From bfoster@redhat.com Thu May 1 08:38:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 468227F55 for ; Thu, 1 May 2014 08:38:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BEC75AC005 for ; Thu, 1 May 2014 06:38:11 -0700 (PDT) X-ASG-Debug-ID: 1398951489-04cb6c72901f8620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FkEZUsCHXBXWrY72 for ; Thu, 01 May 2014 06:38:10 -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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s41Dc9gT021809 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 1 May 2014 09:38:09 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s41Dc8J1021660 for ; Thu, 1 May 2014 09:38:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D248412573F; Thu, 1 May 2014 09:38:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: initialize default acls for ->tmpfile() Date: Thu, 1 May 2014 09:38:07 -0400 X-ASG-Orig-Subj: [PATCH] xfs: initialize default acls for ->tmpfile() Message-Id: <1398951487-15462-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1398951490 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 current tmpfile handler does not initialize default ACLs. Doing so within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), which is already used as a common create handler. xfs_vn_mknod() does not currently have a mechanism to determine whether to link the file into the namespace. Therefore, further abstract xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile parameter. This new handler passes a NULL xname to the create and calls d_tmpfile() on the dentry when called via ->tmpfile(). Signed-off-by: Brian Foster --- Hi all, It appears that we want to initialize default ACLs for ->tmpfile() after all. This patch reintroduces the refactoring to initialize security and ACLs through the current xfs_vn_mknod(). This is based on top of the previously posted series: http://oss.sgi.com/archives/xfs/2014-04/msg00396.html Brian fs/xfs/xfs_iops.c | 57 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index f315a38..b430eb7 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -124,20 +124,20 @@ xfs_cleanup_inode( xfs_dentry_to_name(&teardown, dentry, 0); xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); - iput(inode); } STATIC int -xfs_vn_mknod( +xfs_generic_create( struct inode *dir, struct dentry *dentry, umode_t mode, - dev_t rdev) + dev_t rdev, + bool tmpfile) /* unnamed file */ { struct inode *inode; struct xfs_inode *ip = NULL; struct posix_acl *default_acl, *acl; - struct xfs_name name; + struct xfs_name name, *namep = NULL; int error; /* @@ -156,8 +156,12 @@ xfs_vn_mknod( if (error) return error; - xfs_dentry_to_name(&name, dentry, mode); - error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip); + if (!tmpfile) { + xfs_dentry_to_name(&name, dentry, mode); + namep = &name; + } + + error = xfs_create(XFS_I(dir), namep, mode, rdev, &ip); if (unlikely(error)) goto out_free_acl; @@ -180,7 +184,11 @@ xfs_vn_mknod( } #endif - d_instantiate(dentry, inode); + if (tmpfile) + d_tmpfile(dentry, inode); + else + d_instantiate(dentry, inode); + out_free_acl: if (default_acl) posix_acl_release(default_acl); @@ -189,11 +197,23 @@ xfs_vn_mknod( return -error; out_cleanup_inode: - xfs_cleanup_inode(dir, inode, dentry); + if (!tmpfile) + xfs_cleanup_inode(dir, inode, dentry); + iput(inode); goto out_free_acl; } STATIC int +xfs_vn_mknod( + struct inode *dir, + struct dentry *dentry, + umode_t mode, + dev_t rdev) +{ + return xfs_generic_create(dir, dentry, mode, rdev, false); +} + +STATIC int xfs_vn_create( struct inode *dir, struct dentry *dentry, @@ -353,6 +373,7 @@ xfs_vn_symlink( out_cleanup_inode: xfs_cleanup_inode(dir, inode, dentry); + iput(inode); out: return -error; } @@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( struct dentry *dentry, umode_t mode) { - int error; - struct xfs_inode *ip; - struct inode *inode; - - error = xfs_create(XFS_I(dir), NULL, mode, 0, &ip); - if (unlikely(error)) - return -error; - - inode = VFS_I(ip); - - error = xfs_init_security(inode, dir, &dentry->d_name); - if (unlikely(error)) { - iput(inode); - return -error; - } - - d_tmpfile(dentry, inode); - - return 0; + return xfs_generic_create(dir, dentry, mode, 0, true); } static const struct inode_operations xfs_inode_operations = { -- 1.8.3.1 From dave@fromorbit.com Thu May 1 17:40:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C18067F55 for ; Thu, 1 May 2014 17:40:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE0678F8035 for ; Thu, 1 May 2014 15:40:37 -0700 (PDT) X-ASG-Debug-ID: 1398984035-04cbb03cc72161a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 4ucC7wBH4bsecJml for ; Thu, 01 May 2014 15:40:35 -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: AsBJAGHMYlN5LEcvPGdsb2JhbABSCIMGiEajJgUFmgqBExcDAQEBATg1giUBLS87GGoDBy2IQJZosyiFVogmSyiEIwSVOY5wizkr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 02 May 2014 08:09:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Wfzdj-0006aO-Fv for xfs@oss.sgi.com; Fri, 02 May 2014 08:39:39 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1Wfzdj-0006Ao-Eo for xfs@oss.sgi.com; Fri, 02 May 2014 08:39:39 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: truncate_setsize should be outside transactions Date: Fri, 2 May 2014 08:39:39 +1000 X-ASG-Orig-Subj: [PATCH] xfs: truncate_setsize should be outside transactions Message-Id: <1398983979-23696-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1398984035 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.5446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner truncate_setsize() removes pages from the page cache, and hence requires page locks to be held. It is not valid to lock a page cache page inside a transaction context as we can hold page locks when we we reserve space for a transaction. If we do, then we expose an ABBA deadlock between log space reservation and page locks. That is, both the write path and writeback lock a page, then start a transaction for block allocation, which means they can block waiting for a log reservation with the page lock held. If we hold a log reservation and then do something that locks a page (e.g. truncate_setsize in xfs_setattr_size) then that page lock can block on the page locked and waiting for a log reservation. If the transaction that is waiting for the page lock is the only active transaction in the system that can free log space via a commit, then writeback will never make progress and so log space will never free up. This issue with xfs_setattr_size() was introduced back in 2010 by commit fa9b227 ("xfs: new truncate sequence") which moved the page cache truncate from outside the transaction context (what was xfs_itruncate_data()) to inside the transaction context as a call to truncate_setsize(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_iops.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef1ca01..84db577 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -808,22 +808,25 @@ xfs_setattr_size( */ inode_dio_wait(inode); + /* + * Do all the page cache truncate work outside the transaction + * context as the "lock" order is page lock->log space reservation. + * i.e. locking pages inside the transaction can ABBA deadlock with + * writeback. + */ error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); if (error) return error; + truncate_setsize(inode, newsize); tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); if (error) goto out_trans_cancel; - truncate_setsize(inode, newsize); - commit_flags = XFS_TRANS_RELEASE_LOG_RES; lock_flags |= XFS_ILOCK_EXCL; - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); /* -- 1.9.0 From david@fromorbit.com Thu May 1 18:27:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CDE997F55 for ; Thu, 1 May 2014 18:27:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC1768F8035 for ; Thu, 1 May 2014 16:27:28 -0700 (PDT) X-ASG-Debug-ID: 1398986843-04cbb03cc6218780001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id v7P3KYCJwCF211oP for ; Thu, 01 May 2014 16:27:23 -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: AuVJAB3XYlN5LEcvPGdsb2JhbABagwaDPIUKoyYFBZoKgRMXAwEBAQE4NYIlAQEEAScTHCMFCwgDDgcDCSUPBSUDBxoTiDkHyX8XFoVAiHwHgySBFQSZLpY0K4EuJA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 02 May 2014 08:57:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wg0Ns-0006mF-IT; Fri, 02 May 2014 09:27:20 +1000 Date: Fri, 2 May 2014 09:27:20 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] repair: detect CRC errors in AG headers Message-ID: <20140501232720.GD22353@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] repair: detect CRC errors in AG headers References: <1398719099-19194-1-git-send-email-david@fromorbit.com> <1398719099-19194-6-git-send-email-david@fromorbit.com> <20140429140619.GC59046@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140429140619.GC59046@bfoster.bfoster> 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: 1398986843 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.5447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 29, 2014 at 10:06:19AM -0400, Brian Foster wrote: > On Tue, Apr 29, 2014 at 07:04:55AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > repair doesn't currently detect verifier errors in AG header > > blocks - apart from the primary superblock they are not detected. > > They are, fortunately, corrected in the important cases (AGF, AGI > > and AGFL) because these structures are rebuilt in phase 5, but if > > you run xfs_repair in checking mode it won't report them as bad. > > > > Signed-off-by: Dave Chinner ..... > > @@ -1312,21 +1302,34 @@ scan_ag( > > validate_agi(agi, agno, agcnts); > > > > ASSERT(agi_dirty == 0 || (agi_dirty && !no_modify)); > > + ASSERT(agf_dirty == 0 || (agf_dirty && !no_modify)); > > + ASSERT(sb_dirty == 0 || (sb_dirty && !no_modify)); > > + > > + /* > > + * Only pay attention to CRC/verifier errors if we can correct them. > > + * While there, ensure that we corrected a corruption error if the > > + * verifier detected one. > > + */ > > + if (!no_modify) { > > + ASSERT(agi_dirty || agibuf->b_error != EFSCORRUPTED); > > + ASSERT(agf_dirty || agfbuf->b_error != EFSCORRUPTED); > > + ASSERT(sb_dirty || sbbuf->b_error != EFSCORRUPTED); > > + > > + agi_dirty += (agibuf->b_error == EFSBADCRC); > > + agf_dirty += (agfbuf->b_error == EFSBADCRC); > > + sb_dirty += (sbbuf->b_error == EFSBADCRC); > > + } > > So we'll detect and correct the CRC error in normal mode, but no longer > issue the preceding warnings ("would reset bad ...") for CRC errors in > no_modify mode. Is that desired? It will still throw a bad CRC error, so the user is still told that there is a problem. > I ask because it looks like a departure from previous versions. > Otherwise, the code looks fine to me. Slightly, but I don't think it makes much difference... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 1 18:34:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 447A07F55 for ; Thu, 1 May 2014 18:34:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3DAC98F8039 for ; Thu, 1 May 2014 16:34:14 -0700 (PDT) X-ASG-Debug-ID: 1398987252-04cb6c729022b7a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Ebm5NEsvR45cne54 for ; Thu, 01 May 2014 16:34:13 -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: AnV5AG/ZYlN5LEcvPGdsb2JhbABagwaDPIUKoyYFBZoGAgKBExcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTGYgnygIXFoVAiHwHgySBFQSZLop7izkr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 02 May 2014 09:03:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wg0UC-0006nM-2q; Fri, 02 May 2014 09:33:52 +1000 Date: Fri, 2 May 2014 09:33:52 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfsprog: fix xfs_inode lifetime issue Message-ID: <20140501233351.GE22353@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfsprog: fix xfs_inode lifetime issue References: <20140430134844.924376330@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140430134844.924376330@sgi.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: 1398987252 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.5447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Apr 30, 2014 at 08:48:44AM -0500, Mark Tinguely wrote: > These patches clean up the xfs(_trans)_iput() and fix the > xfs_inode life time so that inodes with a extended attribute > fork can add an attributes. > > Patch 1 removes the unused argument in _iput routines and > introduces the IRELSE define for xfs_iput(). > Patch 2 fixes the xfs_inode lifetime problem. These look OK, but I'm going to leave them until after the 3.2.0 release. Thanks for doing this, Mark! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 1 19:05:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 AF1C77F55 for ; Thu, 1 May 2014 19:05:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A11E930404E for ; Thu, 1 May 2014 17:05:17 -0700 (PDT) X-ASG-Debug-ID: 1398989115-04cbb03cc521a870001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mpOLGIALmq3fZOgf for ; Thu, 01 May 2014 17:05:15 -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: At5JAEvgYlN5LEcvPGdsb2JhbABagwZPgm2FCqMmBQWSTIhQFwMBAQEBODWDAjskNAUlAwctiECWbrMoFoVAiRmCGA9ngRUEmS6WNCuBLiQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 02 May 2014 09:35:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wg0yS-0006sc-TI for xfs@oss.sgi.com; Fri, 02 May 2014 10:05:08 +1000 Date: Fri, 2 May 2014 10:05:08 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged Message-ID: <20140502000508.GA26353@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qMm9M+Fa2AknHoGS" 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: 1398989115 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.5448 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --qMm9M+Fa2AknHoGS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 67fcc94 xfsprogs: v3.2.0-rc2 release This commit has been tagged with v3.2.0-rc2. I'd like everyone who can test this to test it, as all the issues that needed to be solved before a release coul dbe made have now been addressed. If there are no new regressions or critical issues reported in the next week or so, I will make an official 3.2.0 release. So, please test. :) -Dave. New Commits: Dave Chinner (10): [b511ff4] db: don't claim unchecked CRCs are correct [9ba69ce] db: verify buffer on type change [adbb357] repair: ensure prefetched buffers have CRCs validated [8e7e14b] repair: detect and correct CRC errors in directory blocks [8f657d7] repair: detect CRC errors in AG headers [a76a5a7] repair: report AG btree verifier errors [641e65b] repair: remove more dirv1 leftovers [7cb3f7f] repair: handle remote symlink CRC errors [3a1d34e] repair: detect and handle attribute tree CRC errors [67fcc94] xfsprogs: v3.2.0-rc2 release Eric Sandeen (2): [847bbbe] xfs_logprint: Fix error handling in xlog_print_trans_efi [aabc02b] mkfs.xfs: prevent close(-1) on protofile error path Code Diffstat: VERSION | 2 +- db/fprint.c | 15 ++- db/io.c | 26 ++++++ db/io.h | 13 ++- db/type.c | 9 +- doc/CHANGES | 5 + include/libxfs.h | 3 + libxfs/rdwr.c | 58 ++++++++---- logprint/log_misc.c | 5 +- mkfs/proto.c | 3 +- repair/attr_repair.c | 45 +++++++-- repair/dinode.c | 251 +++--------------------------------------------= ---- repair/dinode.h | 6 -- repair/phase6.c | 94 +++++++++++++++---- repair/prefetch.c | 7 +- repair/scan.c | 108 +++++++++++++++------- 16 files changed, 311 insertions(+), 339 deletions(-) --=20 Dave Chinner david@fromorbit.com --qMm9M+Fa2AknHoGS Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTYuE0AAoJEK3oKUf0dfod014P/1VmVxBIAODq2r6k+B14R+6r Hm5YNK1yLJPtUIo48wylVukxAoiFndzbuuzrZY/jYvWGhpocUeYS1hwhhD+HCPWr ybYlNL9fIF/fZT632700ZTgEZwFrqT+Ba62GdVEKSzGFURKmsJ+uc+W3cjrTBSZx bMk+r48Qmd0oyJQxmlTAUuLKleSnaV6S+tPY4jr9P/pUKqmYF4EoGhj0wIWDoXyq MIBYkBTyvOafRciUxgz3vUkDKWO6GXdng/3jbVl7O/qKuE0dofoqGdEa5AqtTeoW ktryd5sVEBdpy89JbGxZW7WTYmJ7plV0GpRRqSjJ6dptoGnDSUSi54Uz+WrC0ZzU jHGyM2AERXN8ImqPTn2vTorS1htOI/qUAroS/wqTGqvU7EZXYlL7HRNNsKNrYWuy sD2nGssJcp3dm86ewigBznfzsLryK9FJuwzTTz0/6TTftAhHyvbbmMod1areWmww csyUBJsVLdMLblcUnv7P3i7Kt6drjpbPwtALVt1oLlzlk9WfdUJMRkDvWAZ3vEFa D9tsTV9pkw7xwZHdQjkcviK1nrcN1xoafacBLObWnvRXpiv0xMmbLE84evSMOcza QHmg+Qptx4meq8gsHiKhQEuy/+4FLDWNZQ7rRcxUtKCJyI+m8+yhwht5RqxbGYeS mqe8ivAN4reUcPzvIDKe =9Drr -----END PGP SIGNATURE----- --qMm9M+Fa2AknHoGS-- From BATV+71429d3cf07c002149f1+3904+infradead.org+hch@bombadil.srs.infradead.org Thu May 1 23:54:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BAA617F55 for ; Thu, 1 May 2014 23:54:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47005AC001 for ; Thu, 1 May 2014 21:54:47 -0700 (PDT) X-ASG-Debug-ID: 1399006484-04cbb03cc42285b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wGyKejAWxbBLV9fD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 01 May 2014 21:54:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+71429d3cf07c002149f1+3904+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 1Wg5Uh-0003QC-QV; Fri, 02 May 2014 04:54:43 +0000 Date: Thu, 1 May 2014 21:54:43 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: truncate_setsize should be outside transactions Message-ID: <20140502045443.GA8867@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398983979-23696-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399006484 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.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.5457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 02, 2014 at 08:39:39AM +1000, Dave Chinner wrote: > This issue with xfs_setattr_size() was introduced back in 2010 by > commit fa9b227 ("xfs: new truncate sequence") which moved the page > cache truncate from outside the transaction context (what was > xfs_itruncate_data()) to inside the transaction context as a call to > truncate_setsize(). And it was moved because we should only call truncate_setsize once the truncate can't fail any more. So to move it out of transaction context it needs to move after the commit of the transaction(s). From BATV+71429d3cf07c002149f1+3904+infradead.org+hch@bombadil.srs.infradead.org Fri May 2 00:00:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8D8A97F55 for ; Fri, 2 May 2014 00:00:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83E7E8F804B for ; Thu, 1 May 2014 22:00:54 -0700 (PDT) X-ASG-Debug-ID: 1399006853-04cbb03cc42289d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BVlSRS8iW2LZs4Do (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 01 May 2014 22:00:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+71429d3cf07c002149f1+3904+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 1Wg5af-0005cn-3I; Fri, 02 May 2014 05:00:53 +0000 Date: Thu, 1 May 2014 22:00:53 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: truncate_setsize should be outside transactions Message-ID: <20140502050053.GA17578@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502045443.GA8867@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399006853 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.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.5457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 01, 2014 at 09:54:43PM -0700, Christoph Hellwig wrote: > On Fri, May 02, 2014 at 08:39:39AM +1000, Dave Chinner wrote: > > This issue with xfs_setattr_size() was introduced back in 2010 by > > commit fa9b227 ("xfs: new truncate sequence") which moved the page > > cache truncate from outside the transaction context (what was > > xfs_itruncate_data()) to inside the transaction context as a call to > > truncate_setsize(). > > And it was moved because we should only call truncate_setsize once > the truncate can't fail any more. So to move it out of transaction > context it needs to move after the commit of the transaction(s). Actually that's only true for the i_size update. So I guess we need to call truncate_pagecache were you put the truncate_setsize now, and then update i_size later, together with the updates of the XFS di_size. From david@fromorbit.com Fri May 2 01:47:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 74A817F55 for ; Fri, 2 May 2014 01:47:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58D7B304053 for ; Thu, 1 May 2014 23:47:06 -0700 (PDT) X-ASG-Debug-ID: 1399013223-04cb6c1fccf0bb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id dhbTvTrwTN5PAzXk for ; Thu, 01 May 2014 23:47:04 -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: Aq1VABA+Y1N5LEcvPGdsb2JhbABagwaDPIUKox0GlCWFZYESFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDKFxcWhUCIfAeDJIEVBJkuinyLOSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 02 May 2014 16:17:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wg7FN-0007ZK-2S; Fri, 02 May 2014 16:47:01 +1000 Date: Fri, 2 May 2014 16:47:01 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: truncate_setsize should be outside transactions Message-ID: <20140502064700.GB26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502050053.GA17578@infradead.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: 1399013223 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.5458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 01, 2014 at 10:00:53PM -0700, Christoph Hellwig wrote: > On Thu, May 01, 2014 at 09:54:43PM -0700, Christoph Hellwig wrote: > > On Fri, May 02, 2014 at 08:39:39AM +1000, Dave Chinner wrote: > > > This issue with xfs_setattr_size() was introduced back in 2010 by > > > commit fa9b227 ("xfs: new truncate sequence") which moved the page > > > cache truncate from outside the transaction context (what was > > > xfs_itruncate_data()) to inside the transaction context as a call to > > > truncate_setsize(). > > > > And it was moved because we should only call truncate_setsize once > > the truncate can't fail any more. So to move it out of transaction > > context it needs to move after the commit of the transaction(s). > > Actually that's only true for the i_size update. So I guess > we need to call truncate_pagecache were you put the truncate_setsize > now, and then update i_size later, together with the updates of the > XFS di_size. OK, that seems reasonable. I'll add a comment to ensure that we don't break it in future ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 2 02:01:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 ADBA47F55 for ; Fri, 2 May 2014 02:01:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30619AC003 for ; Fri, 2 May 2014 00:01:00 -0700 (PDT) X-ASG-Debug-ID: 1399014056-04cb6c72902436d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id pTpTMGiYPdeN0oNH for ; Fri, 02 May 2014 00:00: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: ApNLAJ1BY1N5LEcvPGdsb2JhbABSCIMGgzyFCqMZAQEBAQEFmgqBERcDAQEBATg1giUBAQUnExwjEAgRBwwlDwUlAwcaE4hAyiAXFoVAiCZLCweDJIEVBJU6g3WKfIs6Kw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 02 May 2014 16:30:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wg7So-0007bO-GP; Fri, 02 May 2014 17:00:54 +1000 Date: Fri, 2 May 2014 17:00:54 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140502070054.GC26353@dastard> X-ASG-Orig-Subj: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502064700.GB26353@dastard> 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: 1399014056 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.5459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner truncate_setsize() removes pages from the page cache, and hence requires page locks to be held. It is not valid to lock a page cache page inside a transaction context as we can hold page locks when we we reserve space for a transaction. If we do, then we expose an ABBA deadlock between log space reservation and page locks. That is, both the write path and writeback lock a page, then start a transaction for block allocation, which means they can block waiting for a log reservation with the page lock held. If we hold a log reservation and then do something that locks a page (e.g. truncate_setsize in xfs_setattr_size) then that page lock can block on the page locked and waiting for a log reservation. If the transaction that is waiting for the page lock is the only active transaction in the system that can free log space via a commit, then writeback will never make progress and so log space will never free up. This issue with xfs_setattr_size() was introduced back in 2010 by commit fa9b227 ("xfs: new truncate sequence") which moved the page cache truncate from outside the transaction context (what was xfs_itruncate_data()) to inside the transaction context as a call to truncate_setsize(). The reason truncate_setsize() was located where in this place was that we can't change the file size until after we are in the transaction context and the operation will either succeed or shut down the filesystem on failure. Hence we have to split truncate_setsize() back into a pagecache operation that occurs before the transaction context, and a i_size_write() call that happens within the transaction context. Signed-off-by: Dave Chinner --- fs/xfs/xfs_iops.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef1ca01..ab2dc47 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -808,22 +808,27 @@ xfs_setattr_size( */ inode_dio_wait(inode); + /* + * Do all the page cache truncate work outside the transaction + * context as the "lock" order is page lock->log space reservation. + * i.e. locking pages inside the transaction can ABBA deadlock with + * writeback. We have to do the inode size update inside the + * transaction, however, as xfs_trans_reserve() can fail with ENOMEM + * and we can't make user visible changes on non-fatal errors. + */ error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); if (error) return error; + truncate_pagecache(inode, newsize); tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); if (error) goto out_trans_cancel; - truncate_setsize(inode, newsize); - commit_flags = XFS_TRANS_RELEASE_LOG_RES; lock_flags |= XFS_ILOCK_EXCL; - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); /* @@ -856,6 +861,7 @@ xfs_setattr_size( * they get written to. */ ip->i_d.di_size = newsize; + i_size_write(inode, newsize); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); if (newsize <= oldsize) { From BATV+71429d3cf07c002149f1+3904+infradead.org+hch@bombadil.srs.infradead.org Fri May 2 05:01:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9D0FB7F55 for ; Fri, 2 May 2014 05:01:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8152F30404E for ; Fri, 2 May 2014 03:01:43 -0700 (PDT) X-ASG-Debug-ID: 1399024898-04cbb03cc5239bc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pjAvHE6BJIi5jq4d (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 02 May 2014 03:01:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+71429d3cf07c002149f1+3904+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 1WgAHi-00054t-37; Fri, 02 May 2014 10:01:38 +0000 Date: Fri, 2 May 2014 03:01:38 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: initialize default acls for ->tmpfile() Message-ID: <20140502100138.GA14028@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: initialize default acls for ->tmpfile() References: <1398951487-15462-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398951487-15462-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399024898 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.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.5463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 01, 2014 at 09:38:07AM -0400, Brian Foster wrote: > The current tmpfile handler does not initialize default ACLs. Doing so > within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), > which is already used as a common create handler. > > xfs_vn_mknod() does not currently have a mechanism to determine whether > to link the file into the namespace. Therefore, further abstract > xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile > parameter. This new handler passes a NULL xname to the create and calls > d_tmpfile() on the dentry when called via ->tmpfile(). > > Signed-off-by: Brian Foster Looks good, Reviewed-by: Christoph Hellwig From BATV+71429d3cf07c002149f1+3904+infradead.org+hch@bombadil.srs.infradead.org Fri May 2 05:08:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4AFEE7F56 for ; Fri, 2 May 2014 05:08:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41D3A30404E for ; Fri, 2 May 2014 03:08:08 -0700 (PDT) X-ASG-Debug-ID: 1399025282-04cb6c1fccfa870001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NpurRqyLZDMyxJLD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 02 May 2014 03:08:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+71429d3cf07c002149f1+3904+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 1WgANu-0000E9-Dh; Fri, 02 May 2014 10:08:02 +0000 Date: Fri, 2 May 2014 03:08:02 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140502100802.GB14028@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502070054.GC26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399025283 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.5463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 02, 2014 at 05:00:54PM +1000, Dave Chinner wrote: > The reason truncate_setsize() was located where in this place was > that we can't change the file size until after we are in the > transaction context and the operation will either succeed or shut > down the filesystem on failure. Hence we have to split > truncate_setsize() back into a pagecache operation that occurs > before the transaction context, and a i_size_write() call that > happens within the transaction context. Further updating myself earlier on the comment next to truncate_pagecache claims that the file size must have been updated before, but I can't see a reason for that. This version looks fine to me: Reviewed-by: Christoph Hellwig From bfoster@redhat.com Fri May 2 07:43:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 327C37F55 for ; Fri, 2 May 2014 07:43:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 121C9304062 for ; Fri, 2 May 2014 05:43:13 -0700 (PDT) X-ASG-Debug-ID: 1399034592-04cb6c1fcc103270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JtK0aCykBMgXmj7D for ; Fri, 02 May 2014 05:43: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42CganD019892 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 2 May 2014 08:42:36 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s42CgZfh017916; Fri, 2 May 2014 08:42:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B2007122F16; Fri, 2 May 2014 08:50:49 -0400 (EDT) Date: Fri, 2 May 2014 08:50:49 -0400 From: Brian Foster To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140502125049.GA7709@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502070054.GC26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399034593 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, May 02, 2014 at 05:00:54PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > truncate_setsize() removes pages from the page cache, and hence > requires page locks to be held. It is not valid to lock a page cache > page inside a transaction context as we can hold page locks when we > we reserve space for a transaction. If we do, then we expose an ABBA > deadlock between log space reservation and page locks. > > That is, both the write path and writeback lock a page, then start a > transaction for block allocation, which means they can block waiting > for a log reservation with the page lock held. If we hold a log > reservation and then do something that locks a page (e.g. > truncate_setsize in xfs_setattr_size) then that page lock can block > on the page locked and waiting for a log reservation. If the > transaction that is waiting for the page lock is the only active > transaction in the system that can free log space via a commit, > then writeback will never make progress and so log space will never > free up. > > This issue with xfs_setattr_size() was introduced back in 2010 by > commit fa9b227 ("xfs: new truncate sequence") which moved the page > cache truncate from outside the transaction context (what was > xfs_itruncate_data()) to inside the transaction context as a call to > truncate_setsize(). > > The reason truncate_setsize() was located where in this place was > that we can't change the file size until after we are in the > transaction context and the operation will either succeed or shut > down the filesystem on failure. Hence we have to split > truncate_setsize() back into a pagecache operation that occurs > before the transaction context, and a i_size_write() call that > happens within the transaction context. > > Signed-off-by: Dave Chinner > --- The manifestation of this that we have seen has writeback blocked on log reservation, and a thread sitting on this: #0 [ffff88022e153b18] __schedule at ffffffff815f137d #1 [ffff88022e153b80] io_schedule at ffffffff815f1bdd #2 [ffff88022e153b98] sleep_on_page at ffffffff811410be #3 [ffff88022e153ba8] __wait_on_bit at ffffffff815ef940 #4 [ffff88022e153be8] wait_on_page_bit at ffffffff81140e46 #5 [ffff88022e153c38] truncate_inode_pages_range at ffffffff81150d03 #6 [ffff88022e153d88] truncate_pagecache at ffffffff81151027 #7 [ffff88022e153db0] truncate_setsize at ffffffff81151059 #8 [ffff88022e153dc0] xfs_setattr_size at ffffffffa01f3594 [xfs] #9 [ffff88022e153e10] xfs_vn_setattr at ffffffffa01f37e0 [xfs] #10 [ffff88022e153e30] notify_change at ffffffff811cc349 #11 [ffff88022e153e78] do_truncate at ffffffff811adb43 #12 [ffff88022e153ef0] vfs_truncate at ffffffff811adcf1 #13 [ffff88022e153f28] do_sys_truncate at ffffffff811add9c #14 [ffff88022e153f70] sys_truncate at ffffffff811adf3e #15 [ffff88022e153f80] system_call_fastpath at ffffffff815fc819 That wait_on_page_bit() call maps to this bit of code: 0xffffffff81150cef : mov %rdx,%rdi 0xffffffff81150cf2 : mov $0xd,%esi 0xffffffff81150cf7 : mov %rdx,-0x130(%rbp) 0xffffffff81150cfe : callq 0xffffffff81140dc0 So this thread has basically come in, reserved log space, attempted a truncate and is sitting blocked on writeback. xfs_vm_writepage() has the page, set the writeback bit and attempted a log reservation for the file size update transaction. Therefore, no progress can be made. Ordered properly, the truncate should either wait on writeback without holding the log space hostage or grab the page lock before writeback is set, allowing either path to proceed once the page is acquired. Makes sense, thanks for tracking this down... Reviewed-by: Brian Foster > fs/xfs/xfs_iops.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index ef1ca01..ab2dc47 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -808,22 +808,27 @@ xfs_setattr_size( > */ > inode_dio_wait(inode); > > + /* > + * Do all the page cache truncate work outside the transaction > + * context as the "lock" order is page lock->log space reservation. > + * i.e. locking pages inside the transaction can ABBA deadlock with > + * writeback. We have to do the inode size update inside the > + * transaction, however, as xfs_trans_reserve() can fail with ENOMEM > + * and we can't make user visible changes on non-fatal errors. > + */ > error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); > if (error) > return error; > + truncate_pagecache(inode, newsize); > > tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > if (error) > goto out_trans_cancel; > > - truncate_setsize(inode, newsize); > - > commit_flags = XFS_TRANS_RELEASE_LOG_RES; > lock_flags |= XFS_ILOCK_EXCL; > - > xfs_ilock(ip, XFS_ILOCK_EXCL); > - > xfs_trans_ijoin(tp, ip, 0); > > /* > @@ -856,6 +861,7 @@ xfs_setattr_size( > * they get written to. > */ > ip->i_d.di_size = newsize; > + i_size_write(inode, newsize); > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > > if (newsize <= oldsize) { > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bogomolova_natal@eis.net.au Fri May 2 08:20:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_OBFU_PDF_ATTACH 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 6E3DC7F55 for ; Fri, 2 May 2014 08:20:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFDB08F8039 for ; Fri, 2 May 2014 06:20:47 -0700 (PDT) X-ASG-Debug-ID: 1399036842-04bdf02b8d253af0001-NocioJ Received: from mail.pravmin74.ru (ip-195-54-12-174.ll.surnet.ru [195.54.12.174]) by cuda.sgi.com with SMTP id JxjxcIYkHnCE60aB for ; Fri, 02 May 2014 06:20:43 -0700 (PDT) X-Barracuda-Envelope-From: bogomolova_natal@eis.net.au X-Barracuda-Apparent-Source-IP: 195.54.12.174 Received: from Unknown ([46.191.237.118]) by mail.pravmin74.ru ; Tue, 18 Feb 2014 11:56:38 +0600 Message-ID: Reply-To: =?windows-1251?B?0dLQzsjSxcvczdvJIMrOzdLQzsvc?= From: =?windows-1251?B?0dLQzsjSxcvczdvJIMrOzdLQzsvc?= To: , , , Subject: =?windows-1251?B?zvDj4O3o5+D26O7t7e4t8uX17ej35fHq4P8g?= =?windows-1251?B?5O7q8+zl7fLg9uj/IOTr/yDx8vDu6PLl6/zt?= =?windows-1251?B?7uPuIOru7fLw7uv/?= Date: Tue, 18 Feb 2014 07:04:22 +0100 X-ASG-Orig-Subj: =?windows-1251?B?zvDj4O3o5+D26O7t7e4t8uX17ej35fHq4P8g?= =?windows-1251?B?5O7q8+zl7fLg9uj/IOTr/yDx8vDu6PLl6/zt?= =?windows-1251?B?7uPuIOru7fLw7uv/?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0903_01CF2C77.A6D12B10" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: ip-195-54-12-174.ll.surnet.ru[195.54.12.174] X-Barracuda-Start-Time: 1399036843 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_TG035a, BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5468 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 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0903_01CF2C77.A6D12B10 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0904_01CF2C77.A6D12B10" ------=_NextPart_001_0904_01CF2C77.A6D12B10 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2=F5=EE=E4=ED=EE=E9 =EA=EE=ED=F2=F0=EE=EB=FC =EF=F0=EE=E5=EA=F2=ED=EE=E9= =E8 =F0=E0=E1=EE=F7=E5=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8 ------=_NextPart_001_0904_01CF2C77.A6D12B10 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2=F5=EE=E4=ED=EE=E9 =EA=EE=ED=F2=F0=EE=EB=FC =EF=F0=EE=E5=EA=F2=ED= =EE=E9 =E8 =F0=E0=E1=EE=F7=E5=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8 ------=_NextPart_001_0904_01CF2C77.A6D12B10-- ------=_NextPart_000_0903_01CF2C77.A6D12B10 Content-Type: application/octet-stream; name="=?windows-1251?B?z+7w/+Tu6iDi4u7k4CDiIP3q8e/r8+Dy4Pbo?= =?windows-1251?B?/iDn4Oru7ffl7e3u4+4g8fLw7ujy5ev88fLi?= =?windows-1251?B?7uwg7uH65ery4C5wZGY=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?z+7w/+Tu6iDi4u7k4CDiIP3q8e/r8+Dy4Pbo?= =?windows-1251?B?/iDn4Oru7ffl7e3u4+4g8fLw7ujy5ev88fLi?= =?windows-1251?B?7uwg7uH65ery4C5wZGY=?=" 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 H44JDwuvCX8YYRNRENG/gLpgyYKWBa8ivSLLIu9EmURJonqjFaMTopujX8d4x5THSGOtYlfGXorT iBPEdcdj46Pjm+KnF/os3LlwPME+oTjh+iLjRXmLLizWWJy++PgSxSWcJUcS0YkxiS2J7zmhnAbO 9NKApbVLp7hs7i7uE54Hbwdvku/KL+dPJLkmlSc9SnZN3p48meKeUpHyVMAWVAuep/qn1qW+TgtN 25/2KT0mvT0Dl5GYcVRIEaYJ+zK1M/Myh7PMs4qzpMucl+1cNiUKEjVlQ9mLsrvFNNnP1IDERLJe MprjllOT8yY3OvdInnKeMG9gudnyTcsn8n3zv16BWsFd0VugW7C2YHSl58r6VdCqpat6V+uvLlo9 vsZvzYG1hLVpa38otC4sL3y5LmZdT5FW0ZqisfV+61uLFYpFxTc2uGyo24jaKNg4uGnupqpNH0t4 JRdLrUsrSt9v5m6++JXNV5VffdqStGWwzKFsz1bMVuHW69vctx0oVy7PLx/bHrK9cwdjR8mOlzuX 7LxQYVdRt4uwS7JLWhlc2V1lULW16n11SvVIjVdNe61m7aba17t5u6/s8djTVqdVV1r3bq9g7816 v/rOBqOGin2YfTn7HjZGN/Z/zfq6uUmjqbTpw37hfumBiAN9zY7NzS2aLWWtcKukdfJgwsHL33h/ 093GbKtvp7eXHgKHJIcef5v47fXDQYd7j7COtH1n+F1tB7WjpBPqXN451ZXSJe2O6x4+Gni0t8el p+N7y+/3H9M9VnNc5XjZCcKJohOfTuafnD6Vderp6eTTY71Leu+ciT1zrS+8b/Bs0Nnz53zPnen3 7D953vX8sQvOF45eZF3suuRwqXPAfqDjB/sfOgYdBjuHHIe6Lztd7hmeN3ziivuV01e9r567FnDt 0sj8keHrUddv3ki4Ib3Ju/noVvqt57dzbs/cWXMXfbfkntK9ivua9xt+NP2xXeogPT7qPTrwYMGD O2PcsSc/Zf/0frzoIflhxYTORPMj20fHJn0nLz9e+Hj8SdaTmafFPyv/XPvM5Nl3v3j8MjAVOzX+ XPT806+bX6i/2P/S7mXvdNj0/VcZr2Zel7xRf3PgLett/7uYdxMzue+x7ys/mH7o+Rj08e6njE+f fgP3hPP7CmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9J bWFnZS9XaWR0aCA5MDkvSGVpZ2h0IDEyODYvRmlsdGVyL0RDVERlY29kZS9Db2xvclNwYWNlWy9J Q0NCYXNlZCAxIDAgUl0vQml0c1BlckNvbXBvbmVudCA4L0xlbmd0aCAxMjcyMDQ+PnN0cmVhbQr/ 2P/gABBKRklGAAEBAQBuAG4AAP/hEQJFeGlmAABNTQAqAAAACAAEATsAAgAAABsAAAhKh2kABAAA AAEAAAhmnJ0AAQAAABwAABDe6hwABwAACAwAAAA+AAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0JDQtNC80LjQvdC40YHR gtGA0LDRgtC+0YAAAAAFkAMAAgAAABQAABC0kAQAAgAAABQAABDIkpEAAgAAAAM4MwAAkpIAAgAA AAM4MwAA6hwABwAACAwAAAioAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAxNDowMjoxMiAxNjo1NzozMwAyMDE0OjAy OjEyIDE2OjU3OjMzAAAAEAQ0BDwEOAQ9BDgEQQRCBEAEMARCBD4EQAQAAP/iDFhJQ0NfUFJPRklM RQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBz UkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAA FGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMA AAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRl eHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAA AAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EA AQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAA YpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu aWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAA AAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAA AENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBe AGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA 8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGp AbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqIC rAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APs A/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdh B3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8J pAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwq DEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkP JQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMW JhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQe vh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOU I8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQp Bik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63 Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1 EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC 90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9 SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxS x1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBk lGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4S bmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4 bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0 g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+O Zo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8 mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4 s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA 7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62 zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDd lt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG 7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8 mP0p/br+S/7c/23////hCy1odHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBi ZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHht bG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMu b3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6ZGM9Imh0 dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIi8+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJv dXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczp4bXA9 Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPjx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAyLTEy VDE2OjU3OjMzLjgzMjwveG1wOkNyZWF0ZURhdGU+PC9yZGY6RGVzY3JpcHRpb24+PHJkZjpEZXNj cmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgy ZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpjcmVh dG9yPjxyZGY6U2VxIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYt c3ludGF4LW5zIyI+PHJkZjpsaT7QkNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgDwvcmRmOmxpPjwv cmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94 OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBC YFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2wBDARweHigjKE4rK06kbl1u pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wAARCAUG A40DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJico KSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6 /8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNE RUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEA PwDpqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii ucj11mF1JJKVfZthRU4J5+Yg5wenf86AOjorl7TXGt7SbdukupJN4Zhlew559v5Vs6PcxT2aIkzy yIo8wvnIJ56nr3oAv0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUF 7KYbcuGCfMqlj/CCwBP60AV9as2vbLYjBWRt/IJzgH0571V0i+l+yOJyX8gnzd+Q6DJ55zu/QjHe pJrnTYJI1lmm5HmDdJIwBB4yM9cjp7c1Lqk4js5ljhZmlRwTgKOBgk568dPUD0oANaNwtmfIK7Dl ZcrnCkEZ49OvArmLa0FwWxc28e0DmR9uc+nHatGPS9QmZb/zIpXcCTazH5gR908Y5HGOlRx+Hr10 DMYkJ/hZjkfkDQBVh0/zd/8AplomxyvzyY3Y7jjpWn4clmWT7PGY3hx5kjYbKkjG3PTPH86g/wCE cvP+ekH/AH0f8KcmjagsclqBEqMQzSbz82Og/X0/pQB0M0pRljjUPIwJAJwMDGST+I/OsK3RtV1Z bg3ClYSCmIiNwUg8fn6556U+wW403UTDM4aLyt4jRyVUFgOAepz2689zwdK+uLS2hPns8Y3EhULK WOMnGMZ6/TNAF2iqFvNF9ojFtJJIrj5gzM2AV3Bst+A4/vDPar9ABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABSMqupVgGUjBBGQRS0UAUoraCR76N4kKvKAwx1+RT/Mk1n6msh8PWrR5 GxULEHGAVx/XH41o4lWa8iQqryASRMT32hfTsQPXqKp3bJNozW0DM4jjw77Cu3YM8575UDHXnNAE wunttMsPLRXaXyoxuOAMirP2oR/8fEbQf7TEFP8AvodPxxms24kUWujRYO5niYemAB/iK2qAI5Z4 4cb2wW+6oBLN9AOTVa4vZoXgJttiSSrGd7DdznoBkfr+Hen6dDFFC5jjRCZZAdqgZAdsVDrLKi2b MQqi6Qkk8Ac0AQXXPia1U9DFyPXG4j9QD+FXDBFLqcjyRq5WBVG4ZwCXzVS6Vv8AhIoZACwig3MA MnGSOB361bgkjluJbuOf90qeXIrIVwVJOST0xk0AO0+NFg+VFG2SVVwOg3ngfkPyq1VewV1s4zJw 75dhjGCxLEY9s4qxQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAV4HE1zMwK kRHyhjBwcAtz+IGP9mqN4RFpk11E8hjnQs6vgn5xgEfTKjrjA9atafF5L3i5zm4LdPVVP9ap33/I sL/1yj/mtABH/r9F/wCuTf8AoArXrNi0+O7tLKUyzRvHCoUxvjqBQLHUIAfI1EyDdkJMucj0Lden pQBasf8AUN/11k/9Daq+vqp0mYkAlSpGR0O4UyO31UKI/PtoVLs5dFLNyScYPHU0HR2mR1ur+5l3 HJCttX8uaAG3DsviGKNDtMtvs3ddvJOf0/z0q5bRRxGa2LSS5/eN5mCDuJ4/Q8e9Ubn/AJGe0/65 H+TVfT/kITf9co/5vQA+0dpLcFzllLIW/vFSRn8cZqaq9j/qG/66yf8AobVYoAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKAKl3BEsc8zNIqFS0qKRhwB056cDHGKqap5dvpsNlM7 KjgIZthIXaAenvjp9fSrd1fW0e+OVk4O1w/AxjJ6/e4PQZ6j1qnZXMctgIdScbZAdhmG3zE4wSem fxz0PvQA3TLm/GmwFLVLhcEKRIEIA4AIIq815LHFvksbjIAyE2tz7YOT+VMje1muIkz9rkALCU7W C4PqOAeR056Zp16kwngkt7eORwcM5wCo/wB49O/QHjPSgAGpQyOiW6yXJYZPlAYX0ySRjvxSS3V6 G/dac7Ljq0qKc/majnguX2IttbqjS7pNp3g5B5ZSFzzg9ewq1diLyGeZNyJ8xPdf9oemPbn0oAyn WVNZFzdyxB0C+XEh6qxYcZwSRyehzV64tUlvw3myxyNEQrRnGADz+e4du1IslizxXIuQ5AxHl9x6 DKgdc9P9rt7VWkvb2ylaa6jjaMxoWVCQV55IBJBwTg49VoA1YYkhjCRghQSeSSck5PJp9RwTpOhe PdgEr8yleR161JQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAZP2K7vJGNy3 lROCHXALH0HcYHY8HrxzmtVlV1KsAykYIIyCKWigCtNBKHiktvLBjUpsYEAqSvQjp930NH+nOw4t 4lxyctISf/Hcd6s0UAV3W8GDHJA2MfKyEZ9ecnHfsajnjvLmN4m8iFHQqxBMh544+7jv61cooAYI YhKZRGgkYYLhRkj60y5t1uAmWZTG+9SoB5wR3B9amooAz7G3nt76csv7qX5zj7u/jkc555J44wBk 1oUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAEU83lBQF3SO21FzjJwT17DAJ/Dv0qNJ5VkRLmJI/MOEKOXBOCcHIG OAfyPtl11G7GKRBuaF9+zpu+UjGfXn9O3Wo/3tzPCzQPAsLF/nKksdpXAwT65/L14AI4r2coJJbe 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 cUAPlur2JSz2kIG9UH7887iAD93pk/pVqB5mDefEsbBsDa+4MMDnoPcfhUF4ZpbRCltIX81GMeVy ArgnvjoPXvViSNnZCszxhTkqoXDexyD+mKAK63F3JLMkdvCRE+zLTEZ4B/unsRUS6hO6QOIIVEsJ mJecgKBjqdvow/X8ZrfzUlvHaBwGk3JyvzjaBxz/ALPfHUVR+yu8NnHc6c8yRWxjdcpwx2jj5v8A ZPI9RQBamu7yGCSVrOMLGhdsz9cE9Pl54APOOtOluryFCz2sX3kUYnODuOP7ueDjt3ouftFxplyp gIkkVlSLIyAeBk5x7/pz3XUEeezVRbNJueMtGSvADAkHJx0GKAEe7uI7a4me3iIhUsNk2Q2M7hnb wRj0ps97PbpIZbePesTSqFlJBC4zk7Rg8jHB/Co5I5jYXNvb2LQxmJlRCVyzNnphsADP68dOX3Fo P7Pn8mKV5pYSgWSUswyOmWYge+D278UASma+CufskTMoBUCfhuuRnb14Htz1pHvJSLfyIo5GlzuB kK7MDn+HOAeDkDBIHeo7eHy5zLDYm2RY2DIAgMjZGPunHGD1x1+tS20B897hozFkELGSCVycseDj kgcD0z1JoAje9nQ3Lm3j8q2Y7yJTuIChsgbeuD0z1/OnrcXcksyR28JET7MtMRngH+6exFRxWglu rt54pVVpAVBlO112gcqGweh6joRU1osguLsvEyK8oZCSPmG1V7H/AGe/qKAGxXcxEouYY7d1Teoa XIIxzk44APB64/LM1pJLNAsk0IhZgCE3EkDHfIGD7VDdwtdP5JhZVHDSkjBQ/eUYOeenOPXqBVyg AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKhurj7NGHMTyZY LhMZyTgdSO5H51NVPVSwtBsDFvNjI2xl8YcHJA7YFAErXSrepabGLshkyCMAA455z19v60XNz9na JRDJKZWKjZt64J7kdgfyqusaw6lAoWRsxSb5ChOWJXq2MZwp/ID0p8rma+hiWOQeQ5dnZCFI2EcH ucv+h/EAP7QH2bz/ALNNjzfK2/LnO7b/AHsY3cdf0pXvTHDNLJaToIVDkHbyOc4IbHGPWqbHfpZU xz83WSBE4bb5u7PAz93nP9aWRlGmXVvbxXLJ5T4aSN9zM5OAARk8k5PbjrzgAvyXPltbqYZCZm28 bfkOM88+gPTPSmrdg/aSYnUW5wxYqA3GeOfQjrjr9arSQxxXNjJGLpsyEnc0jhQUYcg5xyR1/wAa WFd93eSSiTyklDqhiYBiEUZ6fNgrwB9eeMAEsV4l15MZtpNlxEXG/aRt9+fcfn9cK98EjunMEuLY 4b7vzcZyOfQg84/OqVtGJf7OjkS5TZalWIEke1vl4JGP7p/T1FKybLLVYkjnbcSE3K7FsoF4J5PI P/6qALU2oPBGZJLC6CAEkjYcAAk9G9qmiud8vlSQyQuVLKH2ncBjPQn1HX1qPUW36VcFFdi8LBVC HcSRgcde9V7pTFB5nm3c0sqFI28o5jDEZOFUYI4ODz8uBigC7DcpPC0kQL7SRtBGTjpjnHIwR7EG oI9R3tGPsk6iSQxhiUxuGc/xdtp/KoPNOmzt5yl0eMYFvbsFDA4UdSMnOOo+6B6UxJkT7ErLKGE5 aRjC6qGcN0JA43MAKALzXeGISCWVFOGdACAR175OPYH068UkV6sr26pFJieLzVY4wBx15znkfnTI ZfsivC8UrOZHZdkZYMGYkc9B1xyR+XNRXkJuby3jcOjeS+SoZk3EqdrHgEHacg4yPTIoAnW+DqGS CVt4zEBtzIvqOeB0646jucVIlzu3K0MkcoUsI225YexBx+vHGeoqt55a5Sd4ZV8pXjkURscElcEc fMPl6j1HA5xIr+bdLcqkgiiidTujZSSSp4UjJ+76dxjPOACH7bIkMN0zO0MzARxbUEh3dATuwR9O emehq9NKsKgkFiThVXqx9B/n36VlRxGPSbWSRJXlBhXAibKKrKSNuMj7vJ74+grQu1bdBKFLCGTe wUZONrLwO/XP/wBfigB0VzucJLDJAzfd8zb83sME8+3+BqOC9M7KBaTorMyb22kAjOc4YnqCKQv9 ruLcxJIFhcuxkjZP4WXAyBk8/p9M0Y38uJpYo70ziZn2bJApTzCTwflyVz+PvQBdk1HY0g+yTsI5 BGWBTG44x/F33D86sXFxHboHkOAWA/8Ar/QDJPsDVCUk28s3ly4luo3VfKYsFUoCSMZH3CfpjvxT 5993e+XGNqxIQfOgZkck4OOgyAOuTkMfegC5NOItoCNJI33UTGT6nnAx7n29RUH2/wCcxi0uTKu3 KYXjO7BznGPl657gdar2srfuJZEnbyI2hctE+5slcNgjJzsycZIyPc1fhlM25hGyx/wlwVLevB5A +vv7EgEEV+0uNtlc4LMufkxlc5HDccgjPShtRRbOC58qTE7KqJlQx3dO+P1/rRp74tJGZJFxLK2G jYHBckYBGTwRVKOIx6TaySJK8oMK4ETZRVZSRtxkfd5PfH0FAGzRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFNVldQ6MGVhkEHIIp1 ABRRRQAUUUUAFFFFABRRRQAySNJVCuMgMG/EHI/UUSRpKoVxkBg34g5H6in0UAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFAGdrkkkdrEEdokkmRJJVODGhPJz27DJ9albT7JZIiIo4vmOFUBRJlSMEd+ Cf196syxxzIY5UV0PVWGQfwqNLOGPdjzCWUruaVmIB64JOR+HoPSgDm/s0H/AAh3n+RH53/PTYN3 +sx1+lXNZRZLprYqpht7QzpGchMgkdFI5xgDnjnjmtP+y7P7H9k8tvI3btnmNjP59O+KdNp9tPt8 xGJCeXuEjAlfQkHJH1oAguTHceHpH8pVRrXeqYyF+XI/KqFzBEdK0UGJCDNCCNo5DDJ/PvW3LbxS 25t2XERXbtUlePTjtVK60eGS08qFpUdBmEmdyEYdOCTj8qAKV3rV6guXtoVYQzNGVMLthVHLFgcf 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 tnZQWakRL8zfeduWb6moNMZZ7m9ukJKvIIx6EKMZH1zU11eJHpz3aEspTchA5Oen8xTrC2FnZx24 YtsHJPc9TTu+Vt7v+v8AICxRRRWQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAyWRYonkc4R FLMcdAKo6MrvFLezJtkun347hBwoP4Vbu7dbq2eBndFcYJQ4OKkRVRFRAFVRgAdhVJpICtqd59hs 2lG3cSFXdnGT64546/hVSHSVLm61OXz5BltrH92g69D2H5Va1S1+1WjAKGdQSoPrgj0Prn6gVQnv 3udBj27TcXOIcDpk9c+nH8xWkL290Czoe6WCW9kGHuZC3XOFHAH4c1pVHBEsECQp91FCjPtUlZzd 3cAoooqQCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigApKWigComnQJOsib1VTkRBv3YPrt9at0UU3Jy3AKKKKQBRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFVk0+0S7N0sKiY5ywz368dKs0U02tgCiiikAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAU7m7+zXsKSzQxQOjEmTg5BHAOcfxenb8mW9+rm4d5o5 Ill8uIwqWLfKG7E5PPYdifpM8cp1CKUKnlLGykljuySD0x/sjv39uYGtrotcEbAskwcKsrKWXaFw WAyvQHjPpQBcWQTQ74WHIOCQeD7jg8HqOKz49Tlm06GUCKKdztbeTsQ7C+T7EAd+M+1T2sN1bWRj VYvNEhZQ0jMCpbJy2M5wSM8+tRS6WDFaKCH8iMxuCSokXYV5xk9T+GTQBehmSdSyE8HBDKVIPuDy KkqtZRSRRv5wHmO25mD7t3AGfuqOgA4Hak/tKx/5/bb/AL+r/jQBaoqr/aVj/wA/tt/39X/Gj+0r H/n9tv8Av6v+NAFqiqv9pWP/AD+23/f1f8aP7Ssf+f22/wC/q/40AWqKq/2lY/8AP7bf9/V/xo/t Kx/5/bb/AL+r/jQBaoqr/aVj/wA/tt/39X/Gj+0rH/n9tv8Av6v+NAFqiqv9pWP/AD+23/f1f8aP 7Ssf+f22/wC/q/40AWqimuI4Nu/cS3RUQsT74AJx7+4qL+0rH/n9tv8Av6v+NLcRy+fHPCqOyKyF XYqMEqc5AP8Ad9O9ACPqFsjKu9n3YwY42cHjOMqDzjnHpzVhWV1DowZWGQQcgiqn2WWNLCOPY62x G9mJUkBCvAwfXP4VYmuYLfb588cW7pvcLn86AJaKq/2lY/8AP7bf9/V/xo/tKx/5/bb/AL+r/jQB aoqr/aVj/wA/tt/39X/Gj+0rH/n9tv8Av6v+NAFqiqv9pWP/AD+23/f1f8aP7Ssf+f22/wC/q/40 AWqKq/2lY/8AP7bf9/V/xo/tKx/5/bb/AL+r/jQBaoqr/aVj/wA/tt/39X/Gj+0rH/n9tv8Av6v+ NAFqiqv9pWP/AD+23/f1f8aP7Ssf+f22/wC/q/40AWqKq/2lY/8AP7bf9/V/xqaGeKdS8MqSKDgl GBGfwoAkooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCOaaOBQ0rhQTg erH0A7n2FMivIJHEYZkdvurIjIW+gYDP4VTt/wDSNfumk5+yoiRDsNwyT9e2R2qbWYll0yckkNGp lRl6qy8gg9qALtFQ2crT2cEzgBpI1YgdMkZqJrl5rmW2tnRXhCmRnQsBnoAMj65z6dewBborPhuL +dUUQJC6syyvIpK8dCoyCQc9e2DUem3l/d20NyUgdJQ4KjKFCM4OcnIOMdOM96ANSism2u9Ruort o1tleCV41XBbeR2zkY+vv0GOZYdVS5t7Vol2TXW4Ir8hdv3icdQMfjx07AGjRWeLq5ivVs7jyt0y sYZlBwSAMgrntyetMsr24lS7eeSFVglaFdsTcsMYP3uc56Dn3oA06KydPu9RvrWCdfsyrLuLNsPy YJGMbuSfwxg9afpV3e3kFvcSLCYpdwYICpTBODyTkce3UUAadFYz60Ht3uYbizCoTiF2O+RQfqNp I6DB7VakuZ5BaSWzxpHc4wJIyxGVLZ4YemMUAX6KzLe4vpr66tvNtl+z7Pm8lvm3DPTfxUmjXU97 YpczmP8AeZwqKRjBI6knPSgC/RWd9pu/7Y+x74fL8rzs+Wc43Y2/e6+/6UkV7N9vvUmeJbe0AYkR ncVKk+vb6c0AaVFZs15eLZi/iSKSDb5nlHKvsxnO7OM9DjHqMnvFf6nNbSW00ZiezlAdmKEMiZUZ 68/e9KANeis3VNQltp7eC3VC0siq7OCQgYkDjIznB79ver+JPKxuXzNv3tvGfXGentmgB9FZFnqk sklxHK8DyxzGFIUBVnIIG7qeOueDgA+lTRXN55v2OZrYXZUyZRWKKnA6HGSTnjP+BANGis+G6uWu ZbKXyo7hVEiSAFldc4ztzx6Yz1qG1v7ubRJL9jCH2M6qIzgbSc5+bnOPbHvQBrUVk/a9R+wfav8A Rggt/PzsPJxnaBu7Y6+44qa0nv5YY5WjgkWWFZFIJTaxx8p+92PX2oA0KKxoNRv5dIGohICFBZog DllDcnOeOAex6e+KuC+Fw0MNsQsssInzIpIVPcA8nnGM+v4gF2iqFvdztdTWU4jSdU3xuoJV1JIz jtjjjNVrq+vrfTZrzfbN5bsmzymGcPt67vxoA2KKoXd6bMQRTSw+dMxG9soigDOep9hjPOeoptjq PnXslo0sM5CeYssH3SM4IIycHPv0oA0aKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKRlV1KsAykYIIyCKAKc1tJHfC9tgGLLsmizjeB0I/2h057dxTbhbm+iMAia2ifi VpCpYr3CgEjJ6ZPT3qf7BZ/8+kH/AH7FH2Cz/wCfSD/v2KAJlVUUIihVUYAAwAKy7iC+tNTkvLKJ biOdVEsRcKcgEAgnoOn5n8L32Cz/AOfSD/v2KPsFn/z6Qf8AfsUAJC9wtsZZ4i0rHPlRkHaOwBOA eOvPXOO1V9ChnttOjtriFo3jzySpBySeME1Z+wWf/PpB/wB+xSNp9oykC2hUkYDCNcj35FAGdpkl wn9orDBvLXcu1twwrcfeGQcdOmT1/Fw0ua1tbBrbbJPabiVZsB9wO4A4656Z/Gp7bRrW3ZyR5wYk lZUQgE+mF4+nSrP2Cz/59IP+/YoAgaF7i6hu5IZI/syvsjJXc5YY7HGMe/U9scwaXazQvdzT28gY zPLEhZT970wfvdufw6mr32Cz/wCfSD/v2KPsFn/z6Qf9+xQBU0ZLiz0pIJrWTzIs8BkO7LE8fN2z 3xTtChnttOjtriFo3jzySpBySeME1Z+wWf8Az6Qf9+xR9gs/+fSD/v2KAM6yg1PTg1nDDFNBljDK 8mPLBzwwAyfwHfr6XCtxJeRI0R8qBgwmZx+8+Qg8Doct9OD7VL9gs/8An0g/79ij7BZ/8+kH/fsU AUbYXUOo3ty1jMUn8vaA0eRtGDn5qqWmm3CWNvCtn9nu0fJusp8oyT2OW44weOa2fsFn/wA+kH/f sUfYLP8A59IP+/YoAoyWjXOuedPZb7cQmIGTYw3Bs5xnpj8eabbWLLeahGbRorW6UIrIUAUBSCcZ 4znjj61ofYLP/n0g/wC/Yo+wWf8Az6Qf9+xQBThivP7OOnTQAHy/JEyMCm3GM4J3Zx2xyR2B4J7P e0VobaV7ZIGgMmU77MNye23069KufYLP/n0g/wC/Yo+wWf8Az6Qf9+xQBkvZ3wtrMPA8s6zxzzMH XHyjbjk5JwBntnPNbe9vK3+W27bnZxnPp1xn8ai+wWf/AD6Qf9+xR9gs/wDn0g/79igDKh0+5dLn 9y1vcG4eeCZip25xwcE9Rweo+tWWjuzeRaglqQ4j8mWFnXJXIOVI4656kdO1XPsFn/z6Qf8AfsUf YLP/AJ9IP+/YoAgWF/tb6g0MnmeUIlhBXdjdkk84z+PQe+BQtdK2aC8UunobwK6gkIWJOcHdntn1 7VrfYLP/AJ9IP+/Yo+wWf/PpB/37FAFTZcf2F9m+yyed5Pk7dydduM53dM/j7VZ01ZEsIYpYmieN FQhiDnAHIwTxTvsFn/z6Qf8AfsUyXTrR0KrBFGT/ABLEuR+YIoAytLFzP4cW1hhGZVdRKzDYAWOc 989egPb3xdeyltLq2uLRPOWKEW7ozAMUBGCO2euc1JaaPaWybConHbzUUkfjjP51P9gs/wDn0g/7 9igCs8U4uJNRS2ZpvKESQF1BI3ZJJ5AP+HvxBqFrcy6NJax27PLM7PgMoCZk3YOT1we2a0PsFn/z 6Qf9+xR9gs/+fSD/AL9igCpqVvdXItru0Xy7m3ZiI5SOQRgjjIycDv3qzaPdynzLmJYF24EQfec5 5JOPpjHqc+zvsFn/AM+kH/fsUfYLP/n0g/79igCxRVf7BZ/8+kH/AH7FH2Cz/wCfSD/v2KALFFV/ sFn/AM+kH/fsUfYLP/n0g/79igCxRVf7BZ/8+kH/AH7FH2Cz/wCfSD/v2KALFFV/sFn/AM+kH/fs UfYLP/n0g/79igCxRVf7BZ/8+kH/AH7FTRxpEgSNFRR0VRgCgB1FFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFQRXtpM4jiuoXc9FWQEn8Kd9pg8/yPPj87/nnvG7p np9KAJaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACimPJHHt8x1TcwVdx xknsPen0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAZl9/oF6uojiBl8u5x6Z+VsdyDx346Cld2WG91CMJ5qBljLrnCp1XjHV gx/EemKnu0vJWaOIQeQ8ZUl87lY98YIIx2PWlubYnTZLW2VRmLykDMQAMY689qAKNpqd1O0YjEN1 uhMkixAp5TY+VSxJGScjHXvToNRn+3WttM0MjTKwcRqR5TgZK5yQT1GPpTU0y7Y22547cwW7QmSJ yzPlcDPA4B569fzog067jl05ttsqWisrKrH5sjBbOOvfH688ACXupXthZSNcG1FypDIADtkUnGBk g5HU+2PWrkE9zcXCtE0D2ija8gBy7Y6pyRjJA/A1Su9Lu7uC7aQw/aLhlVfnJWONSDgHGckjnt3q 3b2s8F/JKgjEE6hpE3H5ZO5XjBB4znk9fagCsdTuoZbdZxCHlmEbwKCWiBzglgSM4wegzzRJqtw8 tx9mi3LA/l7DC7GQj73zLwvtnPvioxpV6lvbxBoGMNz55dmIaY5JyeOD0Hf68c2Esr+0u5jZywG3 nk8xhMpLIx64xjP4n/EgDZNTnj1O3jZFW1mVMlkIdGYNtU89cr6U+61CcarBZW4jVX3BpHUthgu7 GMjsR+ftS3dhLci6jfYySwLGjM53FlyQSAMdT29OnNNksLlbmylh8qT7OHLl3Kl2fqcAHHPP40AO 0fU1vbaNppoBcOTiJDggD2JJ7Zosr+VoL6a52FbWR0xGhBIUZJ5J61XttLu1tbK1lMIS2mEpdXJL YJOMYHr61YsrCVYL6G52BbqR3zG5JAYYI5A6UARWup3UrW7tAXjnPKpDIDGD907jww9entmp9XvJ bJbd42iVZJhG5kUkKD36jpim2FtqVuEt5p4DbxDCsinzGA6A54HH1/rT9UtZ7r7N5Aj/AHMyynex GcduAfWgBxuZi5uAYlsUDFmIJZlAzuXHbOfwGRnIqB9RuYbaG+lji+yyBS6gndEGxg5/i69AB+PW pIrF4ZJ4AEawmH+r3EGPIO4AY6H6jHNRpp9zJYJp9y0TQIQC4J3OqtkDGBt4AGcn+tAD7y5u4nuj E8ISCESgNGST97jO4f3fTvS/abltLt7gNEJZTHnKEqA5A6Z7ZHftTWtb2a2ujN5H2iaEQgISEx83 OSM/xdPb34IrW98i1tn8gQxLHuKkltyMDxxjBCj6Z745AIX1Se1e/wDtIjkS0VMCNCpYt06k4FTW d7dNcxwzxF1dc+YkEkYRh1B3dR6H9Kil0qW5m1ETMiRXYTaUYllK9Mgjv9f8atWSakCPt0sBVQMe UDlz75/Pgf4EArW13qNwly6fZnaCZovL2FfM2477jgn6Gn2eoSvFdNcywoY5mgjIQ/Mw9s5JPoOe Kk0u1ntftPniP99M0o2MTjPbkD0pmm2U1q13LKkRllkaRMSEgZ/h5HHQcgc/gKAKiSz6pZabNJ5Y drsPhQQAFDe55+U1u1mafZ3dnYW1vi2Z4pcsxJPyHOSOBhucVp0AFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFMljjmQxyoroeqsMg/hQA+isXw/ZWk2jwSS2sLud2WaMEn5j3p2hxRRf2hJHAu9LqRF2qAdox8 o9v0oA2KKyYdZd7GO+ktfLtmba7eZkrzjOMcjOPf29bWo3kln5GyFZPOlEXL7cE9Ox4oAuUVSub9 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 PertFAGRZ6ZNbaLNaYiM7qyb95wQc+3GMnj/ABNTlriw0aNRGklxGqRKob5S2Qo5OPUH/Oa0KKAM PUILyOxhYQRFLORZ2xMSz7c5z8o5OSSauvazw6jJdWojZZkCyo7FcsOjZwe3GOKv0UAY/wDZMq3l vIBDIivK824kbzJwcLzwBjvzU8Ef2CKSC7lh+xliIjI+CFPRCCOQOe9aNRzQRTqEmiSRQcgOoIz+ NAFLRLbyLMt5jSLI2Y2fkiP+AZ9Mc44xk8VE+ly3CQiby0ZJpGbaxbMb5LL0HJzj9fataigDIl0q W5m1ETMiRXYTaUYllK9Mgjv9f8asWiaoB/pcls2xflEeRvOP4iRwPoP8DfooAy7WwuYdBewPlGUq 6Ahztw2eenufyourC5m0FLAeUJQqISXO3C456ew/OtSigClqNrLeW0SjYGWRJHjYnY4HVScdPw7d Kz7vS764+3823+l+XzvYbNvbpz9ePX2rdooAyNVW8eGKaSCIR20yzvslLMVXrgFQOnv2qa2sZU1a 6u5VjKy7fLw5JXAxnGMZI79uR3NaNFAGC2lXzqVIgwbz7UcTMD/u5C/rV65s5W1CxmhWJYbYMCu4 g4IxwAMcD/IrQooAij8/z5fM8vyePK253dOc/j0xUtFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFMlkjhQ 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 OT+pp9FFABRRRQAUUUUAFFFFAFKLTI4tSkvxNKZZBhgdu0j06ew/KrtFFABTIo0hiSKMYRFCqPQC n0UAMjjSJSqDALFvxJyf1NPoooAKKKKACiiigAooooAZHGkSlUGAWLfiTk/qaEjRGdlGDI25vc4A /kBT6KACiiigAooooAKKKKACiiigAooooApXml295cpcSFw6qUO08MpzkH8z0weau0UUAFFFFABR RRQAyWNJonikGUdSrD1Bp9FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUF3e21km+5mWMHpnqfoOp61PWR 4mgibSZ5jEhlUKA5UbgNw7/iaANCxu4761S5iDBHzgMOeDj+lZP/AAldj/zyuf8Avlf8an0BPM8P Qx7mTcrjcpwRljyD61JeWum2FjJM1lAViXgGMEk9AM4J5OOaAJtN1GLUonlhjkVFbblwBk/gT7Vc qlo9mbHTYoWAEmNz4A+8f546Z9qu0AFFFFAFS+1K0sFzcSgNjIQcsevb8OvSpVuY2sxdklYjH5hy OQuM9qxfF0ES2KTCJBK0wBcKNxG09/wFXRafbvDkVtnBe3Tac9wAR+GRQA5NYikga4S2uTbKxBm2 jGAeWxnJH4VdgmjuIVmhcPG4yGFcYmq3VjYy6cVjkiZXRHGcYJIJB7j73+Rius0qCO202COGQyR7 dwcjG7POcdutAFuisjXdRvNP2NbpE6FSz7wcrggZ6j+8KS81oppMV5bRqzyLu2tnCgEBvTOCQPxz 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 TW7WXYWF9HM/267E8Qk8xB3J56+g6HHYgYxjkAv20PkQLGW3MMlmxjcxOScdskk1zHhW4Fut4xil kGF/1aFjn5uMD1/L3rqm3BSUALY4BOAT9ayPD+lXOmNOJmiZZAMFGOQRnsR70AU9K0+4s9Fv2mjc STx7UjC5b7pxwOerdO2Kt+FYpYLCWKaKSJ/NLYdCuQQPX6GtqigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigDB19zBqFgRcSxRzSYlxMyrtBX3wOCelOtJ3OvGKyne4s/LBlL SF1jbnGGJ+nc9T6cJrgeTUtPaOGZ1gl3SFYmIAyp6456HpSXcBvNcs57OCWMod00zRtGCoI45Ayc ZH4+nQA2bmcW1vJOyM6xruIXGcDr1rOGvQFbdhbXOLlisXCfMQcf3uOfWrmp5Om3KqrMzRMoCqSS SMDgVzqQXC22jZtp/wDR5mMo8psqN4PTHpQBttrES3k1oLa5aaJdxVVByOOnPoc8/TrxU9vqFtcW RvI3/dKpLZHK4GSCPWshJvs/iq+k8qSQCEcRruPRO36fj6c0WOlXP/CNT20i7JZm8xVPXsQD6E7f wzQBoQaxFO8SfZrlGmQvFvUDzMdhz1+uP1FMi1yKa0kuo7S6aGM4ZgF4/DdnvWeI5bt9JX7PcxLZ pvlZ4iPu44HqTt7ev1q14VilgsJYpopIn80th0K5BA9foaALLaxEt5NaC2uWmiXcVVQcjjpz6HPP 068VLHqlo9h9u83EIxuJGSp6YIHfmspJvs/iq+k8qSQCEcRruPRO36fj6c07TbS5svD0wktFmldj IsDjPHHUevGcf1oA0IdVhkvI7Vo5I5JU8xN20hh7FSfQ/lRZarBe3UtsqSRzRZ3K4HY4PIJ71kWl tOmradcNBc+X5W12ZD8rYORgfdUFgBwBx+NSzWc80ltd2fmRXAuJELNEeEZmbdhuwBP5460AXn1y 3FxcQRxTStbqzSFQoAA69SOlT2mp213ZPdoWWKPO/cOVwMnp7elYkkDQ6lqPl20/ktamCIiJyCQq gDOPbrVuOxePWJpk3iylVbiRfLOS4JIHrnPzYH0xQBctNYtrq0lusPFBEcM8mBz7YJ9R+dPtdThu JkhKvFJJGJY1kx86nuME+nTrWLp1jcy+Hbyz8l452kDKsilcj5TwT/umr2k2sJ+yzG0nW4ijCu8x cbOCMAHg554HAHpwCAXtN1CLUoGmhV1VW2kOADnAPY+9W6qabdy3kDSTWr2zBtoR85IwOeQPX9Kt 0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFZN7Gq6/prgtl/NzliRwnYdB+Fa1ABRWbqjNLd2diWIhu S/m7TgsFGcZ9D3qf+z7dJ4ZYI0hMbFiEXAb5SOcfXr9fWgBsWmRxalJfiaUyyDDA7dpHp09h+VXa zptVSPzJRHutoZfKlk3co3rtxyMkDrn2p1zqPlPOsUXm/ZlDT/NtKg88ccnAJ6igC/RWddalJELe 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 q6fbLBJAqMsUn3kEjAdc4AzwOegobT7Z7eK3ZGMcLBox5jZUjpznPGatUUAU00uzTpGx/eibmRj8 4/i5PX+dXKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiqUj3ovFhS aAK6u4JhJIAKjH3ufvfpWf8A2pff25/Zm62/66eU393d03f1oA3aKidZzEojkjWTjczRkg/QZGPz rMuL6+g0cahvtmyiPs8ph97Hfd70AbFFZ+j3Nze2kd1M0QVwcIiEEEHHUk+npVd9VnudW+w6ekZE efOklBwMHBwMjp09/pzQBsUVhX2qX1pqlvZbrZ/O2/P5TDGWx03VtRCQIBKys/cqu0flk/zoAfRW FfapfWmqW9lutn87b8/lMMZbHTdVvVLi9sbB7kSQOYwMqYiMktj+9x1HrQBpUVn6Pc3N7aR3UzRB XBwiIQQQcdST6elP1e/GnWLTgBnJCopzgsf8k/hQBdoqK2uI7q3jniOUkXI9vb61ka5ql7pbRFDB IspbAMZBUDHfdz1oA3KKoXTX1vazT+fbN5aM+PIYZwM/36raPfX2p2rT77aLa5THlM3YH+8PWgDY orCsdUvrvVLiy3WyeTu+fymOcNjpuqex1aR79tOvYljuV6NGcq/f8OOf8OlAGtRWbqOrx2N9a2z4 xKcyMf4F6A+nX9Aa0G3FSEIDY4JGQD9KAHUVhf2pff25/Zm62/66eU393d03f1qRdWubbV1sL6OL bKR5cseRwc4yOep49qANmio5hKVAhdEbPJdCwx9ARWXcX19Bo41DfbNlEfZ5TD72O+73oA2KKzNN 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 ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKZLJHChkldUQdWY4A/Gn0UAVf7Ssf+f22/7+r/jUkN3bTsUh uIpGAyQjgnH4Vj2Sqni69CqFHk5wBjk7CateILJZ7F7hMJcQDzFkHBwvOM9fX8cUAalFUtGuZLzS 4J5iDIwIJAxnBIz+lTw3dtOxSG4ikYDJCOCcfhQBNRUM13bQMEmuIo2IyA7gHH41H/aVj/z+23/f 1f8AGgC1RUEt7aQuY5bqFHHVWkAI/Clku7aJUeS4iRXGULOAGHt60ATUVHDPFOpeGVJFBwSjAjP4 U2a7toGCTXEUbEZAdwDj8aAJqKazKil3YKqjJJOABVf+0rH/AJ/bb/v6v+NAFqioobmC43eRPHLt 67HDY/Kg3MAR5DPGEjba7FxhT6E9jQBLRTIpI5kEkTq6HoynIP40k08UCh5pUjUnALsAM/jQBJRU cM8U6l4ZUkUHBKMCM/hUTX9kjFHu4FZTggyAEH86ALNFQzXdtAwSa4ijYjIDuAcfjQbu2WFZjcRC JjgOXG0n6/gaAJqKhju7aVXeO4idUGXKuCFHv6UkV7aTOI4rqF3PRVkBJ/CgCeio5p4oFDzSpGpO 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 G2EbPfitOa11NbitfYi0h7iWS7kuHJPmbNu7IUjPT0GCPyqxHe2l1NLa71Z1JRkYfe9cZ696zi81 laQaVEQ15Kp+YMQqAk85/P8AL85IbW2FwscaqtvY/M0hx80mO59hyefT0olCLbk/l/n8wTew+8s0 ERFyXkt0O5JASZIfx6kfy9x0SyvZYJ47O8ZXDjMFwDxKOMD6/wCfrbt76OVQ74iWRsQ72AMg45A9 8/y9ap3tnHDE6Mhexc5ZV6wH+8vt6jt9MiiLv7k/6/4P5+o7dUa1FZunXE8cxsromQgZinHSQf44 /kfTJ0q55xcXYadwoooqRhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUjMqKWY hVAySegFAC1FJcwREiSZFI5wWGarQtPfjzCXgtz9xVOHf3J7D6VYitYISDHEobn5sZPPv1q7JbgR /wBo2mQDLjPGSpA/PFU5MXdwZA2VlfyEAOMoOWI9c4Iq5qEhWAxIR5s3yID79T+AqrZ2Yi1E+TxD AgQg92IySPQ9M1pGyXMhGpRRRWAwooooAKKKKACiiigAqnAPtN01yeY4/ki/qf6fhT72RljEUf8A rZTtXnGPU/gKVEVAtvEpEaj5j/T61a0VxEi/vH35O1eF9/epKQAAAAYA7Uy4mS3geaQ4VBk/4VO7 shlLU55XdLC1JWeUZZwP9Wnc5/T/ACKWxtkIQqp+zwjbCpwdx7yfj2/PvVKzikmkYykfaLz53ZT9 yEY4HcZ6fT6Vd1S7aygijhVUMjbFdhhI/r/T/wCtXS42tTjv/X9f8ORe+o651CBJZYHikkWNR5xV MqgPr+FVbmMIsJiuWWABvLnDb9hyDz/s4GOSe3pRL5jXcbSuttfhdsbAkxTDP3f/AK3XnPNT6VDP E9x5tuLeFyGSIMGAOPm6fhRZQjdf1/X/AA4ndiwWf2mOKe5Vo5io81RjEmDxuGP85xTpL5nuTbWk fmujDzXzhYxnn8f89iKZJNJfzvbW52wxkrNJjnIx8o/z/wDXuwwx28QjhQIg6AVEnbWW/bsNLsVo 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 tNUJNFt7KNrn7QryRyEjcVb7wGOD7cdsVV16TyoLeQgELOCQRnjDVYS7ldQy23mqRkPDIrKeT3JF MuRDdw7Lq1nwrZC4Oc465U47nvRBtSTl0B2syG3jVdfuXLDc6AbfUYX2+vf8KbaN9juJIjazyHzN iOi5VVwMA5PHGMnvjvipIPKiYyQ6bcBsKuSFzgDA6t6VZNzLjP2OVfd3QAfXDHj8Kpye3kkJLqJe WzyzW00RVXikyS39w/eA9+lF1Z2kri4uVHyDBLMQuAc8jp3PX1qjPqwXcGu4EwM4gUzHH+9wAe3I qFDLduDb2bXAIBWe8YlRnk/L09vlpxpzSTbtYbaL5vV8o/ZFjESDHnSHZEOcYHr+HHvVGOaW5uQ1 mjXEuD/pMwIjTIHCr27e/wBRzVuPSjKwl1Cd7iTGNoYqg4wcAf8A1s+laKqqKFUBVAwABgAVLnCH w6/1+P4Ds2U7HTo7QmR3ae4b70r8n8PSrtFFYyk5O7KSsFFFFSAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABUUltBK4eSGNnHRioyPxqWimm1sBnnRrIKBGjRlTlSrE4/A5H6UqaXsUqL69IPP Mv19ver9FX7WfVi5UU109fMdpLi4lDqVKvJxgnnpiq8Ph/T4/vI8p9Xc/wBMVqUUKrNbMLIr21la 2gHkQIhxjcBk/n1qxRRUNt6sYUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//ZCmVuZHN0cmVhbQplbmRvYmoKMyAw IG9iago8PC9MZW5ndGggNjgvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJwr5CpUMLU0VTAA QgsTQz1zcxBTz9DQxMREITlXQT8zN91AwSVfIZArkKuQyymEy9hMwcLATCEkhcs1BCgGAMqkDewK ZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L1R5cGUvUGFnZS9NZWRpYUJveFswIDAgNTk1IDg0 Ml0vUmVzb3VyY2VzPDwvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdl SV0vWE9iamVjdDw8L2ltZzAgMiAwIFI+Pj4+L0NvbnRlbnRzIDMgMCBSL1BhcmVudCA0IDAgUj4+ CmVuZG9iago0IDAgb2JqCjw8L1R5cGUvUGFnZXMvQ291bnQgMS9LaWRzWzUgMCBSXS9JVFhUKDUu MS4zKT4+CmVuZG9iago2IDAgb2JqCjw8L1R5cGUvQ2F0YWxvZy9QYWdlcyA0IDAgUj4+CmVuZG9i ago3IDAgb2JqCjw8L1Byb2R1Y2VyKGNvbnZlcnRmaWxlb25saW5lLmNvbSkvQ3JlYXRpb25EYXRl KEQ6MjAxNDAyMTcxNDIyMjQrMDEnMDAnKS9Nb2REYXRlKEQ6MjAxNDAyMTcxNDIyMjQrMDEnMDAn KT4+CmVuZG9iagp4cmVmCjAgOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAg biAKMDAwMDAwMjcwMyAwMDAwMCBuIAowMDAwMTMwMDcxIDAwMDAwIG4gCjAwMDAxMzAzNjcgMDAw MDAgbiAKMDAwMDEzMDIwNSAwMDAwMCBuIAowMDAwMTMwNDMwIDAwMDAwIG4gCjAwMDAxMzA0NzUg MDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDgvUm9vdCA2IDAgUi9JbmZvIDcgMCBSL0lEIFs8MzY1 YWI1OTIxZDViOGQ3OTNjODNhMzQxNjYyYmQ3YmE+PDcxZWE1ZDVhYWFjNzdlZDQ5ZmU1YzE1MDJi ODRmNDBjPl0+PgpzdGFydHhyZWYKMTMwNTk4CiUlRU9GCg== ------=_NextPart_000_0903_01CF2C77.A6D12B10-- From paola.massignani@ulss5.it Fri May 2 08:47:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 01C6D7F55 for ; Fri, 2 May 2014 08:47:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9EED6AC005 for ; Fri, 2 May 2014 06:47:03 -0700 (PDT) X-ASG-Debug-ID: 1399038407-04bdf02b8b255d80001-NocioJ Received: from webmail.ulss5.it (webmail.ulss5.it [2.228.92.141]) by cuda.sgi.com with ESMTP id 99tyKOPGhEk83Yz4 for ; Fri, 02 May 2014 06:46:48 -0700 (PDT) X-Barracuda-Envelope-From: paola.massignani@ulss5.it X-Barracuda-Apparent-Source-IP: 2.228.92.141 Received: from localhost (localhost [127.0.0.1]) by webmail.ulss5.it (Postfix) with ESMTP id 8A2E11C469; Fri, 2 May 2014 15:46:24 +0200 (CEST) X-Virus-Scanned: amavisd-new at ulss5.it Received: from webmail.ulss5.it ([127.0.0.1]) by localhost (webmail.ulss5.it [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IKjvdFXUKqTm; Fri, 2 May 2014 15:46:19 +0200 (CEST) Received: from webmail.ulss5.it (webmail.ulss5.it [10.1.7.24]) by webmail.ulss5.it (Postfix) with ESMTP id BCCE51C1C7; Fri, 2 May 2014 15:44:47 +0200 (CEST) Date: Fri, 2 May 2014 15:44:47 +0200 (CEST) From: ING ONLINE Message-ID: <2044357796.473952.1399038287717.JavaMail.root@ulss5.it> Subject: Dringend! MIME-Version: 1.0 X-ASG-Orig-Subj: Dringend! Content-Type: multipart/alternative; boundary="----=_Part_473951_229346702.1399038287715" X-Mailer: Zimbra 7.2.3_GA_2872 (zclient/7.2.3_GA_2872) To: undisclosed-recipients:; X-Barracuda-Connect: webmail.ulss5.it[2.228.92.141] X-Barracuda-Start-Time: 1399038407 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_SC7_SA578_CH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5468 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH ------=_Part_473951_229346702.1399038287715 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Geachte ING Client, =20 Houdt u er rekening mee dat de toegang tot uw online-account dreigt te verl= open.Om de toegang tot uw=20 online account actief te houden, vragen wij u dan gelieve om zo snel mogeli= jk in te loggen.Gebruik de=20 onderstaande link om verder te gaan en toegang te krijgen tot uw account. Nadat u gebruik heeft gemaakt van de onderstaande link zal er door =C3=A9= =C3=A9n van onze medewerkers nog=20 contact met u worden opgenomen om het gehele proces te voltooien. Wanneer h= et gehele proces gereed=20 is zal u weer als vanouds gebruik kunnen maken van uw ING-online. Klik hier Met toegang tot uw ING online kunt u het grootste gedeelte van uw bankverri= chtingen=20 uitvoeren door u aan te melden op het onlinebankieren. =20 Wij willen u alvast bedanken voor uw medewerking ING. Hoogachtend, =20 Klantenservice ------=_Part_473951_229346702.1399038287715 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Geachte ING Client,
 =
Houdt u er rekening mee dat de toegang tot uw online-account dreigt te = verlopen.Om de toegang tot uw
online account actief te houden, vragen w= ij u dan gelieve om zo snel mogelijk in te loggen.Gebruik de
onderstaan= de link om verder te gaan en toegang te krijgen tot uw account.

Nada= t u gebruik heeft gemaakt van de onderstaande link zal er door =C3=A9=C3=A9= n van onze medewerkers nog
contact met u worden opgenomen om het gehele= proces te voltooien. Wanneer het gehele proces gereed
is zal u weer al= s vanouds gebruik kunnen maken van uw ING-online.

Klik hier
Met toegang tot uw ING online kunt u het grootste gedeelte van uw bankverr= ichtingen
uitvoeren door u aan te melden op het onlinebankieren.
&nb= sp;
Wij willen u alvast bedanken voor uw medewerking ING.

Hoogach= tend,
 
Klantenservice ------=_Part_473951_229346702.1399038287715-- From mp6058@gmail.com Fri May 2 08:47:54 2014 Return-Path: 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,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 0FD917F57 for ; Fri, 2 May 2014 08:47:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8EB130405F for ; Fri, 2 May 2014 06:47:50 -0700 (PDT) X-ASG-Debug-ID: 1399038468-04cbb03cc6246ac0001-NocioJ Received: from mail-ee0-f50.google.com (mail-ee0-f50.google.com [74.125.83.50]) by cuda.sgi.com with ESMTP id QpVL63xDKNRm1ACC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 06:47:49 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.50 Received: by mail-ee0-f50.google.com with SMTP id c13so3223409eek.9 for ; Fri, 02 May 2014 06:47:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=wBnm5dz5inPqDxtinHFHmxUDiKaBw2H5Rn16XW9evfY=; b=p4hPeMVJof7xvo5CWHyeQB/4EPnQsW2glaJHJM+B0mMw37j9MUuPNuSTii/ne285Xl uvgqMVoqnDkhXRUFvs2oibFTnuoMLuDmmXqQrVr2DW4ACQKd8FUxu0fOGqVY9rkeTPCt xe/l2auMZ/zuKTXua2mFR7lR5LsT9jNSB97QpJRQHukOwUL0Ur4bodxpG1BWQC7yyNSH fm/rAvs+m7y1IhBvOscfugNtdEQRBSbPOPJJR1byUiQ7yJrHKkZbd5QoJ6zShG03ADou rG7S36N4TdMo2PmIRL3zbO0OuqUOvHre/xmQr5pL0DbBuyy6ot4KcfO0QypdKvnEwcVj 2oMw== X-Received: by 10.14.198.197 with SMTP id v45mr15325571een.9.1399038467693; Fri, 02 May 2014 06:47:47 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id q41sm4745878eez.7.2014.05.02.06.47.29 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 06:47:47 -0700 (PDT) Message-ID: <5363A1D8.2020402@gmail.com> Date: Fri, 02 May 2014 16:47:04 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: XFS filesystem claims to be mounted after a disconnect X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: XFS filesystem claims to be mounted after a disconnect Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f50.google.com[74.125.83.50] X-Barracuda-Start-Time: 1399038468 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.5468 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: SHA512 I ran into a problem using XFS. The USB device on which I have an XFS file system got disconnected and xfs_repair and xfs_check fail with a message saying the file system is mounted writable. There is no entry in /etc/mtab or /proc/mounts. However I see messages in the kernel log (dmesg) about write failures to the disconnected drive. Please let me know what I can do short of zeroing the log, which I believe would result in some data loss. Martin # xfs_repair /dev/sdd104 xfs_repair: /dev/sdd104 contains a mounted filesystem fatal error -- couldn't initialize XFS library # xfs_check /dev/sdd104 xfs_check: /dev/sdd104 contains a mounted and writable filesystem fatal error -- couldn't initialize XFS library partial dmesg output: [346220.652432] Buffer I/O error on device sdb104, logical block 3906961152 [346220.652440] Buffer I/O error on device sdb104, logical block 3906961153 [346220.652443] Buffer I/O error on device sdb104, logical block 3906961154 [346220.652446] Buffer I/O error on device sdb104, logical block 3906961155 [346220.652449] Buffer I/O error on device sdb104, logical block 3906961156 [346220.652452] Buffer I/O error on device sdb104, logical block 3906961157 [346220.652455] Buffer I/O error on device sdb104, logical block 3906961158 [346220.652459] Buffer I/O error on device sdb104, logical block 3906961159 [346220.652473] Buffer I/O error on device sdb104, logical block 3906961352 [346220.652476] Buffer I/O error on device sdb104, logical block 3906961353 [346554.917502] quiet_error: 1924 callbacks suppressed [346554.917510] Buffer I/O error on device sdb104, logical block 0 [346554.917518] Buffer I/O error on device sdb104, logical block 1 [346554.917522] Buffer I/O error on device sdb104, logical block 2 [346554.917525] Buffer I/O error on device sdb104, logical block 3 [346554.917529] Buffer I/O error on device sdb104, logical block 4 [346554.917532] Buffer I/O error on device sdb104, logical block 5 [346554.917536] Buffer I/O error on device sdb104, logical block 6 [346554.917539] Buffer I/O error on device sdb104, logical block 7 [346554.951030] Buffer I/O error on device sdb104, logical block 3906961152 [346554.951051] Buffer I/O error on device sdb104, logical block 3906961153 The current disk is /dev/sdd104 and sdb104 doesn't appear anywhere in the kernel, despite the messages in dmesg. # cat /proc/partitions major minor #blocks name 7 0 131072 loop0 8 0 488386584 sda 8 1 204800 sda1 8 2 104384512 sda2 8 3 1 sda3 8 4 15471640 sda4 8 5 30403584 sda5 8 6 104391 sda6 8 7 117187584 sda7 11 0 1048575 sr0 8 64 1953481728 sde 8 75 1953480687 sde11 8 80 312571224 sdf 8 48 1953481728 sdd 259 0 1953480687 sdd104 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY6GrAAoJELsEaSRwbVYrTwcQAKNYds36X3wUssi1Zbcn+AXi UJuvx3QYVY6OF7huitlM/m9Ih9gOfFVQEbVvHEqoHXwEx2y6a5/KzCGoSHSXsxUj KLFgXxgbdTsGEIePfW3R1v3JyY9TmuDx/U39gMPuM2nRy2sFCXc6HpBJFfUJf4uo GY1y+w+LzFE2bTQYG+F0sWhUnBWq9klGoTsZYsghEpLNnaLgdrHLqpJkgb8RIy2C O1sCbRD+Crs/a5W2ijCNOTchU1yV8oJOK4D7HkyyFUMqG2XRUkeRMntA93r9byo9 kYlzNJUbSPB2onzRacq5ygMKp816+e7sQaBFuYTZQB6IQRk3NGf6PWKwLBO+pY3d 2lqbjkt12jtuth6xlxiUHps83D8X/tEWz0a8oQMfjIyAoZZJTCZdg/Hd9HyVUg5A mWPu4UpvXDsTCY/rt3owJrL+VCCxPXumpgAnKc7EiMjbjZBMDIK9YwvEpWSrtt8H Ak11w4bdCoML/oDIK8LV/SHGinSHAC/sOaEBSX5IfvQeIeohoK7cN400jYFzkMgu p5ZsiEtRHwl2tnZ9bgm52TYUH6KMI1qGuTPJoOWfKe7XgXAzmx+ppnzuUtDGKi1y NXNHuD18J8InFCI08mIKaCkIg9yA/6c7Mhq2EaS+QeURcUNyUsi3J2Q7+wv34JJ0 i8TsGzSUYkqrWwDLa1+c =gR4I -----END PGP SIGNATURE----- From sandeen@sandeen.net Fri May 2 10:06:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CAB1E7F55 for ; Fri, 2 May 2014 10:06:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60382AC002 for ; Fri, 2 May 2014 08:06:52 -0700 (PDT) X-ASG-Debug-ID: 1399043206-04cb6c1fcc10d5a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id WQ7CC3vYqTXRCTtC for ; Fri, 02 May 2014 08:06:46 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 495C863C5FF1; Fri, 2 May 2014 10:04:48 -0500 (CDT) Message-ID: <5363B416.2010905@sandeen.net> Date: Fri, 02 May 2014 10:04:54 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363A1D8.2020402@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399043206 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.5470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/2/14, 8:47 AM, Martin Papik wrote: > > > I ran into a problem using XFS. The USB device on which I have an XFS > file system got disconnected and xfs_repair and xfs_check fail with a > message saying the file system is mounted writable. There is no entry > in /etc/mtab or /proc/mounts. However I see messages in the kernel log > (dmesg) about write failures to the disconnected drive. > platform_check_iswritable() and platform_check_ismounted() in xfsprogs check these things. platform_check_ismounted() does a ustat() of the block device, "ustat() returns information about a mounted file system" and it knows if it's mounted or not, "EINVAL: dev does not refer to a device containing a mounted file system." so something, somewhere thinks it's mounted. Check /proc/mounts? > Please let me know what I can do short of zeroing the log, which I > believe would result in some data loss. Hate to say it, but a reboot may be simplest. Zeroing the log won't help. - -Eric > Martin > > > # xfs_repair /dev/sdd104 > xfs_repair: /dev/sdd104 contains a mounted filesystem > > fatal error -- couldn't initialize XFS library > # xfs_check /dev/sdd104 > xfs_check: /dev/sdd104 contains a mounted and writable filesystem > > fatal error -- couldn't initialize XFS library > > > partial dmesg output: > > [346220.652432] Buffer I/O error on device sdb104, logical block > 3906961152 > [346220.652440] Buffer I/O error on device sdb104, logical block > 3906961153 > [346220.652443] Buffer I/O error on device sdb104, logical block > 3906961154 > [346220.652446] Buffer I/O error on device sdb104, logical block > 3906961155 > [346220.652449] Buffer I/O error on device sdb104, logical block > 3906961156 > [346220.652452] Buffer I/O error on device sdb104, logical block > 3906961157 > [346220.652455] Buffer I/O error on device sdb104, logical block > 3906961158 > [346220.652459] Buffer I/O error on device sdb104, logical block > 3906961159 > [346220.652473] Buffer I/O error on device sdb104, logical block > 3906961352 > [346220.652476] Buffer I/O error on device sdb104, logical block > 3906961353 > [346554.917502] quiet_error: 1924 callbacks suppressed > [346554.917510] Buffer I/O error on device sdb104, logical block 0 > [346554.917518] Buffer I/O error on device sdb104, logical block 1 > [346554.917522] Buffer I/O error on device sdb104, logical block 2 > [346554.917525] Buffer I/O error on device sdb104, logical block 3 > [346554.917529] Buffer I/O error on device sdb104, logical block 4 > [346554.917532] Buffer I/O error on device sdb104, logical block 5 > [346554.917536] Buffer I/O error on device sdb104, logical block 6 > [346554.917539] Buffer I/O error on device sdb104, logical block 7 > [346554.951030] Buffer I/O error on device sdb104, logical block > 3906961152 > [346554.951051] Buffer I/O error on device sdb104, logical block > 3906961153 > > The current disk is /dev/sdd104 and sdb104 doesn't appear anywhere in > the kernel, despite the messages in dmesg. > > # cat /proc/partitions > major minor #blocks name > > 7 0 131072 loop0 > 8 0 488386584 sda > 8 1 204800 sda1 > 8 2 104384512 sda2 > 8 3 1 sda3 > 8 4 15471640 sda4 > 8 5 30403584 sda5 > 8 6 104391 sda6 > 8 7 117187584 sda7 > 11 0 1048575 sr0 > 8 64 1953481728 sde > 8 75 1953480687 sde11 > 8 80 312571224 sdf > 8 48 1953481728 sdd > 259 0 1953480687 sdd104 > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTY7QVAAoJECCuFpLhPd7gh8sP/3etms+dvasiiUX6dEwoGf4C uiZarjqYG6liwMgBgtsfBfHs35p5r70kab55kf6keAx0zIvFewQbyCGKZ931Ok1B c0XgXaBVrSCzEtgRAJjJMDnIguEOCn0E/duIkjRcq7Gp8lcb1C83yr9fJ16HMYaz xdYy1Gc3VeDmVAZ3Bf3ojXu1Uqeaa0QZjFSTx7cdUXtsftxtIO906snqU+xc8+pr BPwzneWntEYiR8Fy5ZyjFCwnhlLnfRwu/EivUkLCcNIBHANko12Uzf/0t0xvcTGQ z+VZzmZF5Us8ytFsTqfP6a55jQeWU5p2jr7flRSLnjDZ3RK3wUXIK1Yvngq+zTc6 57o2EhNNBTjqLkIzqDG5rAJYVNsv/9gIR3u7QzbdpzquwSHborfUDLS9Ss3saK8D Qk7FgyM72sNyI5KntO0/HFc443Qvj3ptWfgFengCSd8pDklnIGMC2ykT2MRVazm4 QmeX9XCQ40SZ6y/X67dMrR6hLMSbij7XXZkRjOAFTWkePLNvo2RjzHBW8gFEybHM d/uFP5HWGtKqUEgwUoQWQ+U/MENv878UqT1Hq7XRNtt+TCWNQQOzuAMbdUSniuCG V1WFVZEKsKqmzBJ5bdOLXmkUPXcV73Ou2vvTfRqDCHcPIKJTd9Yq/lNZAE5I6NiE mM4LhitVZUvUn/94NGvX =m/u5 -----END PGP SIGNATURE----- From sandeen@sandeen.net Fri May 2 10:09:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1823D7F37 for ; Fri, 2 May 2014 10:09:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0E2FAC002 for ; Fri, 2 May 2014 08:09:31 -0700 (PDT) X-ASG-Debug-ID: 1399043370-04cb6c729025f8c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TLvAXteJq9g1Z3SG for ; Fri, 02 May 2014 08:09:30 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0F69663C5FF1; Fri, 2 May 2014 10:07:47 -0500 (CDT) Message-ID: <5363B4C9.4000900@sandeen.net> Date: Fri, 02 May 2014 10:07:53 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363A1D8.2020402@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399043370 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.5470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/2/14, 8:47 AM, Martin Papik wrote: > > > I ran into a problem using XFS. The USB device on which I have an XFS > file system got disconnected and xfs_repair and xfs_check fail with a > message saying the file system is mounted writable. There is no entry > in /etc/mtab or /proc/mounts. However I see messages in the kernel log > (dmesg) about write failures to the disconnected drive. platform_check_iswritable() and platform_check_ismounted() in xfsprogs check these things. platform_check_ismounted() does a ustat() of the block device, "ustat() returns information about a mounted file system" and it knows if it's mounted or not, "EINVAL: dev does not refer to a device containing a mounted file system." so something, somewhere thinks it's mounted. Check /proc/mounts? > Please let me know what I can do short of zeroing the log, which I > believe would result in some data loss. Hate to say it, but a reboot may be simplest. Zeroing the log won't help. OTOH, if you lost USB connectivity, you already lost some data. - -Eric > Martin > > > # xfs_repair /dev/sdd104 > xfs_repair: /dev/sdd104 contains a mounted filesystem > > fatal error -- couldn't initialize XFS library > # xfs_check /dev/sdd104 > xfs_check: /dev/sdd104 contains a mounted and writable filesystem > > fatal error -- couldn't initialize XFS library > > > partial dmesg output: > > [346220.652432] Buffer I/O error on device sdb104, logical block > 3906961152 > [346220.652440] Buffer I/O error on device sdb104, logical block > 3906961153 > [346220.652443] Buffer I/O error on device sdb104, logical block > 3906961154 > [346220.652446] Buffer I/O error on device sdb104, logical block > 3906961155 > [346220.652449] Buffer I/O error on device sdb104, logical block > 3906961156 > [346220.652452] Buffer I/O error on device sdb104, logical block > 3906961157 > [346220.652455] Buffer I/O error on device sdb104, logical block > 3906961158 > [346220.652459] Buffer I/O error on device sdb104, logical block > 3906961159 > [346220.652473] Buffer I/O error on device sdb104, logical block > 3906961352 > [346220.652476] Buffer I/O error on device sdb104, logical block > 3906961353 > [346554.917502] quiet_error: 1924 callbacks suppressed > [346554.917510] Buffer I/O error on device sdb104, logical block 0 > [346554.917518] Buffer I/O error on device sdb104, logical block 1 > [346554.917522] Buffer I/O error on device sdb104, logical block 2 > [346554.917525] Buffer I/O error on device sdb104, logical block 3 > [346554.917529] Buffer I/O error on device sdb104, logical block 4 > [346554.917532] Buffer I/O error on device sdb104, logical block 5 > [346554.917536] Buffer I/O error on device sdb104, logical block 6 > [346554.917539] Buffer I/O error on device sdb104, logical block 7 > [346554.951030] Buffer I/O error on device sdb104, logical block > 3906961152 > [346554.951051] Buffer I/O error on device sdb104, logical block > 3906961153 > > The current disk is /dev/sdd104 and sdb104 doesn't appear anywhere in > the kernel, despite the messages in dmesg. > > # cat /proc/partitions > major minor #blocks name > > 7 0 131072 loop0 > 8 0 488386584 sda > 8 1 204800 sda1 > 8 2 104384512 sda2 > 8 3 1 sda3 > 8 4 15471640 sda4 > 8 5 30403584 sda5 > 8 6 104391 sda6 > 8 7 117187584 sda7 > 11 0 1048575 sr0 > 8 64 1953481728 sde > 8 75 1953480687 sde11 > 8 80 312571224 sdf > 8 48 1953481728 sdd > 259 0 1953480687 sdd104 > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTY7TIAAoJECCuFpLhPd7gXMYP/1ZAyFdFXLxGUh8aFjN6R38J hguYWXYWgsZFYc4bl1tLrph74AiPdYFZ3GusNdot9+RL0lW3Fxv1WpXZxvgaKKcV v7eZ8BtI88Gq5JwwnjkozOPCgc7CBifN8AYYWawgGearaTauHRZAwB7WhKkCY3dc 0JGJ7M0OnYHkTti1YluhB01f8zAhdFgjiMp9eQpg+2QgdYE3VJa451ZWG1hcAuQU QCCl/N517GoNMIXo/iq7q0l9BDFyF7Ck8uFjxY3DjT3OG8rg7wjyDnECQf5/qUU2 A7UIOte+7cfnfOaHnkZFHD2OtJSyZVAY31fSVUrJZSR2dQ1hiAVQrVv3IJwCMZW/ euD7geYmFR4WHi2Sqy0uerM9n/2YluVDHSn56DqXU7ttJOlmrgJjsapxUnMSAa1J fRay12deZMP02o9sZsIa0CbaeW74fZkUUPMxBrn6SbicjwjbGpab/KqAOMZdZ6G/ 241jR83km9MceBv+I9CqkA4V8eH0jTBxNzzQhRkIhjMn4FbdU/e3OxUlzz+gwkly dB5sGtJpb1yRs+btKuaD7HeA6ta98Id4J6GISA76HvyPIdqa6753sycC62JI+HhI YJeG4p8G52QH0tB8rP7sPYuifGkKYlFXGa0qufWDMKoYvPkMe+ikJdUiKghsaFzX Qrw28Kc6weAYMMTEpi9f =YSyU -----END PGP SIGNATURE----- From tinguely@sgi.com Fri May 2 10:44:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 387557F57 for ; Fri, 2 May 2014 10:44:38 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0187D8F8039; Fri, 2 May 2014 08:44:34 -0700 (PDT) Message-ID: <5363BD62.7050707@sgi.com> Date: Fri, 02 May 2014 10:44:34 -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: Eric Sandeen CC: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> In-Reply-To: <5363B4C9.4000900@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Please do a "ps -ef" before umount to see if the unmount is hung. --Mark. On 05/02/14 10:07, Eric Sandeen wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 5/2/14, 8:47 AM, Martin Papik wrote: >> >> >> I ran into a problem using XFS. The USB device on which I have an XFS >> file system got disconnected and xfs_repair and xfs_check fail with a >> message saying the file system is mounted writable. There is no entry >> in /etc/mtab or /proc/mounts. However I see messages in the kernel log >> (dmesg) about write failures to the disconnected drive. > > platform_check_iswritable() and platform_check_ismounted() in xfsprogs check > these things. > > platform_check_ismounted() does a ustat() of the block device, > "ustat() returns information about a mounted file system" > and it knows if it's mounted or not, > "EINVAL: dev does not refer to a device containing a mounted file system." > > so something, somewhere thinks it's mounted. Check /proc/mounts? > >> Please let me know what I can do short of zeroing the log, which I >> believe would result in some data loss. > > Hate to say it, but a reboot may be simplest. Zeroing the log won't > help. OTOH, if you lost USB connectivity, you already lost some data. > > - -Eric > > > >> Martin >> From mp6058@gmail.com Fri May 2 11:26:35 2014 Return-Path: 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,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 02E497F59 for ; Fri, 2 May 2014 11:26:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D86B730404E for ; Fri, 2 May 2014 09:26:31 -0700 (PDT) X-ASG-Debug-ID: 1399047989-04cb6c728f265320001-NocioJ Received: from mail-ee0-f41.google.com (mail-ee0-f41.google.com [74.125.83.41]) by cuda.sgi.com with ESMTP id MDxPXrmSbkYd2w7s (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 09:26:29 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.41 Received: by mail-ee0-f41.google.com with SMTP id d49so576663eek.14 for ; Fri, 02 May 2014 09:26:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=1FKqs2VZgt+W16QFKn+mr60aVTMNDh/6aAk7IQsrb1I=; b=xRX9kpUP7JGRyTH8P/fx0hP/bux/Vp217tz/kds0P3tw4u5wZn4GEFVCT4WVgrYzg+ tFRvLXkPZOnScv9n7qx6ps3sM2lrK3tq18S9EcheE1GThpeMDTtCi/firc5kTqMBHUPG rlEuGNXG7JqaYKN2AakT+ycJv0aOgj7TtVgAEwWpM3PsQBRsMnOe39VCFBIIxmP0jgaF WcZ963hh6fwXlj3s81hS04pFrXw9pxiycfLhv7jEEVJ8AIW99y63Cac8NnPn2xNRCgPt st20B1jgnA+TNVLN7WKvnyoq8pJUrlKwpuXs5KrnEufINCd5ZMRsoDi4QwkXx8NOv75P XwZA== X-Received: by 10.15.91.77 with SMTP id r53mr15947744eez.70.1399047988555; Fri, 02 May 2014 09:26:28 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id 4sm5709219eeq.33.2014.05.02.09.26.26 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 09:26:27 -0700 (PDT) Message-ID: <5363C734.6050901@gmail.com> Date: Fri, 02 May 2014 19:26:28 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363BD62.7050707@sgi.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363BD62.7050707@sgi.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f41.google.com[74.125.83.41] X-Barracuda-Start-Time: 1399047989 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.5472 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: SHA512 On 05/02/2014 06:44 PM, Mark Tinguely wrote: > > Please do a "ps -ef" before umount to see if the unmount is hung. > > --Mark. Can't do that any more, I think I've figured out part of the problem and "resolved" it. There's nothing in "ps -ef" any more, maybe there was. What seemed to be the problem was that after the device got disconnected the xfs module was still aware of the mount, even though I could not see it in /proc/mounts or find any other trace of it anywhere. After I went through all processes which had a working directory on the mounted device and changed it to something else the xfs was able to complete its job. But before then it wasn't allowing me to do anything. It's strange that I didn't see xfs mounted (/proc/mounts) or was able to see any directories (find /proc -type l -ls | grep ) used. Any idea why this is? Personally I think this is some kind of a bug. IMHO the xfs driver should be able to inform the user/admin that the filesystem is still in use. Below is what appeared in the kernel log after the last process stopped using the filesystem. One more question, even though in this case it's moot now, is there any possibility of telling xfs that device sdd104 is the new sdb104 and tell it to resume writing where it left off? I know there are risks involved, especially if the USB device device doesn't report write completion correctly (FUA). But I'd like to know. I believe that in this case it would have been safe, the filesystem was idle for at least an hour before the USB disconnected. Martin [352505.707397] XFS (sdb104): metadata I/O error: block 0x7470230c ("xlog_iodone") error 19 numblks 64 [352505.707415] XFS (sdb104): xfs_do_force_shutdown(0x2) called from line 1115 of file /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_log.c. Return address = 0xffffffffa07f4fd1 [352505.707445] XFS (sdb104): Log I/O Error Detected. Shutting down filesystem [352505.707448] XFS (sdb104): Please umount the filesystem and rectify the problem(s) [352505.707452] XFS (sdb104): Unable to update superblock counters. Freespace may not be correct on next mount. [352505.707463] XFS (sdb104): xfs_log_force: error 5 returned. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY8cfAAoJELsEaSRwbVYrOvoP/jaeYZ59qbqhZCauO6Lhir1i zWKyfX6R3vNfQPmu0mWeVn/1+uqmufEbtK6gXoROJsta+7YaBDZtnRvuvN5JeE76 GR9ZxS7Jghffj+CbSwoI+q41K6dorD+fTpHm8uUbsYkNq1N4eVfrULP+7PcchjLx mRDkeffHdESSLF3ZtXhMD/cd7Ok6ILG2PpJ5+yEVu2XKr6QLgOMY8cIUpoDNoKgh /Mawcex1Bz6oItXPGTWth34harbnbOUOU3gRfd6pbXxvXlFfIihUkg6cpre55U0o O6H+3KGZj9gGtxP+Atcb1dc4oJaT7J+SL6PTBNmRuP5oqqGWI2YPDiuQX3BnJMZv VrV78rkJLjMNAmS9c47TkJe9No267dOFK+6pZXj+b3gsmg1/5PrhSJnt5IdVrU6+ kext/CGmtb80Q8O/K6WBb5VmQTD0ZhLV+UPEgllRn8QOu8RfGjp5NgGyeFcqLuWb YgS2OMp1F+EZ/wnXf0LgQECq0FLj5UBmOmhri3fJ3pHlusOjq/VCNIPcCgTl4YaA F7eiM/tYy7m42USyyT76N0g1lAqPq26INfFCiXdGdJGUfdHiK8/ucoGIvsEW8lY8 cfZFSOdfpWtqZLytr8tOVA8rs4c+7EZcnuxb9T49qcPvf9/lL2WRSOWShTdCz6cV sE//zq0BJttX8VDTCp1G =z+sB -----END PGP SIGNATURE----- From php_webmaster@titalcompany.cz Fri May 2 11:27:02 2014 Return-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.9 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HK_RANDOM_REPLYTO,SUBJ_YOUR_FAMILY 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 CD5067F5F for ; Fri, 2 May 2014 11:27:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8208FAC002 for ; Fri, 2 May 2014 09:26:59 -0700 (PDT) X-ASG-Debug-ID: 1399048017-04cbb03cc4253160001-NocioJ Received: from duriel.6105.net (duriel.6105.net [217.197.152.179]) by cuda.sgi.com with ESMTP id pFexn13YMKhQRFRO for ; Fri, 02 May 2014 09:26:57 -0700 (PDT) X-Barracuda-Envelope-From: php_webmaster@titalcompany.cz X-Barracuda-Apparent-Source-IP: 217.197.152.179 Received: from localhost (localhost.localdomain [127.0.0.1]) by duriel.6105.net (Postfix) with ESMTP id 7C9E4375003C for ; Fri, 2 May 2014 18:26:56 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at xen-etch X-Amavis-Alert: BAD HEADER SECTION, Improper use of control character (char 0D hex): From: ... Dick ven den Berg \r Received: from duriel.6105.net ([127.0.0.1]) by localhost (duriel.6105.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id U52SVMWt3kex for ; Fri, 2 May 2014 18:26:56 +0200 (CEST) Received: by duriel.6105.net (Postfix, from userid 1005) id CFF033750257; Fri, 2 May 2014 18:26:41 +0200 (CEST) To: xfs@oss.sgi.com Subject: Re: Its for your family From: John Jack Dick ven den Berg X-ASG-Orig-Subj: Re: Its for your family Reply-To: venderbergdjj@gmx.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: <20140502162641.CFF033750257@duriel.6105.net> Date: Fri, 2 May 2014 18:26:41 +0200 (CEST) X-Barracuda-Connect: duriel.6105.net[217.197.152.179] X-Barracuda-Start-Time: 1399048017 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.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJ_YOUR_FAMILY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5472 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.50 SUBJ_YOUR_FAMILY Subject contains "Your Family" Compliments. This is in regards to my previous message concerning a deceased client with similar last name with you, I have given you all necessary details about this and I haven't gotten any positive response from you, so kindly get back to me today. Thank you, John. From mp6058@gmail.com Fri May 2 11:44:21 2014 Return-Path: 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,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 190137F5E for ; Fri, 2 May 2014 11:44:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC1478F804C for ; Fri, 2 May 2014 09:44:20 -0700 (PDT) X-ASG-Debug-ID: 1399049054-04bdf02b8b263e40001-NocioJ Received: from mail-ee0-f50.google.com (mail-ee0-f50.google.com [74.125.83.50]) by cuda.sgi.com with ESMTP id O3H1ifQvcorGeZbI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 09:44:15 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.50 Received: by mail-ee0-f50.google.com with SMTP id c13so3367543eek.9 for ; Fri, 02 May 2014 09:44:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=bzcKMQQ907ugTVYtHrwTc5cLbw0rvCYZZrXLMeDAZZY=; b=nsRZKELv7b9VHU6E13iQV0eYrOoY7S5Wbv7OJiQ8w1Y5SNrdEcwdvUcsXcQCEx8dL3 q3EqFECc4h/wslxk0ydMcHT9mt1cHzE0YOsAfZ79qHQ7XB+TkufwWy5djsV6ZY00CU2n GOrFz1O3Od1Hjm7iIe3MTRKxsHEnPZTqF6JhW1nR9s22pTBgdMLjOW9vSenT9oib2e8K zSLVDH40HwIkIP7FBDhoqZbNynWOR504pz0TuPFDAsJ+Li7IO8p/aYUioahNPcSUJm5y rClxrRaF5VeIiXj2n4+L5qwk97FzAHi1vo8WMWDlxgENNnP1W5Ef22hyapPx3gGL17Vc ujdA== X-Received: by 10.14.69.201 with SMTP id n49mr16021747eed.106.1399049054082; Fri, 02 May 2014 09:44:14 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id s46sm5862964ees.3.2014.05.02.09.44.12 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 09:44:13 -0700 (PDT) Message-ID: <5363CB5E.3090008@gmail.com> Date: Fri, 02 May 2014 19:44:14 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363B4C9.4000900@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f50.google.com[74.125.83.50] X-Barracuda-Start-Time: 1399049055 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.5472 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: SHA512 > so something, somewhere thinks it's mounted. Check /proc/mounts? There was nothing in /proc/mounts, nor was there any visible reference in /proc. If there was, the first thing I would have done is to make sure no process is using the FS. But I only did it later based on a hunch. >> Please let me know what I can do short of zeroing the log, which >> I believe would result in some data loss. > > Hate to say it, but a reboot may be simplest. Zeroing the log > won't help. OTOH, if you lost USB connectivity, you already lost > some data. Please explain why losing USB connectivity means I've lost data. Is a SATA/SCSI/NBD disconnect less likely to lose data? Is XFS is not stable enough to function without a need to reboot in case of a relatively minor HW failure? Minor meaning affecting only some disks. Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY8tNAAoJELsEaSRwbVYrbRsQALh8cNWAUElNyGMlJg9xWKE+ hAXtwIgX8/zkdMAHKbqHCuGmid+D3FF6kMW5VJUH/i3+OW5l9BD+zps9QqBtTW6X XZjjV3AOslLK6EKm5S796z/42QNIPZUprqJZKkyI70N6BhtfaIEIN+iaSaPWNLjd AgB/Mh57NCziISsfGbGWiq3x1X/0/qs7LvzlFcuQEcq8KlesjJNybPqMZloMuYMO G9tQ9X403bnZBMzn7LXIwii+0hAVylLA94L3C6ygar2PcZagrwp6sUVEN1DP8KXu 2ghlrV4EBkRIJmk7ckUAjc45E9zK17qFOfUg/j3UO8q4rS4BtoQapxvZwb+4np2R RbhLJu/o+OvEfd7mTnMvHk7INDnalqnAkKCrKzJ/I9cgmNvl5GOwSaclDDynMH2/ 8ZftI5lBOtnZ1BXSRjm+l7WuxxIQPKTGKjGAlDoFkyhZu4T1BJ9UA4Cx8dRdEW/1 V2pzuSuPhBvQ92x45PC7HDGByxc2AIBGM8+zPTdFA9z9dht0T4R4VSgyUgx53FvP lyZ63ZzLLsaMY3KCeQefqWIsRCbBwTIKLoqjX7iEQ9MAUBo6OnqL5u6Hc+I/35gO I1u7uTaDnrQoqqGc+F9rA9ApW7bYbuq+hmuhr3stsYGrHCMSyRcHR3gbeVMKH/NR AD2DbwmwDv0h/NEf1DER =/tYi -----END PGP SIGNATURE----- From sandeen@sandeen.net Fri May 2 11:53:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CBF037F61 for ; Fri, 2 May 2014 11:53:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF25C8F804B for ; Fri, 2 May 2014 09:53:00 -0700 (PDT) X-ASG-Debug-ID: 1399049578-04cbb03cc6254e20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dVGMqnjfHQ2jpON2 for ; Fri, 02 May 2014 09:52:59 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6293363C5FF1; Fri, 2 May 2014 11:52:58 -0500 (CDT) Message-ID: <5363CD70.3000006@sandeen.net> Date: Fri, 02 May 2014 11:53:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363CB5E.3090008@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399049578 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.5473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/2/14, 11:44 AM, Martin Papik wrote: > >> so something, somewhere thinks it's mounted. Check /proc/mounts? > > There was nothing in /proc/mounts, nor was there any visible reference > in /proc. If there was, the first thing I would have done is to make > sure no process is using the FS. But I only did it later based on a hunch. BTW sorry for replying twice, my mailer was being weird and the first one didn't seem to send. >>> Please let me know what I can do short of zeroing the log, which >>> I believe would result in some data loss. > >> Hate to say it, but a reboot may be simplest. Zeroing the log >> won't help. OTOH, if you lost USB connectivity, you already lost >> some data. > > Please explain why losing USB connectivity means I've lost data. Is a > SATA/SCSI/NBD disconnect less likely to lose data? If the device goes away and does not come back, any pending buffered data to that device will be lost. That's true of any filesystem, on any type of connection. i.e. these IOs have nowhere to go: > [346220.652432] Buffer I/O error on device sdb104, logical block > 3906961152 and if they can't ever hit the disk, they'll be lost. In the USB case when it comes back with a new name, as far as I know there is no mechanism to handle that anywhere in the kernel. > Is XFS is not stable enough to function without a need to reboot in > case of a relatively minor HW failure? Minor meaning affecting only > some disks. It's not a question of XFS stability, IMHO. XFS was talking to device A; device A went away and never came back. The issue of being unable to repair it seems to have been a result of files still open on the (disappeared) device? Once you resolved that, all was well, and no reboot was needed, correct? I suggested the reboot as a big-hammer fix to clear the mysterious stale mount; turns out that was not required, apparently. If ustat(device) was reporting that it's mounted, but /proc/partitions didn't show it, then the device was in some kind of limbo state, I guess, and that sort of umount handling is below XFS (or any other filesystem), as far as I know. What initiated the unmount, was it you (after the USB disconnect) or some udev magic? - -Eric > Martin > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTY81vAAoJECCuFpLhPd7gSxYP/0FEYa82SBczZZLRDe9MWvqC /lMK475w5wHaHfHcgph9f8i7YbAirrpIS42+QqHVKp92SE5kGRbHhNorUp2Me202 4fvt4oLbro7UxA66BsdrCG7OuaRB4+6FUYGsI6EudnwIAwvG3jur8urf61vZIb+8 BXSd2Y7Z+wQIqPIEKB2n4myrgyZC8GlW0ILNynqL1DFW3y0bkxgV/kFZFTbReOb0 Er0ekrW8A8eQ8R6mU8/msCfSUgNaqSyStkU3Vw35m1gGc+BLE4tArRsCb/AF414j U9JzgFLtGaf8xdfbmTrOsduaIwchv3F+NaHimClpHMHGaxiBpXkNXrWxGVvy76Fd IpGTsqnjBP5Dhh35ymrmOgE3YR+GNax0ckjd4gpW15QHhjiHWayCQEMc1GZ9VWKj USXmT+jENLGGorF8hjWFuC8rMVjWyGwMKFU6wK9xQxHrxn/6/eJqu3DGnV2Bpj70 XTNHvVAn+AFo9tiFd3S1kqiXvZ/HB/mM3DRf5KNkGtpGxTtKxhpNnujG4w6QIkZw ltAAM/i0iBrq/llb3tfthnwZpSUnqwvY+hYh51TRjAA+HBnRfrQygOozrpSfEeIN ebJmyFoLpbTLiRFcUzqnpOlhcX5X1dAIw/Llr0Yp57Y38CmQ5XcWjFabgYwdTgkr 2TjHvhDwU5b4mtEG1OOW =OWFX -----END PGP SIGNATURE----- From bfoster@redhat.com Fri May 2 12:05:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 83C8A7F63 for ; Fri, 2 May 2014 12:05:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 764ED304062 for ; Fri, 2 May 2014 10:05:52 -0700 (PDT) X-ASG-Debug-ID: 1399050351-04cb6c72912680f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AIs1eTLP8HDd8LyF for ; Fri, 02 May 2014 10:05: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 (8.14.4/8.14.4) with ESMTP id s42H5nWO026495 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:50 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nam005215 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2F1A4123111; Fri, 2 May 2014 13:14:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs/013: stress the free inode btree Date: Fri, 2 May 2014 13:14:02 -0400 X-ASG-Orig-Subj: [PATCH 5/5] xfs/013: stress the free inode btree Message-Id: <1399050842-19633-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1399050842-19633-1-git-send-email-bfoster@redhat.com> References: <1399050842-19633-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: 1399050351 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 Create a stress test for the free inode btree. Allocate a set of inodes sequentually and run a hard link clone and random replacement algorithm across the set. Background removal of the oldest directories creates a sparse set of free inodes over time. Run an fsstress workload concurrently to exercise the fs. Signed-off-by: Brian Foster --- tests/xfs/013 | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/013.out | 7 +++ tests/xfs/group | 1 + 3 files changed, 163 insertions(+) create mode 100755 tests/xfs/013 create mode 100644 tests/xfs/013.out diff --git a/tests/xfs/013 b/tests/xfs/013 new file mode 100755 index 0000000..049f0dc --- /dev/null +++ b/tests/xfs/013 @@ -0,0 +1,155 @@ +#!/bin/bash +# FS QA Test No. xfs/013 +# +# Exercise the free inode btree (finobt). XFS allocates physical inodes in +# chunks of 64. Inode records with at least one free inode are stored in the +# finobt to optimize free inode lookup. This test runs a workload that creates +# and modifies a sparsely allocated set of inodes in combination with an +# fsstress workload. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_cleanup() +{ + killall fsstress 2>/dev/null + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_create() +{ + dir=$1 + count=$2 + + mkdir -p $dir + for i in $(seq 0 $count) + do + touch $dir/$i + done +} + +_rand_replace() +{ + dir=$1 + count=$2 + + # replace 5% of the dataset + for i in $(seq 0 $((count / 20))) + do + file=$((RANDOM % count)) + rm -f $dir/$file + touch $dir/$file + done +} + +_cleaner() +{ + dir=$1 + iters=$2 + mindirs=$3 + + iters=$((iters - mindirs)) + + for i in $(seq 1 $iters) + do + need=$dir/dir$((i + mindirs)) + while [ ! -e $need ] + do + sleep 3 + done + + rm -rf $dir/dir$i + done +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_mkfs_finobt +_require_xfs_finobt + +rm -f $seqres.full + +_scratch_mkfs_xfs "-m crc=1,finobt=1 -d agcount=2" | \ + _filter_mkfs 2>> $seqres.full +_scratch_mount + +COUNT=20000 # number of files per directory +LOOPS=15 # last loop iteration +MINDIRS=2 # number of dirs for the cleaner to leave trailing behind the + # most recent (no less than 2 to prevent an rm from trampling a + # clone) + +# create initial directory +_create $SCRATCH_MNT/dir1 $COUNT + +# start background cleaner to remove old directories as new ones are created +_cleaner $SCRATCH_MNT $LOOPS $MINDIRS & + +# start a background stress workload on the fs +$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -w -n 9999999 -p 2 -S t \ + >> $seqres.full 2>&1 & + +# Each cycle clones the current directory and makes a random file replacement +# pass on the new directory. The directory is copied to the next using hard +# links. The replacement pass then randomly removes and replaces ~5% of the +# content in the directory. Files replaced as such are effectively marked to be +# freed by the background cleaner as it moves forward and removes all of the +# previous hard links to the inode. Over several iterations, this workload +# creates a sparsely located set of a free inodes across the set and uses the +# finobt to allocate new inodes for replacement. + +for i in $(seq 1 $LOOPS) +do + # hard link the content of the current directory to the next + cp -Rl $SCRATCH_MNT/dir$i $SCRATCH_MNT/dir$((i+1)) + + # do a random replacement of files in the new directory + _rand_replace $SCRATCH_MNT/dir$((i+1)) $COUNT +done + +killall fsstress +wait + +# clean out the competing fsstress allocations, then everything else +rm -rf $SCRATCH_MNT/fsstress +rm -rf $SCRATCH_MNT/dir* + +umount $SCRATCH_MNT +_check_scratch_fs + +status=0 +exit diff --git a/tests/xfs/013.out b/tests/xfs/013.out new file mode 100644 index 0000000..ae653ff --- /dev/null +++ b/tests/xfs/013.out @@ -0,0 +1,7 @@ +QA output created by 013 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX diff --git a/tests/xfs/group b/tests/xfs/group index c228a63..0fa6674 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -9,6 +9,7 @@ 009 rw ioctl auto prealloc quick 010 auto quick repair 012 rw auto quick +013 stress 016 rw auto quick 017 mount auto quick stress 018 deprecated # log logprint v2log -- 1.8.3.1 From bfoster@redhat.com Fri May 2 12:05:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 25B747F6A for ; Fri, 2 May 2014 12:05:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 080C4304064 for ; Fri, 2 May 2014 10:05:50 -0700 (PDT) X-ASG-Debug-ID: 1399050349-04cbb03cc6255d90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Hq34JcMcBiDkYemZ for ; Fri, 02 May 2014 10:05: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nZ5005073 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:49 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s42H5n3W005996 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 05D62123100; Fri, 2 May 2014 13:14:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs/010: test repair for finobt corruption Date: Fri, 2 May 2014 13:14:01 -0400 X-ASG-Orig-Subj: [PATCH 4/5] xfs/010: test repair for finobt corruption Message-Id: <1399050842-19633-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1399050842-19633-1-git-send-email-bfoster@redhat.com> References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399050350 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 finobt creates a duplicate subset of inode allocation metadata from the inobt. xfs_repair should detect and repair inconsistencies in the finobt that could be caused by bugs or corruption. This test uses xfs_db to cause targeted corruptions in the finobt and verify repair detects and corrects the filesystem. In particular, the test corrupts individual finobt records to cause inconsistency between the inode allocation count fields as well as causing the finobt to contain a record with no free inodes. Signed-off-by: Brian Foster --- tests/xfs/010 | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/010.out | 57 +++++++++++++++++++++++ tests/xfs/group | 1 + 3 files changed, 191 insertions(+) create mode 100755 tests/xfs/010 create mode 100644 tests/xfs/010.out diff --git a/tests/xfs/010 b/tests/xfs/010 new file mode 100755 index 0000000..2b5ad00 --- /dev/null +++ b/tests/xfs/010 @@ -0,0 +1,133 @@ +#!/bin/bash +# FS QA Test No. xfs/010 +# +# Test xfs_repair of the free inode btree (finobt). Make a couple targeted +# corruptions and verify that xfs_repair detects and repairs the filesystem to +# a consistent state. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/repair + +_cleanup() +{ + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_sparse_inode_populate() +{ + dir=$1 + count=$2 + + for i in $(seq 0 $count) + do + touch $dir/$i + done + + # Inode chunks are allocated 64 inodes at a time. If we remove 1 out of + # every 32 we allocated above, we'll end up leaving an inode or two free + # in each chunk. This ensures that most records are inserted into the + # finobt. + for i in $(seq 0 32 $count) + do + rm -f $dir/$i + done +} + +_filter_dbval() +{ + awk '{ print $3 }' +} + +_corrupt_finobt_records() +{ + dev=$1 + + # determine the root block of the finobt + free_root=`$XFS_DB_PROG -c "agi 0" -c "p free_root" $dev | + _filter_dbval` + + # Corrupt a freecount value. This should never exceed 64. + $XFS_DB_PROG -x -c "fsb $free_root" -c "type inobt" \ + -c "write recs[1].freecount 70" $dev + + # Create a corrupted non-free record, which should never appear in the + # finobt. + $XFS_DB_PROG -x -c "fsb $free_root" -c "type inobt" \ + -c "write recs[2].freecount 0" $dev + $XFS_DB_PROG -x -c "fsb $free_root" -c "type inobt" \ + -c "write recs[2].free 0" $dev +} + +_corrupt_finobt_root() +{ + dev=$1 + + # nuke the agi finobt root fields + $XFS_DB_PROG -x -c "agi 0" -c "write free_root 0" $dev + $XFS_DB_PROG -x -c "agi 0" -c "write free_level 0" $dev +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_mkfs_finobt +_require_xfs_finobt + +rm -f $seqres.full + +_scratch_mkfs_xfs "-m crc=1,finobt=1 -d agcount=2" | _filter_mkfs 2>$seqres.full + +# sparsely populate the fs such that we create records with free inodes +_scratch_mount +_sparse_inode_populate $SCRATCH_MNT 999 +umount $SCRATCH_MNT + +# corrupt some finobt records +_corrupt_finobt_records $SCRATCH_DEV + +# repair should detect the inconsistencies +_scratch_xfs_repair 2>&1 | _filter_repair +_check_scratch_fs + +# nuke the finobt root, repair will have to regenerate from the inobt +_corrupt_finobt_root $SCRATCH_DEV + +_scratch_xfs_repair 2>&1 | _filter_repair +_check_scratch_fs + +status=0 +exit diff --git a/tests/xfs/010.out b/tests/xfs/010.out new file mode 100644 index 0000000..ab5e5f3 --- /dev/null +++ b/tests/xfs/010.out @@ -0,0 +1,57 @@ +QA output created by 010 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +recs[1].freecount = 70 +recs[2].freecount = 0 +recs[2].free = 0 +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +finobt ir_freecount/free mismatch, AGNO/INO, freecount 70 nfree 2 +finobt record with no free inodes, AGNO/INO + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - 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 +free_root = 0 +free_level = 0 +Phase 1 - find and verify superblock... +Phase 2 - using log + - zero log... + - scan filesystem freespace and inode maps... +bad agbno AGBNO for finobt root, agno 0 + - found root inode chunk +Phase 3 - for each AG... + - scan and clear agi unlinked lists... + - process known inodes and perform inode discovery... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +Phase 5 - rebuild AG headers and trees... + - 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 diff --git a/tests/xfs/group b/tests/xfs/group index 4624fc3..c228a63 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -7,6 +7,7 @@ 007 auto quota quick 008 rw ioctl auto quick 009 rw ioctl auto prealloc quick +010 auto quick repair 012 rw auto quick 016 rw auto quick 017 mount auto quick stress -- 1.8.3.1 From bfoster@redhat.com Fri May 2 12:05:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F241E7F66 for ; Fri, 2 May 2014 12:05:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E94B98F8040 for ; Fri, 2 May 2014 10:05:50 -0700 (PDT) X-ASG-Debug-ID: 1399050350-04cbb03cc5255d90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 64j5Na9MDos6GKg1 for ; Fri, 02 May 2014 10:05: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nPR008473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:49 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s42H5nqR024096 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DE5D91201F5; Fri, 2 May 2014 13:14:02 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs/030: filter out extra repair noise for finobt enabled fs' Date: Fri, 2 May 2014 13:13:58 -0400 X-ASG-Orig-Subj: [PATCH 1/5] xfs/030: filter out extra repair noise for finobt enabled fs' Message-Id: <1399050842-19633-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1399050842-19633-1-git-send-email-bfoster@redhat.com> References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399050350 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/030 nukes various on-disk data structures to test for repair. This can result in extra output when testing finobt enabled filesystems. For example, xfs_repair detects an invalid free inode btree root block when the agi is zeroed. Filter this output directly in xfs/030 such that the test passes for finobt and non-finobt filesystems. Signed-off-by: Brian Foster --- tests/xfs/030 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/xfs/030 b/tests/xfs/030 index af03166..a43455f 100755 --- a/tests/xfs/030 +++ b/tests/xfs/030 @@ -56,7 +56,8 @@ _check_ag() do echo "Corrupting $structure - setting bits to $1" _check_repair $1 "$structure" | - sed -e '/^error following ag 0 unlinked list$/d' + sed -e '/^error following ag 0 unlinked list$/d' \ + -e '/^bad agbno AGBNO for finobt/d' done } -- 1.8.3.1 From bfoster@redhat.com Fri May 2 12:05:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0E2867F67 for ; Fri, 2 May 2014 12:05:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2ACC304062 for ; Fri, 2 May 2014 10:05:50 -0700 (PDT) X-ASG-Debug-ID: 1399050350-04cb6c728f2680e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OHMGKrHDyqPvtf2D for ; Fri, 02 May 2014 10:05: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nIi008474 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:50 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s42H5ngY005992 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ED057122F17; Fri, 2 May 2014 13:14:02 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfstests: add _require_xfs_[mkfs_]finobt() checks for finobt tests Date: Fri, 2 May 2014 13:13:59 -0400 X-ASG-Orig-Subj: [PATCH 2/5] xfstests: add _require_xfs_[mkfs_]finobt() checks for finobt tests Message-Id: <1399050842-19633-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1399050842-19633-1-git-send-email-bfoster@redhat.com> References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399050350 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 Free inode btree tests must ensure that the userspace and kernel bits are compatible. Add a couple checks for the associated support. Signed-off-by: Brian Foster --- common/rc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/common/rc b/common/rc index 5c13db5..66a3cb8 100644 --- a/common/rc +++ b/common/rc @@ -1113,6 +1113,24 @@ _require_xfs_crc() umount $SCRATCH_MNT } +# this test requires the finobt feature to be available in mkfs.xfs +# +_require_xfs_mkfs_finobt() +{ + _scratch_mkfs_xfs_supported -m crc=1,finobt=1 >/dev/null 2>&1 \ + || _notrun "mkfs.xfs doesn't have finobt feature" +} + +# this test requires the xfs kernel support finobt feature +# +_require_xfs_finobt() +{ + _scratch_mkfs_xfs -m crc=1,finobt=1 >/dev/null 2>&1 + _scratch_mount >/dev/null 2>&1 \ + || _notrun "Kernel doesn't support finobt feature" + umount $SCRATCH_MNT +} + # this test requires that external log/realtime devices are not in use # _require_nonexternal() -- 1.8.3.1 From bfoster@redhat.com Fri May 2 12:05:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 179857F69 for ; Fri, 2 May 2014 12:05:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08CFC304066 for ; Fri, 2 May 2014 10:05:50 -0700 (PDT) X-ASG-Debug-ID: 1399050350-04cbb03cc4255d90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s5bmZ7ORQv6v2gcf for ; Fri, 02 May 2014 10:05: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nbB008477 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:50 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nQS029205 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 14678123249; Fri, 2 May 2014 13:14:02 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfstests: filter agno/ino repair output for finobt Date: Fri, 2 May 2014 13:14:00 -0400 X-ASG-Orig-Subj: [PATCH 3/5] xfstests: filter agno/ino repair output for finobt Message-Id: <1399050842-19633-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1399050842-19633-1-git-send-email-bfoster@redhat.com> References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399050350 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 finobt enabled filesystems can generate new repair output. Update _filter_repair() to ensure specific AG and inode numbers are filtered from test output. Signed-off-by: Brian Foster --- common/repair | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/repair b/common/repair index 3e73c1d..46ca9e0 100644 --- a/common/repair +++ b/common/repair @@ -83,6 +83,8 @@ s/\s+- \d+:\d\d:\d\d:.*\n//g; /^Metadata corruption detected/ && next; /^Metadata CRC error detected/ && next; /^agfl has bad CRC/ && next; +# finobt enabled filesystem output +s/(inode chunk) (\d+)\/(\d+)/AGNO\/INO/; print;' } -- 1.8.3.1 From bfoster@redhat.com Fri May 2 12:05:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4B4147F6B for ; Fri, 2 May 2014 12:05:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5509AC002 for ; Fri, 2 May 2014 10:05:50 -0700 (PDT) X-ASG-Debug-ID: 1399050349-04cb6c72912680e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EWuuyRTXl893WXbD for ; Fri, 02 May 2014 10:05: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5nZ6005067 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 2 May 2014 13:05:49 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s42H5noS026670 for ; Fri, 2 May 2014 13:05:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CDBAE122F16; Fri, 2 May 2014 13:14:02 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/5] xfstests: fixes for the free inode btree Date: Fri, 2 May 2014 13:13:57 -0400 X-ASG-Orig-Subj: [PATCH 0/5] xfstests: fixes for the free inode btree Message-Id: <1399050842-19633-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: 1399050349 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 is a few xfstests fixes and addons for the finobt. Patch 1 fixes xfs/030 to work correctly on finobt-enabled filesystems. Patches 2 and 3 add support for finobt-oriented tests via require functions and repair filter updates. Patch 4 adds a new test for targeted repair of finobt filesystems. Patch 5 adds a stress test that creates/modifies a sparsely allocated set of inodes to effectively exercise the finobt in conjunction with an fsstress workload. xfs/010 runs very quickly. xfs/013 runs for 5-10 minutes on my smallish VM running against a single spindle, so I've been back and forth on whether it should be part of the auto group. Thoughts, reviews, flames appreciated... Brian Brian Foster (5): xfs/030: filter out extra repair noise for finobt enabled fs' xfstests: add _require_xfs_[mkfs_]finobt() checks for finobt tests xfstests: filter agno/ino repair output for finobt xfs/010: test repair for finobt corruption xfs/013: stress the free inode btree common/rc | 18 +++++++ common/repair | 2 + tests/xfs/010 | 133 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/010.out | 57 ++++++++++++++++++++ tests/xfs/013 | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/013.out | 7 +++ tests/xfs/030 | 3 +- tests/xfs/group | 2 + 8 files changed, 376 insertions(+), 1 deletion(-) create mode 100755 tests/xfs/010 create mode 100644 tests/xfs/010.out create mode 100755 tests/xfs/013 create mode 100644 tests/xfs/013.out -- 1.8.3.1 From mp6058@gmail.com Fri May 2 12:54:35 2014 Return-Path: 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,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 102247F6F for ; Fri, 2 May 2014 12:54:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02D9A304062 for ; Fri, 2 May 2014 10:54:34 -0700 (PDT) X-ASG-Debug-ID: 1399053272-04cbb03cc5259ba0001-NocioJ Received: from mail-ee0-f54.google.com (mail-ee0-f54.google.com [74.125.83.54]) by cuda.sgi.com with ESMTP id NEUFSxEyulH6DN6h (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 10:54:33 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.54 Received: by mail-ee0-f54.google.com with SMTP id b57so1441030eek.41 for ; Fri, 02 May 2014 10:54:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=JWbU6ZrQ5AUFiVFVbbxgmsREoHdZLt/BTmIaWULMUUc=; b=x0AXQPOaLuBu7QJt0NHaROxZmEYSAyPUMr22xJdVNILgoeS6ehursNGOzfSZy3pM8r TRl6XmeoTFXQcP78Hn/XY6hPgwAb3zeUC3+7B7xkCebSyzep63wJKUDA8AJfULZfxoYg aoYFAZEXve/Kyf4eBRz8iyiUL5rqS9m2ibU/UfFw1bzgg3gdGuV0OgfeOKE6w1uN1F99 FncYzrQlkc2YiFKXR3kjWIIjAGWZSu1yH3wO4OOp1vY5oL26x+0NM1UBb1EVf+zuVdb9 Cihip0qsj48QdcAa2uhFTvu5QHLUBGz1ib9q7n31MvZXYV5dRlyKRdPUOqp1ab+tOPaA mewg== X-Received: by 10.14.100.69 with SMTP id y45mr16385496eef.108.1399053271787; Fri, 02 May 2014 10:54:31 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id w12sm6248522eez.36.2014.05.02.10.54.29 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 10:54:30 -0700 (PDT) Message-ID: <5363DBD7.4060002@gmail.com> Date: Fri, 02 May 2014 20:54:31 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363CD70.3000006@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f54.google.com[74.125.83.54] X-Barracuda-Start-Time: 1399053272 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.5474 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: SHA512 > In the USB case when it comes back with a new name, as far as I > know there is no mechanism to handle that anywhere in the kernel. Is there a mechanism for other devices? >> Is XFS is not stable enough to function without a need to reboot >> in case of a relatively minor HW failure? Minor meaning affecting >> only some disks. > > It's not a question of XFS stability, IMHO. XFS was talking to > device A; device A went away and never came back. Well, it kinda did come back, but that's different story. > The issue of being unable to repair it seems to have been a result > of files still open on the (disappeared) device? Once you resolved > that, all was well, and no reboot was needed, correct? Yup, but xfs was still active without a trace in /proc/mounts, which what confused me. > I suggested the reboot as a big-hammer fix to clear the mysterious > stale mount; turns out that was not required, apparently. I don't like that particular hammer. Personal opinion, sure, but it seems to me that reboot is what you do when you don't know what went wrong or you know it's totally fubar. In this case, IMHO, not fubar. > If ustat(device) was reporting that it's mounted, but > /proc/partitions didn't show it, then the device was in some kind > of limbo state, I guess, and that sort of umount handling is below > XFS (or any other filesystem), as far as I know. I'm confused here. /dev/old was not in /proc/partitions or /proc/mounts, /dev/new was in /proc/partitions but not in /proc/mounts, even after disconnect and reconnect of the drive the /dev/new refused to be acted on by xfs_check or xfs_repair. How did that happen? All right, apparently there was a slate xfs instance in the kernel, not visible anywhere, but that was attached to /dev/old, why did xfs_repair fail to work on /dev/new until the stale xfs instance in the kernel finished shutting down. > What initiated the unmount, was it you (after the USB disconnect) > or some udev magic? The disconnect of the USB drive, specifically the internal HUB in the notebook failed (don't know how), I reset it from ssh (keyboard is also on the hub), see below, I didn't find any messages from any user space system, but they might not log everything, but there were messages about the XFS driver detecting the error, the USB hub being fubar-ed, the device being off-line, so I'm guessing it was the panic action, or maybe userspace. I'm not sure, I wasn't able to find out how XFS handles errors, there's nothing in the manual pages and google didn't help. Do you know? I.e. the equivalent of errors=remount_ro, or whatever. One page claimed xfs doesn't recognize this option. My system has the defaults and it's ubuntu/precise, if that helps. Martin May 2 15:49:06 lennie kernel: [344344.325232] sd 11:0:0:0: rejecting I/O to offline device May 2 15:49:39 lennie kernel: [344377.367220] hub 2-1:1.0: hub_port_status failed (err = -110) May 2 15:49:44 lennie kernel: [344382.459545] hub 2-1:1.0: hub_port_status failed (err = -110) May 2 15:49:50 lennie kernel: [344387.551918] hub 2-1:1.0: hub_port_status failed (err = -110) May 2 15:49:50 lennie kernel: [344388.413611] sd 6:0:0:0: rejecting I/O to offline device May 2 15:49:50 lennie kernel: [344388.413650] sd 6:0:0:0: rejecting I/O to offline device May 2 15:49:50 lennie kernel: [344388.413668] sd 6:0:0:0: rejecting I/O to offline device May 2 15:49:52 lennie kernel: [344390.062780] sd 6:0:0:0: rejecting I/O to offline device May 2 15:49:52 lennie kernel: [344390.062837] ffff8801034da000: 80 ab 4d 03 01 88 ff ff 00 00 70 b4 f0 7f 00 00 ..M.......p..... May 2 15:49:52 lennie kernel: [344390.062844] XFS (sdb104): Internal error xfs_dir2_data_reada_verify at line 226 of file /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_dir2_data.c. Caller 0xffffffffa079e33f May 2 15:49:52 lennie kernel: [344390.062844] May 2 15:49:52 lennie kernel: [344390.062852] Pid: 642, comm: kworker/0:1H Tainted: G C 3.8.0-39-generic #57~precise1-Ubuntu May 2 15:49:52 lennie kernel: [344390.062854] Call Trace: May 2 15:49:52 lennie kernel: [344390.062902] [] xfs_error_report+0x3f/0x50 [xfs] May 2 15:49:52 lennie kernel: [344390.062921] [] ? xfs_buf_iodone_work+0x3f/0xa0 [xfs] May 2 15:49:52 lennie kernel: [344390.062939] [] xfs_corruption_error+0x5e/0x90 [xfs] May 2 15:49:52 lennie kernel: [344390.062966] [] xfs_dir2_data_reada_verify+0x59/0xa0 [xfs] May 2 15:49:52 lennie kernel: [344390.062986] [] ? xfs_buf_iodone_work+0x3f/0xa0 [xfs] May 2 15:49:52 lennie kernel: [344390.062994] [] ? finish_task_switch+0x4a/0xf0 May 2 15:49:52 lennie kernel: [344390.063013] [] xfs_buf_iodone_work+0x3f/0xa0 [xfs] May 2 15:49:52 lennie kernel: [344390.063019] [] process_one_work+0x141/0x4a0 May 2 15:49:52 lennie kernel: [344390.063024] [] worker_thread+0x168/0x410 May 2 15:49:52 lennie kernel: [344390.063029] [] ? manage_workers+0x120/0x120 May 2 15:49:52 lennie kernel: [344390.063034] [] kthread+0xc0/0xd0 May 2 15:49:52 lennie kernel: [344390.063039] [] ? flush_kthread_worker+0xb0/0xb0 May 2 15:49:52 lennie kernel: [344390.063046] [] ret_from_fork+0x7c/0xb0 May 2 15:49:52 lennie kernel: [344390.063050] [] ? flush_kthread_worker+0xb0/0xb0 May 2 15:49:52 lennie kernel: [344390.063054] XFS (sdb104): Corruption detected. Unmount and run xfs_repair May 2 15:49:52 lennie kernel: [344390.067128] sd 6:0:0:0: rejecting I/O to offline device May 2 15:49:52 lennie kernel: [344390.067158] XFS (sdb104): metadata I/O error: block 0x8a6ec930 ("xfs_trans_read_buf_map") error 117 numblks 8 May 2 15:49:52 lennie kernel: [344390.067179] ffff8801034da000: 80 ab 4d 03 01 88 ff ff 00 00 70 b4 f0 7f 00 00 ..M.......p..... May 2 15:49:52 lennie kernel: [344390.067184] XFS (sdb104): Internal error xfs_dir2_block_verify at line 71 of file /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_dir2_block.c. Call er 0xffffffffa07d7f3e -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY9vCAAoJELsEaSRwbVYrIhsQAIDDL7yshllWCBcxSDmfdefh PMTgMxvzprexd+5xqh14klDySA78FZM44bzMd5mjABQ+GvE0hhbB6kLMQSuySXWi c+nNtpZXsW7R+o5D0GymWF1PYn3KfbE/aJ3lrLtA6yddwV0KanB4SxD45HoiKGdJ 1a2uLZB4G8ZjvyO6tQYn63R9GMWIX0mK5TovzrXY5JRaTIhYxwwTJjKzQpT+N67m nWb86Ve3ahDQHBZx1hhf/xRtKYjgPENH57goKyZqdcmUlTgm2AUhsN0tbfm5T1sX Bb0f4ZOebkfdhXfq5Sk/Eysz7gL+CdPwETJUwr/Z42QFUZfkK1/G1bbJTXZeXi8B cngPk65VxV4UCGX3nzVpg5wk7scelIFULrmUM8FgiR3+SN6oZ4cWycQLGYr44j4k UchuHcZpuMvCiHIPXWGk1PASIWUqdy7eroj900pVVGBMRwyiNe3pmbVHOpjK2owi KaCUiDB86WuKK9V5SSWL3UgVfjy994vZEIvOczaf7+vKfkhW4OX2MJNXDGmWW0/E 3JFbIrD8ETPGhYR2+emRZhOa6op8I5buvkegfMLgWhRxh5jlxxeZ6e2ZdUHc8Ty2 r8xaKnoJArehYzUKxqPCBLwRNljGBMrZ+F1O2Ifemm4cWtocmG56Ae3WvbM+btEH 2po38EG9LNPvuquUJqxy =+zQ+ -----END PGP SIGNATURE----- From sandeen@sandeen.net Fri May 2 13:39:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2A1FC7F6C for ; Fri, 2 May 2014 13:39:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 074EB8F8033 for ; Fri, 2 May 2014 11:39:20 -0700 (PDT) X-ASG-Debug-ID: 1399055957-04bdf02b8c26ce10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id kyHThbhYm2EMsKVz for ; Fri, 02 May 2014 11:39: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A088363C5FF1; Fri, 2 May 2014 13:39:17 -0500 (CDT) Message-ID: <5363E65C.6010006@sandeen.net> Date: Fri, 02 May 2014 13:39:24 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363DBD7.4060002@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399055957 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.5475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/2/14, 12:54 PM, Martin Papik wrote: > >> In the USB case when it comes back with a new name, as far as I >> know there is no mechanism to handle that anywhere in the kernel. > > Is there a mechanism for other devices? to be honest, I'm not certain; if it came back under the same device name, things may have continued. I'm not sure. In general, filesystems are not very happy with storage being yanked out from under them. >>> Is XFS is not stable enough to function without a need to reboot >>> in case of a relatively minor HW failure? Minor meaning affecting >>> only some disks. > >> It's not a question of XFS stability, IMHO. XFS was talking to >> device A; device A went away and never came back. > > Well, it kinda did come back, but that's different story. > >> The issue of being unable to repair it seems to have been a result >> of files still open on the (disappeared) device? Once you resolved >> that, all was well, and no reboot was needed, correct? > > Yup, but xfs was still active without a trace in /proc/mounts, which > what confused me. I agree, it's confusing. >> I suggested the reboot as a big-hammer fix to clear the mysterious >> stale mount; turns out that was not required, apparently. > > I don't like that particular hammer. Personal opinion, sure, but it > seems to me that reboot is what you do when you don't know what went > wrong or you know it's totally fubar. In this case, IMHO, not fubar. Well, I did say that it was the simplest thing. Not the best or most informative thing. :) >> If ustat(device) was reporting that it's mounted, but >> /proc/partitions didn't show it, then the device was in some kind >> of limbo state, I guess, and that sort of umount handling is below >> XFS (or any other filesystem), as far as I know. > > I'm confused here. /dev/old was not in /proc/partitions or > /proc/mounts, /dev/new was in /proc/partitions but not in > /proc/mounts, even after disconnect and reconnect of the drive the > /dev/new refused to be acted on by xfs_check or xfs_repair. How did > that happen? All right, apparently there was a slate xfs instance in > the kernel, not visible anywhere, but that was attached to /dev/old, > why did xfs_repair fail to work on /dev/new until the stale xfs > instance in the kernel finished shutting down. Somewhere in the vfs, the filesystem was still present in a way that the ustat syscall reported that it was mounted. xfs_repair uses this syscall to determine mounted state. It called sys_ustat, got an answer of "it's mounted" and refused to continue. It refused to continue because running xfs_repair on a mounted filesystem would lead to severe damage. >> What initiated the unmount, was it you (after the USB disconnect) >> or some udev magic? > > The disconnect of the USB drive, specifically the internal HUB in the > notebook failed (don't know how), I reset it from ssh (keyboard is > also on the hub), see below, I didn't find any messages from any user > space system, but they might not log everything, but there were > messages about the XFS driver detecting the error, the USB hub being > fubar-ed, the device being off-line, so I'm guessing it was the panic > action, or maybe userspace. I'm not sure, I wasn't able to find out > how XFS handles errors, there's nothing in the manual pages and google > didn't help. Do you know? I.e. the equivalent of errors=remount_ro, or > whatever. One page claimed xfs doesn't recognize this option. My > system has the defaults and it's ubuntu/precise, if that helps. If xfs encounters an insurmountable error, it will shut down, and all operations will return EIO or EUCLEAN. You are right that there is no errors=* mount option; the behavior is not configurable on xfs. You're right that this doesn't seem to be well described in documentation, that's probably something we should address. As for the root cause event; XFS on a yanked and re-plugged USB device is not something that is heavily tested, to be honest, and it's something that no filesystem handles particularly well, as far as I know. (I know that ext4 has had some patches to at least make it a bit less noisy...) - -Eric > Martin > > > > > May 2 15:49:06 lennie kernel: [344344.325232] sd 11:0:0:0: rejecting > I/O to offline device > May 2 15:49:39 lennie kernel: [344377.367220] hub 2-1:1.0: > hub_port_status failed (err = -110) > May 2 15:49:44 lennie kernel: [344382.459545] hub 2-1:1.0: > hub_port_status failed (err = -110) > May 2 15:49:50 lennie kernel: [344387.551918] hub 2-1:1.0: > hub_port_status failed (err = -110) > May 2 15:49:50 lennie kernel: [344388.413611] sd 6:0:0:0: rejecting > I/O to offline device > May 2 15:49:50 lennie kernel: [344388.413650] sd 6:0:0:0: rejecting > I/O to offline device > May 2 15:49:50 lennie kernel: [344388.413668] sd 6:0:0:0: rejecting > I/O to offline device > May 2 15:49:52 lennie kernel: [344390.062780] sd 6:0:0:0: rejecting > I/O to offline device > May 2 15:49:52 lennie kernel: [344390.062837] ffff8801034da000: 80 ab > 4d 03 01 88 ff ff 00 00 70 b4 f0 7f 00 00 ..M.......p..... > May 2 15:49:52 lennie kernel: [344390.062844] XFS (sdb104): Internal > error xfs_dir2_data_reada_verify at line 226 of file > /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_dir2_data.c. > Caller 0xffffffffa079e33f > May 2 15:49:52 lennie kernel: [344390.062844] > May 2 15:49:52 lennie kernel: [344390.062852] Pid: 642, comm: > kworker/0:1H Tainted: G C 3.8.0-39-generic #57~precise1-Ubuntu > May 2 15:49:52 lennie kernel: [344390.062854] Call Trace: > May 2 15:49:52 lennie kernel: [344390.062902] [] > xfs_error_report+0x3f/0x50 [xfs] > May 2 15:49:52 lennie kernel: [344390.062921] [] ? > xfs_buf_iodone_work+0x3f/0xa0 [xfs] > May 2 15:49:52 lennie kernel: [344390.062939] [] > xfs_corruption_error+0x5e/0x90 [xfs] > May 2 15:49:52 lennie kernel: [344390.062966] [] > xfs_dir2_data_reada_verify+0x59/0xa0 [xfs] > May 2 15:49:52 lennie kernel: [344390.062986] [] ? > xfs_buf_iodone_work+0x3f/0xa0 [xfs] > May 2 15:49:52 lennie kernel: [344390.062994] [] ? > finish_task_switch+0x4a/0xf0 > May 2 15:49:52 lennie kernel: [344390.063013] [] > xfs_buf_iodone_work+0x3f/0xa0 [xfs] > May 2 15:49:52 lennie kernel: [344390.063019] [] > process_one_work+0x141/0x4a0 > May 2 15:49:52 lennie kernel: [344390.063024] [] > worker_thread+0x168/0x410 > May 2 15:49:52 lennie kernel: [344390.063029] [] ? > manage_workers+0x120/0x120 > May 2 15:49:52 lennie kernel: [344390.063034] [] > kthread+0xc0/0xd0 > May 2 15:49:52 lennie kernel: [344390.063039] [] ? > flush_kthread_worker+0xb0/0xb0 > May 2 15:49:52 lennie kernel: [344390.063046] [] > ret_from_fork+0x7c/0xb0 > May 2 15:49:52 lennie kernel: [344390.063050] [] ? > flush_kthread_worker+0xb0/0xb0 > May 2 15:49:52 lennie kernel: [344390.063054] XFS (sdb104): > Corruption detected. Unmount and run xfs_repair > May 2 15:49:52 lennie kernel: [344390.067128] sd 6:0:0:0: rejecting > I/O to offline device > May 2 15:49:52 lennie kernel: [344390.067158] XFS (sdb104): metadata > I/O error: block 0x8a6ec930 ("xfs_trans_read_buf_map") error 117 numblks 8 > May 2 15:49:52 lennie kernel: [344390.067179] ffff8801034da000: 80 ab > 4d 03 01 88 ff ff 00 00 70 b4 f0 7f 00 00 ..M.......p..... > May 2 15:49:52 lennie kernel: [344390.067184] XFS (sdb104): Internal > error xfs_dir2_block_verify at line 71 of file > /build/buildd/linux-lts-raring-3.8.0/fs/xfs/xfs_dir2_block.c. Call > er 0xffffffffa07d7f3e > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTY+ZbAAoJECCuFpLhPd7gtk8QAJ65zHJXtYtC/zGndfeok8en 5gbG5Ctgz3uZlMVL0/JGAlHGJDxGBS9YcHBNr/WJmC9VtRinQno/o4L0Z1nycWb/ kAMfDPRJyV4qfMSo8UQOXLovoA6p+neuF5pkVX9m2nmjM4CgQTmmCEEnmUkE78Yj 8lcy4xtWM6tlYVDS5LiNRplaATXJXuBZGL9glxqnxUwGy34/2z+YtcrBNUM0rRtN VH1ws/ci9RwMWDWy7gfEzbJIQMRVUpHmNeC2PIlRVK130YpbwjqIoEpYOeyfBeVE f8uSrGZVSEj4qEm5K72Ulx+GjbLCqhhIQcBDFmqwyhTxph+ARJd1ium3cUN9r6Ki nbWHA0f2PG04E8a5O3pr0Kn61B6Y2a0fuzrMaGNG6dftJa7UPcknEQzRTk8+8dwE uD1veinxP/w9vJjDL0pSbSz1T8sJGF5nCD4cszhN/iplYjf3R3EQXf4p6pDbGeSh NUT97ysxjqbIBeZaM+pUkzPNfY9vjjCqbxUrimIGiOq3QzovILszvb1U7taIP7EI 5FF0a/NbYHvp+Ks8r6zst0HAxPQ6UMx5+1Yxi5zo23ROq3PKGz/t3zWi6zgYkfzO 08IIDiEBtD7M5CIv/mVsK9CX+5nFG6g2khYB6xlsLGYjxUZHw/TTRB+xpflI/qJi Yg0LgqPOXkH36W08nJLG =srIM -----END PGP SIGNATURE----- From mp6058@gmail.com Fri May 2 14:07:27 2014 Return-Path: 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,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 9F9FD7F6F for ; Fri, 2 May 2014 14:07:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A0AC304059 for ; Fri, 2 May 2014 12:07:27 -0700 (PDT) X-ASG-Debug-ID: 1399057639-04bdf02b8d26f040001-NocioJ Received: from mail-ee0-f44.google.com (mail-ee0-f44.google.com [74.125.83.44]) by cuda.sgi.com with ESMTP id tFaREAsBiIq19kVE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 12:07:20 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.44 Received: by mail-ee0-f44.google.com with SMTP id c41so3371622eek.31 for ; Fri, 02 May 2014 12:07:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=gGIPuc3Eap8X2qGJ9z7WmQ7YOtCObjQDD2xjE+TSnWM=; b=JkWCXsEZt9pYgkxiy8GeaoSw80M3b4UNO2snEBsAcur/RGda83jvnB4x5OAMcc85fS PLkwe7KyCC2/ZEF8SCOrWOzW+vZN3cmdzsC2et9l+HJGT+EhJH2T93XgFbbXK1UHyvhB 3fjWYf6M3B3dUSbZ22CGBmPmDBp0bC9tsoMo4Et/Y2zUlufGZ4B/Xx1z1+IFZIpXC9KQ 6SE1N1v3umSWXKvNI8EowR262n0eKfkWa75LSTI+VxAql0xZK0WJeVmH5lidvyrFjbwG uxRiwyJpaggKSqV5L8dsPC5DmxLOSmAZiM258KKb8QRomwdYWt6kdxb7/AlEotaGEHeY WTiw== X-Received: by 10.15.53.69 with SMTP id q45mr16786727eew.22.1399057639182; Fri, 02 May 2014 12:07:19 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id 48sm6745249eee.2.2014.05.02.12.07.17 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 12:07:18 -0700 (PDT) Message-ID: <5363ECE8.6030706@gmail.com> Date: Fri, 02 May 2014 22:07:20 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363E65C.6010006@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f44.google.com[74.125.83.44] X-Barracuda-Start-Time: 1399057640 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.5475 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: SHA512 > to be honest, I'm not certain; if it came back under the same > device name, things may have continued. I'm not sure. Personally, I haven't seen it reconnect even once. I've seen disks fail to appear until the old references are removed, or even partitions not detecting until all is clean. Reconnecting, only on SW raid, and only when everything was just right. > In general, filesystems are not very happy with storage being > yanked out from under them. Yup, I know that, except when there's raid 1, 5 or 6, some yanking is possible. But I wish it were possible, even if manually at my own risk. > Well, I did say that it was the simplest thing. Not the best or > most informative thing. :) I know, I'm just philosophically opposed to rebooting, every time I'm forced to reboot a system I have a nagging feeling I don't really know what the problem is and how to fix it. So, having to reboot makes me think I'm stupid. So I prefer fixing things. > Somewhere in the vfs, the filesystem was still present in a way > that the ustat syscall reported that it was mounted. xfs_repair > uses this syscall to determine mounted state. It called sys_ustat, > got an answer of "it's mounted" and refused to continue. > > It refused to continue because running xfs_repair on a mounted > filesystem would lead to severe damage. I understand that, and I'm okay with whatever I need to do in order to restore the FS after the failure, but it would be good to have xfs report the status correctly, i.e. show up in /proc/mounts UNTIL all resources are released. What do you think? > If xfs encounters an insurmountable error, it will shut down, and > all operations will return EIO or EUCLEAN. You are right that > there is no errors=* mount option; the behavior is not configurable > on xfs. IMHO it should be, but since the last email I've glanced at some mailing lists and understand that there's some reluctance, in the name of not polluting the FS after an error. But at least a R/O remount should be possible, to prevent yanking libraries from under applications (root FS). > You're right that this doesn't seem to be well described in > documentation, that's probably something we should address. Yup, any idea when? .... Also, I think it would be good to have a section on what to do when things go south and what to expect. E.g. I found out the hard way that xfs_check on a 2TB disk allocates 16G of memory, so now I'm running it with cgroup based limitations, otherwise I couldn't even open my emails now. I'm still not sure when to run xfs_check and when xfs_repair, etc. At least I haven't seen such docs. Maybe I missed them. Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY+zaAAoJELsEaSRwbVYr5+MP/AnX6a3aKjwgCI9NzV7/0FG2 Whm/9JR+wg3r0DQ1jc+RUn2NfFIFjkABmxid+icZeZy3o3P0fAcS8yFlKIdzvZaA k7KWgITDbpd/IxVJA1kplxS+MJW/1ACUxGEfsEfDR9YwtkPR3hiFP0vNCp+Y8RTi EDawgNYhJrmLFN/8cMkryPAWiowEBebUZAvDClwMkt9wJW0RzAeccc07IRHAMEuN fBeu+iJJwMdGn/NQfJrOZBXdwU9C/M7v43L269g4H8mCSOFiHCe4prtKWK7LHb0q JvAddCESBEYgAoO7LpZumAmpoGZDR69d80aLvWEayBm+FVi84Wbwl5gde+QH7UKx lH2rWEngSv61OmW0CRfZ2MthYsjGGJF/+4JrVepSiCpu2Vra9X9yOZKV+aJzt+fX lSgaoXsYNIkimJ1fDJHFMeHlZzU4ju4avD6YBNdZP/WPc20awxhv1jJys3ZZCwUc ynAx44AFUS6PXqf6rGJngc/wcfvWDBYio7umbfx/WeLt2cn5CcNhqOWCvu4TNuAt mn4vG1ULIP8v5YaTfDuZQ7vfP4DVDGWqyd4ZTdLkix0wXAAnwZrbpAVST8sgcKY9 17N5dXUT2JyoUZVydRwBzZPORNj6iWO3aKnXykAk/rW+yTGRJuamluS4GYmZQtaK EqJhKeQD81CDtWPlnSr8 =+dT5 -----END PGP SIGNATURE----- From sandeen@sandeen.net Fri May 2 14:16:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 537D27F75 for ; Fri, 2 May 2014 14:16:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C34E304059 for ; Fri, 2 May 2014 12:16:00 -0700 (PDT) X-ASG-Debug-ID: 1399058157-04bdf02b8c26f960001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sfkSo1tdodicknvv for ; Fri, 02 May 2014 12:15: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7DC6463C5FF1; Fri, 2 May 2014 14:15:57 -0500 (CDT) Message-ID: <5363EEF4.7020200@sandeen.net> Date: Fri, 02 May 2014 14:16:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Martin Papik , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363ECE8.6030706@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399058157 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_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/2/14, 2:07 PM, Martin Papik wrote: ... >> You're right that this doesn't seem to be well described in >> documentation, that's probably something we should address. > > Yup, any idea when? .... Also, I think it would be good to have a > section on what to do when things go south and what to expect. E.g. I > found out the hard way that xfs_check on a 2TB disk allocates 16G of > memory, so now I'm running it with cgroup based limitations, otherwise > I couldn't even open my emails now. I'm still not sure when to run > xfs_check and when xfs_repair, etc. At least I haven't seen such docs. > Maybe I missed them. We have a lot of docs at http://xfs.org/index.php/XFS_Papers_and_Documentation in publican/xml format, but Dave has been making noises about converting that to asciidoc. In any case, the goal is documentation which is readily available, version-controlled, for which patches may be submitted... Like everything else, there are more things to do than there are hours to do them. - -Eric > Martin > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTY+70AAoJECCuFpLhPd7gRAYP/2m4sRZZh6yb2z7FZOZOv9l9 uwde0O1/dLt1wpBArcdQoOnMSyPGXzH/0Dd0iDoGSCaTOGlfSwsLTnz7vzemN7am bhhh0ky9vLaUdmqIBJA/DJYcPx3yJiTUm9W5ats8cWJFOMajgF9X92Lg5nlmDrto kOw6+73ct3ShHo0yzf/SlbcBkPbQ7SJ3XAFyD7eF2+UxEe+UMRmPZq+C0PCYBYpE GMi9ByUKuWSM3Misy+e9LBrnHFkq+JT+Z9EnBxJGACWQ+ctDMCjzou1TEWFiljd1 lXdotGOGDR9ETFC4A/9lmCd/CHgJ3xYVXxpgOH4sJuRsUG1QOgw/sInv2fbvDdTg 5f70Od3zzO3UflwWbz8LkltODc1Q+uCWdr2wDzRFQ1JWlxT1BdNvOs9Muly9FQFD 0AwusjyDiOhO8QFocivp2sYuohvUMlMCLKx07QPtVkx0a7o3N8iG4hOjMaAc8oEn mNAHJMU/Et2VHFJr14mDUee3SeC+lMmKhhZ1SMr/G3WOlwaH6C7jpkts+rXWkHqI r1GakzXi+F+hONLWSFTylwXFLioqHqjBYt/8UWZ/1pmw4pHFHm7XTwNdsaiLErtW 0a8fYvTFeSHWhPCX6s1XnUBqSFFADo7Q1ApJ3c9+bXlwWM7YOCxA9BtTLXNDJZCQ 22PiBukZVLhpYmNRZs4y =TPaU -----END PGP SIGNATURE----- From mp6058@gmail.com Fri May 2 14:29:51 2014 Return-Path: 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,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 0051129DF8 for ; Fri, 2 May 2014 14:29:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA577304059 for ; Fri, 2 May 2014 12:29:50 -0700 (PDT) X-ASG-Debug-ID: 1399058988-04cbb03cc6260e40001-NocioJ Received: from mail-ee0-f42.google.com (mail-ee0-f42.google.com [74.125.83.42]) by cuda.sgi.com with ESMTP id wXVQuYSqPyixltLz (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 12:29:49 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.42 Received: by mail-ee0-f42.google.com with SMTP id d17so3445834eek.29 for ; Fri, 02 May 2014 12:29:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=jgYVX4YwkwpJO9HWCVhrnZSsHWWj+SiMxTmPt2nJyFY=; b=xdySs21R1RcpzyqTTwAGIUEN1ZFY4ZlGVweI1iA9oU6k3R+epfGz2jH4Bk6yKFNv8p ULd0DsAzEU1o+EN6vRH/L4EP+siIKl5JCyo9DnSWgczyd8jxq8Ln8qVbKZu1ANB+5XpN piF9S4qj4iG2S1XAgaQM0YZqAb4IcCFzszsVdekevkLt2NOO7ckbCCWq3UOZldy3XOAG 0oxgVAhGxmyCHQE2Fk9twe2WgDGHFE59v+KO7vGad0V4v2hUr0xB6fE8fThAtsYq9xSQ O8kECOwvuDohKlZKdv2r1d4uOBaUdD5Fyml9KZHd42HfSHwP26oOAVYWj5VHSXkeZG57 cnJA== X-Received: by 10.14.110.199 with SMTP id u47mr16818871eeg.74.1399058988204; Fri, 02 May 2014 12:29:48 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id z48sm6846008eel.27.2014.05.02.12.29.46 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 12:29:47 -0700 (PDT) Message-ID: <5363F22E.2060404@gmail.com> Date: Fri, 02 May 2014 22:29:50 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <5363EEF4.7020200@sandeen.net> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <5363EEF4.7020200@sandeen.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f42.google.com[74.125.83.42] X-Barracuda-Start-Time: 1399058989 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.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_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5476 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.10 BSF_SC0_SA085 Custom Rule SA085 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 > We have a lot of docs at > http://xfs.org/index.php/XFS_Papers_and_Documentation in > publican/xml format, but Dave has been making noises about > converting that to asciidoc. In any case, the goal is > documentation which is readily available, version-controlled, for > which patches may be submitted... Unless this documentation is part of the installable package, its utility is limited. My expectation was for the manual pages to be the reference. There could be a snippet in each man page saying "for more information go to http://....", which would help locate this additional documentation. :-) Anyway, thanks for the link. I'll have a look. Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTY/IlAAoJELsEaSRwbVYrELgP/3gq8APx4OKxKaFpWpuQi+TV okqLv7HHtiz3LnL7D8IhM6m2V4UUqgrsWATDtieRAFRmGFZDAVfzjsIpjIi/aGK3 nhEB1vpumwx2r25NOQXanQ4RLcPydIWkp/yQNe+9n9JTkpJwZopgSGPyAFiuBy/P JlTOG/1Izqs/t9zCYMbjfrpbgRhyS6tpnS//bIaXb5oDwRFiuT6uQG1RRmWIUMFz eutCqpax2A4U5vdk5E7mhoytykSdX6ZiGyvHEBtHYnNFVwnfHGEsxfdmJQOe9vpj Wp45aR0QO/7XnE4/L47bRkxiGJ7f9jAcq+oyWpT1FYapbCHCIujXIcXNzjEtyLl1 PQpMmFOL4B4qkoG574qm1Lvx0RGkwb/gwmCoKXnnK8Za1kxRQFYNvUl99SHpWjzf iVuOK2Akr0E+AGf3Eviqvx8Y1HA7m31Z4LfofIXpp1lzmKuHIeFCvQT/tzWPbIFs XBKiy9R5fJ+lS6QNkHC4HvbI1SEGSjv3WWbiFOIMPin9/Vr/hmtAVP4TklMqT/kw M54ksMdJ+LE/WW5HwtUAMzhDF9PK2BDdM1ESukhW84Vzz6Ccj4pCqqP9vae+z9eL XimHCgGD2NUMsST8TJ9g2z/6IRDnkegUzI6w0kTWs72+OOnvFXK3TGV0BxOM0lCx VcVffcgToVy7KRv00ZAz =7tAo -----END PGP SIGNATURE----- From david@fromorbit.com Fri May 2 18:24:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C41537F6F for ; Fri, 2 May 2014 18:23:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B42268F804B for ; Fri, 2 May 2014 16:23:59 -0700 (PDT) X-ASG-Debug-ID: 1399073034-04cbb03cc726e8f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id VpIwkMQuDTFDkgI2 for ; Fri, 02 May 2014 16:23: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: AlsMAKYoZFN5LEcv/2dsb2JhbABZgwaDPagoAQEBAQEBBAGaBYENF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQMpcFxaFQIh8B4MkgRUEmS+KfId0g0Yr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 08:53:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgMnr-0001V7-9j; Sat, 03 May 2014 09:23:39 +1000 Date: Sat, 3 May 2014 09:23:39 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140502232339.GD26353@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> <20140502100802.GB14028@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502100802.GB14028@infradead.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: 1399073034 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.5481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 02, 2014 at 03:08:02AM -0700, Christoph Hellwig wrote: > On Fri, May 02, 2014 at 05:00:54PM +1000, Dave Chinner wrote: > > The reason truncate_setsize() was located where in this place was > > that we can't change the file size until after we are in the > > transaction context and the operation will either succeed or shut > > down the filesystem on failure. Hence we have to split > > truncate_setsize() back into a pagecache operation that occurs > > before the transaction context, and a i_size_write() call that > > happens within the transaction context. > > Further updating myself earlier on the comment next to > truncate_pagecache claims that the file size must have been updated > before, but I can't see a reason for that. Oh, I can, and that reminds me of why - racing with mmap page faults, which aren't serialised against truncate except by an indirect combination of the page locks and i_size updates. hence if we remove the pages before updating the inode size, then a page fault can re-instantiate a page after the truncation beyond the new EOF when, in fact, it should SEGV. So, no, we can't split truncate_setsize() like this. As it is, we've already made a user visible data change in the truncate process before we get to the transaction that can fail: block_truncate_page() zeroes the tail of the page cache page. Hence if the transaction reservation fails, we've already trashed the file data - we may as well finish off the job and at least make it look like the truncate succeeded from a user point of view. They then get a ENOMEM error (only non-fatal error that can come from xfs_trans_reserve) and try the truncate again.... So I now think the first version of the patch is better than this one.. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 2 18:35:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3758F7F75 for ; Fri, 2 May 2014 18:35:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 242D58F8040 for ; Fri, 2 May 2014 16:35:28 -0700 (PDT) X-ASG-Debug-ID: 1399073725-04cbb03cc626f2e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id e8f9FVM3qEJzkT9N for ; Fri, 02 May 2014 16:35:26 -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: AlwMAA8rZFN5LEcv/2dsb2JhbABZgwaDPagoAQEBAQEBBAGaBYENF3SCJQEBBAE6HBgLBQsIAw4KCSUPBSUDIROIOQfKXRcWhUCIGhEBUAeDJIEVBJU6g3WScINGK4E5 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 09:05:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgMz2-0001WR-CT; Sat, 03 May 2014 09:35:12 +1000 Date: Sat, 3 May 2014 09:35:12 +1000 From: Dave Chinner To: Martin Papik Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect Message-ID: <20140502233512.GE26353@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5363ECE8.6030706@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: 1399073725 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.5481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 02, 2014 at 10:07:20PM +0300, Martin Papik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > > to be honest, I'm not certain; if it came back under the same > > device name, things may have continued. I'm not sure. No, they won't. Because the disconnection breaks all references from the filesystem to the original block device. > Personally, I haven't seen it reconnect even once. I've seen disks > fail to appear until the old references are removed, or even > partitions not detecting until all is clean. Reconnecting, only on SW > raid, and only when everything was just right. Right, that's because sw raid probes the new drive, finds the MD/LVM signature, and knows where it put. Nothing else does. > > Somewhere in the vfs, the filesystem was still present in a way > > that the ustat syscall reported that it was mounted. xfs_repair > > uses this syscall to determine mounted state. It called sys_ustat, > > got an answer of "it's mounted" and refused to continue. > > > > It refused to continue because running xfs_repair on a mounted > > filesystem would lead to severe damage. > > I understand that, and I'm okay with whatever I need to do in order to > restore the FS after the failure, but it would be good to have xfs > report the status correctly, i.e. show up in /proc/mounts UNTIL all > resources are released. What do you think? It's called a lazy unmount: "umount -l". It disconnects the filesystem from the namespace, but it still lives on in the kernel until all references to the filesystem go away. Given that the hot-unplug proceedure can call back into the filesystem to sync it (once it's been disconnected!) the hot unplug can deadlock on filesystem locks that can't be released until the hot-unplug errors everything out. So you can end up with the system in an unrecoverable state when USB unplugs. > > If xfs encounters an insurmountable error, it will shut down, and > > all operations will return EIO or EUCLEAN. You are right that > > there is no errors=* mount option; the behavior is not configurable > > on xfs. > > IMHO it should be, but since the last email I've glanced at some > mailing lists and understand that there's some reluctance, in the name > of not polluting the FS after an error. But at least a R/O remount > should be possible, to prevent yanking libraries from under > applications (root FS). What you see here has nothing to do with XFS's shutdown behaviour. The filesystem is already unmounted, it just can't be destroyed because there are still kernel internal references to it. > > documentation, that's probably something we should address. > > Yup, any idea when? .... Also, I think it would be good to have a > section on what to do when things go south and what to expect. E.g. I > found out the hard way that xfs_check on a 2TB disk allocates 16G of > memory, so now I'm running it with cgroup based limitations, otherwise $ man xfs_check .... Note that xfs_check is deprecated and scheduled for removal in June 2014. Please use xfs_repair -n instead. .... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 2 18:38:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 74F377F78 for ; Fri, 2 May 2014 18:38:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F176DAC002 for ; Fri, 2 May 2014 16:38:51 -0700 (PDT) X-ASG-Debug-ID: 1399073929-04cbb03cc526f5c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id KUc514kLZL35O5Lf for ; Fri, 02 May 2014 16:38: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: Al0MACwsZFN5LEcv/2dsb2JhbAA/GoMGT4JuqCgBAQEBAQEEAZoFgQ0XdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4hADjbKMRaFQIgkAVcHgySBFQSZL5Jwg0YrMAF/AR8 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 09:08:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgN27-0001X4-G3; Sat, 03 May 2014 09:38:23 +1000 Date: Sat, 3 May 2014 09:38:23 +1000 From: Dave Chinner To: Martin Papik Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect Message-ID: <20140502233823.GF26353@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <5363EEF4.7020200@sandeen.net> <5363F22E.2060404@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5363F22E.2060404@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: 1399073929 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Fri, May 02, 2014 at 10:29:50PM +0300, Martin Papik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > > > We have a lot of docs at > > http://xfs.org/index.php/XFS_Papers_and_Documentation in > > publican/xml format, but Dave has been making noises about > > converting that to asciidoc. In any case, the goal is > > documentation which is readily available, version-controlled, for > > which patches may be submitted... > > Unless this documentation is part of the installable package, its > utility is limited. My expectation was for the manual pages to be the > reference. There could be a snippet in each man page saying "for more > information go to http://....", which would help locate this > additional documentation. :-) Eventually it will become exactly that - an installable XFS documentation package that ends up in /usr/share/doc/xfs. Other parts of it will end up as the source for the wiki pages e.g. the FAQ. As I do stuff, it ends up here: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git But right now it's time and resources that limit the conversion and development of that repository, so don't hold your breathe too long waiting for it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 2 18:48:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E537C7F6F for ; Fri, 2 May 2014 18:48:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C22EC8F8040 for ; Fri, 2 May 2014 16:48:53 -0700 (PDT) X-ASG-Debug-ID: 1399074531-04cb6c7290289090001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UF7ht0IW4CSzBtMQ for ; Fri, 02 May 2014 16:48: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: AlsMAIQuZFN5LEcv/2dsb2JhbABZgwaDPagoAQEBAQEBBAGaBYENF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQMphFxaFQIh8B4Q5BJkvknCDRis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 09:18:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgNBv-0001YG-5w; Sat, 03 May 2014 09:48:31 +1000 Date: Sat, 3 May 2014 09:48:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfstests: fixes for the free inode btree Message-ID: <20140502234831.GG26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/5] xfstests: fixes for the free inode btree References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399050842-19633-1-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: 1399074531 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.5482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, May 02, 2014 at 01:13:57PM -0400, Brian Foster wrote: > Hi all, > > This series is a few xfstests fixes and addons for the finobt. Patch 1 > fixes xfs/030 to work correctly on finobt-enabled filesystems. Patches 2 > and 3 add support for finobt-oriented tests via require functions and > repair filter updates. Patch 4 adds a new test for targeted repair of > finobt filesystems. Patch 5 adds a stress test that creates/modifies a > sparsely allocated set of inodes to effectively exercise the finobt in > conjunction with an fsstress workload. > > xfs/010 runs very quickly. xfs/013 runs for 5-10 minutes on my smallish > VM running against a single spindle, so I've been back and forth on > whether it should be part of the auto group. Thoughts, reviews, flames > appreciated... 5-10 minutes is probably right at the edge for auto, but I think that most people won't be testing this any time soon. Hence I'd include it by default in the auto group, and if people complain about the runtime when they start testing it, we can revist that choice. FWIW, I'd also include it in the metadata group so that it gets exercised when people run that group.... I had a quick eyeball of the changes, and nothing major stood out. The only thing I noticed was a missing "wait" in the _cleanup function of xfs/013 after killing all the fsstress processes. It should probably using killall -9 as well. If we don't wait, then the unmount will fail and if the fsstress processes don't die it will affect every test after that... I'll probably have more suggestions once I've run the tests ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From mp6058@gmail.com Fri May 2 19:04:55 2014 Return-Path: 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,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 F0C837F37 for ; Fri, 2 May 2014 19:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C54AA8F804B for ; Fri, 2 May 2014 17:04:52 -0700 (PDT) X-ASG-Debug-ID: 1399075486-04bdf02b8d2802d0001-NocioJ Received: from mail-ee0-f50.google.com (mail-ee0-f50.google.com [74.125.83.50]) by cuda.sgi.com with ESMTP id 7P1xPAbTd6caG6Cv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 17:04:47 -0700 (PDT) X-Barracuda-Envelope-From: mp6058@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.50 Received: by mail-ee0-f50.google.com with SMTP id c13so3520582eek.23 for ; Fri, 02 May 2014 17:04:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=55jLAU9QFAjtlaAmTAKg3eojcn44kfRmWZ1no1vu9yA=; b=jW6Jg9OGwaoJl+MMX93zqmQzA/gYDpE/J6B3pzGua7Yogtj0b6d0CQhm91996KUOoX 0HQ6BvQOb2cJay3il6eUsPjUZZTjhBg14XCF9HDDOJByruqQ3S+o3WwxLGv7BV4796zq 0CoWASmhgdzzanIBlRlZLkcpQA6xjkljggrkm6+W6CMdtUiSRhlc6VB90P+P8nXQR8+/ RLG69OXjbSxZcdsSyn8Yp1UkY/uIPOgBSqnpr+OHqCXNZBX941KcIhQqJ6cWBXfa5cgy U2CMluF+4xfzvMOCaRfCrzjhIQOHFJTW4r4cBSS7Le15ZHob920igpe0aTexpVigowbr oi5A== X-Received: by 10.14.206.137 with SMTP id l9mr17991397eeo.40.1399075485921; Fri, 02 May 2014 17:04:45 -0700 (PDT) Received: from [192.168.1.14] ([37.131.65.197]) by mx.google.com with ESMTPSA id x45sm8377918eef.15.2014.05.02.17.04.44 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 May 2014 17:04:45 -0700 (PDT) Message-ID: <536432A0.6000405@gmail.com> Date: Sat, 03 May 2014 03:04:48 +0300 From: Martin Papik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect In-Reply-To: <20140502233512.GE26353@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ee0-f50.google.com[74.125.83.50] X-Barracuda-Start-Time: 1399075487 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.5482 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: SHA512 > It's called a lazy unmount: "umount -l". It disconnects the > filesystem from the namespace, but it still lives on in the kernel > until all references to the filesystem go away. Given that the > hot-unplug proceedure can call back into the filesystem to sync it > (once it's been disconnected!) the hot unplug can deadlock on > filesystem locks that can't be released until the hot-unplug errors > everything out. > > So you can end up with the system in an unrecoverable state when > USB unplugs. And the disconnect from the namespace is what removes it from /proc/mounts? By hot unplug, do you mean a user initiated "remove device" or a pull out of the USB cable? I'm sorry, I don't understand your example. Would you be kind enough to elaborate? >>> If xfs encounters an insurmountable error, it will shut down, >>> and all operations will return EIO or EUCLEAN. You are right >>> that there is no errors=* mount option; the behavior is not >>> configurable on xfs. >> >> IMHO it should be, but since the last email I've glanced at some >> mailing lists and understand that there's some reluctance, in the >> name of not polluting the FS after an error. But at least a R/O >> remount should be possible, to prevent yanking libraries from >> under applications (root FS). > > What you see here has nothing to do with XFS's shutdown behaviour. > The filesystem is already unmounted, it just can't be destroyed > because there are still kernel internal references to it. How can I detect this situation? I mean I didn't see anything in /proc/mounts or references to the mount point from /proc//*, so I only managed to correct it (chdir elsewhere) by chance on a hunch. Would it not be desirable to know that there's a phantom FS referenced by a number of processes? Also, do you know if this affects other filesystems? I never saw this with ext3/4 or reiser, I don't have much practical experience with other filesystems. I ask because your explanation sounds like it's vfs rather than xfs, but as I said, I never saw this before. >>> documentation, that's probably something we should address. >> >> Yup, any idea when? .... Also, I think it would be good to have >> a section on what to do when things go south and what to expect. >> E.g. I found out the hard way that xfs_check on a 2TB disk >> allocates 16G of memory, so now I'm running it with cgroup based >> limitations, otherwise > > $ man xfs_check .... Note that xfs_check is deprecated and > scheduled for removal in June 2014. Please use xfs_repair -n > instead. Thanks, I didn't know that. Martin -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBCgAGBQJTZDKTAAoJELsEaSRwbVYr5T4QAJ+10OjafQUnX6zvG0Lrhs1C G+4Liuxm5aUmINKfUEeuhPJOsNfrdrSs+/SW6G9u5Lhu6FSrll/+O1BLa4Ld6Mxx 3IADom8RQl0rcEMpBGnPNi1hTY0RycYk+Pzug1GzCz2nDE6zCojobvGoW8a02BaL pEdfh0NXDVAjSbTubHKXSqxWydIkVJacbshEy/BhySQuZmPSiu1BOIV1DTvGLqIz VIsYDkv7UvuZyKsBL+0ux/9gPVPNP78hIIvUU9hLomjfnUum02vV6ps6RJZtGjVt OKZ02qaIjaRPtlFCU21YTFr/x0WIGFsh7Zzfma4sDs4tXCqB7FEs+NA4Fq0zoHV0 OSCiiBgCTTtkph0Bn5/WycoVfkxm9eCru5eCLY1NeBRCIFi5rlRNX/Uvo9YO3twA PvvGMHFROYtNl0u+/e1Tkniylwtanx7esMgVb0rC4IYHeovxZkHIuFkjHv5/PMNs p+w8u6ZOfKOARUfYiFHOLVR/QAhp4ubhpTegD7d6Eqqtea/d/vGrUj6Bu/4svZ9j YsVmYqsnUe1Uisz+NarmH/t7KeeRJBqEPLvJ9rZ2P7ixQLOTxsnuyU7kOdZKpwIM jHAzaAIfxcntyL76hPbnkAdSZU//zOv3qfyfkD/NuqnKi1BOsQKZMMb9NEcA4OOg QoWmXdMC64OlWv1Buxdr =qP6z -----END PGP SIGNATURE----- From david@fromorbit.com Fri May 2 19:05:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6F5DC7F37 for ; Fri, 2 May 2014 19:05:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5D89030405F for ; Fri, 2 May 2014 17:05:29 -0700 (PDT) X-ASG-Debug-ID: 1399075526-04cb6c1fcc137e30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ueIrxnkRROD6yAW0 for ; Fri, 02 May 2014 17:05:27 -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: AlsMAAAyZFN5LEcv/2dsb2JhbABZgwaDPagoAQEBAQEBBAGaBYENF3SCJQEBBAE6HCMFCwgDGAklDwUlAyETiDkHymMXFoVAiHcFB4Q5BJkvinyHdINGKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 09:35:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgNS5-0001aY-2N; Sat, 03 May 2014 10:05:13 +1000 Date: Sat, 3 May 2014 10:05:13 +1000 From: Dave Chinner To: Bob Mastors Cc: xfs@oss.sgi.com Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error Message-ID: <20140503000512.GH26353@dastard> X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error References: <20140428234558.GD18672@dastard> <20140429010121.GE18672@dastard> <20140430032209.GA22353@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: 1399075526 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.5482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 02, 2014 at 11:32:19AM -0600, Bob Mastors wrote: > On Tue, Apr 29, 2014 at 9:22 PM, Dave Chinner wrote: > > Well, I guess I should been more specific. ftrace is pretty much > > useless here - we need the information taht is recorded by the > > events, not the timing of the events. > > > Heh, I have been trying to bluff my way through this. > I have hacked on file systems but am new to linux and xfs. I wouldn't have guessed that. Most of the time the response is "trace events? what are they?". :) > Output file attached but it all looks like this: > > xfsaild/sdb-3613 [001] 445.757616: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88001d3017b8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > xfsaild/sdb-3613 [001] 445.757617: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88001d301850 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88001de63ed8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88001cd24720 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88001cd248e8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > xfsaild/sdb-3613 [001] 445.757619: xfs_ail_flushing: dev 8:16 > lip 0x0xffff88002c435ab0 lsn 32/3573 type XFS_LI_INODE flags IN_AIL That's very enlightening - a bunch of inodes returning XFS_ITEM_FLUSHING from attempts to push them. > The addresses repeat. > I started the record as soon as I noticed the umount hanging, probably > within 20 seconds or so. > Also attached is the console output. > > This was done with your patch applied. > > Seems like xfsaild_push is missing a check that the file system is > XFS_FORCED_SHUTDOWN. It might look that way, but what is supposed to happen is that everything else is supposed to handle shutdown situations and empty the AIL. i.e. the act of issuing IO by the AIL is supposed to trigger shutdown processing on the objects, and so having the AIL shut down itself won't help. So, what's the problem? Well, the inodes have been flushed, triggering the inode buffer to be written. However, then inode buffer has had an IO error (i.e. the async write error), is retried, and then we stop retrying the IO. The idea is that the AIL will push it again soon and the IO will be retried. What is happening is that the inodes in the buffer are already marked as "being flushed" and hence the AIL does not push the inode buffer again, and hence the IO completion callbacks on the buffer that will remove the inodes from the AIL are never called. Not sure how to fix this one yet.... > Let me know if there is any other info I can capture that would be > interesting. I know what the problem is now, so testing a fix will be the next step. But I need to think about how to fix this, and that can wait till Monday. ;) Thanks for following up with the trace information, Bob! Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri May 2 19:26:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4E0577F37 for ; Fri, 2 May 2014 19:26:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFBCDAC002 for ; Fri, 2 May 2014 17:26:24 -0700 (PDT) X-ASG-Debug-ID: 1399076782-04bdf02b8c281480001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id thJSG9kHb1KSdOvN for ; Fri, 02 May 2014 17:26: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3C4CF63C5FF1; Fri, 2 May 2014 19:26:22 -0500 (CDT) Message-ID: <536437AD.9020303@sandeen.net> Date: Fri, 02 May 2014 19:26:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged References: <20140502000508.GA26353@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged In-Reply-To: <20140502000508.GA26353@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399076782 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.5483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 5/1/14, 7:05 PM, Dave Chinner wrote: > Hi folks, > > The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has > just been updated. > > The new head of the master branch is commit: > > 67fcc94 xfsprogs: v3.2.0-rc2 release > > This commit has been tagged with v3.2.0-rc2. I'd like everyone who > can test this to test it, as all the issues that needed to be solved > before a release coul dbe made have now been addressed. If there are > no new regressions or critical issues reported in the next week or > so, I will make an official 3.2.0 release. So, please test. :) Any chance for a signed tarball? - -Eric > -Dave. > > New Commits: > > Dave Chinner (10): > [b511ff4] db: don't claim unchecked CRCs are correct > [9ba69ce] db: verify buffer on type change > [adbb357] repair: ensure prefetched buffers have CRCs validated > [8e7e14b] repair: detect and correct CRC errors in directory blocks > [8f657d7] repair: detect CRC errors in AG headers > [a76a5a7] repair: report AG btree verifier errors > [641e65b] repair: remove more dirv1 leftovers > [7cb3f7f] repair: handle remote symlink CRC errors > [3a1d34e] repair: detect and handle attribute tree CRC errors > [67fcc94] xfsprogs: v3.2.0-rc2 release > > Eric Sandeen (2): > [847bbbe] xfs_logprint: Fix error handling in xlog_print_trans_efi > [aabc02b] mkfs.xfs: prevent close(-1) on protofile error path > > > Code Diffstat: > > VERSION | 2 +- > db/fprint.c | 15 ++- > db/io.c | 26 ++++++ > db/io.h | 13 ++- > db/type.c | 9 +- > doc/CHANGES | 5 + > include/libxfs.h | 3 + > libxfs/rdwr.c | 58 ++++++++---- > logprint/log_misc.c | 5 +- > mkfs/proto.c | 3 +- > repair/attr_repair.c | 45 +++++++-- > repair/dinode.c | 251 +++------------------------------------------------ > repair/dinode.h | 6 -- > repair/phase6.c | 94 +++++++++++++++---- > repair/prefetch.c | 7 +- > repair/scan.c | 108 +++++++++++++++------- > 16 files changed, 311 insertions(+), 339 deletions(-) > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTZDesAAoJECCuFpLhPd7gYR4P/idUYSSHbppJClmu7JreDlja yh8RvNxLxopQ96y4CrPmEqupT/n8ZO/T9xElr0mPEIltoFrFL1CTALa/u3cBNkf0 MOHdPmLB1t6JvavMSjSMzBoPmbkH6v2FH8TjZvuIDMJOeYgWPKspYKHGNesT2t+b nKfnyn00Z2hROSjHJozYNSYcmcXIZUI7RhlTaA+eXa2j8PrPBgqd+qmzN9NBUzmM NH8zkHerNrZLknMlZrTA4gKUaHYXgR1kPEdXC5IzBtlVqjVWv4o2ASDAlAUO1KAR mxCOdVcCxKBjbzn2pu4LgdNKhe7XFYenFwXxbxHs2gLwOaHnFlwCa45wEDm0g40W U60lwX2zlvmOP5QwqXUN13xeixR0Qsu/mAhuj5gXsj2SBPKPHvK1i9IC1pwvMwZE fSa8Al/0TTjZ2IwRfLSaLX5xruC486pdCCEVEYxkpdh4F6baSSbMsE6BsXDUJMs+ ouQXecjtmMA437o2h4stExKx2VVHrVpst/p7nPsR+1RISuqmyyOLq79riRHgGm5l YNQiwfmmxoXpdIcnh0QQ2WHvCed8zZA3YT6gLVG/KW8vEUB2/zFtfSS8jm2FKXKz rb2cPqOJ3KjMnMXu1QGZUb/UozS5jRls3LmYPRdQVo+/C1ceY2J6zLqdPeVI3Com bozat+0vW2lahDB8SVFi =SWEH -----END PGP SIGNATURE----- From bob.mastors@solidfire.com Fri May 2 19:47:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A91BC7F53 for ; Fri, 2 May 2014 19:47:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 385F1AC002 for ; Fri, 2 May 2014 17:47:25 -0700 (PDT) X-ASG-Debug-ID: 1399078041-04cbb03cc7274ce0001-NocioJ Received: from mail-qa0-f54.google.com (mail-qa0-f54.google.com [209.85.216.54]) by cuda.sgi.com with ESMTP id L5HjfDzy8gUrd6UY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 02 May 2014 17:47:23 -0700 (PDT) X-Barracuda-Envelope-From: bob.mastors@solidfire.com X-Barracuda-Apparent-Source-IP: 209.85.216.54 Received: by mail-qa0-f54.google.com with SMTP id s7so5051241qap.27 for ; Fri, 02 May 2014 17:47: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=0UdPOvodHlbutMkqzLl+Sz2/rwagEPLc68Jq4U+YlM4=; b=L7hpT85xBXB4dSB5X/YB4ELtNZjuBNdxpzXZmMTDl+hxkmIyhKXXxqc4Eo6BcTF17I +Z3LbUlK8f9AEp7Zq2VG9zGpENxlUGxii3sVCIbllFmEf9NnlU+HqlySAu70ykHPMBuY rS51bJiOzSTsgMowakFpvJLEf1tlhhcIiW4z4w7EMiFNp6Dw2pKUOA6bde2h2damTtlY B0euaIP2dXH/pOgw1gNXli0PK8N+YVMbjaQzmzn+luHCvOJTpDuBTA0t+fGnRD2cCbq9 qp5++yGyBtsT9Eo+Vo6dHCA2jF5bB7AUuyfQxO7GAEct9BJHaWp2zR7Z4Vbk10xzQGmq ESBg== X-Gm-Message-State: ALoCoQm2m4jh2+Z5NK/dlQuEvdCSaF4o9S8OUN5yb5t+Ig7Yi88TtZ6NEzEShOTcbA2OiLegmGTY MIME-Version: 1.0 X-Received: by 10.140.31.10 with SMTP id e10mr24738471qge.101.1399078041709; Fri, 02 May 2014 17:47:21 -0700 (PDT) Received: by 10.140.48.40 with HTTP; Fri, 2 May 2014 17:47:21 -0700 (PDT) In-Reply-To: <20140503000512.GH26353@dastard> References: <20140428234558.GD18672@dastard> <20140429010121.GE18672@dastard> <20140430032209.GA22353@dastard> <20140503000512.GH26353@dastard> Date: Fri, 2 May 2014 18:47:21 -0600 Message-ID: Subject: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error From: Bob Mastors X-ASG-Orig-Subj: Re: xfs umount hang in xfs_ail_push_all_sync on i/o error To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113a9c10b0837604f8743ddd X-Barracuda-Connect: mail-qa0-f54.google.com[209.85.216.54] X-Barracuda-Start-Time: 1399078043 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.5483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a113a9c10b0837604f8743ddd Content-Type: text/plain; charset=UTF-8 On Fri, May 2, 2014 at 6:05 PM, Dave Chinner wrote: > On Fri, May 02, 2014 at 11:32:19AM -0600, Bob Mastors wrote: > > On Tue, Apr 29, 2014 at 9:22 PM, Dave Chinner > wrote: > > > Well, I guess I should been more specific. ftrace is pretty much > > > useless here - we need the information taht is recorded by the > > > events, not the timing of the events. > > > > > Heh, I have been trying to bluff my way through this. > > I have hacked on file systems but am new to linux and xfs. > > I wouldn't have guessed that. Most of the time the response is > "trace events? what are they?". :) > > > Output file attached but it all looks like this: > > > > xfsaild/sdb-3613 [001] 445.757616: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88001d3017b8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > xfsaild/sdb-3613 [001] 445.757617: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88001d301850 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88001de63ed8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88001cd24720 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > xfsaild/sdb-3613 [001] 445.757618: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88001cd248e8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > xfsaild/sdb-3613 [001] 445.757619: xfs_ail_flushing: dev 8:16 > > lip 0x0xffff88002c435ab0 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > > That's very enlightening - a bunch of inodes returning > XFS_ITEM_FLUSHING from attempts to push them. > > > The addresses repeat. > > I started the record as soon as I noticed the umount hanging, probably > > within 20 seconds or so. > > Also attached is the console output. > > > > This was done with your patch applied. > > > > Seems like xfsaild_push is missing a check that the file system is > > XFS_FORCED_SHUTDOWN. > > It might look that way, but what is supposed to happen is that > everything else is supposed to handle shutdown situations and empty > the AIL. i.e. the act of issuing IO by the AIL is supposed to > trigger shutdown processing on the objects, and so having the AIL > shut down itself won't help. > > So, what's the problem? Well, the inodes have been flushed, > triggering the inode buffer to be written. However, then inode > buffer has had an IO error (i.e. the async write error), is retried, > and then we stop retrying the IO. The idea is that the AIL will push > it again soon and the IO will be retried. > > What is happening is that the inodes in the buffer are already > marked as "being flushed" and hence the AIL does not push the inode > buffer again, and hence the IO completion callbacks on the buffer > that will remove the inodes from the AIL are never called. Not sure > how to fix this one yet.... > Thanks for the explanation. It clears up some questions I had. > > > Let me know if there is any other info I can capture that would be > > interesting. > > I know what the problem is now, so testing a fix will be the next > step. But I need to think about how to fix this, and that can wait > till Monday. ;) > Just an fyi next week is busy for me with some other stuff so I won't be able to try out a fix until the following week. > > Thanks for following up with the trace information, Bob! > Not a problem. Thanks, Bob > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a113a9c10b0837604f8743ddd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On F= ri, May 2, 2014 at 6:05 PM, Dave Chinner <david@fromorbit.com> wrote:
On Fri, May 02, 2014 at 11:3= 2:19AM -0600, Bob Mastors wrote:
> On Tue, Apr 29, 2014 at 9:22 PM, Dave Chinner <david@fromorbit.com> wrote:
> > Well, I guess I should been more specific. = ftrace is pretty much
> > useless here - we need the information taht is recorded by the > > events, not the timing of the events.
> >
> Heh, I have been trying to bluff my way through this.
> I have hacked on file systems but am new to linux and xfs.

I wouldn't have guessed that. Most of the time the response is "trace events? what are they?". :)

> Output file attached but it all looks like this:
>
> =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 [001] 445.757616: xfs_ail_flus= hing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88001d3017b8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 =C2=A0[001] =C2=A0 445.757617: xf= s_ail_flushing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88001d301850 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 =C2=A0[001] =C2=A0 445.757618: xf= s_ail_flushing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88001de63ed8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 =C2=A0[001] =C2=A0 445.757618: xf= s_ail_flushing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88001cd24720 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 =C2=A0[001] =C2=A0 445.757618: xf= s_ail_flushing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88001cd248e8 lsn 32/3573 type XFS_LI_INODE flags IN_AIL > =C2=A0 =C2=A0 =C2=A0xfsaild/sdb-3613 =C2=A0[001] =C2=A0 445.757619: xf= s_ail_flushing: =C2=A0 =C2=A0 dev 8:16
> lip 0x0xffff88002c435ab0 lsn 32/3573 type XFS_LI_INODE flags IN_AIL
That's very enlightening - a bunch of inodes returning
XFS_ITEM_FLUSHING from attempts to push them.

> The addresses repeat.
> I started the record as soon as I noticed the umount hanging, probably=
> within 20 seconds or so.
> Also attached is the console output.
>
> This was done with your patch applied.
>
> Seems like xfsaild_push is missing a check that the file system is
> XFS_FORCED_SHUTDOWN.

It might look that way, but what is supposed to happen is that
everything else is supposed to handle shutdown situations and empty
the AIL. i.e. the act of issuing IO by the AIL is supposed to
trigger shutdown processing on the objects, and so having the AIL
shut down itself won't help.

So, what's the problem? Well, the inodes have been flushed,
triggering the inode buffer to be written. However, then inode
buffer has had an IO error (i.e. the async write error), is retried,
and then we stop retrying the IO. The idea is that the AIL will push
it again soon and the IO will be retried.

What is happening is that the inodes in the buffer are already
marked as "being flushed" and hence the AIL does not push the ino= de
buffer again, and hence the IO completion callbacks on the buffer
that will remove the inodes from the AIL are never called. Not sure
how to fix this one yet....
Thanks for the explanation= .
It clears up some questions I had.
=C2=A0

> Let me know if there is any other info I can capture that would be
> interesting.

I know what the problem is now, so testing a fix will be the next
step. But I need to think about how to fix this, and that can wait
till Monday. ;)
Just an fyi next week is busy for me w= ith some other stuff so I
won't be able to try out a fix unti= l the following week.
=C2=A0

Thanks for following up with the trace information, Bob!
Not a problem.

Thanks,
Bob
= =C2=A0

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a113a9c10b0837604f8743ddd-- From varvara7788@yandex.ru Fri May 2 21:30:40 2014 Return-Path: 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=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO_END_DIGIT,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 F3F047F53 for ; Fri, 2 May 2014 21:30:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77CEAAC002 for ; Fri, 2 May 2014 19:30:39 -0700 (PDT) X-ASG-Debug-ID: 1399084234-04cb6c1fcc13ecc0001-NocioJ Received: from server.zoneforweb.com (server.zoneforweb.com [205.234.232.65]) by cuda.sgi.com with ESMTP id Y1mEcfgTYjoq7467 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 02 May 2014 19:30:34 -0700 (PDT) X-Barracuda-Envelope-From: varvara7788@yandex.ru X-Barracuda-Apparent-Source-IP: 205.234.232.65 Received: from [223.164.255.194] (port=35755 helo=Unknown) by server.zoneforweb.com with esmtpa (Exim 4.80) (envelope-from ) id 1WgPii-000681-Cz for xfs@oss.sgi.com; Fri, 02 May 2014 21:30:33 -0500 Message-ID: Reply-To: "Anastasia" From: "Anastasia" To: Subject: 10 ladies searched for you on 03.05.20146:30:06 Date: Sat, 3 May 2014 06:30:06 +0400 X-ASG-Orig-Subj: 10 ladies searched for you on 03.05.20146:30:06 Organization: Nina MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1F4E_01CF6699.1FEE15C0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.zoneforweb.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - yandex.ru X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: server.zoneforweb.com[205.234.232.65] X-Barracuda-Start-Time: 1399084234 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.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=BSF_SC0_TG035a, HTML_MESSAGE, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address 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_1F4E_01CF6699.1FEE15C0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Hi Ladies voted your profile,have a look please, it is a chance to meet your= sweet lady [lteawbso] you have missed calls for chat :=20 Natalia 15866297 missed call 03.05.20146:30:06=20 You have missed calls for video chat [wjasn] Natalia 15883258 missed call 03.05.20146:30:06=20 you have new replies: [gmmimxh] Ekaterina 15889143 new reply 03.05.20146:30:06=20 Your login and password: [oeijlxho] login: [knfrwuts] password:=20 have a nice time,=20 administrator Svetlana[bvbqram] [pzqfho]=20 [czhez]=20 [afkcw]=20 ------=_NextPart_000_1F4E_01CF6699.1FEE15C0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
Hi
Ladies voted your profile,have a look please, it=20 is a chance to meet your sweet lady [lteawbso]
you have missed calls for=20 chat :
Natalia 15866297 missed call=20 03.05.20146:30:06
You have missed calls for video chat [wjasn]
Natalia=20 15883258 missed call 03.05.20146:30:06
you have new replies: [gmmimxh]
Ekaterina=20 15889143 new reply 03.05.20146:30:06
Your login and=20 password: [oeijlxho]
login:=20 [knfrwuts]
password:=20

have a nice time,
administrator Svetlana[bvbqram]

[pzqfho]
[czhez]
[afkcw] ------=_NextPart_000_1F4E_01CF6699.1FEE15C0-- From david@fromorbit.com Fri May 2 21:58:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 189F67F53 for ; Fri, 2 May 2014 21:58:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A964FAC002 for ; Fri, 2 May 2014 19:58:16 -0700 (PDT) X-ASG-Debug-ID: 1399085894-04cb6c728f291ed0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id nz67mS7poibVinuL for ; Fri, 02 May 2014 19:58: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: Al0MABlaZFN5LEcv/2dsb2JhbABZgwZPgm6oJAEBAQEBAQQBmgWBDRd0giUBAQU6HCMQCAMYCSUPBSUDIROIQMpjFxaFQIh8B4Q5BJkvknCDRis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 12:28:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgQ9I-0001tE-LZ; Sat, 03 May 2014 12:58:00 +1000 Date: Sat, 3 May 2014 12:58:00 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged Message-ID: <20140503025800.GI26353@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged References: <20140502000508.GA26353@dastard> <536437AD.9020303@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536437AD.9020303@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: 1399085894 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.5486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 02, 2014 at 07:26:21PM -0500, Eric Sandeen wrote: > On 5/1/14, 7:05 PM, Dave Chinner wrote: > > Hi folks, > > > > The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has > > just been updated. > > > > The new head of the master branch is commit: > > > > 67fcc94 xfsprogs: v3.2.0-rc2 release > > > > This commit has been tagged with v3.2.0-rc2. I'd like everyone who > > can test this to test it, as all the issues that needed to be solved > > before a release coul dbe made have now been addressed. If there are > > no new regressions or critical issues reported in the next week or > > so, I will make an official 3.2.0 release. So, please test. :) > > Any chance for a signed tarball? Do we need one? I can generate one, but I'm not 100% sure where we are putting them up online.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 2 22:02:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 055137F53 for ; Fri, 2 May 2014 22:02:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E09728F8039 for ; Fri, 2 May 2014 20:02:37 -0700 (PDT) X-ASG-Debug-ID: 1399086155-04cb6c72912921d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id w3YqC2bVPWElWFkz for ; Fri, 02 May 2014 20:02:35 -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: AlwMAElbZFN5LEcv/2dsb2JhbABZgwaDPagkAQEBAQEBBAGaBYENF3SCJQEBBAE6HBgLBQsIAw4KCSUPBSUDIROIOQfKYxcWhUCIGhEBUAeEOQSZL5Jwg0YrgTk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 03 May 2014 12:32:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgQDW-0001uQ-2i; Sat, 03 May 2014 13:02:22 +1000 Date: Sat, 3 May 2014 13:02:22 +1000 From: Dave Chinner To: Martin Papik Cc: xfs@oss.sgi.com Subject: Re: XFS filesystem claims to be mounted after a disconnect Message-ID: <20140503030221.GJ26353@dastard> X-ASG-Orig-Subj: Re: XFS filesystem claims to be mounted after a disconnect References: <5363A1D8.2020402@gmail.com> <5363B4C9.4000900@sandeen.net> <5363CB5E.3090008@gmail.com> <5363CD70.3000006@sandeen.net> <5363DBD7.4060002@gmail.com> <5363E65C.6010006@sandeen.net> <5363ECE8.6030706@gmail.com> <20140502233512.GE26353@dastard> <536432A0.6000405@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536432A0.6000405@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: 1399086155 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.5486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 03:04:48AM +0300, Martin Papik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > > > It's called a lazy unmount: "umount -l". It disconnects the > > filesystem from the namespace, but it still lives on in the kernel > > until all references to the filesystem go away. Given that the > > hot-unplug proceedure can call back into the filesystem to sync it > > (once it's been disconnected!) the hot unplug can deadlock on > > filesystem locks that can't be released until the hot-unplug errors > > everything out. > > > > So you can end up with the system in an unrecoverable state when > > USB unplugs. > > And the disconnect from the namespace is what removes it from > /proc/mounts? I believe so. > By hot unplug, do you mean a user initiated "remove device" or a pull > out of the USB cable? I'm sorry, I don't understand your example. > Would you be kind enough to elaborate? Anything that causes a hot-unplug to occur. There's no real difference between echoing a value to the relevant sysfs file to trigger the hot-unplug or simply pull the plug on the active device. Or could even occur because something went wrong in the USB subsystem (e.g. a hub stopped communicating) and so the end devices disappeared, even though nothing is wrong with them. > >>> If xfs encounters an insurmountable error, it will shut down, > >>> and all operations will return EIO or EUCLEAN. You are right > >>> that there is no errors=* mount option; the behavior is not > >>> configurable on xfs. > >> > >> IMHO it should be, but since the last email I've glanced at some > >> mailing lists and understand that there's some reluctance, in the > >> name of not polluting the FS after an error. But at least a R/O > >> remount should be possible, to prevent yanking libraries from > >> under applications (root FS). > > > > What you see here has nothing to do with XFS's shutdown behaviour. > > The filesystem is already unmounted, it just can't be destroyed > > because there are still kernel internal references to it. > > How can I detect this situation? I mean I didn't see anything in > /proc/mounts or references to the mount point from /proc//*, so I > only managed to correct it (chdir elsewhere) by chance on a hunch. > Would it not be desirable to know that there's a phantom FS referenced > by a number of processes? lsof. > Also, do you know if this affects other filesystems? I never saw this > with ext3/4 or reiser, I don't have much practical experience with > other filesystems. I ask because your explanation sounds like it's vfs > rather than xfs, but as I said, I never saw this before. Yes, it affects all filesystems - the same behaviour occurs regardless of the filesystem that is active on the block device. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri May 2 22:41:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BDC457F53 for ; Fri, 2 May 2014 22:41:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 948898F8040 for ; Fri, 2 May 2014 20:41:02 -0700 (PDT) X-ASG-Debug-ID: 1399088460-04cb6c7291293af0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id z0CYzWRLLv8a5u54 for ; Fri, 02 May 2014 20:41:00 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7503363C5FF1; Fri, 2 May 2014 22:41:00 -0500 (CDT) Message-ID: <5364654C.3080009@sandeen.net> Date: Fri, 02 May 2014 22:41:00 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged References: <20140502000508.GA26353@dastard> <536437AD.9020303@sandeen.net> <20140503025800.GI26353@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged In-Reply-To: <20140503025800.GI26353@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399088460 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.5486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/2/14, 9:58 PM, Dave Chinner wrote: > On Fri, May 02, 2014 at 07:26:21PM -0500, Eric Sandeen wrote: >> On 5/1/14, 7:05 PM, Dave Chinner wrote: >>> Hi folks, >>> >>> The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has >>> just been updated. >>> >>> The new head of the master branch is commit: >>> >>> 67fcc94 xfsprogs: v3.2.0-rc2 release >>> >>> This commit has been tagged with v3.2.0-rc2. I'd like everyone who >>> can test this to test it, as all the issues that needed to be solved >>> before a release coul dbe made have now been addressed. If there are >>> no new regressions or critical issues reported in the next week or >>> so, I will make an official 3.2.0 release. So, please test. :) >> >> Any chance for a signed tarball? > > Do we need one? I can generate one, but I'm not 100% sure where we > are putting them up online.... The others are at ftp://oss.sgi.com/projects/xfs/cmd_tars/ I dunno, I think distros usually expect to be able to grab a tarball... -Eric > Cheers, > > Dave. > From nscott@redhat.com Sat May 3 01:19:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 16C337F53 for ; Sat, 3 May 2014 01:19:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A332BAC003 for ; Fri, 2 May 2014 23:19:07 -0700 (PDT) X-ASG-Debug-ID: 1399097944-04cbb03cc4283070001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id BtHo7a6hU99tXMlX for ; Fri, 02 May 2014 23:19:05 -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 s436IvKU029179; Sat, 3 May 2014 02:18:57 -0400 Date: Sat, 3 May 2014 02:18:56 -0400 (EDT) From: Nathan Scott Reply-To: Nathan Scott To: Dave Chinner Cc: xfs@oss.sgi.com Message-ID: <1461962146.20984.1399097936577.JavaMail.zimbra@redhat.com> In-Reply-To: <20140502000508.GA26353@dastard> References: <20140502000508.GA26353@dastard> Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged Content-Type: multipart/mixed; boundary="----=_Part_20982_860430083.1399097936574" X-Originating-IP: [10.5.82.11] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF17 (Linux)/8.0.6_GA_5922) Thread-Topic: xfsprogs: 3.2.0-rc2 release tagged Thread-Index: QAq3bym2f/G7U7Irc/2SB7fMP6D0ZQ== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1399097945 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.5491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ------=_Part_20982_860430083.1399097936574 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi Dave, ----- Original Message ----- > [...] > This commit has been tagged with v3.2.0-rc2. I'd like everyone who > can test this to test it, as all the issues that needed to be solved > before a release could be made have now been addressed. If there are > no new regressions or critical issues reported in the next week or > so, I will make an official 3.2.0 release. So, please test. :) > I came across a couple of trivial build warnings when doing a test build, and added a doc note for the debian/changelog - updates are in a git tree over here if you'd like to pull 'em in... Changes committed to git://oss.sgi.com/nathans/xfsprogs.git master debian/changelog | 7 +++++++ libxfs/rdwr.c | 5 +++-- po/de.po | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) commit 75b480dad5f54d10e77750b2cf8793c04aa5537a Author: Nathan Scott Date: Sat May 3 16:13:00 2014 +1000 Update debian changelog in preparation for pending release In particular, add a note to the changelog about the added dh_autoconf use so the BTS will be updated appropriately. Signed-off-by: Nathan Scott commit ce5da129319024236ce7e1af6b0f1fb448bcf4c7 Author: Nathan Scott Date: Sat May 3 16:10:38 2014 +1000 Fix msgfmt warning when building the German translation Use the same header present in the Polish language files to resolve the following warning in the de.po build: [MSGFMT] de.mo de.po:7: warning: header field 'Language' missing in header Signed-off-by: Nathan Scott commit b47c8cae3637a81c50a7f1e42938fc20d947f3aa Author: Nathan Scott Date: Sat May 3 16:09:03 2014 +1000 Fix 32 bit build warning in libxfs, xfs_daddr_t printing Add the usual type casts to resolve the following warnings: rdwr.c: In function 'libxfs_getbufr_map': rdwr.c:499:4: warning: format '%lx' expects argument of type 'long unsigned int', but argument 5 has type 'xfs_daddr_t' [-Wformat] rdwr.c:499:4: warning: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'xfs_daddr_t' [-Wformat] Signed-off-by: Nathan Scott -- Nathan ------=_Part_20982_860430083.1399097936574 Content-Type: text/x-patch; name=xfsprogs-warnings.patch Content-Disposition: attachment; filename=xfsprogs-warnings.patch Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCmluZGV4IDA5 MzVlMDcuLmM3OTBjNzUgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9jaGFuZ2Vsb2cKKysrIGIvZGViaWFu L2NoYW5nZWxvZwpAQCAtMSwzICsxLDkgQEAKK3hmc3Byb2dzICgzLjIuMCkgdW5zdGFibGU7IHVy Z2VuY3k9bG93CisKKyAgKiBOZXcgdXBzdHJlYW0gcmVsZWFzZQorCisgLS0gTmF0aGFuIFNjb3R0 IDxuYXRoYW5zQGRlYmlhbi5vcmc+ICBGcmksIDAyIE1heSAyMDE0IDEwOjE5OjM0ICsxMDAwCisK IHhmc3Byb2dzICgzLjEuMTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdwogCiAgICogTmV3IHVwc3Ry ZWFtIHJlbGVhc2UKZGlmZiAtLWdpdCBhL2xpYnhmcy9yZHdyLmMgYi9saWJ4ZnMvcmR3ci5jCmlu ZGV4IGVhNGJkZmQuLjU3YzEyYzEgMTAwNjQ0Ci0tLSBhL2xpYnhmcy9yZHdyLmMKKysrIGIvbGli eGZzL3Jkd3IuYwpAQCAtNDk1LDggKzQ5NSw5IEBAIGxpYnhmc19nZXRidWZyX21hcChzdHJ1Y3Qg eGZzX2J1ZnRhcmcgKmJ0cCwgeGZzX2RhZGRyX3QgYmxrbm8sIGludCBiYmxlbiwKIAogCWlmIChi bGtubyAhPSBtYXBbMF0uYm1fYm4pIHsKIAkJZnByaW50ZihzdGRlcnIsCi0JCQlfKCIlczogJXMg bWFwIGJsa25vICVseCBkb2Vzbid0IG1hdGNoIGtleSAlbHhcbiIpLAotCQkJcHJvZ25hbWUsIF9f RlVOQ1RJT05fXywgbWFwWzBdLmJtX2JuLCBibGtubyk7CisJCQlfKCIlczogJXMgbWFwIGJsa25v IDB4JWxseCBkb2Vzbid0IG1hdGNoIGtleSAweCVsbHhcbiIpLAorCQkJcHJvZ25hbWUsIF9fRlVO Q1RJT05fXywgKGxvbmcgbG9uZyltYXBbMF0uYm1fYm4sCisJCQkobG9uZyBsb25nKWJsa25vKTsK IAkJZXhpdCgxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BvL2RlLnBvIGIvcG8vZGUucG8KaW5kZXgg NTczMzgwZS4uYTEzYjVjYyAxMDA2NDQKLS0tIGEvcG8vZGUucG8KKysrIGIvcG8vZGUucG8KQEAg LTExLDYgKzExLDcgQEAgbXNnc3RyICIiCiAiUE8tUmV2aXNpb24tRGF0ZTogMjAwOS0xMC0yMSAy MTowOCswMTAwXG4iCiAiTGFzdC1UcmFuc2xhdG9yOiBDaHJpcyBMZWljayA8Yy5sZWlja0B2b2xs YmlvLmRlPlxuIgogIkxhbmd1YWdlLVRlYW06ICBHZXJtYW4gPGRlYmlhbi1sMTBuLWdlcm1hbkBs aXN0cy5kZWJpYW4ub3JnPlxuIgorIkxhbmd1YWdlOiBkZVxuIgogIk1JTUUtVmVyc2lvbjogMS4w XG4iCiAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCiAiQ29udGVu dC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgo= ------=_Part_20982_860430083.1399097936574-- From BATV+93502c8427c52810776d+3905+infradead.org+hch@bombadil.srs.infradead.org Sat May 3 06:48:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C66177F37 for ; Sat, 3 May 2014 06:48:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8CAE30405F for ; Sat, 3 May 2014 04:48:18 -0700 (PDT) X-ASG-Debug-ID: 1399117697-04cb6c72912a7c80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GRaSNlBCke5Se9Hs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 04:48:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+93502c8427c52810776d+3905+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 1WgYQT-0008HC-0O; Sat, 03 May 2014 11:48:17 +0000 Date: Sat, 3 May 2014 04:48:16 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140503114816.GA31191@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <535580A1.20806@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399117697 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.5496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Can I assumes that xfs/007 failing with: --- tests/xfs/007.out 2014-05-03 08:58:08.000000000 +0000 +++ /root/xfstests/results//xfs/007.out.bad 2014-05-03 11:48:05.000000000 +0000 @@ -7,4 +7,4 @@ *** umount *** Usage after quotarm *** core.nblocks = 0 -core.nblocks = 0 +core.nblocks = 1 is because this patch didn't get picked up yet? From sandeen@sandeen.net Sat May 3 09:36:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A64FD7F37 for ; Sat, 3 May 2014 09:36:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3165CAC002 for ; Sat, 3 May 2014 07:36:06 -0700 (PDT) X-ASG-Debug-ID: 1399127763-04cbb03cc62999a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id q2IPOGSy3DAyoYFC for ; Sat, 03 May 2014 07:36: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C744C63C5FF1; Sat, 3 May 2014 09:36:02 -0500 (CDT) Message-ID: <5364FED5.1050203@sandeen.net> Date: Sat, 03 May 2014 09:36:05 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Christoph Hellwig , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <20140503114816.GA31191@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl In-Reply-To: <20140503114816.GA31191@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399127763 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.5499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Whoops, missed reply-all. Yes, it will fail this way w/o the kernel patch. User quota gets removed OK because flags accidentally line up; group quota remains, so you'd see exactly this. -Eric On 5/3/14, 6:48 AM, Christoph Hellwig wrote: > Can I assumes that xfs/007 failing with: > > --- tests/xfs/007.out 2014-05-03 08:58:08.000000000 +0000 > +++ /root/xfstests/results//xfs/007.out.bad 2014-05-03 > 11:48:05.000000000 +0000 > @@ -7,4 +7,4 @@ > *** umount > *** Usage after quotarm *** > core.nblocks = 0 > -core.nblocks = 0 > +core.nblocks = 1 > > is because this patch didn't get picked up yet? > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+93502c8427c52810776d+3905+infradead.org+hch@bombadil.srs.infradead.org Sat May 3 10:14:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1AEEB7F37 for ; Sat, 3 May 2014 10:14:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD912AC003 for ; Sat, 3 May 2014 08:14:45 -0700 (PDT) X-ASG-Debug-ID: 1399130084-04bdf02b8b2a9f60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id b5BCfqU0E2shmlRZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:14:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+93502c8427c52810776d+3905+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 1WgbeC-0007Rj-KJ; Sat, 03 May 2014 15:14:40 +0000 Date: Sat, 3 May 2014 08:14:40 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Dave Chinner , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140503151440.GA28608@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <20140503114816.GA31191@infradead.org> <5364FED5.1050203@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5364FED5.1050203@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399130084 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: 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.5499 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 Sat, May 03, 2014 at 09:36:05AM -0500, Eric Sandeen wrote: > Whoops, missed reply-all. > > Yes, it will fail this way w/o the kernel patch. > > User quota gets removed OK because flags accidentally line up; > group quota remains, so you'd see exactly this. Ok. Dave, can you pick it up for for-next? > > -Eric > > On 5/3/14, 6:48 AM, Christoph Hellwig wrote: > > Can I assumes that xfs/007 failing with: > > > > --- tests/xfs/007.out 2014-05-03 08:58:08.000000000 +0000 > > +++ /root/xfstests/results//xfs/007.out.bad 2014-05-03 > > 11:48:05.000000000 +0000 > > @@ -7,4 +7,4 @@ > > *** umount > > *** Usage after quotarm *** > > core.nblocks = 0 > > -core.nblocks = 0 > > +core.nblocks = 1 > > > > is because this patch didn't get picked up yet? > > > > _______________________________________________ > > 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 ---end quoted text--- From BATV+93502c8427c52810776d+3905+infradead.org+hch@bombadil.srs.infradead.org Sat May 3 10:16:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8D8477F37 for ; Sat, 3 May 2014 10:16:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B8E5AC002 for ; Sat, 3 May 2014 08:16:03 -0700 (PDT) X-ASG-Debug-ID: 1399130161-04cb6c72902b3440001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id QSWNiMIlXfb8CjwJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:16:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+93502c8427c52810776d+3905+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 1WgbfV-00005Y-3E; Sat, 03 May 2014 15:16:01 +0000 Date: Sat, 3 May 2014 08:16:01 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140503151601.GB28608@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> <20140502100802.GB14028@infradead.org> <20140502232339.GD26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502232339.GD26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399130161 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.5499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 09:23:39AM +1000, Dave Chinner wrote: > before we get to the transaction that can fail: > block_truncate_page() zeroes the tail of the page cache page. Hence > if the transaction reservation fails, we've already trashed the file > data - we may as well finish off the job and at least make it look > like the truncate succeeded from a user point of view. They then get > a ENOMEM error (only non-fatal error that can come from > xfs_trans_reserve) and try the truncate again.... I don't think we can even get the ENOMEM. But yeah, I guess we want something like the old version, with comments explaining exactly we we have this order. From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 865417F37 for ; Sat, 3 May 2014 10:18:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78E8030405F for ; Sat, 3 May 2014 08:18:04 -0700 (PDT) X-ASG-Debug-ID: 1399130282-04cbb03cc529c340001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id hBwaOu99zJiNGVJF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhS-0003i3-9e for xfs@oss.sgi.com; Sat, 03 May 2014 15:18:02 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove Date: Sat, 3 May 2014 17:20:13 +0200 X-ASG-Orig-Subj: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove Message-Id: <1399130415-5382-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> References: <1399130415-5382-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130283 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.5499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Also remove a useless ilock roundtrip for the first attr fork check, it's racy anyway and we redo it later under the ilock before we start the removal. Plus various minor style fixes to the new xfs_attr_remove. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr.c | 97 +++++++++++++++++++---------------------------------- 1 file changed, 35 insertions(+), 62 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 01f2267..a96e27b 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -416,21 +416,34 @@ out: * Generic handler routine to remove a name from an attribute list. * Transitions attribute list from Btree to shortform as necessary. */ -STATIC int -xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) +int +xfs_attr_remove( + struct xfs_inode *dp, + const unsigned char *name, + int flags) { - xfs_da_args_t args; - xfs_fsblock_t firstblock; - xfs_bmap_free_t flist; - int error; - xfs_mount_t *mp = dp->i_mount; + struct xfs_mount *mp = dp->i_mount; + struct xfs_da_args args; + struct xfs_bmap_free flist; + struct xfs_name xname; + xfs_fsblock_t firstblock; + int error; - /* - * Fill in the arg structure for this request. - */ - memset((char *)&args, 0, sizeof(args)); - args.name = name->name; - args.namelen = name->len; + XFS_STATS_INC(xs_attr_remove); + + if (XFS_FORCED_SHUTDOWN(dp->i_mount)) + return EIO; + + if (!xfs_inode_hasattr(dp)) + return ENOATTR; + + error = xfs_attr_name_to_xname(&xname, name); + if (error) + return error; + + memset(&args, 0, sizeof(args)); + args.name = xname.name; + args.namelen = xname.len; args.flags = flags; args.hashval = xfs_da_hashname(args.name, args.namelen); args.dp = dp; @@ -446,9 +459,6 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) */ args.op_flags = XFS_DA_OP_OKNOENT; - /* - * Attach the dquots to the inode. - */ error = xfs_qm_dqattach(dp, 0); if (error) return error; @@ -477,7 +487,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) XFS_ATTRRM_SPACE_RES(mp), 0); if (error) { xfs_trans_cancel(args.trans, 0); - return(error); + return error; } xfs_ilock(dp, XFS_ILOCK_EXCL); @@ -487,35 +497,26 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) */ xfs_trans_ijoin(args.trans, dp, 0); - /* - * Decide on what work routines to call based on the inode size. - */ if (!xfs_inode_hasattr(dp)) { error = XFS_ERROR(ENOATTR); - goto out; - } - if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { + } else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { ASSERT(dp->i_afp->if_flags & XFS_IFINLINE); error = xfs_attr_shortform_remove(&args); - if (error) { - goto out; - } } else if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { error = xfs_attr_leaf_removename(&args); } else { error = xfs_attr_node_removename(&args); } - if (error) { + + if (error) goto out; - } /* * If this is a synchronous mount, make sure that the * transaction goes to disk before returning to the user. */ - if (mp->m_flags & XFS_MOUNT_WSYNC) { + if (mp->m_flags & XFS_MOUNT_WSYNC) xfs_trans_set_sync(args.trans); - } if ((flags & ATTR_KERNOTIME) == 0) xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); @@ -527,45 +528,17 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; out: - if (args.trans) + if (args.trans) { xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); -} - -int -xfs_attr_remove( - xfs_inode_t *dp, - const unsigned char *name, - int flags) -{ - int error; - struct xfs_name xname; - - XFS_STATS_INC(xs_attr_remove); - - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return (EIO); - - error = xfs_attr_name_to_xname(&xname, name); - if (error) - return error; - - xfs_ilock(dp, XFS_ILOCK_SHARED); - if (!xfs_inode_hasattr(dp)) { - xfs_iunlock(dp, XFS_ILOCK_SHARED); - return XFS_ERROR(ENOATTR); } - xfs_iunlock(dp, XFS_ILOCK_SHARED); - - return xfs_attr_remove_int(dp, &xname, flags); + xfs_iunlock(dp, XFS_ILOCK_EXCL); + return error; } - /*======================================================================== * External routines when attribute list is inside the inode *========================================================================*/ -- 1.7.10.4 From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 64AE17F53 for ; Sat, 3 May 2014 10:18:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E88A30405F for ; Sat, 3 May 2014 08:18:05 -0700 (PDT) X-ASG-Debug-ID: 1399130283-04cb6c72902b3660001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 4CR2L6CbFArPSykO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhT-0003i7-4f for xfs@oss.sgi.com; Sat, 03 May 2014 15:18:03 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: simplify attr name setup Date: Sat, 3 May 2014 17:20:14 +0200 X-ASG-Orig-Subj: [PATCH 4/5] xfs: simplify attr name setup Message-Id: <1399130415-5382-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> References: <1399130415-5382-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130284 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.5500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Replace xfs_attr_name_to_xname with a new xfs_attr_args_init helper that sets up the basic da_args structure without using a temporary xfs_name structure. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr.c | 74 +++++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index a96e27b..1208621 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -77,17 +77,26 @@ STATIC int xfs_attr_refillstate(xfs_da_state_t *state); STATIC int -xfs_attr_name_to_xname( - struct xfs_name *xname, - const unsigned char *aname) +xfs_attr_args_init( + struct xfs_da_args *args, + struct xfs_inode *dp, + const unsigned char *name, + int flags) { - if (!aname) + + if (!name) return EINVAL; - xname->name = aname; - xname->len = strlen((char *)aname); - if (xname->len >= MAXNAMELEN) + + memset(args, 0, sizeof(*args)); + args->whichfork = XFS_ATTR_FORK; + args->dp = dp; + args->flags = flags; + args->name = name; + args->namelen = strlen((const char *)name); + if (args->namelen >= MAXNAMELEN) return EFAULT; /* match IRIX behaviour */ + args->hashval = xfs_da_hashname(args->name, args->namelen); return 0; } @@ -115,7 +124,6 @@ xfs_attr_get( int flags) { struct xfs_da_args args; - struct xfs_name xname; uint lock_mode; int error; @@ -127,19 +135,12 @@ xfs_attr_get( if (!xfs_inode_hasattr(ip)) return ENOATTR; - error = xfs_attr_name_to_xname(&xname, name); + error = xfs_attr_args_init(&args, ip, name, flags); if (error) return error; - memset(&args, 0, sizeof(args)); - args.name = xname.name; - args.namelen = xname.len; args.value = value; args.valuelen = *valuelenp; - args.flags = flags; - args.hashval = xfs_da_hashname(args.name, args.namelen); - args.dp = ip; - args.whichfork = XFS_ATTR_FORK; lock_mode = xfs_ilock_attr_map_shared(ip); if (!xfs_inode_hasattr(ip)) @@ -208,7 +209,6 @@ xfs_attr_set( struct xfs_da_args args; struct xfs_bmap_free flist; struct xfs_trans_res tres; - struct xfs_name xname; xfs_fsblock_t firstblock; int rsvd = (flags & ATTR_ROOT) != 0; int error, err2, committed, local; @@ -218,10 +218,19 @@ xfs_attr_set( if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return EIO; - error = xfs_attr_name_to_xname(&xname, name); + error = xfs_attr_args_init(&args, dp, name, flags); if (error) return error; + args.value = value; + args.valuelen = valuelen; + args.firstblock = &firstblock; + args.flist = &flist; + args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; + + /* Size is now blocks for attribute data */ + args.total = xfs_attr_calc_size(dp, args.namelen, valuelen, &local); + error = xfs_qm_dqattach(dp, 0); if (error) return error; @@ -232,29 +241,13 @@ xfs_attr_set( */ if (XFS_IFORK_Q(dp) == 0) { int sf_size = sizeof(xfs_attr_sf_hdr_t) + - XFS_ATTR_SF_ENTSIZE_BYNAME(xname.len, valuelen); + XFS_ATTR_SF_ENTSIZE_BYNAME(args.namelen, valuelen); error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); if (error) return error; } - memset(&args, 0, sizeof(args)); - args.name = xname.name; - args.namelen = xname.len; - args.value = value; - args.valuelen = valuelen; - args.flags = flags; - args.hashval = xfs_da_hashname(args.name, args.namelen); - args.dp = dp; - args.firstblock = &firstblock; - args.flist = &flist; - args.whichfork = XFS_ATTR_FORK; - args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; - - /* Size is now blocks for attribute data */ - args.total = xfs_attr_calc_size(dp, xname.len, valuelen, &local); - /* * Start our first transaction of the day. * @@ -425,7 +418,6 @@ xfs_attr_remove( struct xfs_mount *mp = dp->i_mount; struct xfs_da_args args; struct xfs_bmap_free flist; - struct xfs_name xname; xfs_fsblock_t firstblock; int error; @@ -437,20 +429,12 @@ xfs_attr_remove( if (!xfs_inode_hasattr(dp)) return ENOATTR; - error = xfs_attr_name_to_xname(&xname, name); + error = xfs_attr_args_init(&args, dp, name, flags); if (error) return error; - memset(&args, 0, sizeof(args)); - args.name = xname.name; - args.namelen = xname.len; - args.flags = flags; - args.hashval = xfs_da_hashname(args.name, args.namelen); - args.dp = dp; args.firstblock = &firstblock; args.flist = &flist; - args.total = 0; - args.whichfork = XFS_ATTR_FORK; /* * we have no control over the attribute names that userspace passes us -- 1.7.10.4 From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 465457F54 for ; Sat, 3 May 2014 10:18:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C99B304062 for ; Sat, 3 May 2014 08:18:02 -0700 (PDT) X-ASG-Debug-ID: 1399130280-04cb6c72912b3650001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id aWqFrIlKtENAvAoZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhP-0003hr-T6 for xfs@oss.sgi.com; Sat, 03 May 2014 15:17:59 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: attr cleanups Date: Sat, 3 May 2014 17:20:10 +0200 X-ASG-Orig-Subj: attr cleanups Message-Id: <1399130415-5382-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130281 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.5500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- A couple random cleanups for the attr code that I had sitting in my tree for a long time. From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C3AC87F3F for ; Sat, 3 May 2014 10:18:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52744AC002 for ; Sat, 3 May 2014 08:18:04 -0700 (PDT) X-ASG-Debug-ID: 1399130281-04cb6c728f2b3650001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id LKO6LmDNK7kJqCGF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhR-0003hz-GH for xfs@oss.sgi.com; Sat, 03 May 2014 15:18:01 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: fold xfs_attr_get_int into xfs_attr_get Date: Sat, 3 May 2014 17:20:12 +0200 X-ASG-Orig-Subj: [PATCH 2/5] xfs: fold xfs_attr_get_int into xfs_attr_get Message-Id: <1399130415-5382-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> References: <1399130415-5382-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130282 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.5500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This allows doing an unlocked check if an attr for is present at all and slightly reduce the lock hold time if we actually do an attr get. Plus various minor style fixes to the new xfs_attr_get. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr.c | 79 ++++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index eb3ae8f..01f2267 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -106,26 +106,34 @@ xfs_inode_hasattr( * Overall external interface routines. *========================================================================*/ -STATIC int -xfs_attr_get_int( +int +xfs_attr_get( struct xfs_inode *ip, - struct xfs_name *name, + const unsigned char *name, unsigned char *value, int *valuelenp, int flags) { - xfs_da_args_t args; - int error; + struct xfs_da_args args; + struct xfs_name xname; + uint lock_mode; + int error; + + XFS_STATS_INC(xs_attr_get); + + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return EIO; if (!xfs_inode_hasattr(ip)) return ENOATTR; - /* - * Fill in the arg structure for this request. - */ - memset((char *)&args, 0, sizeof(args)); - args.name = name->name; - args.namelen = name->len; + error = xfs_attr_name_to_xname(&xname, name); + if (error) + return error; + + memset(&args, 0, sizeof(args)); + args.name = xname.name; + args.namelen = xname.len; args.value = value; args.valuelen = *valuelenp; args.flags = flags; @@ -133,52 +141,19 @@ xfs_attr_get_int( args.dp = ip; args.whichfork = XFS_ATTR_FORK; - /* - * Decide on what work routines to call based on the inode size. - */ - if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { + lock_mode = xfs_ilock_attr_map_shared(ip); + if (!xfs_inode_hasattr(ip)) + error = ENOATTR; + else if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) error = xfs_attr_shortform_getvalue(&args); - } else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) { + else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) error = xfs_attr_leaf_get(&args); - } else { + else error = xfs_attr_node_get(&args); - } + xfs_iunlock(ip, lock_mode); - /* - * Return the number of bytes in the value to the caller. - */ *valuelenp = args.valuelen; - - if (error == EEXIST) - error = 0; - return(error); -} - -int -xfs_attr_get( - xfs_inode_t *ip, - const unsigned char *name, - unsigned char *value, - int *valuelenp, - int flags) -{ - int error; - struct xfs_name xname; - uint lock_mode; - - XFS_STATS_INC(xs_attr_get); - - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return(EIO); - - error = xfs_attr_name_to_xname(&xname, name); - if (error) - return error; - - lock_mode = xfs_ilock_attr_map_shared(ip); - error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); - xfs_iunlock(ip, lock_mode); - return(error); + return error == EEXIST ? 0 : error; } /* -- 1.7.10.4 From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BB4D57F55 for ; Sat, 3 May 2014 10:18:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AFDAF8F8037 for ; Sat, 3 May 2014 08:18:03 -0700 (PDT) X-ASG-Debug-ID: 1399130281-04cbb03cc629c340001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id iTbE8rPTiQloz7ED (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhQ-0003hu-Lz for xfs@oss.sgi.com; Sat, 03 May 2014 15:18:00 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: fold xfs_attr_set_int into xfs_attr_set Date: Sat, 3 May 2014 17:20:11 +0200 X-ASG-Orig-Subj: [PATCH 1/5] xfs: fold xfs_attr_set_int into xfs_attr_set Message-Id: <1399130415-5382-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> References: <1399130415-5382-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130281 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.5499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Plus various minor style fixes to the new xfs_attr_set. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr.c | 110 +++++++++++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 66 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 01b6a01..eb3ae8f 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -221,26 +221,32 @@ xfs_attr_calc_size( return nblks; } -STATIC int -xfs_attr_set_int( - struct xfs_inode *dp, - struct xfs_name *name, - unsigned char *value, - int valuelen, - int flags) +int +xfs_attr_set( + struct xfs_inode *dp, + const unsigned char *name, + unsigned char *value, + int valuelen, + int flags) { - xfs_da_args_t args; - xfs_fsblock_t firstblock; - xfs_bmap_free_t flist; - int error, err2, committed; struct xfs_mount *mp = dp->i_mount; + struct xfs_da_args args; + struct xfs_bmap_free flist; struct xfs_trans_res tres; + struct xfs_name xname; + xfs_fsblock_t firstblock; int rsvd = (flags & ATTR_ROOT) != 0; - int local; + int error, err2, committed, local; + + XFS_STATS_INC(xs_attr_set); + + if (XFS_FORCED_SHUTDOWN(dp->i_mount)) + return EIO; + + error = xfs_attr_name_to_xname(&xname, name); + if (error) + return error; - /* - * Attach the dquots to the inode. - */ error = xfs_qm_dqattach(dp, 0); if (error) return error; @@ -251,18 +257,16 @@ xfs_attr_set_int( */ if (XFS_IFORK_Q(dp) == 0) { int sf_size = sizeof(xfs_attr_sf_hdr_t) + - XFS_ATTR_SF_ENTSIZE_BYNAME(name->len, valuelen); + XFS_ATTR_SF_ENTSIZE_BYNAME(xname.len, valuelen); - if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) - return(error); + error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); + if (error) + return error; } - /* - * Fill in the arg structure for this request. - */ - memset((char *)&args, 0, sizeof(args)); - args.name = name->name; - args.namelen = name->len; + memset(&args, 0, sizeof(args)); + args.name = xname.name; + args.namelen = xname.len; args.value = value; args.valuelen = valuelen; args.flags = flags; @@ -274,7 +278,7 @@ xfs_attr_set_int( args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; /* Size is now blocks for attribute data */ - args.total = xfs_attr_calc_size(dp, name->len, valuelen, &local); + args.total = xfs_attr_calc_size(dp, xname.len, valuelen, &local); /* * Start our first transaction of the day. @@ -303,7 +307,7 @@ xfs_attr_set_int( error = xfs_trans_reserve(args.trans, &tres, args.total, 0); if (error) { xfs_trans_cancel(args.trans, 0); - return(error); + return error; } xfs_ilock(dp, XFS_ILOCK_EXCL); @@ -313,7 +317,7 @@ xfs_attr_set_int( if (error) { xfs_iunlock(dp, XFS_ILOCK_EXCL); xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES); - return (error); + return error; } xfs_trans_ijoin(args.trans, dp, 0); @@ -322,9 +326,9 @@ xfs_attr_set_int( * If the attribute list is non-existent or a shortform list, * upgrade it to a single-leaf-block attribute list. */ - if ((dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) || - ((dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS) && - (dp->i_d.di_anextents == 0))) { + if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL || + (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && + dp->i_d.di_anextents == 0)) { /* * Build initial attribute list (if required). @@ -349,9 +353,8 @@ xfs_attr_set_int( * the transaction goes to disk before returning * to the user. */ - if (mp->m_flags & XFS_MOUNT_WSYNC) { + if (mp->m_flags & XFS_MOUNT_WSYNC) xfs_trans_set_sync(args.trans); - } if (!error && (flags & ATTR_KERNOTIME) == 0) { xfs_trans_ichgtime(args.trans, dp, @@ -361,7 +364,7 @@ xfs_attr_set_int( XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error == 0 ? err2 : error); + return error ? error : err2; } /* @@ -399,22 +402,19 @@ xfs_attr_set_int( } - if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { + if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) error = xfs_attr_leaf_addname(&args); - } else { + else error = xfs_attr_node_addname(&args); - } - if (error) { + if (error) goto out; - } /* * If this is a synchronous mount, make sure that the * transaction goes to disk before returning to the user. */ - if (mp->m_flags & XFS_MOUNT_WSYNC) { + if (mp->m_flags & XFS_MOUNT_WSYNC) xfs_trans_set_sync(args.trans); - } if ((flags & ATTR_KERNOTIME) == 0) xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); @@ -426,37 +426,15 @@ xfs_attr_set_int( error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); + return error; out: - if (args.trans) + if (args.trans) { xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); + } xfs_iunlock(dp, XFS_ILOCK_EXCL); - return(error); -} - -int -xfs_attr_set( - xfs_inode_t *dp, - const unsigned char *name, - unsigned char *value, - int valuelen, - int flags) -{ - int error; - struct xfs_name xname; - - XFS_STATS_INC(xs_attr_set); - - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) - return (EIO); - - error = xfs_attr_name_to_xname(&xname, name); - if (error) - return error; - - return xfs_attr_set_int(dp, &xname, value, valuelen, flags); + return error; } /* -- 1.7.10.4 From BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org Sat May 3 10:18:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 47B727F37 for ; Sat, 3 May 2014 10:18:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D52C8F8037 for ; Sat, 3 May 2014 08:18:07 -0700 (PDT) X-ASG-Debug-ID: 1399130284-04bdf02b8d2aa2d0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id hJUimfwCIhAepAR3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 08:18:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9746c13c1c43e5ad03e0+3905+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1WgbhT-0003iB-WB for xfs@oss.sgi.com; Sat, 03 May 2014 15:18:04 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: pass struct da_args to xfs_attr_calc_size Date: Sat, 3 May 2014 17:20:15 +0200 X-ASG-Orig-Subj: [PATCH 5/5] xfs: pass struct da_args to xfs_attr_calc_size Message-Id: <1399130415-5382-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> References: <1399130415-5382-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1399130285 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.5499 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- And remove a very confused comment. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_attr.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 1208621..86f482e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -162,12 +162,10 @@ xfs_attr_get( */ STATIC int xfs_attr_calc_size( - struct xfs_inode *ip, - int namelen, - int valuelen, + struct xfs_da_args *args, int *local) { - struct xfs_mount *mp = ip->i_mount; + struct xfs_mount *mp = args->dp->i_mount; int size; int nblks; @@ -175,7 +173,7 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(namelen, valuelen, + size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, mp->m_sb.sb_blocksize, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); @@ -189,7 +187,7 @@ xfs_attr_calc_size( * Out of line attribute, cannot double split, but * make room for the attribute value itself. */ - uint dblocks = XFS_B_TO_FSB(mp, valuelen); + uint dblocks = XFS_B_TO_FSB(mp, args->valuelen); nblks += dblocks; nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); } @@ -227,9 +225,7 @@ xfs_attr_set( args.firstblock = &firstblock; args.flist = &flist; args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; - - /* Size is now blocks for attribute data */ - args.total = xfs_attr_calc_size(dp, args.namelen, valuelen, &local); + args.total = xfs_attr_calc_size(&args, &local); error = xfs_qm_dqattach(dp, 0); if (error) -- 1.7.10.4 From tinguely@sgi.com Sat May 3 11:04:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3E6947F37 for ; Sat, 3 May 2014 11:04:08 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D1CA8F8037; Sat, 3 May 2014 09:04:04 -0700 (PDT) Message-ID: <53651375.9080305@sgi.com> Date: Sat, 03 May 2014 11:04:05 -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: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> In-Reply-To: <1399130415-5382-1-git-send-email-hch@lst.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/03/14 10:20, Christoph Hellwig wrote: > A couple random cleanups for the attr code that I had sitting in my tree > for a long time. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Depends on how parent inode pointers are implemented, this folding the internal version of get and set attributes could be undone. --Mark. From info@skeena.net Sat May 3 14:49:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6A5C37F37 for ; Sat, 3 May 2014 14:49:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F12B4AC003 for ; Sat, 3 May 2014 12:49:51 -0700 (PDT) X-ASG-Debug-ID: 1399146586-04cb6c1fcc174280001-NocioJ Received: from skeena.net ([199.60.222.33]) by cuda.sgi.com with ESMTP id 112ofeymSSmVgzxS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 12:49:47 -0700 (PDT) X-Barracuda-Envelope-From: info@skeena.net X-Barracuda-Apparent-Source-IP: 199.60.222.33 Received: from innuk.localdomain (S01061caff7de9d56.gv.shawcable.net [184.66.28.75]) (using SSLv3 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: felix@skeena.net) by skeena.net (Postfix) with ESMTPSA id 2E84C125BDA5 for ; Sat, 3 May 2014 12:49:49 -0700 (PDT) Date: Sat, 3 May 2014 12:49:33 -0700 From: Marcel (Felix) Giannelia To: xfs@oss.sgi.com Subject: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy Message-ID: <20140503124933.7ed0ff3e@innuk.localdomain> X-ASG-Orig-Subj: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy X-Mailer: Claws Mail 3.8.1 (GTK+ 2.24.10; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[199.60.222.33] X-Barracuda-Start-Time: 1399146587 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=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Hi, I just had the following happen on a server that's never had any previous issues with XFS: I was copying an 8 GB file onto an XFS filesystem, when the copy aborted with an I/O error message and I was forced to unmount and xfs_repair the filesystem before it would mount again. Relevant dmesg messages below. Some other information that might be relevant: - Distribution & kernel version: Debian 7, uname -a returns: Linux hostname 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2+deb7u2 i686 GNU/Linux - This filesystem is on a software (mdadm) RAID 1 array, backed by 2 disks. - The drives underneath the RAID reported no errors, and there were no errors from either the RAID layer or the disk layer in dmesg. One hard drive shows no change in SMART status; the other one's reallocated sector count has increased by 1 since the last time I checked (1 month ago), but there are no logged errors. - The filesystem is 174 GB and contains 2.5 million (i.e. 2484996) files, and had 20 GB of free space. A day or two ago it contained around 4 million files and was almost completely full (2 GB free space), and the most recent activity before this problem was the deletion of about 1.5 million files. (Over 24 hours passed between deletion of these files and the attempt to copy the 8 GB file.) - The file I was copying was a virtual disk image from a virtual machine that I had shut down about 5 seconds before starting the copy, so it is likely that some of the file's data had not yet been committed to disk on the source filesystem, and it is also possible that the source file's metadata and contents (but not size) changed during the copy. The source filesystem is also xfs. - A few weeks ago, one of the disks in the RAID 1 array failed and I replaced it with two disks, bringing the number of disks in the array up to 3. This seemed to cause performance issues (writes took too long to complete, causing disk timeouts in the virtual machines), so the third disk was removed and the array was changed back to 2 disks. - I have never seen memory issues in this server before (I ran an overnight memtest when it was first set up, but that was a year ago), and after this error I ran the userspace program "memtester", as I cannot take the server offline. This is a fairly limited test (I was only able to test 1 GB of free memory), but it found no problems. - The problem has not recurred -- after doing xfs_repair and remounting the filesystem, I was able to copy that same file without issues. I since have also copied another virtual machine disk of the same size, while the VM was running, without problems. Output of xfs_info for the filesystem: meta-data=/dev/md126 isize=256 agcount=4, agsize=11375416 blks = sectsz=512 attr=2 data = bsize=4096 blocks=45501664, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=22217, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 dmesg entries: > Immediately after the cp command exited with "i/o error": XFS (md126): xfs_iflush_int: Bad inode 939480132, ptr 0xd12fa080, magic number 0x494d XFS (md126): xfs_do_force_shutdown(0x8) called from line 2606 of file /build/buildd-linux_3.2.41-2+deb7u2-i386-G4jjsr/linux-3.2.41/fs/xfs/xfs_inode.c. Return address = 0xf88319b4 XFS (md126): Corruption of in-memory data detected. Shutting down filesystem XFS (md126): Please umount the filesystem and rectify the problem(s) Buffer I/O error on device md126, logical block 5673596 lost page write due to I/O error on md126 (about 10 more of the "Buffer I/O error / lost page" messages) > I then unmounted the filesystem, which caused these lines in dmesg: XFS (md126): xfs_log_force: error 5 returned. XFS (md126): xfs_log_force: error 5 returned. XFS (md126): xfs_log_force: error 5 returned. XFS (md126): xfs_do_force_shutdown(0x1) called from line 1033 of file /build/buildd-linux_3.2.41-2+deb7u2-i386-G4jjsr/linux-3.2.41/fs/xfs/xfs_buf.c. Return address = 0xf87fd1a7 XFS (md126): xfs_log_force: error 5 returned. XFS (md126): xfs_log_force: error 5 returned. > I then tried to mount the filesystem again and got: XFS (md126): Mounting Filesystem XFS (md126): Starting recovery (logdev: internal) XFS (md126): xlog_recover_inode_pass2: Bad inode log record, rec ptr 0xe153d720, ino 939480132 XFS (md126): Internal error xlog_recover_inode_pass2(2) at line 2259 of file /build/buildd-linux_3.2.41-2+deb7u2-i386-G4jjsr/linux-3.2.41/fs/xfs/xfs_log_recover.c. Caller 0xf8835e66 Pid: 30323, comm: mount Tainted: G O 3.2.0-4-686-pae #1 Debian 3.2.41-2+deb7u2 Call Trace: [] ? xlog_recover_inode_pass2+0x206/0x60a [xfs] [] ? xlog_recover_commit_trans+0x5f/0x80 [xfs] [] ? xlog_recover_commit_trans+0x5f/0x80 [xfs] [] ? xlog_recover_process_data+0x131/0x1bd [xfs] [] ? xlog_do_recovery_pass+0x233/0x57b [xfs] [] ? vprintk+0x3ae/0x3df [] ? xlog_do_log_recovery+0x77/0x92 [xfs] [] ? xlog_do_recover+0x12/0xab [xfs] [] ? xlog_recover+0x6d/0x79 [xfs] [] ? xfs_log_mount+0xab/0x109 [xfs] [] ? xfs_mountfs+0x2b6/0x501 [xfs] [] ? xfs_mru_cache_create+0xeb/0x112 [xfs] [] ? xfs_fs_fill_super+0x145/0x205 [xfs] [] ? mount_bdev+0x11f/0x16d [] ? xfs_parseargs+0x8da/0x8da [xfs] [] ? move_active_pages_to_lru+0xab/0xde [] ? __kmalloc_track_caller+0x9b/0xa7 [] ? xfs_fs_mount+0xe/0x11 [xfs] [] ? xfs_parseargs+0x8da/0x8da [xfs] [] ? mount_fs+0x55/0x122 [] ? vfs_kern_mount+0x4a/0x77 [] ? do_kern_mount+0x2f/0xac [] ? do_mount+0x5d0/0x61e [] ? _cond_resched+0x5/0x18 [] ? memdup_user+0x26/0x43 [] ? sys_mount+0x67/0x96 [] ? sysenter_do_call+0x12/0x28 XFS (md126): log mount/recovery failed: error 117 XFS (md126): log mount failed After this, I ran xfs_repair with -L. xfs_repair noted the same bad inode number and deleted the file I had tried to copy, but otherwise made no changes that I could see. After this, the filesystem mounted normally and there were no further issues. ~Felix. From mrs_deborah_makkanah01@yahoo.co.jp Sat May 3 16:47:09 2014 Return-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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,LOTS_OF_MONEY,MONEY_FROM_41,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 5589F7F37 for ; Sat, 3 May 2014 16:47:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CDCCCAC002 for ; Sat, 3 May 2014 14:47:05 -0700 (PDT) X-ASG-Debug-ID: 1399153622-04cb6c72902cbe40001-NocioJ Received: from web101119.mail.kks.yahoo.co.jp (web101119.mail.kks.yahoo.co.jp [183.79.100.203]) by cuda.sgi.com with SMTP id zHe37YgR8HtPDGxa for ; Sat, 03 May 2014 14:47:02 -0700 (PDT) X-Barracuda-Envelope-From: mrs_deborah_makkanah01@yahoo.co.jp X-Barracuda-Apparent-Source-IP: 183.79.100.203 Received: (qmail 95384 invoked by uid 60001); 3 May 2014 21:46:54 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1399153614; bh=ul5rulrhIrIv4750m/BZEoqigxHSjf15hgWVPk8Cg4Y=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=bskN5z4IMRYbo0Pts5rPqJjuuH2Syagm6xyrZ//jjrKD08W3qjzmHP3lNXxaA0hf0E8JfwmuTOOQ7J1c+84xHfwCl2lvVDv3aqA7VmsPsXUVVReQYroJF2T7SK1z5ZtlolHdtPwuweMjFUI2dj1Y+MPLUqCTqsf1R5w7lthgvy8= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=d5l234tWQA/PNdHYvajxqKYABuAazI9MyFknhDt8l4gKeymOOWD0c31avcQL506mYOuEzo3BqnhVGZ/aPG+AWAHdqXYw1TBDpn7MX/Tct0kn7+KWWuWlH5Lto1tD1oqqf1dQPnNOrAfqE7EgJeR0hBamP9WhRFD6+zilfAdvd98=; Message-ID: <629421.93438.qm@web101119.mail.kks.yahoo.co.jp> X-YMail-OSG: KcK4xsoVM1nrdKrEwZMMn5FEra6kx1rLxz9EIFX_GYRk5aB5i31dqc0kmjx3bp4PCRRcPX6TfywMGkt_pDPuQniy9SldNsQDXWK_d.43IylgendXWqkBwUpjLh.M0OAKVBa.seFtqXJLcgIPeQXNE9OG4bDDnvR4BFHhWxFypmeiYzbX.DByBoWmoSGISdGj3WwHR38oizLpoGySGOozQNzTOKERJbOeON8g8IKwlY.ceHJQOZNVBxStbfopNzVOmw4QvPf_qgSWxlOrKj7Q1UHDPP3hCj1tb05Ox7uIwWVVsQC6Ed5b9niz2sxBnA5W03O0vhEv87bxmh_6zJx77rYd2JpVCtP9unUcvdSR03hjE_h_Y5S69xLIjYEl8I7GzSg.Zz74JxAn0k3RLiZJCnv_wvxstdJPRDYRgjG64syKtIcHV8LsL4td1cCfVu8OEkMc5_7WVb37ghDAgwEKOAczVKYo70VY7n1BCrEuRkUvzhJlafPIWz1MBcxDrW5G9Nfv7vSvY.wQX_f2Ur21v8NI2scoF1QOsl.F2xvHD1_uHbVe4Q47zmHP8tMcEZz6w3AZBfzE7XyPH_AxguRBRi.CCS76R5djhbqrO.KgFkM7xDVjJbvMrVQ6.ksDuLFfuCs- Received: from [41.66.11.29] by web101119.mail.kks.yahoo.co.jp via HTTP; Sun, 04 May 2014 06:46:54 JST X-Mailer: YahooMailWebService/0.8.111_52 Date: Sun, 4 May 2014 06:46:54 +0900 (JST) From: Mis STEPHANIE Reply-To: Mis STEPHANIE Subject: Liebster Freund , To: undisclosed recipients: ; X-ASG-Orig-Subj: Liebster Freund , MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-1296493347-1399153614=:93438" X-Barracuda-Connect: web101119.mail.kks.yahoo.co.jp[183.79.100.203] X-Barracuda-Start-Time: 1399153622 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=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, VALIDYAHOOJP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5506 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.10 VALIDYAHOOJP This mail is valid yahoo.co.jp mail. --0-1296493347-1399153614=:93438 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Liebster Freund ,=0A=A0=0AWie geht es Ihnen heute ? Ich denke, in Ordnung. = Ich werde froh sein , mit Ihnen n=E4her kennen zu lernen , ich hoffe, dass = Sie gut und gesund sind. Lieber , jetzt, dass ich Vertrauen in Sie, dann ic= h werde gl=FCcklich sein, f=FCr deine Hilfe anfordern und auch in Partnersc= haft mit Ihnen zu gehen , glaube ich , dass Sie nicht mein Vertrauen , das = ich werde an euch legen verraten . Ich bin Miss Stephanie KOUAJO ,=0A=0AIch= brauche Ihre Kooperationspartner f=FCr Unternehmensinvestitionen und meine= Absichten , in Ihrem Land zu verlagern, um den Rest meines Lebens dort zu = verbringen.=0A=0AIch bin ein sehr ernster Mensch brauchen Ihre Hilfe, um in= Ihr Land und Setup Investitionen durch Ihre Hilfe zu bewegen meine verstor= benen Eltern Vererbung, sprechen wir von $ 2,5 Millionen USD , und ich wei= =DF nicht, ob , wenn ich sicher bin , die sich mit Ihnen auf diese unterwer= fen ? K=F6nnten Sie bitte zur=FCck zu mir sehr dringend , so dass ich wei= =DF, dass Sie wirklich Interesse haben , mir zu helfen , und sofort ich von= Ihnen h=F6re ich Sie weitere Informationen senden und meine Bilder f=FCr S= ie , mich pers=F6nlich kennen zu lernen .=0A=0ABetrachten Sie diese und erh= alten Sie so schnell wie m=F6glich zu mir zur=FCck.=0A=A0=0AVielen, vielen = Dank .=0A=A0=0AMein herzlicher Gru=DF,=0AFr=E4ulein Stephanie KOUAJO=0A --0-1296493347-1399153614=:93438 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
Liebster Freund ,
 
Wie geht e= s Ihnen heute ? Ich denke, in Ordnung. Ich werde froh sein , mit Ihnen n=E4= her kennen zu lernen , ich hoffe, dass Sie gut und gesund sind. Lieber , je= tzt, dass ich Vertrauen in Sie, dann ich werde gl=FCcklich sein, f=FCr dein= e Hilfe anfordern und auch in Partnerschaft mit Ihnen zu gehen , glaube ich= , dass Sie nicht mein Vertrauen , das ich werde an euch legen verraten . I= ch bin Miss Stephanie KOUAJO ,

Ich brauche Ihre Kooperationspartner = f=FCr Unternehmensinvestitionen und meine Absichten , in Ihrem Land zu verl= agern, um den Rest meines Lebens dort zu verbringen.

Ich bin ein seh= r ernster Mensch brauchen Ihre Hilfe, um in Ihr Land und Setup Investitione= n durch Ihre Hilfe zu bewegen meine verstorbenen Eltern Vererbung, sprechen= wir von $ 2,5 Millionen USD , und ich wei=DF nicht, ob , wenn ich sicher bin , die sich mit Ihnen auf diese unterwerfen ? K=F6nnten Sie bitte zur= =FCck zu mir sehr dringend , so dass ich wei=DF, dass Sie wirklich Interess= e haben , mir zu helfen , und sofort ich von Ihnen h=F6re ich Sie weitere I= nformationen senden und meine Bilder f=FCr Sie , mich pers=F6nlich kennen z= u lernen .

Betrachten Sie diese und erhalten Sie so schnell wie m=F6= glich zu mir zur=FCck.
 
Vielen, vielen Dank .
 
Mein= herzlicher Gru=DF,
Fr=E4ulein Stephanie KOUAJO
--0-1296493347-1399153614=:93438-- From david@fromorbit.com Sat May 3 19:07:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C12877F37 for ; Sat, 3 May 2014 19:07:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B27B2304062 for ; Sat, 3 May 2014 17:06:57 -0700 (PDT) X-ASG-Debug-ID: 1399162009-04cbb03cc62b8620001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 6vGIV8naG4X2E3KQ for ; Sat, 03 May 2014 17:06:50 -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: AjlKADeEZVN5LEcvPGdsb2JhbABZgwaDPYUKozIGmgqBDxcDAQEBATg1giUBAQQBOhwjBQsIAw4KCSUPBSUDBxoTiDkHyXcXFoVAiHwHhD8ElT6DdYp/izwr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 04 May 2014 09:36:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wgjwg-00042m-Cg; Sun, 04 May 2014 10:06:18 +1000 Date: Sun, 4 May 2014 10:06:18 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions Message-ID: <20140504000618.GK26353@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> <20140502100802.GB14028@infradead.org> <20140502232339.GD26353@dastard> <20140503151601.GB28608@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140503151601.GB28608@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: 1399162010 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.5508 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 08:16:01AM -0700, Christoph Hellwig wrote: > On Sat, May 03, 2014 at 09:23:39AM +1000, Dave Chinner wrote: > > before we get to the transaction that can fail: > > block_truncate_page() zeroes the tail of the page cache page. Hence > > if the transaction reservation fails, we've already trashed the file > > data - we may as well finish off the job and at least make it look > > like the truncate succeeded from a user point of view. They then get > > a ENOMEM error (only non-fatal error that can come from > > xfs_trans_reserve) and try the truncate again.... > > I don't think we can even get the ENOMEM. We can - we pass KM_MAYFAIL to xlog_ticket_alloc() from xfs_log_reserve(). > But yeah, I guess > we want something like the old version, with comments explaining exactly > we we have this order. I'll send another version of the first patch with an expanded comment. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat May 3 19:17:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 157C77F37 for ; Sat, 3 May 2014 19:17:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA8D8AC003 for ; Sat, 3 May 2014 17:17:50 -0700 (PDT) X-ASG-Debug-ID: 1399162667-04cb6c1fcc17fe30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id gqqg7VUwp6k84jqF for ; Sat, 03 May 2014 17:17:48 -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: AjlKAJOGZVN5LEcvPGdsb2JhbABZgwaDPYUKozIGmgqBDxcDAQEBATg1giUBAQQBOhwjBQsIAw4KCSUPBSUDBxoTiDkHyXgXFoVAiHwHhD8EmTOKf4lrgVEr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 04 May 2014 09:47:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wgk7m-00043x-AK; Sun, 04 May 2014 10:17:46 +1000 Date: Sun, 4 May 2014 10:17:46 +1000 From: Dave Chinner To: Marcel Giannelia Cc: xfs@oss.sgi.com Subject: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy Message-ID: <20140504001746.GL26353@dastard> X-ASG-Orig-Subj: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy References: <20140503124933.7ed0ff3e@innuk.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140503124933.7ed0ff3e@innuk.localdomain> 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: 1399162667 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.5509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 12:49:33PM -0700, Marcel Giannelia wrote: > Hi, > > I just had the following happen on a server that's never had any > previous issues with XFS: > > I was copying an 8 GB file onto an XFS filesystem, when the copy > aborted with an I/O error message and I was forced to unmount and > xfs_repair the filesystem before it would mount again. Relevant dmesg > messages below. > > Some other information that might be relevant: > > - Distribution & kernel version: Debian 7, uname -a returns: > > Linux hostname 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2+deb7u2 i686 GNU/Linux So, old hardware... > dmesg entries: > > > Immediately after the cp command exited with "i/o error": > > XFS (md126): xfs_iflush_int: Bad inode 939480132, ptr 0xd12fa080, magic number 0x494d The magic number has a single bit error in it. #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ That's the in-memory inode, not the on-disk inode. It caught the problem before writing the bad magic number to disk - the in-memory disk buffer was checked immediately before the in-memory copy, and it checked out OK... > After this, I ran xfs_repair with -L. xfs_repair noted the same bad inode > number and deleted the file I had tried to copy, but otherwise made no changes > that I could see. After this, the filesystem mounted normally and there were no > further issues. What was the error that xfs_repair returned? There may have been other things wrong with the inode that weren't caught when it was loaded into memory. However, I'd almost certainly be checking you hardware at this point, as software doesn't usually cause random single bit flips... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat May 3 19:21:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 016817F37 for ; Sat, 3 May 2014 19:21:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E1D038F8037 for ; Sat, 3 May 2014 17:21:50 -0700 (PDT) X-ASG-Debug-ID: 1399162908-04cbb03cc52b8ff0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id wc2P53Ku02YD8MlP for ; Sat, 03 May 2014 17:21:49 -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: AjdKAMCHZVN5LEcvPGdsb2JhbABZgwaDPYUKozIGmgqBDxcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hAyXIXFoVAiC9NB4Q/BJkzin+LPCuBMQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl2.internode.on.net with ESMTP; 04 May 2014 09:51:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WgkBD-00044Q-DK; Sun, 04 May 2014 10:21:19 +1000 Date: Sun, 4 May 2014 10:21:19 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl Message-ID: <20140504002119.GM26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix Q_XQUOTARM ioctl References: <535580A1.20806@redhat.com> <20140503114816.GA31191@infradead.org> <5364FED5.1050203@sandeen.net> <20140503151440.GA28608@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140503151440.GA28608@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: 1399162908 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.5509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 08:14:40AM -0700, Christoph Hellwig wrote: > On Sat, May 03, 2014 at 09:36:05AM -0500, Eric Sandeen wrote: > > Whoops, missed reply-all. > > > > Yes, it will fail this way w/o the kernel patch. > > > > User quota gets removed OK because flags accidentally line up; > > group quota remains, so you'd see exactly this. > > Ok. Dave, can you pick it up for for-next? It's in my queue - I've been trying to get everything sorted for a 3.15-rc4 update first before pushing more 3.16 changes into for-next. That's been going round in circles on the truncate_setsize() issue, but I think that is sorted now so it'll be done soon. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@skeena.net Sun May 4 01:19:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5AEB07F3F for ; Sun, 4 May 2014 01:19:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDDACAC002 for ; Sat, 3 May 2014 23:18:57 -0700 (PDT) X-ASG-Debug-ID: 1399184332-04cbb03cc42c8da0001-NocioJ Received: from skeena.net ([199.60.222.33]) by cuda.sgi.com with ESMTP id 74ay0UAHT8iZKA6A (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 03 May 2014 23:18:52 -0700 (PDT) X-Barracuda-Envelope-From: info@skeena.net X-Barracuda-Apparent-Source-IP: 199.60.222.33 Received: from innuk.localdomain (S01061caff7de9d56.gv.shawcable.net [184.66.28.75]) (using SSLv3 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: felix@skeena.net) by skeena.net (Postfix) with ESMTPSA id 02185125BDA5 for ; Sat, 3 May 2014 23:18:52 -0700 (PDT) Date: Sat, 3 May 2014 23:18:38 -0700 From: Marcel (Felix) Giannelia To: xfs@oss.sgi.com Subject: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy Message-ID: <20140503231838.219df8ac@innuk.localdomain> X-ASG-Orig-Subj: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy In-Reply-To: <20140504001746.GL26353@dastard> References: <20140503124933.7ed0ff3e@innuk.localdomain> <20140504001746.GL26353@dastard> X-Mailer: Claws Mail 3.8.1 (GTK+ 2.24.10; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[199.60.222.33] X-Barracuda-Start-Time: 1399184332 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_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 On Sun, 4 May 2014 10:17:46 +1000 Dave Chinner wrote: > > > > - Distribution & kernel version: Debian 7, uname -a returns: > > > > Linux hostname 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2+deb7u2 i686 > > GNU/Linux > > So, old hardware... Actually no, fairly new underlying hardware -- but this is for a not-for-profit with no hardware budget, and that one new machine is the exception. At the time they had a lot more 32-bit hardware lying around to build spares with, so I built it to run on that if needed :) > > > dmesg entries: > > > > > Immediately after the cp command exited with "i/o error": > > > > XFS (md126): xfs_iflush_int: Bad inode 939480132, ptr 0xd12fa080, > > magic number 0x494d > > The magic number has a single bit error in it. > > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > > That's the in-memory inode, not the on-disk inode. It caught the > problem before writing the bad magic number to disk - the in-memory > disk buffer was checked immediately before the in-memory copy, and > it checked out OK... > > > After this, I ran xfs_repair with -L. xfs_repair noted the same bad > > inode number and deleted the file I had tried to copy, but > > otherwise made no changes that I could see. After this, the > > filesystem mounted normally and there were no further issues. > > What was the error that xfs_repair returned? There may have been > other things wrong with the inode that weren't caught when it was > loaded into memory. Sorry; I didn't capture that output. From what I remember, the only line different from a clean xfs_repair run was a line quite similar to what was in the dmesg, about inode # 939480132. > > However, I'd almost certainly be checking you hardware at this > point, as software doesn't usually cause random single bit flips... Yeah, going to take that server offline for a full memtest next time I'm out there. I also discovered that the third disk I mentioned from that RAID array was actually having serious problems (hardware ECC recovery and reallocated sectors through the roof), which explains the performance issues it was causing -- and that disk was still part of the array containing the root filesystem. Since mdadm RAID1 reads from whichever individual disk is least busy (and doesn't read from all disks in the array and compare, during normal I/O), is it conceivable that this is what happened?: Copying that file busied out the two healthy disks, which were both in the array I was writing to. So of the three disks backing the root filesystem, the only one not busy was the failing one. During the file copy, some piece of code was needed that was not in the memory cache and had to be read from disk, so mdadm read it from the failing drive, which silently flipped a bit (or several). A memory problem still seems more likely to me, as I wouldn't expect the part of the xfs filesystem driver containing the definition of that magic number to ever need to be re-read from disk after boot -- but I don't know. Memory load on this system is always very high; there's almost no room for cache, so maybe... And is there a definition of that constant someplace that might only be needed when creating a file bigger than 2 or 4 GB (a very infrequent operation on this filesystem)? Thanks, ~Felix. From junxiao.bi@oracle.com Sun May 4 02:43:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 0C1617F3F for ; Sun, 4 May 2014 02:43:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE3C3304059 for ; Sun, 4 May 2014 00:43:17 -0700 (PDT) X-ASG-Debug-ID: 1399189396-04cb6c72912e6f20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id YJjHZg7m9iYBoRTo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 00:43:16 -0700 (PDT) X-Barracuda-Envelope-From: junxiao.bi@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s447hF4l023980 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 4 May 2014 07:43:16 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s447hEhB027507 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 4 May 2014 07:43:15 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s447hDFb027498 for ; Sun, 4 May 2014 07:43:14 GMT Received: from bijx-OptiPlex-780.cn.oracle.com (/10.182.39.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 04 May 2014 00:43:13 -0700 From: Junxiao Bi To: xfs@oss.sgi.com Cc: joe.jin@oracle.com Subject: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() Date: Sun, 4 May 2014 15:44:15 +0800 X-ASG-Orig-Subj: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() Message-Id: <1399189455-29890-1-git-send-email-junxiao.bi@oracle.com> X-Mailer: git-send-email 1.7.9.5 X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399189396 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.5516 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Sending a SIGKILL signal to child thread will terminate the whole process, xfs_copy will return an error value 137. This cause confuse for script to know whether the copy successes. Calling exit() in main thread can terminate the whole process and return the right value. Cc: Joe Jin Signed-off-by: Junxiao Bi --- copy/xfs_copy.c | 33 +++------------------------------ 1 files changed, 3 insertions(+), 30 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 39517da..1419ce7 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -217,25 +217,6 @@ handle_error: } void -killall(void) -{ - int i; - - /* only the parent gets to kill things */ - - if (getpid() != parent_pid) - return; - - for (i = 0; i < num_targets; i++) { - if (target[i].state == ACTIVE) { - /* kill up target threads */ - pthread_kill(target[i].pid, SIGKILL); - pthread_mutex_unlock(&targ[i].wait); - } - } -} - -void handler(int sig) { pid_t pid = getpid(); @@ -400,8 +381,7 @@ read_wbuf(int fd, wbuf *buf, xfs_mount_t *mp) if (buf->length > buf->size) { do_warn(_("assert error: buf->length = %d, buf->size = %d\n"), buf->length, buf->size); - killall(); - abort(); + exit(1); } if ((res = read(fd, buf->data, buf->length)) < 0) { @@ -591,11 +571,6 @@ main(int argc, char **argv) parent_pid = getpid(); - if (atexit(killall)) { - do_log(_("%s: couldn't register atexit function.\n"), progname); - die_perror(); - } - /* open up source -- is it a file? */ open_flags = O_RDONLY; @@ -1154,10 +1129,8 @@ main(int argc, char **argv) } check_errors(); - killall(); - pthread_exit(NULL); - /*NOTREACHED*/ - return 0; + + exit(0); } xfs_caddr_t -- 1.7.1 From BATV+eba897dca63d31bab413+3906+infradead.org+hch@bombadil.srs.infradead.org Sun May 4 04:42:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A5C8D7F3F for ; Sun, 4 May 2014 04:42:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DE8C8F8039 for ; Sun, 4 May 2014 02:42:20 -0700 (PDT) X-ASG-Debug-ID: 1399196538-04bdf02b8d2e2e70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id l2ZbhoJcbNB2znGA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 02:42:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+eba897dca63d31bab413+3906+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 1Wgsw6-0000mI-7e for xfs@oss.sgi.com; Sun, 04 May 2014 09:42:18 +0000 Date: Sun, 4 May 2014 02:42:18 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: repating 208 failures Message-ID: <20140504094218.GA2920@infradead.org> X-ASG-Orig-Subj: repating 208 failures MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399196538 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.5518 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Did anyone see failure like: generic/208 201s ... 200s umount: /mnt/test: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) which then abort xfstests? I've seen them occasionally for a long time, but these days they seem to happen more than 50% of the time. From hch@lst.de Sun May 4 05:16:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E43EE7F3F for ; Sun, 4 May 2014 05:16:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 661CAAC002 for ; Sun, 4 May 2014 03:16:27 -0700 (PDT) X-ASG-Debug-ID: 1399198584-04cbb03cc62d3bd0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Di54fZ0Gwnlu72gJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 03:16:26 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id DA88B13E88; Sun, 4 May 2014 12:16:23 +0200 (CEST) Date: Sun, 4 May 2014 12:16:23 +0200 From: Christoph Hellwig To: Mark Tinguely Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: attr cleanups Message-ID: <20140504101623.GA4947@lst.de> X-ASG-Orig-Subj: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53651375.9080305@sgi.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1399198585 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.5519 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: > Depends on how parent inode pointers are implemented, this folding the > internal version of get and set attributes could be undone. We might have to introduce _locked version at that point. But I'd like to keep the xfs_name removal and other assorted cleanups. From BATV+eba897dca63d31bab413+3906+infradead.org+hch@bombadil.srs.infradead.org Sun May 4 05:34:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E15BB7F3F for ; Sun, 4 May 2014 05:34:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C4ED3304051 for ; Sun, 4 May 2014 03:34:44 -0700 (PDT) X-ASG-Debug-ID: 1399199683-04cbb03cc42d4950001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 6J6vV9fHo3VSyWwD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 03:34:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+eba897dca63d31bab413+3906+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 1Wgtkp-0007jU-Mp; Sun, 04 May 2014 10:34:43 +0000 Date: Sun, 4 May 2014 03:34:43 -0700 From: Christoph Hellwig To: Junxiao Bi Cc: xfs@oss.sgi.com, joe.jin@oracle.com Subject: Re: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() Message-ID: <20140504103443.GA25154@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() References: <1399189455-29890-1-git-send-email-junxiao.bi@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399189455-29890-1-git-send-email-junxiao.bi@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399199684 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, May 04, 2014 at 03:44:15PM +0800, Junxiao Bi wrote: > Sending a SIGKILL signal to child thread will terminate the whole process, > xfs_copy will return an error value 137. This cause confuse for script to > know whether the copy successes. > > Calling exit() in main thread can terminate the whole process and return the > right value. Looks generally good to me, but the changelog should have some more details: > if (buf->length > buf->size) { > do_warn(_("assert error: buf->length = %d, buf->size = %d\n"), > buf->length, buf->size); > - killall(); > - abort(); > + exit(1); You're replacing the killall with an exit here and removing the abort() call. I can see arguments for keeping either the abort or exit, but please document why you did in the patch description. If the exit was intentional should we return a different value for an assertation failure? > - killall(); > - pthread_exit(NULL); > - /*NOTREACHED*/ > - return 0; > + > + exit(0); You're also replacing the return 0 from main with an exit which seem superflous. Btw, I think the reason for this cruft is that xfs_copy was originally written using the IRIX sproc interface, and the port to pthreads didn't remove this gem: http://marc.info/?l=linux-xfs&m=99535721110020&w=2 From BATV+eba897dca63d31bab413+3906+infradead.org+hch@bombadil.srs.infradead.org Sun May 4 05:45:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 EBD137F3F for ; Sun, 4 May 2014 05: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 C236E304059 for ; Sun, 4 May 2014 03:45:12 -0700 (PDT) X-ASG-Debug-ID: 1399200310-04bdf02b8d2e5e80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id FJyhkIb9hxuxuVYQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 03:45:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+eba897dca63d31bab413+3906+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 1Wgtuw-0003WU-Gd for xfs@oss.sgi.com; Sun, 04 May 2014 10:45:10 +0000 Date: Sun, 4 May 2014 03:45:10 -0700 From: Christoph Hellwig , Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] common: use a relative path to fsstress Message-ID: <20140504104510.GA9510@infradead.org> X-ASG-Orig-Subj: [PATCH] common: use a relative path to fsstress MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Christoph Hellwig X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1399200310 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=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5519 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 All commands run as $qa_user should use a relative path so that missing access permissions on $HOME for root don't prevent running it. This fixes common/233 for me. Signed-off-by: Christoph Hellwig --- a/common/config +++ b/common/config @@ -134,7 +134,7 @@ export MOUNT_PROG="`set_prog_path mount`" export UMOUNT_PROG="`set_prog_path umount`" [ "$UMOUNT_PROG" = "" ] && _fatal "umount not found" -export FSSTRESS_PROG="`set_prog_path fsstress $PWD/ltp/fsstress`" +export FSSTRESS_PROG="./ltp/fsstress" [ "$FSSTRESS_PROG" = "" ] && _fatal "fsstress not found" export PERL_PROG="`set_prog_path perl`" From jeff.liu@oracle.com Sun May 4 07:33:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5EBE67F3F for ; Sun, 4 May 2014 07:33:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E0B48F804B for ; Sun, 4 May 2014 05:33:19 -0700 (PDT) X-ASG-Debug-ID: 1399206797-04cb6c72902f6380001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Wpea8UmFk9oNE59s (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 05:33:17 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s44CWriU027402 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 4 May 2014 12:32:53 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s44CWqFA003481 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 4 May 2014 12:32:53 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s44CWpFD003401; Sun, 4 May 2014 12:32:52 GMT Received: from [192.168.1.101] (/112.238.71.23) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 04 May 2014 05:32:51 -0700 Message-ID: <5366336D.5000401@oracle.com> Date: Sun, 04 May 2014 20:32:45 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 03/10] xfs: consolidate xfs_inumbers References: <535078B2.8010601@oracle.com> <20140423153639.GB3326@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 03/10] xfs: consolidate xfs_inumbers In-Reply-To: <20140423153639.GB3326@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399206797 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.5521 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Christoph, Sorry for my too late response! I missed your response somehow. On 04/23 2014 23:36 PM, Christoph Hellwig wrote: > On Fri, Apr 18, 2014 at 08:58:26AM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> To fetch the file system number tables, we currently just ignore the >> errors and proceed to loop over the next AG or bump agino to the next >> chunk in case of btree operations failed, that is not properly because >> those errors might hint us potential file system problems. >> >> This patch rework xfs_inumbers() to handle the btree operation errors >> as well as the loop conditions. Also, add pre-checkups for the given >> inode, we can save alloc/free the format buffer once against an invalid >> inode number. > > The patch looks mostly good to me, but I really think it should be > split into two patches: one to do the formatting changes and code > consolidation, and then one that does the actual logic changes for > better error handling. It's not easy to understand and verify with > these two different changes combined. > >> xfs_inumbers_fmt( >> void __user *ubuffer, /* buffer to write to */ >> - const xfs_inogrp_t *buffer, /* buffer to read from */ >> + const struct xfs_inogrp *buffer, /* buffer to read from */ >> long count, /* # of elements to read */ >> long *written) /* # of bytes written */ >> { >> if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) >> - return -EFAULT; >> + return XFS_ERROR(EFAULT); > > xfs_inumbers_fmt_compat will need the same treatment. Yup. > >> *count = 0; >> + if (agno >= mp->m_sb.sb_agcount || >> + *lastino != XFS_AGINO_TO_INO(mp, agno, agino)) >> + return 0; > > Where is the lastino check coming from? Originally, I copied this check up from xfs_bulkstat(), it seems that it is a redundant check as agno >= mp->m_sb.sb_agcount can handle an invalid lastino input? At least, I can not think out a case to make it happen for now. > >> buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); >> + bufidx = error = 0; > > Why not initialize bufidx and error at declaration time? So they should be initialized there. > >> + error = xfs_inobt_get_rec(cur, &r, &stat); >> + if (error || !stat) >> + break; > > The old code moved on to the next AG here, why has this changed? Ah, it should be the old way. Thanks, -Jeff From tenderit@ds-86831.ds-10.com Sun May 4 14:21:13 2014 Return-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_EXTRA_CLOSE,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 69D767F50 for ; Sun, 4 May 2014 14:21:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4DD54304053 for ; Sun, 4 May 2014 12:21:09 -0700 (PDT) X-ASG-Debug-ID: 1399231266-04cbb03cc72f2580001-NocioJ Received: from ds-86831.ds-10.com (mailer.realtimemail.co.uk [95.131.67.101]) by cuda.sgi.com with ESMTP id ouVGyCbBs4Ov58nq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 12:21:07 -0700 (PDT) X-Barracuda-Envelope-From: tenderit@ds-86831.ds-10.com X-Barracuda-Apparent-Source-IP: 95.131.67.101 Received: from tenderit by ds-86831.ds-10.com with local (Exim 4.82) (envelope-from ) id 1Wh1yD-000543-0w for xfs@oss.sgi.com; Sun, 04 May 2014 20:21:05 +0100 To: xfs@oss.sgi.com Subject: Your Nab Online facility has been Locked- Unlock Now. X-PHP-Script: www.tenderit.co.uk/mailattach..php for 41.203.69.2 X-ASG-Orig-Subj: Your Nab Online facility has been Locked- Unlock Now. From: National Australia Bank Reply-To: MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: Date: Sun, 04 May 2014 20:21:05 +0100 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ds-86831.ds-10.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [504 517] / [47 12] X-AntiAbuse: Sender Address Domain - ds-86831.ds-10.com X-Get-Message-Sender-Via: ds-86831.ds-10.com: authenticated_id: tenderit/only user confirmed/virtual account not confirmed X-Barracuda-Connect: mailer.realtimemail.co.uk[95.131.67.101] X-Barracuda-Start-Time: 1399231267 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: 2.14 X-Barracuda-Spam-Status: No, SCORE=2.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_EXTRA_CLOSE, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.09 HTML_EXTRA_CLOSE BODY: HTML contains far too many close tags 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

NAB Customer,

Your Online access have been blocked.

To ensure that your online service is always available for your use,

Unlock Your online access by following the link below :

UNLOCK YOUR ACCESS

Online Team

© National Australia Bank 2014

From david@fromorbit.com Sun May 4 16:40:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 637AF7F52 for ; Sun, 4 May 2014 16:40:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D9048F8039 for ; Sun, 4 May 2014 14:40:02 -0700 (PDT) X-ASG-Debug-ID: 1399239595-04bdf02b8d306f60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MenWi1kUDVOAzVjr for ; Sun, 04 May 2014 14:39:56 -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: ArgIAJmyZlN5LEcv/2dsb2JhbABYgwaDPag8AQEBAQEBBQGaCoEOF3SCJQEBBAE6HCMFCwgDDgoJJQ8FJQMhE4g5B8oRFxaFQIh8B4Q/BJJfhlSKf4d2gXWBUSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 07:09:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh48L-0006b9-Jc; Mon, 05 May 2014 07:39:41 +1000 Date: Mon, 5 May 2014 07:39:41 +1000 From: Dave Chinner To: Marcel Giannelia Cc: xfs@oss.sgi.com Subject: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy Message-ID: <20140504213941.GN26353@dastard> X-ASG-Orig-Subj: Re: xfs_iflush_int: Bad inode, xfs_do_force_shutdown from xfs_inode.c during file copy References: <20140503124933.7ed0ff3e@innuk.localdomain> <20140504001746.GL26353@dastard> <20140503231838.219df8ac@innuk.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140503231838.219df8ac@innuk.localdomain> 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: 1399239596 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.5533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 11:18:38PM -0700, Marcel Giannelia wrote: > On Sun, 4 May 2014 10:17:46 +1000 > Dave Chinner wrote: > > > > > > > - Distribution & kernel version: Debian 7, uname -a returns: > > > > > > Linux hostname 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2+deb7u2 i686 > > > GNU/Linux > > > > So, old hardware... > > Actually no, fairly new underlying hardware -- but this is for a > not-for-profit with no hardware budget, and that one new machine is > the exception. At the time they had a lot more 32-bit hardware lying > around to build spares with, so I built it to run on that if needed :) OK. If it were me, I would run a x86-64 kernel with a 32 bit userspace rather than put up with all the highmem weirdness of a 686-pae kernel... > > > dmesg entries: > > > > > > > Immediately after the cp command exited with "i/o error": > > > > > > XFS (md126): xfs_iflush_int: Bad inode 939480132, ptr 0xd12fa080, > > > magic number 0x494d > > > > The magic number has a single bit error in it. > > > > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > > > > That's the in-memory inode, not the on-disk inode. It caught the > > problem before writing the bad magic number to disk - the in-memory > > disk buffer was checked immediately before the in-memory copy, and > > it checked out OK... ... > > However, I'd almost certainly be checking you hardware at this > > point, as software doesn't usually cause random single bit flips... > > Yeah, going to take that server offline for a full memtest next time > I'm out there. > > I also discovered that the third disk I mentioned from that RAID array > was actually having serious problems (hardware ECC recovery and > reallocated sectors through the roof), which explains the performance > issues it was causing -- and that disk was still part of the array > containing the root filesystem. Ok, so it may be that the error came from disk in the first place. The kernel you are running is old enough that it doesn't rigourously check every inode that is read from disk, so maybe it slipped through and was only caught by the writeback checks. > A memory problem still seems more likely to me, as I wouldn't expect > the part of the xfs filesystem driver containing the definition of that > magic number to ever need to be re-read from disk after boot The magic number is in every inode that is allocated on disk... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 4 16:44:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7315C7F52 for ; Sun, 4 May 2014 16:44:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5D407304048 for ; Sun, 4 May 2014 14:44:23 -0700 (PDT) X-ASG-Debug-ID: 1399239861-04cb6c72913106b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 1TUtUhAEHpdA5p7g for ; Sun, 04 May 2014 14:44:21 -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: ArgIAMSzZlN5LEcv/2dsb2JhbABYgwaDPag8AQEBAQEBBQGaCoEOF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQMoSFxaFQIh8B4Q/BJkzknWDRis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 07:14:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh4Cd-0006bg-Lw; Mon, 05 May 2014 07:44:07 +1000 Date: Mon, 5 May 2014 07:44:07 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: repating 208 failures Message-ID: <20140504214407.GO26353@dastard> X-ASG-Orig-Subj: Re: repating 208 failures References: <20140504094218.GA2920@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140504094218.GA2920@infradead.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: 1399239861 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.5533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 04, 2014 at 02:42:18AM -0700, Christoph Hellwig wrote: > Did anyone see failure like: > > generic/208 201s ... 200s > umount: /mnt/test: device is busy. > (In some cases useful info about processes that use > the device is found by lsof(8) or fuser(1)) > > which then abort xfstests? I've seen them occasionally for a long time, > but these days they seem to happen more than 50% of the time. I see it occassionally. Most often on a single processor test VM, but not regularly enough to debug. It's an AIO stress test, so perhaps there's a problem with delayed AIO reference counts, because a second attempt to unmount the device will succeed.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 4 16:49:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 00C607F55 for ; Sun, 4 May 2014 16:49:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EECB5304048 for ; Sun, 4 May 2014 14:49:28 -0700 (PDT) X-ASG-Debug-ID: 1399240166-04cb6c728f310800001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id C5RJRBSLwj9shojk for ; Sun, 04 May 2014 14:49:27 -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: ArgIAOe0ZlN5LEcv/2dsb2JhbABYgwaDPag8AQEBAQEBBQGaCoEOF3SCJQEBBTocIxAIAw4KCSUPBSUDIQESiEDKEhcWhUCIfAeEPwEDmTOSdYNGKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 07:19:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh4HZ-0006cV-AS; Mon, 05 May 2014 07:49:13 +1000 Date: Mon, 5 May 2014 07:49:13 +1000 From: Dave Chinner To: Christoph Hellwig , Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] common: use a relative path to fsstress Message-ID: <20140504214913.GP26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] common: use a relative path to fsstress References: <20140504104510.GA9510@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140504104510.GA9510@infradead.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: 1399240166 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.5534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 04, 2014 at 03:45:10AM -0700, Christoph Hellwig wrote: > All commands run as $qa_user should use a relative path so that > missing access permissions on $HOME for root don't prevent running > it. This fixes common/233 for me. > > Signed-off-by: Christoph Hellwig > > --- a/common/config > +++ b/common/config > @@ -134,7 +134,7 @@ export MOUNT_PROG="`set_prog_path mount`" > export UMOUNT_PROG="`set_prog_path umount`" > [ "$UMOUNT_PROG" = "" ] && _fatal "umount not found" > > -export FSSTRESS_PROG="`set_prog_path fsstress $PWD/ltp/fsstress`" > +export FSSTRESS_PROG="./ltp/fsstress" Why remove the set_prog_path call? i.e. this should work: +export FSSTRESS_PROG="`set_prog_path fsstress ./ltp/fsstress`" Otherwise, a comment explaining why set_prog_path is not used just for this binary would be appropriate.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 4 16:52:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0D3587F57 for ; Sun, 4 May 2014 16:52:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D69DC8F8035 for ; Sun, 4 May 2014 14:52:56 -0700 (PDT) X-ASG-Debug-ID: 1399240374-04bdf02b8b307b60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id m6WM2CZ3PGPx7MpT for ; Sun, 04 May 2014 14:52: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: ArgIABO2ZlN5LEcv/2dsb2JhbABYgwaDPag8AQEBAQEBBQGaCoEOF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQMoRFxaFQIh8B4Q/BJkzknWDRis Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 07:22:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh4Kv-0006dA-HT; Mon, 05 May 2014 07:52:41 +1000 Date: Mon, 5 May 2014 07:52:41 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: attr cleanups Message-ID: <20140504215241.GQ26353@dastard> X-ASG-Orig-Subj: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> <20140504101623.GA4947@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140504101623.GA4947@lst.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: 1399240374 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.5535 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 04, 2014 at 12:16:23PM +0200, Christoph Hellwig wrote: > On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: > > Depends on how parent inode pointers are implemented, this folding the > > internal version of get and set attributes could be undone. > > We might have to introduce _locked version at that point. But I'd like > to keep the xfs_name removal and other assorted cleanups. *nod* If we need to factor the code for new additions, then we should do that appropriately for the new code when it arrives. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 4 16:55:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8FCCC7F57 for ; Sun, 4 May 2014 16:55:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7AC91304048 for ; Sun, 4 May 2014 14:55:49 -0700 (PDT) X-ASG-Debug-ID: 1399240546-04cbb03cc52f61c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id xmHWYmFDsoAPajTP for ; Sun, 04 May 2014 14:55: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: AroIABO2ZlN5LEcv/2dsb2JhbABYgwZPgm6oPAEBAQEBAQUBmgqBDhd0giUBAQU6HCMMBAgDGAklDwUlAyETiEDKERcWhUCIfAeEPwSZM5J1g0Yr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 07:25:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh4Nh-0006dX-Kg; Mon, 05 May 2014 07:55:33 +1000 Date: Mon, 5 May 2014 07:55:33 +1000 From: Dave Chinner To: Nathan Scott Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged Message-ID: <20140504215533.GR26353@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged References: <20140502000508.GA26353@dastard> <1461962146.20984.1399097936577.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1461962146.20984.1399097936577.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: 1399240546 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.5535 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 03, 2014 at 02:18:56AM -0400, Nathan Scott wrote: > Hi Dave, > > ----- Original Message ----- > > [...] > > This commit has been tagged with v3.2.0-rc2. I'd like everyone who > > can test this to test it, as all the issues that needed to be solved > > before a release could be made have now been addressed. If there are > > no new regressions or critical issues reported in the next week or > > so, I will make an official 3.2.0 release. So, please test. :) > > > > I came across a couple of trivial build warnings when doing a test > build, and added a doc note for the debian/changelog - updates are > in a git tree over here if you'd like to pull 'em in... > > Changes committed to git://oss.sgi.com/nathans/xfsprogs.git master Look good. I'll pull them in. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 4 17:53:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5E0F47F5E for ; Sun, 4 May 2014 17:53:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AFB4304043 for ; Sun, 4 May 2014 15:53:50 -0700 (PDT) X-ASG-Debug-ID: 1399244028-04cb6c1fcc1c1a00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id HLqEKxi9FGpTEVUD for ; Sun, 04 May 2014 15:53:48 -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: AgsLAE/EZlN5LEcv/2dsb2JhbABYgwYcM6shCwEBAQEBAQUBklGBWYZvF3SDAjskNAUlAzSIQJZ9sy0WhUCJGYIdD0SBOQSZM5J1g0Yr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 08:23:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh5Hq-0006mv-LN for xfs@oss.sgi.com; Mon, 05 May 2014 08:53:34 +1000 Date: Mon, 5 May 2014 08:53:34 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs; master branch updated to 75b480d Message-ID: <20140504225334.GS26353@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs; master branch updated to 75b480d MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="/NkBOFFp2J2Af1nK" 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: 1399244028 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.5535 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --/NkBOFFp2J2Af1nK Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 75b480d Update debian changelog in preparation for pending release New Commits: Nathan Scott (3): [b47c8ca] Fix 32 bit build warning in libxfs, xfs_daddr_t printing [ce5da12] Fix msgfmt warning when building the German translation [75b480d] Update debian changelog in preparation for pending release Code Diffstat: debian/changelog | 7 +++++++ libxfs/rdwr.c | 5 +++-- po/de.po | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) --=20 Dave Chinner david@fromorbit.com --/NkBOFFp2J2Af1nK Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTZsTtAAoJEK3oKUf0dfodtBsP/2qDZ1tIm/jCmEmQY/7Fb5sM Kb4U99nv9KBNEalHDnBURZsiIYWhazC/DnRQAwCR6UrGPPN2ou1O0gWIudmk8zrR 5AXRnEF9DP3c8+u0WMtGjSksQvFxwSyg72AhiXbJwcpsO5l1RfuTXI7GJelGPPbW PUF3EMMs71JonTnDQtstD6++kzqHPOzG8hJRYbVbVYBiAkCqh8tjoEBFSLOX2WBr 1KEA5W3yQsTefCiMOgqXh4FoIDxyRdDrZpkJX180VbMu+25IiJ9GaRdH8ZbttDUf yYGVoRQK7ikbiGlVVXDzHRsBNJpua+0upkMcSTAjgnZ7bB7DDA8Kxqgi7Ngh0qD2 hs+Gb6bjgCXjPMjfcuSYeyQMgXT6kGVXPMD/d5Xmg3RxCYsKj6ex+uzQjyUOfJy6 /c/e8zF19loMpnhboY633jivNeuN8XBUz7drPMoZ1P5d0q0hwCTA6Ai50HHaLBxV 5tsmCosFgFk3RwusETcyOSM7pCoXcDK/XfPdC43lq4eRukUU5AeN00wZKhnWJ58Q rFvoFogZ/6uhtJsSpJtc5MYCrtmPjl8gtdcguTVgQiwYlJNmQgHZjfpCkFkcpCSf rEL5u/jIX7yPYkzFUmD1tcQTHgjn0NLah3e1VqDh0x8b95PO2ESaMZojPWvM8RaK m+FFvqc5WPPUG3n9SkKH =y4KD -----END PGP SIGNATURE----- --/NkBOFFp2J2Af1nK-- From david@fromorbit.com Sun May 4 18:16:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4EFDA7F60 for ; Sun, 4 May 2014 18:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 470FC304053 for ; Sun, 4 May 2014 16:16:04 -0700 (PDT) X-ASG-Debug-ID: 1399245361-04cb6c7290315610001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id o4GAHAy5emknm6Pp for ; Sun, 04 May 2014 16:16:02 -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: AgsLAA3JZlN5LEcv/2dsb2JhbABYgwZPqyELAQEBAQEBBQGUKoVggRAXdIIlAQEFViMQCAMYCSUPBSUDIROIQMoWFxaFQIcBgXsHhD8EmTOSdYNGKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail07.adl2.internode.on.net with ESMTP; 05 May 2014 08:46:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wh5dM-0006qe-4f; Mon, 05 May 2014 09:15:48 +1000 Date: Mon, 5 May 2014 09:15:48 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged Message-ID: <20140504231548.GT26353@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: 3.2.0-rc2 release tagged References: <20140502000508.GA26353@dastard> <536437AD.9020303@sandeen.net> <20140503025800.GI26353@dastard> <5364654C.3080009@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="3siQDZowHQqNOShm" Content-Disposition: inline In-Reply-To: <5364654C.3080009@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: 1399245361 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.5535 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --3siQDZowHQqNOShm Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, May 02, 2014 at 10:41:00PM -0500, Eric Sandeen wrote: > On 5/2/14, 9:58 PM, Dave Chinner wrote: > > On Fri, May 02, 2014 at 07:26:21PM -0500, Eric Sandeen wrote: > >> On 5/1/14, 7:05 PM, Dave Chinner wrote: > >>> Hi folks, > >>> > >>> The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has > >>> just been updated. > >>> > >>> The new head of the master branch is commit: > >>> > >>> 67fcc94 xfsprogs: v3.2.0-rc2 release > >>> > >>> This commit has been tagged with v3.2.0-rc2. I'd like everyone who > >>> can test this to test it, as all the issues that needed to be solved > >>> before a release coul dbe made have now been addressed. If there are > >>> no new regressions or critical issues reported in the next week or > >>> so, I will make an official 3.2.0 release. So, please test. :) > >> > >> Any chance for a signed tarball? > >=20 > > Do we need one? I can generate one, but I'm not 100% sure where we > > are putting them up online.... >=20 > The others are at ftp://oss.sgi.com/projects/xfs/cmd_tars/ >=20 > I dunno, I think distros usually expect to be able to grab a > tarball... OK, I've uploaded a signed tarball to that location with the sha1sum of: 93f3dd8818a749e718fd75e8dd48c466570a402c xfsprogs-3.2.0-rc2.tar.gz FWIW, that set of "release" directories is a wasteland of old releases, rpms, stuff moved out of the way because of mistakes, etc. There is no consistent use of permissions or users, README files are out of date, etc. Any suggestions on what should be done to clean this up? Cheers, Dave. --=20 Dave Chinner david@fromorbit.com --3siQDZowHQqNOShm Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTZsojAAoJEK3oKUf0dfodY+kQALNZCRBxWdnR+WM2Nk7BZR+2 pon/WX8ekmj5DZXJ8Rc+Dw7/eVCpjBuvotT++l/6B4Nl37EnjU504S/JV21Wzxr9 b/bj1L8r4moDzgQP4iLLDLL5JYoktanu53QJo6wSIhR0gbCJBpj6hDgZ+K2zOafo 852PiMEjXl6uN7RkMU83zgRtSRed/rgmu/Y2IbRaSsUPzqfyQwIcaY2anxDSWJwd x1uwLQ5uUZrSU8REPY48z8pUipyA/v/ZvZT4TYAGz5yXkHYa2T2Ih0Yh1nb+i4JK iy1D56hUVtk++aDMXTzpgwkhWIz7DA65q2THq7hrZi9meUgV/hEJ0BwXxkDJPDKN thNEeYv9rq7ZudEa0hwjZOuFE+W9BpSLxGgIxHmw5ND4/H6U0Ux7dL/z1vSu1hOt 2E8ZqZ0aWBHbWxgbQPobLa0Gl8qqVUwLWjZjYlA5lWJQ9LV13hAnBBUQy80nsmVg uPNMYYpVAc/8qbrsqVDc9qcLYufjhhrlNNZ2qz/ludCLXdGMiPFCGI6wHi+3lpo/ e4VMiyN48T76HT7/43+oVUOCiPJ59X/wKEK7KReeESFET9q12gT/7vEGnJknGltB Ut8qM8rEzuHtapxlCXDdM685GmzF/CJ+eYZuvf/qgj9ggrQTUzEc7Duv30/rlKdD ZjjOIYeFg33nsPOdP73n =DB9P -----END PGP SIGNATURE----- --3siQDZowHQqNOShm-- From david@fromorbit.com Mon May 5 00:20:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E4B717F56 for ; Mon, 5 May 2014 00:20:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C92D58F8033 for ; Sun, 4 May 2014 22:20:01 -0700 (PDT) X-ASG-Debug-ID: 1399267199-04cbb03cc43027f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id tvyMSJ2bBv4jye9S for ; Sun, 04 May 2014 22:19:59 -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: AuJnANQeZ1N5LEcvPGdsb2JhbABRCIMGiEejCgEBAQEBAQaUKoVggRYXAwEBAQE4NYIlAQEFJxMcIxAIEQcMJQ8FJQMHGhOIQMpEFxaFQIgmSwsHhD8ElT6DdYp/izwr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 05 May 2014 14:49:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhBJW-0007Uh-2N; Mon, 05 May 2014 15:19:42 +1000 Date: Mon, 5 May 2014 15:19:42 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: [PATCH V3] xfs: truncate_setsize should be outside transactions Message-ID: <20140505051941.GU26353@dastard> X-ASG-Orig-Subj: [PATCH V3] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> <20140502100802.GB14028@infradead.org> <20140502232339.GD26353@dastard> <20140503151601.GB28608@infradead.org> <20140504000618.GK26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140504000618.GK26353@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: 1399267199 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.5544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner truncate_setsize() removes pages from the page cache, and hence requires page locks to be held. It is not valid to lock a page cache page inside a transaction context as we can hold page locks when we we reserve space for a transaction. If we do, then we expose an ABBA deadlock between log space reservation and page locks. That is, both the write path and writeback lock a page, then start a transaction for block allocation, which means they can block waiting for a log reservation with the page lock held. If we hold a log reservation and then do something that locks a page (e.g. truncate_setsize in xfs_setattr_size) then that page lock can block on the page locked and waiting for a log reservation. If the transaction that is waiting for the page lock is the only active transaction in the system that can free log space via a commit, then writeback will never make progress and so log space will never free up. This issue with xfs_setattr_size() was introduced back in 2010 by commit fa9b227 ("xfs: new truncate sequence") which moved the page cache truncate from outside the transaction context (what was xfs_itruncate_data()) to inside the transaction context as a call to truncate_setsize(). The reason truncate_setsize() was located where in this place was that we can't shouldn't change the file size until after we are in the transaction context and the operation will either succeed or shut down the filesystem on failure. However, block_truncate_page() already modifies the file contents before we enter the transaction context, so we can't really fulfill this guarantee in any way. Hence we may as well ensure that on success or failure, the in-memory inode and data is truncated away and that the application cleans up the mess appropriately. Signed-off-by: Dave Chinner --- V3 - revert back to original fix but expand the comment to explain why the truncate is done this way. fs/xfs/xfs_iops.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef1ca01..9ef6394 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -808,22 +808,34 @@ xfs_setattr_size( */ inode_dio_wait(inode); + /* + * Do all the page cache truncate work outside the transaction context + * as the "lock" order is page lock->log space reservation. i.e. + * locking pages inside the transaction can ABBA deadlock with + * writeback. We have to do the VFS inode size update before we truncate + * the pagecache, however, to avoid racing with page faults beyond the + * new EOF they are not serialised against truncate operations except by + * page locks and size updates. + * + * Hence we are in a situation where a truncate can fail with ENOMEM + * from xfs_trans_reserve(), but having already truncated the in-memory + * version of the file (i.e. made user visible changes). There's not + * much we can do about this, except to hope that the caller sees ENOMEM + * and retries the truncate operation. + */ error = -block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); if (error) return error; + truncate_setsize(inode, newsize); tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); if (error) goto out_trans_cancel; - truncate_setsize(inode, newsize); - commit_flags = XFS_TRANS_RELEASE_LOG_RES; lock_flags |= XFS_ILOCK_EXCL; - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); /* From junxiao.bi@oracle.com Mon May 5 01:13:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 83EF57F58 for ; Mon, 5 May 2014 01:13:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 71BB08F8035 for ; Sun, 4 May 2014 23:13:14 -0700 (PDT) X-ASG-Debug-ID: 1399270393-04cbb03cc7303b20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VcB5i4w5FaAgfXRg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 04 May 2014 23:13:13 -0700 (PDT) X-Barracuda-Envelope-From: junxiao.bi@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s456ChJo003049 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 5 May 2014 06:12:43 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s456CgbT027734 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 5 May 2014 06:12:43 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s456CfFN022928; Mon, 5 May 2014 06:12:42 GMT Received: from [10.182.39.153] (/10.182.39.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 04 May 2014 23:12:41 -0700 Message-ID: <53672C12.10600@oracle.com> Date: Mon, 05 May 2014 14:13:38 +0800 From: Junxiao Bi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com, joe.jin@oracle.com Subject: Re: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() References: <1399189455-29890-1-git-send-email-junxiao.bi@oracle.com> <20140504103443.GA25154@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_copy: use exit() to replace killall() In-Reply-To: <20140504103443.GA25154@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399270393 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 05/04/2014 06:34 PM, Christoph Hellwig wrote: > On Sun, May 04, 2014 at 03:44:15PM +0800, Junxiao Bi wrote: >> Sending a SIGKILL signal to child thread will terminate the whole process, >> xfs_copy will return an error value 137. This cause confuse for script to >> know whether the copy successes. >> >> Calling exit() in main thread can terminate the whole process and return the >> right value. > Looks generally good to me, but the changelog should have some more > details: Yes, will update. > >> if (buf->length > buf->size) { >> do_warn(_("assert error: buf->length = %d, buf->size = %d\n"), >> buf->length, buf->size); >> - killall(); >> - abort(); >> + exit(1); > You're replacing the killall with an exit here and removing the abort() > call. I can see arguments for keeping either the abort or exit, but please > document why you did in the patch description. If the exit was > intentional should we return a different value for an assertation > failure? I think exit() is more clear than killall()+abort(). And xfs_copy uses exit(1) to exit before creating threads. I think 1 is OK, since all values except 0 means xfs_copy fail. > >> - killall(); >> - pthread_exit(NULL); >> - /*NOTREACHED*/ >> - return 0; >> + >> + exit(0); > You're also replacing the return 0 from main with an exit which > seem superflous. Yes, return 0 is OK. Will update the patch. > > Btw, I think the reason for this cruft is that xfs_copy was originally > written using the IRIX sproc interface, and the port to pthreads didn't > remove this gem: Thanks for point the reason. Thanks, Junxiao. > > http://marc.info/?l=linux-xfs&m=99535721110020&w=2 From dave@fromorbit.com Mon May 5 02:45:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9AD927F62 for ; Mon, 5 May 2014 02:45:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 643478F8035 for ; Mon, 5 May 2014 00:45:54 -0700 (PDT) X-ASG-Debug-ID: 1399275951-04bdf02b8d3186b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id dn4hVGatdGlGpDnV for ; Mon, 05 May 2014 00:45:51 -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: Aq5nAD9BZ1N5LEcvPGdsb2JhbABYgwaIR6MIAQEBAQEBBpsfFwMBAQEBODWCJQEtLzsYGFIDBy2IQJc7s0yFVokNhDUErWeCBys Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 05 May 2014 17:15:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhDau-0007nr-FG for xfs@oss.sgi.com; Mon, 05 May 2014 17:45:48 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhDau-0007ED-E5 for xfs@oss.sgi.com; Mon, 05 May 2014 17:45:48 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [V2] xfs: remote attribute overwrite causes transaction overrun Date: Mon, 5 May 2014 17:45:48 +1000 X-ASG-Orig-Subj: [V2] xfs: remote attribute overwrite causes transaction overrun Message-Id: <1399275948-27752-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1399275951 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.5546 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Commit e461fcb ("xfs: remote attribute lookups require the value length") passes the remote attribute length in the xfs_da_args structure on lookup so that CRC calculations and validity checking can be performed correctly by related code. This, unfortunately has the side effect of changing the args->valuelen parameter in cases where it shouldn't. That is, when we replace a remote attribute, the incoming replacement stores the value and length in args->value and args->valuelen, but then the lookup which finds the existing remote attribute overwrites args->valuelen with the length of the remote attribute being replaced. Hence when we go to create the new attribute, we create it of the size of the existing remote attribute, not the size it is supposed to be. When the new attribute is much smaller than the old attribute, this results in a transaction overrun and an ASSERT() failure on a debug kernel: XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 Fix this by keeping the remote attribute value length separate to the attribute value length in the xfs_da_args structure. The enables us to pass the length of the remote attribute to be removed without overwriting the new attribute's length. Also, ensure that when we save remote block contexts for a later rename we zero the original state variables so that we don't confuse the state of the attribute to be removes with the state of the new attribute that we just added. [Spotted by Brain Foster.] Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 24 +++++++++++++++++++++++- fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 8 +++++--- fs/xfs/xfs_da_btree.h | 2 ++ 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 95de302..30482c9 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -213,7 +213,7 @@ xfs_attr_calc_size( * Out of line attribute, cannot double split, but * make room for the attribute value itself. */ - uint dblocks = XFS_B_TO_FSB(mp, valuelen); + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); nblks += dblocks; nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); } @@ -698,11 +698,22 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) trace_xfs_attr_leaf_replace(args); + /* save the attribute state for later removal*/ args->op_flags |= XFS_DA_OP_RENAME; /* an atomic rename */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; args->rmtblkcnt2 = args->rmtblkcnt; + args->rmtvaluelen2 = args->rmtvaluelen; + + /* + * clear the remote attr state now that it is saved so that the + * values reflect the state of the attribute we are about to + * add, not the attribute we just found and will remove later. + */ + args->rmtblkno = 0; + args->rmtblkcnt = 0; + args->rmtvaluelen = 0; } /* @@ -794,6 +805,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) args->blkno = args->blkno2; args->rmtblkno = args->rmtblkno2; args->rmtblkcnt = args->rmtblkcnt2; + args->rmtvaluelen = args->rmtvaluelen2; if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) @@ -999,13 +1011,22 @@ restart: trace_xfs_attr_node_replace(args); + /* save the attribute state for later removal*/ args->op_flags |= XFS_DA_OP_RENAME; /* atomic rename op */ args->blkno2 = args->blkno; /* set 2nd entry info*/ args->index2 = args->index; args->rmtblkno2 = args->rmtblkno; args->rmtblkcnt2 = args->rmtblkcnt; + args->rmtvaluelen2 = args->rmtvaluelen; + + /* + * clear the remote attr state now that it is saved so that the + * values reflect the state of the attribute we are about to + * add, not the attribute we just found and will remove later. + */ args->rmtblkno = 0; args->rmtblkcnt = 0; + args->rmtvaluelen = 0; } retval = xfs_attr3_leaf_add(blk->bp, state->args); @@ -1133,6 +1154,7 @@ restart: args->blkno = args->blkno2; args->rmtblkno = args->rmtblkno2; args->rmtblkcnt = args->rmtblkcnt2; + args->rmtvaluelen = args->rmtvaluelen2; if (args->rmtblkno) { error = xfs_attr_rmtval_remove(args); if (error) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index b9d9170..17ec23f 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work( name_rmt->valueblk = 0; args->rmtblkno = 1; args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); + args->rmtvaluelen = args->valuelen; } xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), @@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int( if (!xfs_attr_namesp_match(args->flags, entry->flags)) continue; args->index = probe; - args->valuelen = be32_to_cpu(name_rmt->valuelen); + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = xfs_attr3_rmt_blocks( args->dp->i_mount, - args->valuelen); + args->rmtvaluelen); return XFS_ERROR(EEXIST); } } @@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue( name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); ASSERT(name_rmt->namelen == args->namelen); ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); - valuelen = be32_to_cpu(name_rmt->valuelen); + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); args->rmtblkno = be32_to_cpu(name_rmt->valueblk); args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, - valuelen); + args->rmtvaluelen); if (args->flags & ATTR_KERNOVAL) { - args->valuelen = valuelen; + args->valuelen = args->rmtvaluelen; return 0; } - if (args->valuelen < valuelen) { - args->valuelen = valuelen; + if (args->valuelen < args->rmtvaluelen) { + args->valuelen = args->rmtvaluelen; return XFS_ERROR(ERANGE); } - args->valuelen = valuelen; + args->valuelen = args->rmtvaluelen; } return 0; } @@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag( ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); - name_rmt->valuelen = cpu_to_be32(args->valuelen); + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); } @@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags( ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); name_rmt->valueblk = cpu_to_be32(args->rmtblkno); - name_rmt->valuelen = cpu_to_be32(args->valuelen); + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); xfs_trans_log_buf(args->trans, bp1, XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); } diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 3e9a65a..0bba7c3 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -447,6 +447,7 @@ xfs_attr3_leaf_list_int( args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; + args.rmtvaluelen = valuelen; args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS); args.rmtblkno = be32_to_cpu(name_rmt->valueblk); args.rmtblkcnt = xfs_attr3_rmt_blocks( diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 44a57c8..6a70e7e 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( struct xfs_buf *bp; xfs_dablk_t lblkno = args->rmtblkno; __uint8_t *dst = args->value; - int valuelen = args->valuelen; + int valuelen; int nmap; int error; int blkcnt = args->rmtblkcnt; @@ -347,7 +347,9 @@ xfs_attr_rmtval_get( trace_xfs_attr_rmtval_get(args); ASSERT(!(args->flags & ATTR_KERNOVAL)); + ASSERT(args->rmtvaluelen == args->valuelen); + valuelen = args->rmtvaluelen; while (valuelen > 0) { nmap = ATTR_RMTVALUE_MAPSIZE; error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, @@ -415,7 +417,7 @@ xfs_attr_rmtval_set( * attributes have headers, we can't just do a straight byte to FSB * conversion and have to take the header space into account. */ - blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); + blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, XFS_ATTR_FORK); if (error) @@ -480,7 +482,7 @@ xfs_attr_rmtval_set( */ lblkno = args->rmtblkno; blkcnt = args->rmtblkcnt; - valuelen = args->valuelen; + valuelen = args->rmtvaluelen; while (valuelen > 0) { struct xfs_buf *bp; xfs_daddr_t dblkno; diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6e95ea7..201c609 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -60,10 +60,12 @@ typedef struct xfs_da_args { int index; /* index of attr of interest in blk */ xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ int rmtblkcnt; /* remote attr value block count */ + int rmtvaluelen; /* remote attr value length in bytes */ xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ int index2; /* index of 2nd attr in blk */ xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ int rmtblkcnt2; /* remote attr value block count */ + int rmtvaluelen2; /* remote attr value length in bytes */ int op_flags; /* operation flags */ enum xfs_dacmp cmpresult; /* name compare result for lookups */ } xfs_da_args_t; -- 1.9.0 From david@fromorbit.com Mon May 5 05:24:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 673EF7F69 for ; Mon, 5 May 2014 05:24:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3873B8F8040 for ; Mon, 5 May 2014 03:24:08 -0700 (PDT) X-ASG-Debug-ID: 1399285445-04cb6c729132de50001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fgSGCrkL8DvKICKL for ; Mon, 05 May 2014 03:24:06 -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: AthmAJ5lZ1N5LEcvPGdsb2JhbABZgwZPqngLAQEBAQEBBpQqhWCBFxcDAQEBATg1giUBAQUnExwjEAgDDgoJJQ8FJQMHGhOIQA7LHRaFQIcBgXsHhD8EmTOWOysw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail06.adl6.internode.on.net with ESMTP; 05 May 2014 19:54:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhG43-0008C2-7y; Mon, 05 May 2014 20:24:03 +1000 Date: Mon, 5 May 2014 20:24:03 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: initialize default acls for ->tmpfile() Message-ID: <20140505102403.GV26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: initialize default acls for ->tmpfile() References: <1398951487-15462-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398951487-15462-1-git-send-email-bfoster@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: 1399285445 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.5549 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 01, 2014 at 09:38:07AM -0400, Brian Foster wrote: > The current tmpfile handler does not initialize default ACLs. Doing so > within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), > which is already used as a common create handler. > > xfs_vn_mknod() does not currently have a mechanism to determine whether > to link the file into the namespace. Therefore, further abstract > xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile > parameter. This new handler passes a NULL xname to the create and calls > d_tmpfile() on the dentry when called via ->tmpfile(). > > Signed-off-by: Brian Foster > --- > > Hi all, > > It appears that we want to initialize default ACLs for ->tmpfile() after > all. This patch reintroduces the refactoring to initialize security and > ACLs through the current xfs_vn_mknod(). This is based on top of the > previously posted series: > > http://oss.sgi.com/archives/xfs/2014-04/msg00396.html > > Brian ..... > @@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( > struct dentry *dentry, > umode_t mode) > { > - int error; > - struct xfs_inode *ip; > - struct inode *inode; > - > - error = xfs_create(XFS_I(dir), NULL, mode, 0, &ip); > - if (unlikely(error)) > - return -error; > - > - inode = VFS_I(ip); > - > - error = xfs_init_security(inode, dir, &dentry->d_name); > - if (unlikely(error)) { > - iput(inode); > - return -error; > - } > - > - d_tmpfile(dentry, inode); > - > - return 0; > + return xfs_generic_create(dir, dentry, mode, 0, true); > } This hunk doesn't apply to a 3.15-rc2 kernel - it calls xfs_create_tmpfile(). Just applying it as is after fixing the hunk causes a crash in xfs-create(), because the code in the patch is calling xfs-create ratehr than xfs_create_tmpfile(). Brian, can you regenerate this patch against a current linus tree (3.15-rc4)? Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon May 5 06:35:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BB0E37F6B for ; Mon, 5 May 2014 06:35:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9EF8E8F8035 for ; Mon, 5 May 2014 04:34:58 -0700 (PDT) X-ASG-Debug-ID: 1399289694-04cbb03cc43148f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CTXPWWbdwj0SUQ31 for ; Mon, 05 May 2014 04:34: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45BYk3U000692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 07:34:47 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45BYkYh024150; Mon, 5 May 2014 07:34:46 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 05627120AC3; Mon, 5 May 2014 07:34:45 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45BYhas012058; Mon, 5 May 2014 07:34:43 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 07:34:43 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfstests: fixes for the free inode btree Message-ID: <20140505113443.GA11622@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/5] xfstests: fixes for the free inode btree References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> <20140502234831.GG26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140502234831.GG26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399289694 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, May 03, 2014 at 09:48:31AM +1000, Dave Chinner wrote: > On Fri, May 02, 2014 at 01:13:57PM -0400, Brian Foster wrote: > > Hi all, > > > > This series is a few xfstests fixes and addons for the finobt. Patch 1 > > fixes xfs/030 to work correctly on finobt-enabled filesystems. Patches 2 > > and 3 add support for finobt-oriented tests via require functions and > > repair filter updates. Patch 4 adds a new test for targeted repair of > > finobt filesystems. Patch 5 adds a stress test that creates/modifies a > > sparsely allocated set of inodes to effectively exercise the finobt in > > conjunction with an fsstress workload. > > > > xfs/010 runs very quickly. xfs/013 runs for 5-10 minutes on my smallish > > VM running against a single spindle, so I've been back and forth on > > whether it should be part of the auto group. Thoughts, reviews, flames > > appreciated... > > 5-10 minutes is probably right at the edge for auto, but I think > that most people won't be testing this any time soon. Hence I'd > include it by default in the auto group, and if people complain > about the runtime when they start testing it, we can revist that > choice. FWIW, I'd also include it in the metadata group so that it > gets exercised when people run that group.... > Ok, sounds good. It actually runs closer to 5 minutes than 10 when I simply move to a separate (still single) spindle, so it's probably not that bad. IIRC, it's still probably not the longest running test I've seen in auto. I believe you have an SSD test setup, so I'm curious how the workload looks if you get a a chance to run it there. :) > I had a quick eyeball of the changes, and nothing major stood out. > The only thing I noticed was a missing "wait" in the _cleanup > function of xfs/013 after killing all the fsstress processes. It > should probably using killall -9 as well. If we don't wait, then the > unmount will fail and if the fsstress processes don't die it will > affect every test after that... > Indeed, thanks. > I'll probably have more suggestions once I've run the tests ;) > Ok. FWIW, the parameters of the stress test (# files, # iters, etc.) were mostly determined empirically to provide a good workout for the finobt in a reasonable amount of time. The test started out as open coded for loops to do linking and random new creations, but that turned out far too slow when tuned to be effective. The hard link cp and smaller file replacement loop after the fact turned out to be much faster. fsstress was added after that as it appeared to amplify the operations on the finobt without adding too much time to the test. Any thoughts on the parameters or broader test(s) are appreciated... Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From jeff.liu@oracle.com Mon May 5 07:32:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3759F7F6D for ; Mon, 5 May 2014 07:32:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 107AD8F8035 for ; Mon, 5 May 2014 05:31:57 -0700 (PDT) X-ASG-Debug-ID: 1399293116-04cb6c7290338620001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VntmeeV8GM951d69 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:31:56 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CVsR7018784 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:31:55 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CVsGT008052 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Mon, 5 May 2014 12:31:54 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CVr2U008033 for ; Mon, 5 May 2014 12:31:53 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:31:53 -0700 Message-ID: <536784B2.7090002@oracle.com> Date: Mon, 05 May 2014 20:31:46 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399293116 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, This patch series sync up the code differences between kernel and user space for xfs_icluster_size_fsb() relevant changes, i.e, http://oss.sgi.com/archives/xfs/2013-12/msg00499.html Most patches are similar to the kernel part except we have xfs_bulkstat() and xfs_ifree_cluster() at kernel space but they are not presented at user space. Cheers, -Jeff From jeff.liu@oracle.com Mon May 5 07:32:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5DDFE7F75 for ; Mon, 5 May 2014 07:32:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4915D30405F for ; Mon, 5 May 2014 05:32:04 -0700 (PDT) X-ASG-Debug-ID: 1399293121-04cb6c1fcc1e6660001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Q0xxTNZBuFjL7JbD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:02 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CW0JH022229 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:01 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CVxkC004684 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 May 2014 12:32:00 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CVxNF029317 for ; Mon, 5 May 2014 12:31:59 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:31:59 -0700 Message-ID: <536784BB.4020308@oracle.com> Date: Mon, 05 May 2014 20:31:55 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 1/6] xfsprogs: get rid of XFS_IALLOC_INODES macros Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 1/6] xfsprogs: get rid of XFS_IALLOC_INODES macros Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399293122 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Get rid of XFS_IALLOC_INODES() macros, use mp->m_ialloc_inos directly. Signed-off-by: Jie Liu --- include/xfs_ialloc.h | 1 - libxfs/xfs_ialloc.c | 12 ++++++------ repair/dino_chunks.c | 16 ++++++++-------- repair/prefetch.c | 4 ++-- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index a8f76a5..4689b02 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -28,7 +28,6 @@ struct xfs_btree_cur; /* * Allocation parameters for inode allocation. */ -#define XFS_IALLOC_INODES(mp) (mp)->m_ialloc_inos #define XFS_IALLOC_BLOCKS(mp) (mp)->m_ialloc_blks /* diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c19d84a..108f6f2 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -201,7 +201,7 @@ xfs_ialloc_inode_init( * they track in the AIL as if they were physically logged. */ if (tp) - xfs_icreate_log(tp, agno, agbno, XFS_IALLOC_INODES(mp), + xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, mp->m_sb.sb_inodesize, length, gen); } else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; @@ -305,7 +305,7 @@ xfs_ialloc_ag_alloc( * Locking will ensure that we don't have two callers in here * at one time. */ - newlen = XFS_IALLOC_INODES(args.mp); + newlen = args.mp->m_ialloc_inos; if (args.mp->m_maxicount && args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) return XFS_ERROR(ENOSPC); @@ -975,7 +975,7 @@ xfs_dialloc( * inode. */ if (mp->m_maxicount && - mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { + mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { noroom = 1; okalloc = 0; } @@ -1178,7 +1178,7 @@ xfs_difree( * When an inode cluster is free, it becomes eligible for removal */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && - (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { + (rec.ir_freecount == mp->m_ialloc_inos)) { *delete = 1; *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); @@ -1188,7 +1188,7 @@ xfs_difree( * AGI and Superblock inode counts, and mark the disk space * to be freed when the transaction is committed. */ - ilen = XFS_IALLOC_INODES(mp); + ilen = mp->m_ialloc_inos; be32_add_cpu(&agi->agi_count, -ilen); be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); @@ -1287,7 +1287,7 @@ xfs_imap_lookup( /* check that the returned record contains the required inode */ if (rec.ir_startino > agino || - rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) + rec.ir_startino + mp->m_ialloc_inos <= agino) return EINVAL; /* for untrusted inodes check it is allocated first */ diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index afb26e0..15aa4f8 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -267,7 +267,7 @@ verify_inode_chunk(xfs_mount_t *mp, * would include the inode passed into us. */ if (XFS_IALLOC_BLOCKS(mp) > 1) { - if (agino > XFS_IALLOC_INODES(mp)) + if (agino > mp->m_ialloc_inos) start_agbno = agbno - XFS_IALLOC_BLOCKS(mp) + 1; else start_agbno = 1; @@ -336,7 +336,7 @@ verify_inode_chunk(xfs_mount_t *mp, * of the gap -- is it within the search range? */ if (irec_next_p != NULL && - agino + XFS_IALLOC_INODES(mp) >= + agino + mp->m_ialloc_inos >= irec_next_p->ino_startnum) end_agbno = XFS_AGINO_TO_AGBNO(mp, irec_next_p->ino_startnum); @@ -688,7 +688,7 @@ process_inode_chunk( icnt++; cluster_offset++; - if (icnt == XFS_IALLOC_INODES(mp) && + if (icnt == mp->m_ialloc_inos && irec_offset == XFS_INODES_PER_CHUNK) { /* * done! - finished up irec and block @@ -900,7 +900,7 @@ process_inode_chunk( icnt++; cluster_offset++; - if (icnt == XFS_IALLOC_INODES(mp) && + if (icnt == mp->m_ialloc_inos && irec_offset == XFS_INODES_PER_CHUNK) { /* * done! - finished up irec and block simultaneously @@ -1002,7 +1002,7 @@ process_aginodes( * the next block before we call the processing routines. */ num_inos = XFS_INODES_PER_CHUNK; - while (num_inos < XFS_IALLOC_INODES(mp) && ino_rec != NULL) { + while (num_inos < mp->m_ialloc_inos && ino_rec != NULL) { /* * inodes chunks will always be aligned and sized * correctly @@ -1011,7 +1011,7 @@ process_aginodes( num_inos += XFS_INODES_PER_CHUNK; } - ASSERT(num_inos == XFS_IALLOC_INODES(mp)); + ASSERT(num_inos == mp->m_ialloc_inos); if (pf_args) { sem_post(&pf_args->ra_count); @@ -1043,7 +1043,7 @@ process_aginodes( */ num_inos = 0; ino_rec = first_ino_rec; - while (num_inos < XFS_IALLOC_INODES(mp) && + while (num_inos < mp->m_ialloc_inos && ino_rec != NULL) { prev_ino_rec = ino_rec; @@ -1227,7 +1227,7 @@ process_uncertain_aginodes(xfs_mount_t *mp, xfs_agnumber_t agno) * processing may add more records to the * uncertain inode lists. */ - if (process_inode_chunk(mp, agno, XFS_IALLOC_INODES(mp), + if (process_inode_chunk(mp, agno, mp->m_ialloc_inos, nrec, 1, 0, 0, &bogus)) { /* XXX - i/o error, we've got a problem */ abort(); diff --git a/repair/prefetch.c b/repair/prefetch.c index 65fedf5..2cd3d5a 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -711,7 +711,7 @@ pf_queuing_worker( cur_irec = irec; num_inos = XFS_INODES_PER_CHUNK; - while (num_inos < XFS_IALLOC_INODES(mp) && irec != NULL) { + while (num_inos < mp->m_ialloc_inos && irec != NULL) { irec = next_ino_rec(irec); num_inos += XFS_INODES_PER_CHUNK; } @@ -749,7 +749,7 @@ pf_queuing_worker( : B_INODE); bno += blks_per_cluster; num_inos += inodes_per_cluster; - } while (num_inos < XFS_IALLOC_INODES(mp)); + } while (num_inos < mp->m_ialloc_inos); } pthread_mutex_lock(&args->lock); -- 1.8.3.2 From jeff.liu@oracle.com Mon May 5 07:32:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6D13F7F6D for ; Mon, 5 May 2014 07:32:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5711630405F for ; Mon, 5 May 2014 05:32:14 -0700 (PDT) X-ASG-Debug-ID: 1399293132-04cbb03cc4319490001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id j3sNU8EABsnHKcSc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:13 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CWCtq022557 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:12 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s45CWBiq014435 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 May 2014 12:32:11 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWBwV029967 for ; Mon, 5 May 2014 12:32:11 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:32:10 -0700 Message-ID: <536784C6.8000009@oracle.com> Date: Mon, 05 May 2014 20:32:06 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 2/6] xfsprogs: get rid of XFS_INODE_CLUSTER_SIZE macros Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 2/6] xfsprogs: get rid of XFS_INODE_CLUSTER_SIZE macros Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399293133 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Get rid of XFS_INODE_CLUSTER_SIZE() macros, use mp->m_inode_cluster_size directly. Signed-off-by: Jie Liu --- include/xfs_ialloc.h | 1 - libxfs/xfs_ialloc.c | 10 +++++----- libxfs/xfs_trans_resv.c | 2 +- repair/dino_chunks.c | 2 +- repair/prefetch.c | 6 +++--- repair/xfs_repair.c | 2 +- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 4689b02..4026933 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -34,7 +34,6 @@ struct xfs_btree_cur; * Move inodes in clusters of this size. */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 -#define XFS_INODE_CLUSTER_SIZE(mp) (mp)->m_inode_cluster_size /* * Make an inode pointer out of the buffer/offset. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 108f6f2..bd47971 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -28,7 +28,7 @@ xfs_ialloc_cluster_alignment( { if (xfs_sb_version_hasalign(&args->mp->m_sb) && args->mp->m_sb.sb_inoalignmt >= - XFS_B_TO_FSBT(args->mp, XFS_INODE_CLUSTER_SIZE(args->mp))) + XFS_B_TO_FSBT(args->mp, args->mp->m_inode_cluster_size)) return args->mp->m_sb.sb_inoalignmt; return 1; } @@ -157,12 +157,12 @@ xfs_ialloc_inode_init( * For small block sizes, manipulate the inodes in buffers * which are multiples of the blocks size. */ - if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { + if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) { blks_per_cluster = 1; nbufs = length; ninodes = mp->m_sb.sb_inopblock; } else { - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) / + blks_per_cluster = mp->m_inode_cluster_size / mp->m_sb.sb_blocksize; nbufs = length / blks_per_cluster; ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; @@ -1360,7 +1360,7 @@ xfs_imap( return XFS_ERROR(EINVAL); } - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; /* * For bulkstat and handle lookups, we have an untrusted inode number @@ -1381,7 +1381,7 @@ xfs_imap( * If the inode cluster size is the same as the blocksize or * smaller we get to the buffer by simple arithmetics. */ - if (XFS_INODE_CLUSTER_SIZE(mp) <= mp->m_sb.sb_blocksize) { + if (mp->m_inode_cluster_size <= mp->m_sb.sb_blocksize) { offset = XFS_INO_TO_OFFSET(mp, ino); ASSERT(offset < mp->m_sb.sb_inopblock); diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 1e59fad..ba9c7b0 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -369,7 +369,7 @@ xfs_calc_ifree_reservation( xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), - XFS_INODE_CLUSTER_SIZE(mp)) + + mp->m_inode_cluster_size) + xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 15aa4f8..2c2fd79 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -598,7 +598,7 @@ process_inode_chunk( *bogus = 0; ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; if (blks_per_cluster == 0) blks_per_cluster = 1; cluster_count = XFS_INODES_PER_CHUNK / inodes_per_cluster; diff --git a/repair/prefetch.c b/repair/prefetch.c index 2cd3d5a..25ceb34 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -682,7 +682,7 @@ pf_queuing_worker( int i; int err; - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; if (blks_per_cluster == 0) blks_per_cluster = 1; @@ -844,8 +844,8 @@ start_inode_prefetch( */ max_queue = libxfs_bcache->c_maxcount / thread_count / 8; - if (XFS_INODE_CLUSTER_SIZE(mp) > mp->m_sb.sb_blocksize) - max_queue = max_queue * (XFS_INODE_CLUSTER_SIZE(mp) >> + if (mp->m_inode_cluster_size > mp->m_sb.sb_blocksize) + max_queue = max_queue * (mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog) / XFS_IALLOC_BLOCKS(mp); sem_init(&args->ra_count, 0, max_queue); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 08b25f0..b6d070b 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -618,7 +618,7 @@ main(int argc, char **argv) chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK; max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN); inodes_per_cluster = MAX(mp->m_sb.sb_inopblock, - XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); + mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog); /* * Automatic striding for high agcount filesystems. -- 1.8.3.2 From jeff.liu@oracle.com Mon May 5 07:32:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 018D67F75 for ; Mon, 5 May 2014 07:32:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE4CF8F8039 for ; Mon, 5 May 2014 05:32:21 -0700 (PDT) X-ASG-Debug-ID: 1399293139-04bdf02b8b32cde0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id u03acjT1dAoeFtms (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:20 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CWJ7J022720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:19 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s45CWIAk014949 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Mon, 5 May 2014 12:32:18 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWInK009388 for ; Mon, 5 May 2014 12:32:18 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:32:17 -0700 Message-ID: <536784CD.60900@oracle.com> Date: Mon, 05 May 2014 20:32:13 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399293140 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Get rid of XFS_IALLOC_BLOCKS() macros, use mp->m_ialloc_blks directly. Signed-off-by: Jie Liu --- db/check.c | 2 +- db/frag.c | 2 +- db/metadump.c | 2 +- include/xfs_ialloc.h | 5 ----- include/xfs_trans_space.h | 2 +- libxfs/xfs_ialloc.c | 8 ++++---- libxfs/xfs_trans_resv.c | 8 ++++---- mkfs/proto.c | 2 +- repair/dino_chunks.c | 24 ++++++++++++------------ repair/prefetch.c | 2 +- repair/xfs_repair.c | 4 ++-- 11 files changed, 28 insertions(+), 33 deletions(-) diff --git a/db/check.c b/db/check.c index 4fd9fd0..df98cc6 100644 --- a/db/check.c +++ b/db/check.c @@ -4223,7 +4223,7 @@ scanfunc_ino( set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, seqno, XFS_AGINO_TO_AGBNO(mp, agino)), - (int)XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), + (int)XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), DB_RING_IGN, NULL); if (iocur_top->data == NULL) { if (!sflag) diff --git a/db/frag.c b/db/frag.c index 2eb33d8..38b77e0 100644 --- a/db/frag.c +++ b/db/frag.c @@ -484,7 +484,7 @@ scanfunc_ino( set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, seqno, XFS_AGINO_TO_AGBNO(mp, agino)), - XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), + XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), DB_RING_IGN, NULL); if (iocur_top->data == NULL) { dbprintf(_("can't read inode block %u/%u\n"), diff --git a/db/metadump.c b/db/metadump.c index 09bb85a..bae08cd 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1848,7 +1848,7 @@ copy_inode_chunk( push_cur(); set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, agbno), - XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), + XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), DB_RING_IGN, NULL); if (iocur_top->data == NULL) { print_warning("cannot read inode block %u/%u", agno, agbno); diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 4026933..0498f20 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -26,11 +26,6 @@ struct xfs_trans; struct xfs_btree_cur; /* - * Allocation parameters for inode allocation. - */ -#define XFS_IALLOC_BLOCKS(mp) (mp)->m_ialloc_blks - -/* * Move inodes in clusters of this size. */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h index 7d2c920..af5dbe0 100644 --- a/include/xfs_trans_space.h +++ b/include/xfs_trans_space.h @@ -47,7 +47,7 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) + ((mp)->m_ialloc_blks + (mp)->m_in_maxlevels - 1) /* * Space reservation values for various transactions. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index bd47971..a3a1c75 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -309,7 +309,7 @@ xfs_ialloc_ag_alloc( if (args.mp->m_maxicount && args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) return XFS_ERROR(ENOSPC); - args.minlen = args.maxlen = XFS_IALLOC_BLOCKS(args.mp); + args.minlen = args.maxlen = args.mp->m_ialloc_blks; /* * First try to allocate inodes contiguous with the last-allocated * chunk of inodes. If the filesystem is striped, this will fill @@ -319,7 +319,7 @@ xfs_ialloc_ag_alloc( newino = be32_to_cpu(agi->agi_newino); agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + - XFS_IALLOC_BLOCKS(args.mp); + args.mp->m_ialloc_blks; if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); @@ -561,7 +561,7 @@ xfs_ialloc_ag_select( * Is there enough free space for the file plus a block of * inodes? (if we need to allocate some)? */ - ineed = XFS_IALLOC_BLOCKS(mp); + ineed = mp->m_ialloc_blks; longest = pag->pagf_longest; if (!longest) longest = pag->pagf_flcount > 0; @@ -1206,7 +1206,7 @@ xfs_difree( xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, XFS_INO_TO_AGBNO(mp,rec.ir_startino)), - XFS_IALLOC_BLOCKS(mp), flist, mp); + mp->m_ialloc_blks, flist, mp); } else { *delete = 0; diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index ba9c7b0..93261f1 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -157,7 +157,7 @@ xfs_calc_itruncate_reservation( xfs_calc_buf_res(5, 0) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + xfs_calc_buf_res(2 + mp->m_ialloc_blks + mp->m_in_maxlevels, 0))); } @@ -265,7 +265,7 @@ xfs_calc_create_resv_modify( * For create we can allocate some inodes giving: * the agi and agf of the ag getting the new inodes: 2 * sectorsize * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode blocks allocated: mp->m_ialloc_blks * blocksize * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size */ @@ -275,7 +275,7 @@ xfs_calc_create_resv_alloc( { return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + mp->m_sb.sb_sectsize + - xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(mp->m_ialloc_blks, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), XFS_FSB_TO_B(mp, 1)); @@ -371,7 +371,7 @@ xfs_calc_ifree_reservation( MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), mp->m_inode_cluster_size) + xfs_calc_buf_res(1, 0) + - xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + xfs_calc_buf_res(2 + mp->m_ialloc_blks + mp->m_in_maxlevels, 0) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), XFS_FSB_TO_B(mp, 1)); diff --git a/mkfs/proto.c b/mkfs/proto.c index 5a47e27..2689f75 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -39,7 +39,7 @@ static long filesize(int fd); * (basically no fragmentation). */ #define MKFS_BLOCKRES_INODE \ - ((uint)(XFS_IALLOC_BLOCKS(mp) + ((mp)->m_in_maxlevels - 1))) + ((uint)(mp->m_ialloc_blks + ((mp)->m_in_maxlevels - 1))) #define MKFS_BLOCKRES(rb) \ ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 2c2fd79..1bf1fca 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -117,7 +117,7 @@ verify_inode_chunk(xfs_mount_t *mp, agbno = XFS_INO_TO_AGBNO(mp, ino); *start_ino = NULLFSINO; - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); + ASSERT(mp->m_ialloc_blks > 0); if (agno == mp->m_sb.sb_agcount - 1) max_agbno = mp->m_sb.sb_dblocks - @@ -135,7 +135,7 @@ verify_inode_chunk(xfs_mount_t *mp, * check for the easy case, inodes per block >= XFS_INODES_PER_CHUNK * (multiple chunks per block) */ - if (XFS_IALLOC_BLOCKS(mp) == 1) { + if (mp->m_ialloc_blks == 1) { if (agbno > max_agbno) return 0; if (check_aginode_block(mp, agno, agino) == 0) @@ -208,7 +208,7 @@ verify_inode_chunk(xfs_mount_t *mp, */ start_agbno = rounddown(XFS_INO_TO_AGBNO(mp, ino), fs_ino_alignment); - end_agbno = start_agbno + XFS_IALLOC_BLOCKS(mp); + end_agbno = start_agbno + mp->m_ialloc_blks; /* * if this fs has aligned inodes but the end of the @@ -266,14 +266,14 @@ verify_inode_chunk(xfs_mount_t *mp, * a discovered inode chunk completely within that range * would include the inode passed into us. */ - if (XFS_IALLOC_BLOCKS(mp) > 1) { + if (mp->m_ialloc_blks > 1) { if (agino > mp->m_ialloc_inos) - start_agbno = agbno - XFS_IALLOC_BLOCKS(mp) + 1; + start_agbno = agbno - mp->m_ialloc_blks + 1; else start_agbno = 1; } - end_agbno = agbno + XFS_IALLOC_BLOCKS(mp); + end_agbno = agbno + mp->m_ialloc_blks; if (end_agbno > max_agbno) end_agbno = max_agbno; @@ -328,7 +328,7 @@ verify_inode_chunk(xfs_mount_t *mp, start_agbno = XFS_AGINO_TO_AGBNO(mp, irec_p->ino_startnum) + - XFS_IALLOC_BLOCKS(mp); + mp->m_ialloc_blks; /* * we know that the inode we're trying to verify isn't @@ -351,7 +351,7 @@ verify_inode_chunk(xfs_mount_t *mp, * the inode in question and that the space between them * is too small for a legal inode chunk */ - if (end_agbno - start_agbno < XFS_IALLOC_BLOCKS(mp)) + if (end_agbno - start_agbno < mp->m_ialloc_blks) return(0); /* @@ -395,7 +395,7 @@ verify_inode_chunk(xfs_mount_t *mp, num_blks = chunk_stop_agbno - chunk_start_agbno; - if (num_blks < XFS_IALLOC_BLOCKS(mp) || ino_cnt == 0) + if (num_blks < mp->m_ialloc_blks || ino_cnt == 0) return(0); /* @@ -411,8 +411,8 @@ verify_inode_chunk(xfs_mount_t *mp, * the chunk */ - if (num_blks % XFS_IALLOC_BLOCKS(mp) != 0) { - num_blks = rounddown(num_blks, XFS_IALLOC_BLOCKS(mp)); + if (num_blks % mp->m_ialloc_blks != 0) { + num_blks = rounddown(num_blks, mp->m_ialloc_blks); chunk_stop_agbno = chunk_start_agbno + num_blks; } @@ -596,7 +596,7 @@ process_inode_chunk( ASSERT(XFS_AGINO_TO_OFFSET(mp, first_irec->ino_startnum) == 0); *bogus = 0; - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); + ASSERT(mp->m_ialloc_blks > 0); blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; if (blks_per_cluster == 0) diff --git a/repair/prefetch.c b/repair/prefetch.c index 25ceb34..e3dfd08 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -846,7 +846,7 @@ start_inode_prefetch( max_queue = libxfs_bcache->c_maxcount / thread_count / 8; if (mp->m_inode_cluster_size > mp->m_sb.sb_blocksize) max_queue = max_queue * (mp->m_inode_cluster_size >> - mp->m_sb.sb_blocklog) / XFS_IALLOC_BLOCKS(mp); + mp->m_sb.sb_blocklog) / mp->m_ialloc_blks; sem_init(&args->ra_count, 0, max_queue); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index b6d070b..5515de8 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -441,9 +441,9 @@ calc_mkfs(xfs_mount_t *mp) first_prealloc_ino = XFS_OFFBNO_TO_AGINO(mp, fino_bno, 0); } - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); + ASSERT(mp->m_ialloc_blks > 0); - if (XFS_IALLOC_BLOCKS(mp) > 1) + if (mp->m_ialloc_blks > 1) last_prealloc_ino = first_prealloc_ino + XFS_INODES_PER_CHUNK; else last_prealloc_ino = XFS_OFFBNO_TO_AGINO(mp, fino_bno + 1, 0); -- 1.8.3.2 From jeff.liu@oracle.com Mon May 5 07:32:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 77C627F6D for ; Mon, 5 May 2014 07:32:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B10B8F8039 for ; Mon, 5 May 2014 05:32:28 -0700 (PDT) X-ASG-Debug-ID: 1399293147-04cbb03cc73194e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NbAoXphqrLASHcoG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:27 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CWQUS019649 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:27 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWPXF006067 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 May 2014 12:32:26 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s45CWOMB015187 for ; Mon, 5 May 2014 12:32:25 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:32:24 -0700 Message-ID: <536784D4.1050405@oracle.com> Date: Mon, 05 May 2014 20:32:20 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 4/6] xfsprogs: introduce xfs_icluster_size_fsb() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 4/6] xfsprogs: introduce xfs_icluster_size_fsb() Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399293147 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce a common routine xfs_icluster_size_fsb() to calculate and return the number of file system blocks per inode cluster. Signed-off-by: Jie Liu --- include/xfs_ialloc.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 0498f20..9dee62f 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -30,6 +30,16 @@ struct xfs_btree_cur; */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 +/* Calculate and return the number of filesystem blocks per inode cluster */ +static inline int +xfs_icluster_size_fsb( + struct xfs_mount *mp) +{ + if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) + return 1; + return mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; +} + /* * Make an inode pointer out of the buffer/offset. */ -- 1.8.3.2 From jeff.liu@oracle.com Mon May 5 07:32:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 227FD7F81 for ; Mon, 5 May 2014 07:32:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE7D18F8035 for ; Mon, 5 May 2014 05:32:32 -0700 (PDT) X-ASG-Debug-ID: 1399293151-04bdf02b8c32cec0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id w7UZYOSlHZtzTq51 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:31 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CWUa6019689 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:30 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWTeQ009803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 May 2014 12:32:29 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWTfc000903 for ; Mon, 5 May 2014 12:32:29 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:32:28 -0700 Message-ID: <536784D9.1030502@oracle.com> Date: Mon, 05 May 2014 20:32:25 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 5/6] xfsprogs: use xfs_icluster_size_fsb in xfs_ialloc_inode_init Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 5/6] xfsprogs: use xfs_icluster_size_fsb in xfs_ialloc_inode_init Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399293151 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Use xfs_icluster_size_fsb() in xfs_ialloc_inode_init(), rename variable ninodes to inodes_per_cluster as the latter is more meaningful. Signed-off-by: Jie Liu --- libxfs/xfs_ialloc.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index a3a1c75..7d2ae8d 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -146,7 +146,7 @@ xfs_ialloc_inode_init( { struct xfs_buf *fbuf; struct xfs_dinode *free; - int blks_per_cluster, nbufs, ninodes; + int nbufs, blks_per_cluster, inodes_per_cluster; int version; int i, j; xfs_daddr_t d; @@ -157,16 +157,9 @@ xfs_ialloc_inode_init( * For small block sizes, manipulate the inodes in buffers * which are multiples of the blocks size. */ - if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) { - blks_per_cluster = 1; - nbufs = length; - ninodes = mp->m_sb.sb_inopblock; - } else { - blks_per_cluster = mp->m_inode_cluster_size / - mp->m_sb.sb_blocksize; - nbufs = length / blks_per_cluster; - ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; - } + blks_per_cluster = xfs_icluster_size_fsb(mp); + inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; + nbufs = length / blks_per_cluster; /* * Figure out what version number to use in the inodes we create. If @@ -222,7 +215,7 @@ xfs_ialloc_inode_init( /* Initialize the inode buffers and log them appropriately. */ fbuf->b_ops = &xfs_inode_buf_ops; xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); - for (i = 0; i < ninodes; i++) { + for (i = 0; i < inodes_per_cluster; i++) { int ioffset = i << mp->m_sb.sb_inodelog; uint isize = xfs_dinode_size(version); -- 1.8.3.2 From jeff.liu@oracle.com Mon May 5 07:32:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CEAE37F8E for ; Mon, 5 May 2014 07:32:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B650E30405F for ; Mon, 5 May 2014 05:32:37 -0700 (PDT) X-ASG-Debug-ID: 1399293156-04cb6c728f338840001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id PrKXAZS3TXWM3pa7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 05:32:37 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s45CWZEu019758 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 5 May 2014 12:32:36 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s45CWZfr015603 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 5 May 2014 12:32:35 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s45CWY1s001133 for ; Mon, 5 May 2014 12:32:34 GMT Received: from [192.168.1.101] (/123.130.8.80) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 05:32:34 -0700 Message-ID: <536784DF.5040509@oracle.com> Date: Mon, 05 May 2014 20:32:31 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH 6/6] use xfs_icluster_size_fsb in xfs_imap Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 6/6] use xfs_icluster_size_fsb in xfs_imap Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399293157 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.5551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Use xfs_icluster_size_fsb() in xfs_imap(). Signed-off-by: Jie Liu --- libxfs/xfs_ialloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 7d2ae8d..c8967db 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1353,7 +1353,7 @@ xfs_imap( return XFS_ERROR(EINVAL); } - blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; + blks_per_cluster = xfs_icluster_size_fsb(mp); /* * For bulkstat and handle lookups, we have an untrusted inode number @@ -1374,7 +1374,7 @@ xfs_imap( * If the inode cluster size is the same as the blocksize or * smaller we get to the buffer by simple arithmetics. */ - if (mp->m_inode_cluster_size <= mp->m_sb.sb_blocksize) { + if (blks_per_cluster == 1) { offset = XFS_INO_TO_OFFSET(mp, ino); ASSERT(offset < mp->m_sb.sb_inopblock); -- 1.8.3.2 From debbugs@buxtehude.debian.org Mon May 5 07:51:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 05A967F7B for ; Mon, 5 May 2014 07:51:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB2E68F8039 for ; Mon, 5 May 2014 05:51:13 -0700 (PDT) X-ASG-Debug-ID: 1399294268-04cbb03cc731b080001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id ZB5Sqn96cvnOhgMp (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 05 May 2014 05:51: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.80) (envelope-from ) id 1WhIMM-00026W-A8; Mon, 05 May 2014 12:51:06 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#747080: xfsprogs: new upstream release (2013-05-08 v3.1.11) Reply-To: Florian Ernst , 747080@bugs.debian.org X-ASG-Orig-Subj: Bug#747080: xfsprogs: new upstream release (2013-05-08 v3.1.11) Resent-From: Florian Ernst Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 05 May 2014 12:51:01 +0000 Resent-Message-ID: X-Debian-PR-Message: report 747080 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.13992941477445 (code B); Mon, 05 May 2014 12:51:01 +0000 Received: (at submit) by bugs.debian.org; 5 May 2014 12:49:07 +0000 Received: from mout.gmx.net ([212.227.17.22]) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1WhIKR-0001vc-2Q for submit@bugs.debian.org; Mon, 05 May 2014 12:49:07 +0000 Received: from fernst.no-ip.org ([95.208.248.53]) by mail.gmx.com (mrgmx002) with ESMTPSA (Nemesis) id 0MWSwU-1WN3lh2VKs-00XcRO for ; Mon, 05 May 2014 14:48:59 +0200 Received: from fernst by fernst.no-ip.org with local (Exim 4.82) (envelope-from ) id 1WhIKJ-00064l-76 for submit@bugs.debian.org; Mon, 05 May 2014 14:48:59 +0200 Date: Mon, 5 May 2014 14:48:59 +0200 From: Florian Ernst To: Debian Bug Tracking System Message-ID: <20140505124859.GA19836@fernst.no-ip.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Reportbug-Version: 6.5.0 User-Agent: Mutt/1.5.23 (2014-03-12) X-Provags-ID: V03:K0:Vt0qwfC345YL7ckvElMQA4c9V4rt2DekcEd+elh5oLrOGFEOcG9 c0wgPL/DqU3rSWywXsvlpk6yKA4/SW9PsK5KvLiz5Vydqm16ZHmrZIT+PEyOqLIsyD3qx33 aCZNhPBsu/3wiaLHuf3HUhi3LsaYzKvvblFLA4H648tiG/iollFZHV92g8OIxXMyrbZCdYS 1V6OAXMzsRLw0IojT7PPw== Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1399294268 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.5552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Package: xfsprogs Version: 3.1.9 Severity: wishlist Hello there, please consider updating the package to the newest upstream release, see http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/cmds/xfsprogs.git;a=tags Cheers, Flo -- System Information: Debian Release: jessie/sid APT prefers testing APT policy: (990, 'testing'), (50, 'testing-proposed-updates'), (50, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.11-2-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages xfsprogs depends on: ii libblkid1 2.20.1-5.7 ii libc6 2.18-5 ii libreadline5 5.2+dfsg-2 ii libuuid1 2.20.1-5.7 xfsprogs recommends no packages. Versions of packages xfsprogs suggests: ii acl 2.2.52-1 ii attr 1:2.4.47-1 ii quota 4.01-3 ii xfsdump 3.1.1 -- no debconf information From bfoster@redhat.com Mon May 5 08:17:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 EE71D7F7E for ; Mon, 5 May 2014 08:17:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C92BC8F8039 for ; Mon, 5 May 2014 06:17:50 -0700 (PDT) X-ASG-Debug-ID: 1399295869-04cb6c1fcc1eae20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qu4gllVp0zuCXulG for ; Mon, 05 May 2014 06:17: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45DHmhq013607 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 09:17:48 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45DHl95006619; Mon, 5 May 2014 09:17:48 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 97552120AC3; Mon, 5 May 2014 09:17:47 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45DHkLj012301; Mon, 5 May 2014 09:17:46 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 09:17:46 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: initialize default acls for ->tmpfile() Message-ID: <20140505131745.GB11622@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: initialize default acls for ->tmpfile() References: <1398951487-15462-1-git-send-email-bfoster@redhat.com> <20140505102403.GV26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505102403.GV26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399295869 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, May 05, 2014 at 08:24:03PM +1000, Dave Chinner wrote: > On Thu, May 01, 2014 at 09:38:07AM -0400, Brian Foster wrote: > > The current tmpfile handler does not initialize default ACLs. Doing so > > within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), > > which is already used as a common create handler. > > > > xfs_vn_mknod() does not currently have a mechanism to determine whether > > to link the file into the namespace. Therefore, further abstract > > xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile > > parameter. This new handler passes a NULL xname to the create and calls > > d_tmpfile() on the dentry when called via ->tmpfile(). > > > > Signed-off-by: Brian Foster > > --- > > > > Hi all, > > > > It appears that we want to initialize default ACLs for ->tmpfile() after > > all. This patch reintroduces the refactoring to initialize security and > > ACLs through the current xfs_vn_mknod(). This is based on top of the > > previously posted series: > > > > http://oss.sgi.com/archives/xfs/2014-04/msg00396.html > > > > Brian > ..... > > @@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( > > struct dentry *dentry, > > umode_t mode) > > { > > - int error; > > - struct xfs_inode *ip; > > - struct inode *inode; > > - > > - error = xfs_create(XFS_I(dir), NULL, mode, 0, &ip); > > - if (unlikely(error)) > > - return -error; > > - > > - inode = VFS_I(ip); > > - > > - error = xfs_init_security(inode, dir, &dentry->d_name); > > - if (unlikely(error)) { > > - iput(inode); > > - return -error; > > - } > > - > > - d_tmpfile(dentry, inode); > > - > > - return 0; > > + return xfs_generic_create(dir, dentry, mode, 0, true); > > } > > This hunk doesn't apply to a 3.15-rc2 kernel - it calls > xfs_create_tmpfile(). Just applying it as is after fixing the hunk > causes a crash in xfs-create(), because the code in the patch is > calling xfs-create ratehr than xfs_create_tmpfile(). > Right, this is based on the previously posted series (link above), which fixes up xfs_create() such that we can use it from xfs_generic_create() via all associated codepaths. Sorry, I probably should have posted this as a [5/4 ...] patch to make that more clear... > Brian, can you regenerate this patch against a current linus tree > (3.15-rc4)? > It isn't clear to me what the expectation is with this series at this point, beyond the agreement that we do want to initialize the acls. It looks like the v1 patch that only initialized security is merged, so we're Ok as far as that goes. v2 added the bits to initialize the acls as well: http://oss.sgi.com/archives/xfs/2014-04/msg00182.html ... and followed up with the xfs_create_tmpfile() removal. Is that (minus the already merged selinux fix) what you're asking for here? v3 dropped the default acl bits and thus the xfs_generic_create() handler as well. The xfs_create_tmpfile() cleanup persisted, and now the default acl bits are required, so it's added back in this 5/4. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tinguely@sgi.com Mon May 5 08:24:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 7EBB47F7E for ; Mon, 5 May 2014 08:24:34 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D1B28F804B; Mon, 5 May 2014 06:24:34 -0700 (PDT) Message-ID: <53679113.8000209@sgi.com> Date: Mon, 05 May 2014 08:24:35 -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: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> <20140504101623.GA4947@lst.de> In-Reply-To: <20140504101623.GA4947@lst.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/04/14 05:16, Christoph Hellwig wrote: > On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: >> Depends on how parent inode pointers are implemented, this folding the >> internal version of get and set attributes could be undone. > > We might have to introduce _locked version at that point. But I'd like > to keep the xfs_name removal and other assorted cleanups. > locking is only one issue, xfs_attr_(get/set/remove) are asciii only whereas the xfs_attr_(get/set/remove)_int versions are more generic. I am thinking of not just parent inode pointers but a non-ascii character set. --Mark. From bfoster@redhat.com Mon May 5 09:26:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BB99D7F7B for ; Mon, 5 May 2014 09:26:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B2CD304043 for ; Mon, 5 May 2014 07:26:01 -0700 (PDT) X-ASG-Debug-ID: 1399299960-04cbb03cc7324350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QG77J8GT9afm9QhV for ; Mon, 05 May 2014 07:26:00 -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 (8.14.4/8.14.4) with ESMTP id s45EQ0fc021853 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 5 May 2014 10:26:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45EPxme006246 for ; Mon, 5 May 2014 10:25:59 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BBDA91242A3; Mon, 5 May 2014 10:25:58 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2] xfs: initialize default acls for ->tmpfile() Date: Mon, 5 May 2014 10:25:58 -0400 X-ASG-Orig-Subj: [PATCH v2] xfs: initialize default acls for ->tmpfile() Message-Id: <1399299958-34588-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: 1399299960 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 current tmpfile handler does not initialize default ACLs. Doing so within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), which is already used as a common create handler. xfs_vn_mknod() does not currently have a mechanism to determine whether to link the file into the namespace. Therefore, further abstract xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile parameter. This new handler calls xfs_create_tmpfile() and d_tmpfile() on the dentry when called via ->tmpfile(). Signed-off-by: Brian Foster --- v2: rebased to 3.15-rc4 fs/xfs/xfs_iops.c | 55 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ef1ca01..301ecbf 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -124,15 +124,15 @@ xfs_cleanup_inode( xfs_dentry_to_name(&teardown, dentry, 0); xfs_remove(XFS_I(dir), &teardown, XFS_I(inode)); - iput(inode); } STATIC int -xfs_vn_mknod( +xfs_generic_create( struct inode *dir, struct dentry *dentry, umode_t mode, - dev_t rdev) + dev_t rdev, + bool tmpfile) /* unnamed file */ { struct inode *inode; struct xfs_inode *ip = NULL; @@ -156,8 +156,12 @@ xfs_vn_mknod( if (error) return error; - xfs_dentry_to_name(&name, dentry, mode); - error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip); + if (!tmpfile) { + xfs_dentry_to_name(&name, dentry, mode); + error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip); + } else { + error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip); + } if (unlikely(error)) goto out_free_acl; @@ -180,7 +184,11 @@ xfs_vn_mknod( } #endif - d_instantiate(dentry, inode); + if (tmpfile) + d_tmpfile(dentry, inode); + else + d_instantiate(dentry, inode); + out_free_acl: if (default_acl) posix_acl_release(default_acl); @@ -189,11 +197,23 @@ xfs_vn_mknod( return -error; out_cleanup_inode: - xfs_cleanup_inode(dir, inode, dentry); + if (!tmpfile) + xfs_cleanup_inode(dir, inode, dentry); + iput(inode); goto out_free_acl; } STATIC int +xfs_vn_mknod( + struct inode *dir, + struct dentry *dentry, + umode_t mode, + dev_t rdev) +{ + return xfs_generic_create(dir, dentry, mode, rdev, false); +} + +STATIC int xfs_vn_create( struct inode *dir, struct dentry *dentry, @@ -353,6 +373,7 @@ xfs_vn_symlink( out_cleanup_inode: xfs_cleanup_inode(dir, inode, dentry); + iput(inode); out: return -error; } @@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( struct dentry *dentry, umode_t mode) { - int error; - struct xfs_inode *ip; - struct inode *inode; - - error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip); - if (unlikely(error)) - return -error; - - inode = VFS_I(ip); - - error = xfs_init_security(inode, dir, &dentry->d_name); - if (unlikely(error)) { - iput(inode); - return -error; - } - - d_tmpfile(dentry, inode); - - return 0; + return xfs_generic_create(dir, dentry, mode, 0, true); } static const struct inode_operations xfs_inode_operations = { -- 1.8.3.1 From Charlene.Gouws@nmmu.ac.za Mon May 5 10:16:45 2014 Return-Path: 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=MISSING_MIME_HB_SEP, SUBJ_ALL_CAPS,T_MIME_NO_TEXT 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 AB9AE29DF8 for ; Mon, 5 May 2014 10:16:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 976648F8033 for ; Mon, 5 May 2014 08:16:41 -0700 (PDT) X-ASG-Debug-ID: 1399302996-04cb6c72913498a0001-NocioJ Received: from osiris.nmmu.ac.za (osiris.nmmu.ac.za [196.21.198.169]) by cuda.sgi.com with ESMTP id CloEA3QR5jOee1lJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 08:16:38 -0700 (PDT) X-Barracuda-Envelope-From: Charlene.Gouws@nmmu.ac.za X-Barracuda-Apparent-Source-IP: 196.21.198.169 Received: from TUKTUK.nmmu.ac.za (tuktuk.nmmu.ac.za [10.103.121.195]) by osiris.nmmu.ac.za (8.13.8/8.13.8) with ESMTP id s456PHCN006643; Mon, 5 May 2014 08:25:17 +0200 Received: from SUEZ.nmmu.ac.za (10.103.1.36) by TUKTUK.nmmu.ac.za (10.103.121.195) with Microsoft SMTP Server (TLS) id 14.3.181.6; Mon, 5 May 2014 08:25:13 +0200 Received: from CRETE.nmmu.ac.za ([::1]) by SUEZ.nmmu.ac.za ([fe80::6428:7d58:b035:36b5%16]) with mapi id 14.03.0181.006; Mon, 5 May 2014 08:25:15 +0200 From: "Gouws, Charlene (Miss) (Summestrand Campus South)" To: "i@i.net" Subject: IT SERVICE HELP DESK. Thread-Topic: IT SERVICE HELP DESK. X-ASG-Orig-Subj: IT SERVICE HELP DESK. Thread-Index: Ac9oKsZKDN0GTm3QTi69goGo9xnRkg== Date: Mon, 5 May 2014 06:25:14 +0000 Message-ID: Accept-Language: en-ZA, en-US Content-Language: en-ZA X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.103.121.29] Content-Type: multipart/alternative; boundary="_000_C1B8A7178466994AAC8B253BB1B3971818973C9ACRETEnmmuacza_" MIME-Version: 1.0 X-Barracuda-Connect: osiris.nmmu.ac.za[196.21.198.169] X-Barracuda-Start-Time: 1399302998 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-Spam-Score: 1.86 X-Barracuda-Spam-Status: No, SCORE=1.86 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA590, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.20 BSF_SC0_SA590 Custom Rule SA590 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 <<< No Message Collected >>> From andrey@xdel.ru Mon May 5 14:49:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 4729029DF8 for ; Mon, 5 May 2014 14:49:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 228F08F8040 for ; Mon, 5 May 2014 12:49:31 -0700 (PDT) X-ASG-Debug-ID: 1399319365-04cb6c1fcc208cf0001-NocioJ Received: from mail-ob0-f173.google.com (mail-ob0-f173.google.com [209.85.214.173]) by cuda.sgi.com with ESMTP id QGSWAOIFHbTTSI6l (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 05 May 2014 12:49:25 -0700 (PDT) X-Barracuda-Envelope-From: andrey@xdel.ru X-Barracuda-Apparent-Source-IP: 209.85.214.173 Received: by mail-ob0-f173.google.com with SMTP id wm4so5698738obc.4 for ; Mon, 05 May 2014 12:49:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xdel.ru; s=google; h=mime-version:from:date:message-id:subject:to:cc:content-type; bh=udi8p/faX1V1QMSgQ+m7u8rgthdJ3z1pulo51KJ4jYs=; b=WHV+4gG9oml7mXIORAJv7XB5ilzupRg9YNKd/wadTvS4CZTCQoZYMKgCHmOokdmbfm PHBaorSkpKc5ps3LWSrHp/kWUCJCGphSo8M+7EAw91nJPXHt1CFP9Z9MMhN2rJ7+G93J NzWBNQrE+ryZLRvQqp7qTOKtZMUdNhgpJHlTw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc :content-type; bh=udi8p/faX1V1QMSgQ+m7u8rgthdJ3z1pulo51KJ4jYs=; b=EU62WnP+QX+htsuFof5JwhF2aj+S3Z3KOQRvU0t/P65aHbPCXRHrBA7ai0zA7Unx+1 ltY4X4MQSfFUb6qryEdx7QcnpSCUWmrMpPbWsPP3auOZc2w4zpglvEyv/9ke8uLtbZ38 hsSS5p6teXiv8cbtLSE1Gcdh4zv59VaAuUtLTSGW0OJXvdq5EJo5oolnpXMaHdl2lPK0 gxn3lLuhE2IkndYxIyyt2NtrH8wq1eFksbNoiexe0J4YWPyCKimqJf6H21oXgkmmv/0K f5KgLuo1HLWywduNHo0Tu7WkStYF3omh/epF/1G55Orgw2zEyAH9z3m6PIaImQDMJqiC 8SOA== X-Gm-Message-State: ALoCoQkASwCSh+Q0qmOBHXbYmc5aINMGkwu3K0+0MireYTRgah1VJV+SX5UsjmWXYfl0/MDR7mk7 X-Received: by 10.182.96.168 with SMTP id dt8mr34207613obb.43.1399319365152; Mon, 05 May 2014 12:49:25 -0700 (PDT) MIME-Version: 1.0 Received: by 10.182.194.15 with HTTP; Mon, 5 May 2014 12:49:05 -0700 (PDT) From: Andrey Korolyov Date: Mon, 5 May 2014 23:49:05 +0400 Message-ID: Subject: Fatigue for XFS To: "ceph-users@lists.ceph.com" X-ASG-Orig-Subj: Fatigue for XFS Cc: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f173.google.com[209.85.214.173] X-Barracuda-Start-Time: 1399319365 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=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5561 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 Hello, We are currently exploring issue which can be related to Ceph itself or to the XFS - any help is very appreciated. First, the picture: relatively old cluster w/ two years uptime and ten months after fs recreation on every OSD, one of daemons started to flap approximately once per day for couple of weeks, with no external reason (bandwidth/IOPS/host issues). It looks almost the same every time - OSD suddenly stop serving requests for a short period, gets kicked out by peers report, then returns in a couple of seconds. Of course, small but sensitive amount of requests are delayed by 15-30 seconds twice, which is bad for us. The only thing which correlates with this kick is a peak of I/O, not too large, even not consuming all underlying disk utilization, but alone in the cluster and clearly visible. Also there are at least two occasions *without* correlated iowait peak. I have two versions - we`re touching some sector on disk which is about to be marked as dead but not displayed in SMART statistics or (I believe so) some kind of XFS fatigue, which can be more likely in this case, since near-bad sector should be touched more frequently and related impact could leave traces in dmesg/SMART from my experience. I would like to ask if anyone has a simular experience before or can suggest to poke existing file system in some way. If no suggestion appear, I`ll probably reformat disk and, if problem will remain after refill, replace it, but I think less destructive actions can be done before. XFS is running on 3.10 with almost default create and mount options, ceph version is the latest cuttlefish (this rack should be upgraded, I know). From bfoster@redhat.com Mon May 5 15:21:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A482D29DF8 for ; Mon, 5 May 2014 15:21:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 70A7B8F8035 for ; Mon, 5 May 2014 13:21:14 -0700 (PDT) X-ASG-Debug-ID: 1399321269-04bdf02b8a352870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JPnWqhv808MUhWTg for ; Mon, 05 May 2014 13:21: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45KL7iB016301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 16:21:07 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45KL7Sr010425; Mon, 5 May 2014 16:21:07 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id EFADC120AC3; Mon, 5 May 2014 16:21:06 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45KL5R4013881; Mon, 5 May 2014 16:21:05 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 16:21:05 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: fold xfs_attr_set_int into xfs_attr_set Message-ID: <20140505202104.GB12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: fold xfs_attr_set_int into xfs_attr_set References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-2-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399130415-5382-2-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399321269 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 Sat, May 03, 2014 at 05:20:11PM +0200, Christoph Hellwig wrote: > Plus various minor style fixes to the new xfs_attr_set. > > Signed-off-by: Christoph Hellwig > --- Looks good to me. Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 110 +++++++++++++++++++++-------------------------------- > 1 file changed, 44 insertions(+), 66 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 01b6a01..eb3ae8f 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -221,26 +221,32 @@ xfs_attr_calc_size( > return nblks; > } > > -STATIC int > -xfs_attr_set_int( > - struct xfs_inode *dp, > - struct xfs_name *name, > - unsigned char *value, > - int valuelen, > - int flags) > +int > +xfs_attr_set( > + struct xfs_inode *dp, > + const unsigned char *name, > + unsigned char *value, > + int valuelen, > + int flags) > { > - xfs_da_args_t args; > - xfs_fsblock_t firstblock; > - xfs_bmap_free_t flist; > - int error, err2, committed; > struct xfs_mount *mp = dp->i_mount; > + struct xfs_da_args args; > + struct xfs_bmap_free flist; > struct xfs_trans_res tres; > + struct xfs_name xname; > + xfs_fsblock_t firstblock; > int rsvd = (flags & ATTR_ROOT) != 0; > - int local; > + int error, err2, committed, local; > + > + XFS_STATS_INC(xs_attr_set); > + > + if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > + return EIO; > + > + error = xfs_attr_name_to_xname(&xname, name); > + if (error) > + return error; > > - /* > - * Attach the dquots to the inode. > - */ > error = xfs_qm_dqattach(dp, 0); > if (error) > return error; > @@ -251,18 +257,16 @@ xfs_attr_set_int( > */ > if (XFS_IFORK_Q(dp) == 0) { > int sf_size = sizeof(xfs_attr_sf_hdr_t) + > - XFS_ATTR_SF_ENTSIZE_BYNAME(name->len, valuelen); > + XFS_ATTR_SF_ENTSIZE_BYNAME(xname.len, valuelen); > > - if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) > - return(error); > + error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); > + if (error) > + return error; > } > > - /* > - * Fill in the arg structure for this request. > - */ > - memset((char *)&args, 0, sizeof(args)); > - args.name = name->name; > - args.namelen = name->len; > + memset(&args, 0, sizeof(args)); > + args.name = xname.name; > + args.namelen = xname.len; > args.value = value; > args.valuelen = valuelen; > args.flags = flags; > @@ -274,7 +278,7 @@ xfs_attr_set_int( > args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > > /* Size is now blocks for attribute data */ > - args.total = xfs_attr_calc_size(dp, name->len, valuelen, &local); > + args.total = xfs_attr_calc_size(dp, xname.len, valuelen, &local); > > /* > * Start our first transaction of the day. > @@ -303,7 +307,7 @@ xfs_attr_set_int( > error = xfs_trans_reserve(args.trans, &tres, args.total, 0); > if (error) { > xfs_trans_cancel(args.trans, 0); > - return(error); > + return error; > } > xfs_ilock(dp, XFS_ILOCK_EXCL); > > @@ -313,7 +317,7 @@ xfs_attr_set_int( > if (error) { > xfs_iunlock(dp, XFS_ILOCK_EXCL); > xfs_trans_cancel(args.trans, XFS_TRANS_RELEASE_LOG_RES); > - return (error); > + return error; > } > > xfs_trans_ijoin(args.trans, dp, 0); > @@ -322,9 +326,9 @@ xfs_attr_set_int( > * If the attribute list is non-existent or a shortform list, > * upgrade it to a single-leaf-block attribute list. > */ > - if ((dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) || > - ((dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS) && > - (dp->i_d.di_anextents == 0))) { > + if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL || > + (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS && > + dp->i_d.di_anextents == 0)) { > > /* > * Build initial attribute list (if required). > @@ -349,9 +353,8 @@ xfs_attr_set_int( > * the transaction goes to disk before returning > * to the user. > */ > - if (mp->m_flags & XFS_MOUNT_WSYNC) { > + if (mp->m_flags & XFS_MOUNT_WSYNC) > xfs_trans_set_sync(args.trans); > - } > > if (!error && (flags & ATTR_KERNOTIME) == 0) { > xfs_trans_ichgtime(args.trans, dp, > @@ -361,7 +364,7 @@ xfs_attr_set_int( > XFS_TRANS_RELEASE_LOG_RES); > xfs_iunlock(dp, XFS_ILOCK_EXCL); > > - return(error == 0 ? err2 : error); > + return error ? error : err2; > } > > /* > @@ -399,22 +402,19 @@ xfs_attr_set_int( > > } > > - if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { > + if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) > error = xfs_attr_leaf_addname(&args); > - } else { > + else > error = xfs_attr_node_addname(&args); > - } > - if (error) { > + if (error) > goto out; > - } > > /* > * If this is a synchronous mount, make sure that the > * transaction goes to disk before returning to the user. > */ > - if (mp->m_flags & XFS_MOUNT_WSYNC) { > + if (mp->m_flags & XFS_MOUNT_WSYNC) > xfs_trans_set_sync(args.trans); > - } > > if ((flags & ATTR_KERNOTIME) == 0) > xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); > @@ -426,37 +426,15 @@ xfs_attr_set_int( > error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); > xfs_iunlock(dp, XFS_ILOCK_EXCL); > > - return(error); > + return error; > > out: > - if (args.trans) > + if (args.trans) { > xfs_trans_cancel(args.trans, > XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); > + } > xfs_iunlock(dp, XFS_ILOCK_EXCL); > - return(error); > -} > - > -int > -xfs_attr_set( > - xfs_inode_t *dp, > - const unsigned char *name, > - unsigned char *value, > - int valuelen, > - int flags) > -{ > - int error; > - struct xfs_name xname; > - > - XFS_STATS_INC(xs_attr_set); > - > - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > - return (EIO); > - > - error = xfs_attr_name_to_xname(&xname, name); > - if (error) > - return error; > - > - return xfs_attr_set_int(dp, &xname, value, valuelen, flags); > + return error; > } > > /* > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 15:21:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A42DA29DFF for ; Mon, 5 May 2014 15:21:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EFA98F8037 for ; Mon, 5 May 2014 13:21:20 -0700 (PDT) X-ASG-Debug-ID: 1399321279-04cb6c728f35ccb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DFrOHjYjtpOAmuTB for ; Mon, 05 May 2014 13:21:19 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45KLGrc030709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 5 May 2014 16:21:17 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s45KLGxE005542; Mon, 5 May 2014 16:21:16 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id CAB97120AC3; Mon, 5 May 2014 16:21:15 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45KLFmx013889; Mon, 5 May 2014 16:21:15 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 16:21:14 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: fold xfs_attr_get_int into xfs_attr_get Message-ID: <20140505202114.GC12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: fold xfs_attr_get_int into xfs_attr_get References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399130415-5382-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399321279 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, May 03, 2014 at 05:20:12PM +0200, Christoph Hellwig wrote: > This allows doing an unlocked check if an attr for is present at all and > slightly reduce the lock hold time if we actually do an attr get. > > Plus various minor style fixes to the new xfs_attr_get. > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 79 ++++++++++++++++++----------------------------------- > 1 file changed, 27 insertions(+), 52 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index eb3ae8f..01f2267 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -106,26 +106,34 @@ xfs_inode_hasattr( > * Overall external interface routines. > *========================================================================*/ > > -STATIC int > -xfs_attr_get_int( > +int > +xfs_attr_get( > struct xfs_inode *ip, > - struct xfs_name *name, > + const unsigned char *name, > unsigned char *value, > int *valuelenp, > int flags) > { > - xfs_da_args_t args; > - int error; > + struct xfs_da_args args; > + struct xfs_name xname; > + uint lock_mode; > + int error; > + > + XFS_STATS_INC(xs_attr_get); > + > + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > + return EIO; > > if (!xfs_inode_hasattr(ip)) > return ENOATTR; > > - /* > - * Fill in the arg structure for this request. > - */ > - memset((char *)&args, 0, sizeof(args)); > - args.name = name->name; > - args.namelen = name->len; > + error = xfs_attr_name_to_xname(&xname, name); > + if (error) > + return error; > + > + memset(&args, 0, sizeof(args)); > + args.name = xname.name; > + args.namelen = xname.len; > args.value = value; > args.valuelen = *valuelenp; > args.flags = flags; > @@ -133,52 +141,19 @@ xfs_attr_get_int( > args.dp = ip; > args.whichfork = XFS_ATTR_FORK; > > - /* > - * Decide on what work routines to call based on the inode size. > - */ > - if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { > + lock_mode = xfs_ilock_attr_map_shared(ip); > + if (!xfs_inode_hasattr(ip)) > + error = ENOATTR; > + else if (ip->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) > error = xfs_attr_shortform_getvalue(&args); > - } else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) { > + else if (xfs_bmap_one_block(ip, XFS_ATTR_FORK)) > error = xfs_attr_leaf_get(&args); > - } else { > + else > error = xfs_attr_node_get(&args); > - } > + xfs_iunlock(ip, lock_mode); > > - /* > - * Return the number of bytes in the value to the caller. > - */ > *valuelenp = args.valuelen; > - > - if (error == EEXIST) > - error = 0; > - return(error); > -} > - > -int > -xfs_attr_get( > - xfs_inode_t *ip, > - const unsigned char *name, > - unsigned char *value, > - int *valuelenp, > - int flags) > -{ > - int error; > - struct xfs_name xname; > - uint lock_mode; > - > - XFS_STATS_INC(xs_attr_get); > - > - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) > - return(EIO); > - > - error = xfs_attr_name_to_xname(&xname, name); > - if (error) > - return error; > - > - lock_mode = xfs_ilock_attr_map_shared(ip); > - error = xfs_attr_get_int(ip, &xname, value, valuelenp, flags); > - xfs_iunlock(ip, lock_mode); > - return(error); > + return error == EEXIST ? 0 : error; > } > > /* > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 15:21:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A83FA29DF8 for ; Mon, 5 May 2014 15:21:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1FA51AC003 for ; Mon, 5 May 2014 13:21:34 -0700 (PDT) X-ASG-Debug-ID: 1399321292-04cbb03cc533d6a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UuR1AdEBQmBd7ZyL for ; Mon, 05 May 2014 13:21: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45KLUcY031543 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 5 May 2014 16:21:30 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s45KLT3Z005910; Mon, 5 May 2014 16:21:29 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 46329120AC3; Mon, 5 May 2014 16:21:29 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45KLS5u013892; Mon, 5 May 2014 16:21:28 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 16:21:28 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove Message-ID: <20140505202127.GD12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-4-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399130415-5382-4-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399321292 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, May 03, 2014 at 05:20:13PM +0200, Christoph Hellwig wrote: > Also remove a useless ilock roundtrip for the first attr fork check, it's > racy anyway and we redo it later under the ilock before we start the removal. > > Plus various minor style fixes to the new xfs_attr_remove. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_attr.c | 97 +++++++++++++++++++---------------------------------- > 1 file changed, 35 insertions(+), 62 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 01f2267..a96e27b 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -416,21 +416,34 @@ out: > * Generic handler routine to remove a name from an attribute list. > * Transitions attribute list from Btree to shortform as necessary. > */ > -STATIC int > -xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > +int > +xfs_attr_remove( > + struct xfs_inode *dp, > + const unsigned char *name, > + int flags) > { > - xfs_da_args_t args; > - xfs_fsblock_t firstblock; > - xfs_bmap_free_t flist; > - int error; > - xfs_mount_t *mp = dp->i_mount; > + struct xfs_mount *mp = dp->i_mount; > + struct xfs_da_args args; > + struct xfs_bmap_free flist; > + struct xfs_name xname; > + xfs_fsblock_t firstblock; > + int error; > > - /* > - * Fill in the arg structure for this request. > - */ > - memset((char *)&args, 0, sizeof(args)); > - args.name = name->name; > - args.namelen = name->len; > + XFS_STATS_INC(xs_attr_remove); > + > + if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > + return EIO; > + > + if (!xfs_inode_hasattr(dp)) > + return ENOATTR; > + > + error = xfs_attr_name_to_xname(&xname, name); > + if (error) > + return error; > + > + memset(&args, 0, sizeof(args)); > + args.name = xname.name; > + args.namelen = xname.len; > args.flags = flags; > args.hashval = xfs_da_hashname(args.name, args.namelen); > args.dp = dp; > @@ -446,9 +459,6 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > */ > args.op_flags = XFS_DA_OP_OKNOENT; > > - /* > - * Attach the dquots to the inode. > - */ > error = xfs_qm_dqattach(dp, 0); > if (error) > return error; > @@ -477,7 +487,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > XFS_ATTRRM_SPACE_RES(mp), 0); > if (error) { > xfs_trans_cancel(args.trans, 0); > - return(error); > + return error; > } > > xfs_ilock(dp, XFS_ILOCK_EXCL); > @@ -487,35 +497,26 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > */ > xfs_trans_ijoin(args.trans, dp, 0); > > - /* > - * Decide on what work routines to call based on the inode size. > - */ > if (!xfs_inode_hasattr(dp)) { > error = XFS_ERROR(ENOATTR); I suppose we probably want to nuke the XFS_ERROR() while we're here..? Otherwise, it looks good. Brian > - goto out; > - } > - if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { > + } else if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) { > ASSERT(dp->i_afp->if_flags & XFS_IFINLINE); > error = xfs_attr_shortform_remove(&args); > - if (error) { > - goto out; > - } > } else if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) { > error = xfs_attr_leaf_removename(&args); > } else { > error = xfs_attr_node_removename(&args); > } > - if (error) { > + > + if (error) > goto out; > - } > > /* > * If this is a synchronous mount, make sure that the > * transaction goes to disk before returning to the user. > */ > - if (mp->m_flags & XFS_MOUNT_WSYNC) { > + if (mp->m_flags & XFS_MOUNT_WSYNC) > xfs_trans_set_sync(args.trans); > - } > > if ((flags & ATTR_KERNOTIME) == 0) > xfs_trans_ichgtime(args.trans, dp, XFS_ICHGTIME_CHG); > @@ -527,45 +528,17 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > error = xfs_trans_commit(args.trans, XFS_TRANS_RELEASE_LOG_RES); > xfs_iunlock(dp, XFS_ILOCK_EXCL); > > - return(error); > + return error; > > out: > - if (args.trans) > + if (args.trans) { > xfs_trans_cancel(args.trans, > XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); > - xfs_iunlock(dp, XFS_ILOCK_EXCL); > - return(error); > -} > - > -int > -xfs_attr_remove( > - xfs_inode_t *dp, > - const unsigned char *name, > - int flags) > -{ > - int error; > - struct xfs_name xname; > - > - XFS_STATS_INC(xs_attr_remove); > - > - if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > - return (EIO); > - > - error = xfs_attr_name_to_xname(&xname, name); > - if (error) > - return error; > - > - xfs_ilock(dp, XFS_ILOCK_SHARED); > - if (!xfs_inode_hasattr(dp)) { > - xfs_iunlock(dp, XFS_ILOCK_SHARED); > - return XFS_ERROR(ENOATTR); > } > - xfs_iunlock(dp, XFS_ILOCK_SHARED); > - > - return xfs_attr_remove_int(dp, &xname, flags); > + xfs_iunlock(dp, XFS_ILOCK_EXCL); > + return error; > } > > - > /*======================================================================== > * External routines when attribute list is inside the inode > *========================================================================*/ > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 15:21:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 55F0129E05 for ; Mon, 5 May 2014 15:21:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22B558F8035 for ; Mon, 5 May 2014 13:21:44 -0700 (PDT) X-ASG-Debug-ID: 1399321303-04bdf02b8b352910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id paiYA7sXtp3ie8RW for ; Mon, 05 May 2014 13:21:43 -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 (8.14.4/8.14.4) with ESMTP id s45KLfcM009093 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 16:21:41 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45KLfEd001016; Mon, 5 May 2014 16:21:41 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id D65F8120AC3; Mon, 5 May 2014 16:21:40 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45KLeTY013897; Mon, 5 May 2014 16:21:40 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 16:21:39 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: simplify attr name setup Message-ID: <20140505202139.GE12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: simplify attr name setup References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-5-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399130415-5382-5-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399321303 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 Sat, May 03, 2014 at 05:20:14PM +0200, Christoph Hellwig wrote: > Replace xfs_attr_name_to_xname with a new xfs_attr_args_init helper that > sets up the basic da_args structure without using a temporary xfs_name > structure. > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 74 +++++++++++++++++++++-------------------------------- > 1 file changed, 29 insertions(+), 45 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index a96e27b..1208621 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -77,17 +77,26 @@ STATIC int xfs_attr_refillstate(xfs_da_state_t *state); > > > STATIC int > -xfs_attr_name_to_xname( > - struct xfs_name *xname, > - const unsigned char *aname) > +xfs_attr_args_init( > + struct xfs_da_args *args, > + struct xfs_inode *dp, > + const unsigned char *name, > + int flags) > { > - if (!aname) > + > + if (!name) > return EINVAL; > - xname->name = aname; > - xname->len = strlen((char *)aname); > - if (xname->len >= MAXNAMELEN) > + > + memset(args, 0, sizeof(*args)); > + args->whichfork = XFS_ATTR_FORK; > + args->dp = dp; > + args->flags = flags; > + args->name = name; > + args->namelen = strlen((const char *)name); > + if (args->namelen >= MAXNAMELEN) > return EFAULT; /* match IRIX behaviour */ > > + args->hashval = xfs_da_hashname(args->name, args->namelen); > return 0; > } > > @@ -115,7 +124,6 @@ xfs_attr_get( > int flags) > { > struct xfs_da_args args; > - struct xfs_name xname; > uint lock_mode; > int error; > > @@ -127,19 +135,12 @@ xfs_attr_get( > if (!xfs_inode_hasattr(ip)) > return ENOATTR; > > - error = xfs_attr_name_to_xname(&xname, name); > + error = xfs_attr_args_init(&args, ip, name, flags); > if (error) > return error; > > - memset(&args, 0, sizeof(args)); > - args.name = xname.name; > - args.namelen = xname.len; > args.value = value; > args.valuelen = *valuelenp; > - args.flags = flags; > - args.hashval = xfs_da_hashname(args.name, args.namelen); > - args.dp = ip; > - args.whichfork = XFS_ATTR_FORK; > > lock_mode = xfs_ilock_attr_map_shared(ip); > if (!xfs_inode_hasattr(ip)) > @@ -208,7 +209,6 @@ xfs_attr_set( > struct xfs_da_args args; > struct xfs_bmap_free flist; > struct xfs_trans_res tres; > - struct xfs_name xname; > xfs_fsblock_t firstblock; > int rsvd = (flags & ATTR_ROOT) != 0; > int error, err2, committed, local; > @@ -218,10 +218,19 @@ xfs_attr_set( > if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > return EIO; > > - error = xfs_attr_name_to_xname(&xname, name); > + error = xfs_attr_args_init(&args, dp, name, flags); > if (error) > return error; > > + args.value = value; > + args.valuelen = valuelen; > + args.firstblock = &firstblock; > + args.flist = &flist; > + args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > + > + /* Size is now blocks for attribute data */ > + args.total = xfs_attr_calc_size(dp, args.namelen, valuelen, &local); > + > error = xfs_qm_dqattach(dp, 0); > if (error) > return error; > @@ -232,29 +241,13 @@ xfs_attr_set( > */ > if (XFS_IFORK_Q(dp) == 0) { > int sf_size = sizeof(xfs_attr_sf_hdr_t) + > - XFS_ATTR_SF_ENTSIZE_BYNAME(xname.len, valuelen); > + XFS_ATTR_SF_ENTSIZE_BYNAME(args.namelen, valuelen); > > error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); > if (error) > return error; > } > > - memset(&args, 0, sizeof(args)); > - args.name = xname.name; > - args.namelen = xname.len; > - args.value = value; > - args.valuelen = valuelen; > - args.flags = flags; > - args.hashval = xfs_da_hashname(args.name, args.namelen); > - args.dp = dp; > - args.firstblock = &firstblock; > - args.flist = &flist; > - args.whichfork = XFS_ATTR_FORK; > - args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > - > - /* Size is now blocks for attribute data */ > - args.total = xfs_attr_calc_size(dp, xname.len, valuelen, &local); > - > /* > * Start our first transaction of the day. > * > @@ -425,7 +418,6 @@ xfs_attr_remove( > struct xfs_mount *mp = dp->i_mount; > struct xfs_da_args args; > struct xfs_bmap_free flist; > - struct xfs_name xname; > xfs_fsblock_t firstblock; > int error; > > @@ -437,20 +429,12 @@ xfs_attr_remove( > if (!xfs_inode_hasattr(dp)) > return ENOATTR; > > - error = xfs_attr_name_to_xname(&xname, name); > + error = xfs_attr_args_init(&args, dp, name, flags); > if (error) > return error; > > - memset(&args, 0, sizeof(args)); > - args.name = xname.name; > - args.namelen = xname.len; > - args.flags = flags; > - args.hashval = xfs_da_hashname(args.name, args.namelen); > - args.dp = dp; > args.firstblock = &firstblock; > args.flist = &flist; > - args.total = 0; > - args.whichfork = XFS_ATTR_FORK; > > /* > * we have no control over the attribute names that userspace passes us > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 15:21:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D0ED329DF8 for ; Mon, 5 May 2014 15:21:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A9AAAC003 for ; Mon, 5 May 2014 13:21:54 -0700 (PDT) X-ASG-Debug-ID: 1399321313-04cb6c729035cd50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QVLFD14tA6fjZ2pM for ; Mon, 05 May 2014 13:21:53 -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 (8.14.4/8.14.4) with ESMTP id s45KLpJX030116 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 16:21:51 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45KLp1u012690; Mon, 5 May 2014 16:21:51 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 1B288120AC3; Mon, 5 May 2014 16:21:51 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45KLoU1013900; Mon, 5 May 2014 16:21:50 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 16:21:50 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: pass struct da_args to xfs_attr_calc_size Message-ID: <20140505202149.GF12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: pass struct da_args to xfs_attr_calc_size References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-6-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399130415-5382-6-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399321313 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, May 03, 2014 at 05:20:15PM +0200, Christoph Hellwig wrote: > And remove a very confused comment. > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 14 +++++--------- > 1 file changed, 5 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 1208621..86f482e 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -162,12 +162,10 @@ xfs_attr_get( > */ > STATIC int > xfs_attr_calc_size( > - struct xfs_inode *ip, > - int namelen, > - int valuelen, > + struct xfs_da_args *args, > int *local) > { > - struct xfs_mount *mp = ip->i_mount; > + struct xfs_mount *mp = args->dp->i_mount; > int size; > int nblks; > > @@ -175,7 +173,7 @@ xfs_attr_calc_size( > * Determine space new attribute will use, and if it would be > * "local" or "remote" (note: local != inline). > */ > - size = xfs_attr_leaf_newentsize(namelen, valuelen, > + size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > mp->m_sb.sb_blocksize, local); > > nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); > @@ -189,7 +187,7 @@ xfs_attr_calc_size( > * Out of line attribute, cannot double split, but > * make room for the attribute value itself. > */ > - uint dblocks = XFS_B_TO_FSB(mp, valuelen); > + uint dblocks = XFS_B_TO_FSB(mp, args->valuelen); > nblks += dblocks; > nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); > } > @@ -227,9 +225,7 @@ xfs_attr_set( > args.firstblock = &firstblock; > args.flist = &flist; > args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > - > - /* Size is now blocks for attribute data */ > - args.total = xfs_attr_calc_size(dp, args.namelen, valuelen, &local); > + args.total = xfs_attr_calc_size(&args, &local); > > error = xfs_qm_dqattach(dp, 0); > if (error) > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 15:26:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0A30929DF8 for ; Mon, 5 May 2014 15:26:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8F8E30405F for ; Mon, 5 May 2014 13:26:30 -0700 (PDT) X-ASG-Debug-ID: 1399321589-04cbb03cc733dca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Y2qcRZ0k12gMrilb for ; Mon, 05 May 2014 13:26: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45KPoBW018719 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 16:26:28 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45JUB9R011763; Mon, 5 May 2014 15:30:12 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 36E70120AC3; Mon, 5 May 2014 15:30:11 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45JUAVM013495; Mon, 5 May 2014 15:30:10 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 15:30:09 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [V2] xfs: remote attribute overwrite causes transaction overrun Message-ID: <20140505193009.GA12448@laptop.bfoster> X-ASG-Orig-Subj: Re: [V2] xfs: remote attribute overwrite causes transaction overrun References: <1399275948-27752-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399275948-27752-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399321589 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, May 05, 2014 at 05:45:48PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Commit e461fcb ("xfs: remote attribute lookups require the value > length") passes the remote attribute length in the xfs_da_args > structure on lookup so that CRC calculations and validity checking > can be performed correctly by related code. This, unfortunately has > the side effect of changing the args->valuelen parameter in cases > where it shouldn't. > > That is, when we replace a remote attribute, the incoming > replacement stores the value and length in args->value and > args->valuelen, but then the lookup which finds the existing remote > attribute overwrites args->valuelen with the length of the remote > attribute being replaced. Hence when we go to create the new > attribute, we create it of the size of the existing remote > attribute, not the size it is supposed to be. When the new attribute > is much smaller than the old attribute, this results in a > transaction overrun and an ASSERT() failure on a debug kernel: > > XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 > > Fix this by keeping the remote attribute value length separate to > the attribute value length in the xfs_da_args structure. The enables > us to pass the length of the remote attribute to be removed without > overwriting the new attribute's length. > > Also, ensure that when we save remote block contexts for a later > rename we zero the original state variables so that we don't confuse > the state of the attribute to be removes with the state of the new > attribute that we just added. [Spotted by Brain Foster.] > > Signed-off-by: Dave Chinner > --- Looks good to me.. Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 24 +++++++++++++++++++++++- > fs/xfs/xfs_attr_leaf.c | 21 +++++++++++---------- > fs/xfs/xfs_attr_list.c | 1 + > fs/xfs/xfs_attr_remote.c | 8 +++++--- > fs/xfs/xfs_da_btree.h | 2 ++ > 5 files changed, 42 insertions(+), 14 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 95de302..30482c9 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -213,7 +213,7 @@ xfs_attr_calc_size( > * Out of line attribute, cannot double split, but > * make room for the attribute value itself. > */ > - uint dblocks = XFS_B_TO_FSB(mp, valuelen); > + uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); > nblks += dblocks; > nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); > } > @@ -698,11 +698,22 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > > trace_xfs_attr_leaf_replace(args); > > + /* save the attribute state for later removal*/ > args->op_flags |= XFS_DA_OP_RENAME; /* an atomic rename */ > args->blkno2 = args->blkno; /* set 2nd entry info*/ > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > + > + /* > + * clear the remote attr state now that it is saved so that the > + * values reflect the state of the attribute we are about to > + * add, not the attribute we just found and will remove later. > + */ > + args->rmtblkno = 0; > + args->rmtblkcnt = 0; > + args->rmtvaluelen = 0; > } > > /* > @@ -794,6 +805,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > @@ -999,13 +1011,22 @@ restart: > > trace_xfs_attr_node_replace(args); > > + /* save the attribute state for later removal*/ > args->op_flags |= XFS_DA_OP_RENAME; /* atomic rename op */ > args->blkno2 = args->blkno; /* set 2nd entry info*/ > args->index2 = args->index; > args->rmtblkno2 = args->rmtblkno; > args->rmtblkcnt2 = args->rmtblkcnt; > + args->rmtvaluelen2 = args->rmtvaluelen; > + > + /* > + * clear the remote attr state now that it is saved so that the > + * values reflect the state of the attribute we are about to > + * add, not the attribute we just found and will remove later. > + */ > args->rmtblkno = 0; > args->rmtblkcnt = 0; > + args->rmtvaluelen = 0; > } > > retval = xfs_attr3_leaf_add(blk->bp, state->args); > @@ -1133,6 +1154,7 @@ restart: > args->blkno = args->blkno2; > args->rmtblkno = args->rmtblkno2; > args->rmtblkcnt = args->rmtblkcnt2; > + args->rmtvaluelen = args->rmtvaluelen2; > if (args->rmtblkno) { > error = xfs_attr_rmtval_remove(args); > if (error) > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index b9d9170..17ec23f 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work( > name_rmt->valueblk = 0; > args->rmtblkno = 1; > args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + args->rmtvaluelen = args->valuelen; > } > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), > @@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int( > if (!xfs_attr_namesp_match(args->flags, entry->flags)) > continue; > args->index = probe; > - args->valuelen = be32_to_cpu(name_rmt->valuelen); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks( > args->dp->i_mount, > - args->valuelen); > + args->rmtvaluelen); > return XFS_ERROR(EEXIST); > } > } > @@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue( > name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); > ASSERT(name_rmt->namelen == args->namelen); > ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); > - valuelen = be32_to_cpu(name_rmt->valuelen); > + args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); > args->rmtblkno = be32_to_cpu(name_rmt->valueblk); > args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, > - valuelen); > + args->rmtvaluelen); > if (args->flags & ATTR_KERNOVAL) { > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > return 0; > } > - if (args->valuelen < valuelen) { > - args->valuelen = valuelen; > + if (args->valuelen < args->rmtvaluelen) { > + args->valuelen = args->rmtvaluelen; > return XFS_ERROR(ERANGE); > } > - args->valuelen = valuelen; > + args->valuelen = args->rmtvaluelen; > } > return 0; > } > @@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag( > ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); > name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); > name_rmt->valueblk = cpu_to_be32(args->rmtblkno); > - name_rmt->valuelen = cpu_to_be32(args->valuelen); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp, > XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); > } > @@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags( > ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); > name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); > name_rmt->valueblk = cpu_to_be32(args->rmtblkno); > - name_rmt->valuelen = cpu_to_be32(args->valuelen); > + name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); > xfs_trans_log_buf(args->trans, bp1, > XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); > } > diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c > index 3e9a65a..0bba7c3 100644 > --- a/fs/xfs/xfs_attr_list.c > +++ b/fs/xfs/xfs_attr_list.c > @@ -447,6 +447,7 @@ xfs_attr3_leaf_list_int( > args.dp = context->dp; > args.whichfork = XFS_ATTR_FORK; > args.valuelen = valuelen; > + args.rmtvaluelen = valuelen; > args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS); > args.rmtblkno = be32_to_cpu(name_rmt->valueblk); > args.rmtblkcnt = xfs_attr3_rmt_blocks( > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index 44a57c8..6a70e7e 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -337,7 +337,7 @@ xfs_attr_rmtval_get( > struct xfs_buf *bp; > xfs_dablk_t lblkno = args->rmtblkno; > __uint8_t *dst = args->value; > - int valuelen = args->valuelen; > + int valuelen; > int nmap; > int error; > int blkcnt = args->rmtblkcnt; > @@ -347,7 +347,9 @@ xfs_attr_rmtval_get( > trace_xfs_attr_rmtval_get(args); > > ASSERT(!(args->flags & ATTR_KERNOVAL)); > + ASSERT(args->rmtvaluelen == args->valuelen); > > + valuelen = args->rmtvaluelen; > while (valuelen > 0) { > nmap = ATTR_RMTVALUE_MAPSIZE; > error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, > @@ -415,7 +417,7 @@ xfs_attr_rmtval_set( > * attributes have headers, we can't just do a straight byte to FSB > * conversion and have to take the header space into account. > */ > - blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); > + blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); > error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, > XFS_ATTR_FORK); > if (error) > @@ -480,7 +482,7 @@ xfs_attr_rmtval_set( > */ > lblkno = args->rmtblkno; > blkcnt = args->rmtblkcnt; > - valuelen = args->valuelen; > + valuelen = args->rmtvaluelen; > while (valuelen > 0) { > struct xfs_buf *bp; > xfs_daddr_t dblkno; > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 6e95ea7..201c609 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -60,10 +60,12 @@ typedef struct xfs_da_args { > int index; /* index of attr of interest in blk */ > xfs_dablk_t rmtblkno; /* remote attr value starting blkno */ > int rmtblkcnt; /* remote attr value block count */ > + int rmtvaluelen; /* remote attr value length in bytes */ > xfs_dablk_t blkno2; /* blkno of 2nd attr leaf of interest */ > int index2; /* index of 2nd attr in blk */ > xfs_dablk_t rmtblkno2; /* remote attr value starting blkno */ > int rmtblkcnt2; /* remote attr value block count */ > + int rmtvaluelen2; /* remote attr value length in bytes */ > int op_flags; /* operation flags */ > enum xfs_dacmp cmpresult; /* name compare result for lookups */ > } xfs_da_args_t; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon May 5 15:36:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F074729DF8 for ; Mon, 5 May 2014 15:36:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81C58AC006 for ; Mon, 5 May 2014 13:36:58 -0700 (PDT) X-ASG-Debug-ID: 1399322215-04bdf02b8c3539d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6MxnWcJTFEKgrBWM for ; Mon, 05 May 2014 13:36:56 -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: AnpMAAP2Z1N5LEcvPGdsb2JhbAA/GoMGT4JuqB4GmgyBGRcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOQcONs0bFoVAiHwHhD8EmTOWOysw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:06:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhPcn-0001J8-F8; Tue, 06 May 2014 06:36:33 +1000 Date: Tue, 6 May 2014 06:36:33 +1000 From: Dave Chinner To: Andrey Korolyov Cc: "ceph-users@lists.ceph.com" , "xfs@oss.sgi.com" Subject: Re: Fatigue for XFS Message-ID: <20140505203633.GW26353@dastard> X-ASG-Orig-Subj: Re: Fatigue for XFS 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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1399322215 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_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Mon, May 05, 2014 at 11:49:05PM +0400, Andrey Korolyov wrote: > Hello, > > We are currently exploring issue which can be related to Ceph itself > or to the XFS - any help is very appreciated. > > First, the picture: relatively old cluster w/ two years uptime and ten > months after fs recreation on every OSD, one of daemons started to > flap approximately once per day for couple of weeks, with no external > reason (bandwidth/IOPS/host issues). It looks almost the same every > time - OSD suddenly stop serving requests for a short period, gets > kicked out by peers report, then returns in a couple of seconds. Of > course, small but sensitive amount of requests are delayed by 15-30 > seconds twice, which is bad for us. The only thing which correlates > with this kick is a peak of I/O, not too large, even not consuming all > underlying disk utilization, but alone in the cluster and clearly > visible. Also there are at least two occasions *without* correlated > iowait peak. So, actual numbers and traces are the only thing that tell us what is happening during these events. See here: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F If it happens at almost the same time every day, then I'd be looking at the crontabs to find what starts up about that time. output of top will also probably tell you what process is running, too. topio might be instructive, and blktrace almost certainly will be.... > I have two versions - we`re touching some sector on disk which is > about to be marked as dead but not displayed in SMART statistics or (I Doubt it - SMART doesn't cause OS visible IO dispatch spikes. > believe so) some kind of XFS fatigue, which can be more likely in this > case, since near-bad sector should be touched more frequently and > related impact could leave traces in dmesg/SMART from my experience. I I doubt that, too, because XFS doesn't have anything that is triggered on a daily basis inside it. Maybe you've got xfs_fsr set up on a cron job, though... > would like to ask if anyone has a simular experience before or can > suggest to poke existing file system in some way. If no suggestion > appear, I`ll probably reformat disk and, if problem will remain after > refill, replace it, but I think less destructive actions can be done > before. Yeah, monitoring and determining the process that is issuing the IO is what you need to find first. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 5 15:55:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2C2A529DFD for ; Mon, 5 May 2014 15:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3B74AC006 for ; Mon, 5 May 2014 13:55:56 -0700 (PDT) X-ASG-Debug-ID: 1399323353-04cb6c729035f210001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id RMwcTMVrFSZEBCG1 for ; Mon, 05 May 2014 13:55:54 -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: Au9MAIf5Z1N5LEcvPGdsb2JhbABZgwaDPYUKoxQGmgyBGhcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDNShcWhUCIfAeEPwSZM5Y7Kw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:25:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhPvU-0001ME-9D; Tue, 06 May 2014 06:55:52 +1000 Date: Tue, 6 May 2014 06:55:52 +1000 From: Dave Chinner To: Mark Tinguely Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: attr cleanups Message-ID: <20140505205552.GX26353@dastard> X-ASG-Orig-Subj: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> <20140504101623.GA4947@lst.de> <53679113.8000209@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53679113.8000209@sgi.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: 1399323353 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.5562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 08:24:35AM -0500, Mark Tinguely wrote: > On 05/04/14 05:16, Christoph Hellwig wrote: > >On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: > >>Depends on how parent inode pointers are implemented, this folding the > >>internal version of get and set attributes could be undone. > > > >We might have to introduce _locked version at that point. But I'd like > >to keep the xfs_name removal and other assorted cleanups. > > > > locking is only one issue, xfs_attr_(get/set/remove) are asciii only > whereas the xfs_attr_(get/set/remove)_int versions are more generic. > I am thinking of not just parent inode pointers but a non-ascii > character set. I fail to see how they are different. The attribute name is just an opaque binary blob - only when it is compared externally does it have any meaning at all. Character sets are meaningless unless you are doing case manipulation, in which case we would need to apply the same treatment as the directory code deep in the internal attribute cod. i.e It needs case aware compare and hash algorithms. However, the outer layers are completely unchanged - they just pass through the blob that was passed to them... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 5 15:57:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BE1E629DFD for ; Mon, 5 May 2014 15:57:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A682F8F8035 for ; Mon, 5 May 2014 13:57:06 -0700 (PDT) X-ASG-Debug-ID: 1399323423-04cb6c1fcc20d3a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id fUcfEAO4HDQcUAq5 for ; Mon, 05 May 2014 13:57: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: AvFMAOb6Z1N5LEcvPGdsb2JhbABZgwaDPYUKoxQGmgyBGxcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hAzU0XFoVAiHwHhD8EmTOKf4s8Kw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:26:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhPwT-0001Mw-Vz; Tue, 06 May 2014 06:56:54 +1000 Date: Tue, 6 May 2014 06:56:53 +1000 From: Dave Chinner To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove Message-ID: <20140505205653.GY26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-4-git-send-email-hch@lst.de> <20140505202127.GD12448@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505202127.GD12448@laptop.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: 1399323423 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.5562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 04:21:28PM -0400, Brian Foster wrote: > On Sat, May 03, 2014 at 05:20:13PM +0200, Christoph Hellwig wrote: > > Also remove a useless ilock roundtrip for the first attr fork check, it's > > racy anyway and we redo it later under the ilock before we start the removal. > > > > Plus various minor style fixes to the new xfs_attr_remove. > > > > Signed-off-by: Christoph Hellwig ..... > > @@ -487,35 +497,26 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > > */ > > xfs_trans_ijoin(args.trans, dp, 0); > > > > - /* > > - * Decide on what work routines to call based on the inode size. > > - */ > > if (!xfs_inode_hasattr(dp)) { > > error = XFS_ERROR(ENOATTR); > > I suppose we probably want to nuke the XFS_ERROR() while we're here..? > Otherwise, it looks good. No need, I'll do that at the end of the dev cycle for everything. Cheers, Dave. -- Dave Chinner david@fromorbit.com From andrey@xdel.ru Mon May 5 15:59:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CF0CC29DFD for ; Mon, 5 May 2014 15:59:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB55B30405F for ; Mon, 5 May 2014 13:59:50 -0700 (PDT) X-ASG-Debug-ID: 1399323587-04cbb03cc433ffa0001-NocioJ Received: from mail-ob0-f177.google.com (mail-ob0-f177.google.com [209.85.214.177]) by cuda.sgi.com with ESMTP id TrtyrrEbvvbMKIIO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 05 May 2014 13:59:48 -0700 (PDT) X-Barracuda-Envelope-From: andrey@xdel.ru X-Barracuda-Apparent-Source-IP: 209.85.214.177 Received: by mail-ob0-f177.google.com with SMTP id gq1so1442038obb.8 for ; Mon, 05 May 2014 13:59:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xdel.ru; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=A0A24S3S0LLnN2WC6FJ9zQ78b9dYmZkRYDNsMuOViLU=; b=uEUGA0xPNzyCiFBE6XF/CuBMeNqOvimUB3KmDHThoTcPXW+cA2adQlFAobBIRS2VDP jebp+bnkzULMOoreIfaxox0x67Sqc+8C4ginr9yMIrsdRuWKYp0fd9odI2Vh/zZks7vy O0RSlJMhWv85U7W2VqJXH5DqArT1RA0nCrAfc= 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=A0A24S3S0LLnN2WC6FJ9zQ78b9dYmZkRYDNsMuOViLU=; b=hNEOfZOXkh8pMA2LE6X4VE1BJrcqL/VQrj/Q2IlKRwQ+mCaO+AYT+hbXTXwrRFgpoO lV4tA/3lVH2X13MGMespPcuTCYPpRcdzMOpWER7B6Q15ReUL8Jv/oTeOZZRbeybdKww7 KyvrsrPK0qxAXSRjVKPZcSaEGLHCR/yZ/EATjEL80rqzdb2zWqs9EbnDq1y71GAD7QVj exTHhV54O2oWA2y/gJt21jOWPkRaNMydOpF/+NV6XiJNRmwjJCM3jZQtJkJS2gPHYmGt 2GSP8CamSYA/P8YKfwa/MsO9rR9ks/AQKXik0wPZSyUQ5eQ5zUhjsiRCnM8YGxbK8TAD kGkw== X-Gm-Message-State: ALoCoQlO+oMLlk7p41yX4hi5dGci0h+BtCt3iUokL4TH5lmMIHw+H4PYaygGFPHIWwNy7iMc624j X-Received: by 10.182.33.131 with SMTP id r3mr34665989obi.40.1399323587517; Mon, 05 May 2014 13:59:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.182.194.15 with HTTP; Mon, 5 May 2014 13:59:27 -0700 (PDT) In-Reply-To: <20140505203633.GW26353@dastard> References: <20140505203633.GW26353@dastard> From: Andrey Korolyov Date: Tue, 6 May 2014 00:59:27 +0400 Message-ID: Subject: Re: Fatigue for XFS To: Dave Chinner X-ASG-Orig-Subj: Re: Fatigue for XFS Cc: "ceph-users@lists.ceph.com" , "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f177.google.com[209.85.214.177] X-Barracuda-Start-Time: 1399323588 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.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_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5562 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.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, May 6, 2014 at 12:36 AM, Dave Chinner wrote: > On Mon, May 05, 2014 at 11:49:05PM +0400, Andrey Korolyov wrote: >> Hello, >> >> We are currently exploring issue which can be related to Ceph itself >> or to the XFS - any help is very appreciated. >> >> First, the picture: relatively old cluster w/ two years uptime and ten >> months after fs recreation on every OSD, one of daemons started to >> flap approximately once per day for couple of weeks, with no external >> reason (bandwidth/IOPS/host issues). It looks almost the same every >> time - OSD suddenly stop serving requests for a short period, gets >> kicked out by peers report, then returns in a couple of seconds. Of >> course, small but sensitive amount of requests are delayed by 15-30 >> seconds twice, which is bad for us. The only thing which correlates >> with this kick is a peak of I/O, not too large, even not consuming all >> underlying disk utilization, but alone in the cluster and clearly >> visible. Also there are at least two occasions *without* correlated >> iowait peak. > > So, actual numbers and traces are the only thing that tell us what > is happening during these events. See here: > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > If it happens at almost the same time every day, then I'd be looking > at the crontabs to find what starts up about that time. output of > top will also probably tell you what process is running, too. topio > might be instructive, and blktrace almost certainly will be.... > >> I have two versions - we`re touching some sector on disk which is >> about to be marked as dead but not displayed in SMART statistics or (I > > Doubt it - SMART doesn't cause OS visible IO dispatch spikes. > >> believe so) some kind of XFS fatigue, which can be more likely in this >> case, since near-bad sector should be touched more frequently and >> related impact could leave traces in dmesg/SMART from my experience. I > > I doubt that, too, because XFS doesn't have anything that is > triggered on a daily basis inside it. Maybe you've got xfs_fsr set > up on a cron job, though... > >> would like to ask if anyone has a simular experience before or can >> suggest to poke existing file system in some way. If no suggestion >> appear, I`ll probably reformat disk and, if problem will remain after >> refill, replace it, but I think less destructive actions can be done >> before. > > Yeah, monitoring and determining the process that is issuing the IO > is what you need to find first. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com Thanks Dave, there are definitely no cron set for specific time (though most of lockups happened in a relatively small interval which correlates with the Ceph snapshot operations). In at least one case no Ceph snapshot operations (including delayed removal) happened and at least two when no I/O peak was observed. We observed and eliminated weird lockups related to the openswitch behavior before - we`re combining storage and compute nodes, so quirks in the OVS datapath caused very interesting and weird system-wide lockups on (supposedly) spinlock, and we see 'pure' Ceph lockups on XFS at time with 3.4-3.7 kernels, all of them was correlated with very high context switch peak. Current issue is seemingly nothing to do with spinlock-like bugs or just a hardware problem, we even rebooted problematic node to check if the memory allocator may stuck at the border of specific NUMA node, with no help, but first reappearance of this bug was delayed by some days then. Disabling lazy allocation via specifying allocsize did nothing too. It may look like I am insisting that it is XFS bug, where Ceph version is more likely to appear because of way more complicated logic and operation behaviour, but persistence on specific node across relaunching of Ceph storage daemon suggests bug relation to the unlucky byte sequence more than anything else. If it finally appear as Ceph bug, it`ll ruin our expectations from two-year of close experience with this product and if it is XFS bug, we haven`t see anything like this before, thought we had a pretty collection of XFS-related lockups on the earlier kernels. So, my understanding is that we hitting neither very rare memory allocator bug in case of XFS or age-related Ceph issue, both are very unlikely to exist - but I cannot imagine nothing else. If it helps, I may collect a series of perf events during next appearance or exact iostat output (mine graphics can say that the I/O was not choked completely when peak appeared, that`s all). From david@fromorbit.com Mon May 5 16:05:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6681829DFD for ; Mon, 5 May 2014 16:05:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 502988F8035 for ; Mon, 5 May 2014 14:05:44 -0700 (PDT) X-ASG-Debug-ID: 1399323941-04cbb03cc6340590001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 072HB7PguZGq0b0u for ; Mon, 05 May 2014 14:05:42 -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: AnlMAOL7Z1N5LEcvPGdsb2JhbABZgwZPgm6oHgaaDIEbFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hADs1AFxaFQIcBgXsHgyqBFQSZM5Y7KzA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:35:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhQ4y-0001PL-Jp; Tue, 06 May 2014 07:05:40 +1000 Date: Tue, 6 May 2014 07:05:40 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: initialize default acls for ->tmpfile() Message-ID: <20140505210540.GF32204@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: initialize default acls for ->tmpfile() References: <1398951487-15462-1-git-send-email-bfoster@redhat.com> <20140505102403.GV26353@dastard> <20140505131745.GB11622@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505131745.GB11622@laptop.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: 1399323941 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.5562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 09:17:46AM -0400, Brian Foster wrote: > On Mon, May 05, 2014 at 08:24:03PM +1000, Dave Chinner wrote: > > On Thu, May 01, 2014 at 09:38:07AM -0400, Brian Foster wrote: > > > The current tmpfile handler does not initialize default ACLs. Doing so > > > within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), > > > which is already used as a common create handler. > > > > > > xfs_vn_mknod() does not currently have a mechanism to determine whether > > > to link the file into the namespace. Therefore, further abstract > > > xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile > > > parameter. This new handler passes a NULL xname to the create and calls > > > d_tmpfile() on the dentry when called via ->tmpfile(). > > > > > > Signed-off-by: Brian Foster > > > --- > > > > > > Hi all, > > > > > > It appears that we want to initialize default ACLs for ->tmpfile() after > > > all. This patch reintroduces the refactoring to initialize security and > > > ACLs through the current xfs_vn_mknod(). This is based on top of the > > > previously posted series: > > > > > > http://oss.sgi.com/archives/xfs/2014-04/msg00396.html > > > > > > Brian > > ..... > > > @@ -1053,25 +1074,7 @@ xfs_vn_tmpfile( > > > struct dentry *dentry, > > > umode_t mode) > > > { > > > - int error; > > > - struct xfs_inode *ip; > > > - struct inode *inode; > > > - > > > - error = xfs_create(XFS_I(dir), NULL, mode, 0, &ip); > > > - if (unlikely(error)) > > > - return -error; > > > - > > > - inode = VFS_I(ip); > > > - > > > - error = xfs_init_security(inode, dir, &dentry->d_name); > > > - if (unlikely(error)) { > > > - iput(inode); > > > - return -error; > > > - } > > > - > > > - d_tmpfile(dentry, inode); > > > - > > > - return 0; > > > + return xfs_generic_create(dir, dentry, mode, 0, true); > > > } > > > > This hunk doesn't apply to a 3.15-rc2 kernel - it calls > > xfs_create_tmpfile(). Just applying it as is after fixing the hunk > > causes a crash in xfs-create(), because the code in the patch is > > calling xfs-create ratehr than xfs_create_tmpfile(). > > > > Right, this is based on the previously posted series (link above), which > fixes up xfs_create() such that we can use it from xfs_generic_create() > via all associated codepaths. Sorry, I probably should have posted this > as a [5/4 ...] patch to make that more clear... > > > Brian, can you regenerate this patch against a current linus tree > > (3.15-rc4)? > > > > It isn't clear to me what the expectation is with this series at this > point, beyond the agreement that we do want to initialize the acls. It > looks like the v1 patch that only initialized security is merged, so > we're Ok as far as that goes. v2 added the bits to initialize the acls > as well: > > http://oss.sgi.com/archives/xfs/2014-04/msg00182.html > > ... and followed up with the xfs_create_tmpfile() removal. Is that > (minus the already merged selinux fix) what you're asking for here? > > v3 dropped the default acl bits and thus the xfs_generic_create() > handler as well. The xfs_create_tmpfile() cleanup persisted, and now the > default acl bits are required, so it's added back in this 5/4. Basically, cleanups and factoring, etc, are beyond the scope of adding the missing default acl initialisation to 3.15-rc4. i.e. the cleanups and refactoring will go into 3.16, so will end up layered on top of this bug fix.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon May 5 16:08:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B4E1029DFD for ; Mon, 5 May 2014 16:08:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B430AC002 for ; Mon, 5 May 2014 14:08:39 -0700 (PDT) X-ASG-Debug-ID: 1399324117-04cbb03cc7340940001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Y9FbnMjbH1I3ppZ0 for ; Mon, 05 May 2014 14:08: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45L8ZUg014754 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:08:35 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45L8YWV010650; Mon, 5 May 2014 17:08:35 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 8562C120AC3; Mon, 5 May 2014 17:08:34 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45L8Xbx014183; Mon, 5 May 2014 17:08:33 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:08:32 -0400 From: Brian Foster To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove Message-ID: <20140505210832.GA13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: fold xfs_attr_remove_int into xfs_attr_remove References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-4-git-send-email-hch@lst.de> <20140505202127.GD12448@laptop.bfoster> <20140505205653.GY26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505205653.GY26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399324117 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, May 06, 2014 at 06:56:53AM +1000, Dave Chinner wrote: > On Mon, May 05, 2014 at 04:21:28PM -0400, Brian Foster wrote: > > On Sat, May 03, 2014 at 05:20:13PM +0200, Christoph Hellwig wrote: > > > Also remove a useless ilock roundtrip for the first attr fork check, it's > > > racy anyway and we redo it later under the ilock before we start the removal. > > > > > > Plus various minor style fixes to the new xfs_attr_remove. > > > > > > Signed-off-by: Christoph Hellwig > ..... > > > @@ -487,35 +497,26 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) > > > */ > > > xfs_trans_ijoin(args.trans, dp, 0); > > > > > > - /* > > > - * Decide on what work routines to call based on the inode size. > > > - */ > > > if (!xfs_inode_hasattr(dp)) { > > > error = XFS_ERROR(ENOATTR); > > > > I suppose we probably want to nuke the XFS_ERROR() while we're here..? > > Otherwise, it looks good. > > No need, I'll do that at the end of the dev cycle for everything. > Sounds good. Reviewed-by: Brian Foster > 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 May 5 16:09:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D5D9029DFD for ; Mon, 5 May 2014 16:09:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 59BD6AC002 for ; Mon, 5 May 2014 14:09:38 -0700 (PDT) X-ASG-Debug-ID: 1399324177-04cbb03cc7340a20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Yci3T1VQx97vgFJX for ; Mon, 05 May 2014 14:09: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45L9ZbF030999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:09:35 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45L9Z80016514; Mon, 5 May 2014 17:09:35 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 09977120AC3; Mon, 5 May 2014 17:09:35 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45L9YSG014192; Mon, 5 May 2014 17:09:34 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:09:33 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 1/6] xfsprogs: get rid of XFS_IALLOC_INODES macros Message-ID: <20140505210933.GB13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfsprogs: get rid of XFS_IALLOC_INODES macros References: <536784BB.4020308@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784BB.4020308@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399324177 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, May 05, 2014 at 08:31:55PM +0800, Jeff Liu wrote: > From: Jie Liu > > Get rid of XFS_IALLOC_INODES() macros, use mp->m_ialloc_inos directly. > > Signed-off-by: Jie Liu > --- Pretty straightforward cleanup... Reviewed-by: Brian Foster > include/xfs_ialloc.h | 1 - > libxfs/xfs_ialloc.c | 12 ++++++------ > repair/dino_chunks.c | 16 ++++++++-------- > repair/prefetch.c | 4 ++-- > 4 files changed, 16 insertions(+), 17 deletions(-) > > diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h > index a8f76a5..4689b02 100644 > --- a/include/xfs_ialloc.h > +++ b/include/xfs_ialloc.h > @@ -28,7 +28,6 @@ struct xfs_btree_cur; > /* > * Allocation parameters for inode allocation. > */ > -#define XFS_IALLOC_INODES(mp) (mp)->m_ialloc_inos > #define XFS_IALLOC_BLOCKS(mp) (mp)->m_ialloc_blks > > /* > diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c > index c19d84a..108f6f2 100644 > --- a/libxfs/xfs_ialloc.c > +++ b/libxfs/xfs_ialloc.c > @@ -201,7 +201,7 @@ xfs_ialloc_inode_init( > * they track in the AIL as if they were physically logged. > */ > if (tp) > - xfs_icreate_log(tp, agno, agbno, XFS_IALLOC_INODES(mp), > + xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, > mp->m_sb.sb_inodesize, length, gen); > } else if (xfs_sb_version_hasnlink(&mp->m_sb)) > version = 2; > @@ -305,7 +305,7 @@ xfs_ialloc_ag_alloc( > * Locking will ensure that we don't have two callers in here > * at one time. > */ > - newlen = XFS_IALLOC_INODES(args.mp); > + newlen = args.mp->m_ialloc_inos; > if (args.mp->m_maxicount && > args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) > return XFS_ERROR(ENOSPC); > @@ -975,7 +975,7 @@ xfs_dialloc( > * inode. > */ > if (mp->m_maxicount && > - mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { > + mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { > noroom = 1; > okalloc = 0; > } > @@ -1178,7 +1178,7 @@ xfs_difree( > * When an inode cluster is free, it becomes eligible for removal > */ > if (!(mp->m_flags & XFS_MOUNT_IKEEP) && > - (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { > + (rec.ir_freecount == mp->m_ialloc_inos)) { > > *delete = 1; > *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); > @@ -1188,7 +1188,7 @@ xfs_difree( > * AGI and Superblock inode counts, and mark the disk space > * to be freed when the transaction is committed. > */ > - ilen = XFS_IALLOC_INODES(mp); > + ilen = mp->m_ialloc_inos; > be32_add_cpu(&agi->agi_count, -ilen); > be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); > xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); > @@ -1287,7 +1287,7 @@ xfs_imap_lookup( > > /* check that the returned record contains the required inode */ > if (rec.ir_startino > agino || > - rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) > + rec.ir_startino + mp->m_ialloc_inos <= agino) > return EINVAL; > > /* for untrusted inodes check it is allocated first */ > diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c > index afb26e0..15aa4f8 100644 > --- a/repair/dino_chunks.c > +++ b/repair/dino_chunks.c > @@ -267,7 +267,7 @@ verify_inode_chunk(xfs_mount_t *mp, > * would include the inode passed into us. > */ > if (XFS_IALLOC_BLOCKS(mp) > 1) { > - if (agino > XFS_IALLOC_INODES(mp)) > + if (agino > mp->m_ialloc_inos) > start_agbno = agbno - XFS_IALLOC_BLOCKS(mp) + 1; > else > start_agbno = 1; > @@ -336,7 +336,7 @@ verify_inode_chunk(xfs_mount_t *mp, > * of the gap -- is it within the search range? > */ > if (irec_next_p != NULL && > - agino + XFS_IALLOC_INODES(mp) >= > + agino + mp->m_ialloc_inos >= > irec_next_p->ino_startnum) > end_agbno = XFS_AGINO_TO_AGBNO(mp, > irec_next_p->ino_startnum); > @@ -688,7 +688,7 @@ process_inode_chunk( > icnt++; > cluster_offset++; > > - if (icnt == XFS_IALLOC_INODES(mp) && > + if (icnt == mp->m_ialloc_inos && > irec_offset == XFS_INODES_PER_CHUNK) { > /* > * done! - finished up irec and block > @@ -900,7 +900,7 @@ process_inode_chunk( > icnt++; > cluster_offset++; > > - if (icnt == XFS_IALLOC_INODES(mp) && > + if (icnt == mp->m_ialloc_inos && > irec_offset == XFS_INODES_PER_CHUNK) { > /* > * done! - finished up irec and block simultaneously > @@ -1002,7 +1002,7 @@ process_aginodes( > * the next block before we call the processing routines. > */ > num_inos = XFS_INODES_PER_CHUNK; > - while (num_inos < XFS_IALLOC_INODES(mp) && ino_rec != NULL) { > + while (num_inos < mp->m_ialloc_inos && ino_rec != NULL) { > /* > * inodes chunks will always be aligned and sized > * correctly > @@ -1011,7 +1011,7 @@ process_aginodes( > num_inos += XFS_INODES_PER_CHUNK; > } > > - ASSERT(num_inos == XFS_IALLOC_INODES(mp)); > + ASSERT(num_inos == mp->m_ialloc_inos); > > if (pf_args) { > sem_post(&pf_args->ra_count); > @@ -1043,7 +1043,7 @@ process_aginodes( > */ > num_inos = 0; > ino_rec = first_ino_rec; > - while (num_inos < XFS_IALLOC_INODES(mp) && > + while (num_inos < mp->m_ialloc_inos && > ino_rec != NULL) { > prev_ino_rec = ino_rec; > > @@ -1227,7 +1227,7 @@ process_uncertain_aginodes(xfs_mount_t *mp, xfs_agnumber_t agno) > * processing may add more records to the > * uncertain inode lists. > */ > - if (process_inode_chunk(mp, agno, XFS_IALLOC_INODES(mp), > + if (process_inode_chunk(mp, agno, mp->m_ialloc_inos, > nrec, 1, 0, 0, &bogus)) { > /* XXX - i/o error, we've got a problem */ > abort(); > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 65fedf5..2cd3d5a 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -711,7 +711,7 @@ pf_queuing_worker( > cur_irec = irec; > > num_inos = XFS_INODES_PER_CHUNK; > - while (num_inos < XFS_IALLOC_INODES(mp) && irec != NULL) { > + while (num_inos < mp->m_ialloc_inos && irec != NULL) { > irec = next_ino_rec(irec); > num_inos += XFS_INODES_PER_CHUNK; > } > @@ -749,7 +749,7 @@ pf_queuing_worker( > : B_INODE); > bno += blks_per_cluster; > num_inos += inodes_per_cluster; > - } while (num_inos < XFS_IALLOC_INODES(mp)); > + } while (num_inos < mp->m_ialloc_inos); > } > > pthread_mutex_lock(&args->lock); > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 16:10:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 88F5B29DFD for ; Mon, 5 May 2014 16:10:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58D95304032 for ; Mon, 5 May 2014 14:10:02 -0700 (PDT) X-ASG-Debug-ID: 1399324201-04bdf02b8c355c00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L2koRWhZsA6jsec7 for ; Mon, 05 May 2014 14:10: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45LA0Ci031123 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:10:00 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45LA0lM031224; Mon, 5 May 2014 17:10:00 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id B490C120AC3; Mon, 5 May 2014 17:09:59 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45L9xYq014195; Mon, 5 May 2014 17:09:59 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:09:58 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 2/6] xfsprogs: get rid of XFS_INODE_CLUSTER_SIZE macros Message-ID: <20140505210958.GC13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfsprogs: get rid of XFS_INODE_CLUSTER_SIZE macros References: <536784C6.8000009@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784C6.8000009@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399324201 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, May 05, 2014 at 08:32:06PM +0800, Jeff Liu wrote: > From: Jie Liu > > Get rid of XFS_INODE_CLUSTER_SIZE() macros, use mp->m_inode_cluster_size > directly. > > Signed-off-by: Jie Liu > --- Reviewed-by: Brian Foster > include/xfs_ialloc.h | 1 - > libxfs/xfs_ialloc.c | 10 +++++----- > libxfs/xfs_trans_resv.c | 2 +- > repair/dino_chunks.c | 2 +- > repair/prefetch.c | 6 +++--- > repair/xfs_repair.c | 2 +- > 6 files changed, 11 insertions(+), 12 deletions(-) > > diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h > index 4689b02..4026933 100644 > --- a/include/xfs_ialloc.h > +++ b/include/xfs_ialloc.h > @@ -34,7 +34,6 @@ struct xfs_btree_cur; > * Move inodes in clusters of this size. > */ > #define XFS_INODE_BIG_CLUSTER_SIZE 8192 > -#define XFS_INODE_CLUSTER_SIZE(mp) (mp)->m_inode_cluster_size > > /* > * Make an inode pointer out of the buffer/offset. > diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c > index 108f6f2..bd47971 100644 > --- a/libxfs/xfs_ialloc.c > +++ b/libxfs/xfs_ialloc.c > @@ -28,7 +28,7 @@ xfs_ialloc_cluster_alignment( > { > if (xfs_sb_version_hasalign(&args->mp->m_sb) && > args->mp->m_sb.sb_inoalignmt >= > - XFS_B_TO_FSBT(args->mp, XFS_INODE_CLUSTER_SIZE(args->mp))) > + XFS_B_TO_FSBT(args->mp, args->mp->m_inode_cluster_size)) > return args->mp->m_sb.sb_inoalignmt; > return 1; > } > @@ -157,12 +157,12 @@ xfs_ialloc_inode_init( > * For small block sizes, manipulate the inodes in buffers > * which are multiples of the blocks size. > */ > - if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { > + if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) { > blks_per_cluster = 1; > nbufs = length; > ninodes = mp->m_sb.sb_inopblock; > } else { > - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) / > + blks_per_cluster = mp->m_inode_cluster_size / > mp->m_sb.sb_blocksize; > nbufs = length / blks_per_cluster; > ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; > @@ -1360,7 +1360,7 @@ xfs_imap( > return XFS_ERROR(EINVAL); > } > > - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; > + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > > /* > * For bulkstat and handle lookups, we have an untrusted inode number > @@ -1381,7 +1381,7 @@ xfs_imap( > * If the inode cluster size is the same as the blocksize or > * smaller we get to the buffer by simple arithmetics. > */ > - if (XFS_INODE_CLUSTER_SIZE(mp) <= mp->m_sb.sb_blocksize) { > + if (mp->m_inode_cluster_size <= mp->m_sb.sb_blocksize) { > offset = XFS_INO_TO_OFFSET(mp, ino); > ASSERT(offset < mp->m_sb.sb_inopblock); > > diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c > index 1e59fad..ba9c7b0 100644 > --- a/libxfs/xfs_trans_resv.c > +++ b/libxfs/xfs_trans_resv.c > @@ -369,7 +369,7 @@ xfs_calc_ifree_reservation( > xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + > MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > - XFS_INODE_CLUSTER_SIZE(mp)) + > + mp->m_inode_cluster_size) + > xfs_calc_buf_res(1, 0) + > xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > mp->m_in_maxlevels, 0) + > diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c > index 15aa4f8..2c2fd79 100644 > --- a/repair/dino_chunks.c > +++ b/repair/dino_chunks.c > @@ -598,7 +598,7 @@ process_inode_chunk( > *bogus = 0; > ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); > > - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; > + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > if (blks_per_cluster == 0) > blks_per_cluster = 1; > cluster_count = XFS_INODES_PER_CHUNK / inodes_per_cluster; > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 2cd3d5a..25ceb34 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -682,7 +682,7 @@ pf_queuing_worker( > int i; > int err; > > - blks_per_cluster = XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_blocklog; > + blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > if (blks_per_cluster == 0) > blks_per_cluster = 1; > > @@ -844,8 +844,8 @@ start_inode_prefetch( > */ > > max_queue = libxfs_bcache->c_maxcount / thread_count / 8; > - if (XFS_INODE_CLUSTER_SIZE(mp) > mp->m_sb.sb_blocksize) > - max_queue = max_queue * (XFS_INODE_CLUSTER_SIZE(mp) >> > + if (mp->m_inode_cluster_size > mp->m_sb.sb_blocksize) > + max_queue = max_queue * (mp->m_inode_cluster_size >> > mp->m_sb.sb_blocklog) / XFS_IALLOC_BLOCKS(mp); > > sem_init(&args->ra_count, 0, max_queue); > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > index 08b25f0..b6d070b 100644 > --- a/repair/xfs_repair.c > +++ b/repair/xfs_repair.c > @@ -618,7 +618,7 @@ main(int argc, char **argv) > chunks_pblock = mp->m_sb.sb_inopblock / XFS_INODES_PER_CHUNK; > max_symlink_blocks = libxfs_symlink_blocks(mp, MAXPATHLEN); > inodes_per_cluster = MAX(mp->m_sb.sb_inopblock, > - XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); > + mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog); > > /* > * Automatic striding for high agcount filesystems. > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 16:10:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D955629DFD for ; Mon, 5 May 2014 16:10:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 906A0304032 for ; Mon, 5 May 2014 14:10:38 -0700 (PDT) X-ASG-Debug-ID: 1399324234-04bdf02b8a355ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ttk4sFBMQbmpBski for ; Mon, 05 May 2014 14:10: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAYTZ019686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:10:34 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAX5Y000334; Mon, 5 May 2014 17:10:33 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 39E8B120AC3; Mon, 5 May 2014 17:10:33 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45LAWPd014261; Mon, 5 May 2014 17:10:32 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:10:31 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 5/6] xfsprogs: use xfs_icluster_size_fsb in xfs_ialloc_inode_init Message-ID: <20140505211030.GF13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfsprogs: use xfs_icluster_size_fsb in xfs_ialloc_inode_init References: <536784D9.1030502@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784D9.1030502@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399324234 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, May 05, 2014 at 08:32:25PM +0800, Jeff Liu wrote: > From: Jie Liu > > Use xfs_icluster_size_fsb() in xfs_ialloc_inode_init(), rename variable > ninodes to inodes_per_cluster as the latter is more meaningful. > > Signed-off-by: Jie Liu > --- Reviewed-by: Brian Foster > libxfs/xfs_ialloc.c | 17 +++++------------ > 1 file changed, 5 insertions(+), 12 deletions(-) > > diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c > index a3a1c75..7d2ae8d 100644 > --- a/libxfs/xfs_ialloc.c > +++ b/libxfs/xfs_ialloc.c > @@ -146,7 +146,7 @@ xfs_ialloc_inode_init( > { > struct xfs_buf *fbuf; > struct xfs_dinode *free; > - int blks_per_cluster, nbufs, ninodes; > + int nbufs, blks_per_cluster, inodes_per_cluster; > int version; > int i, j; > xfs_daddr_t d; > @@ -157,16 +157,9 @@ xfs_ialloc_inode_init( > * For small block sizes, manipulate the inodes in buffers > * which are multiples of the blocks size. > */ > - if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) { > - blks_per_cluster = 1; > - nbufs = length; > - ninodes = mp->m_sb.sb_inopblock; > - } else { > - blks_per_cluster = mp->m_inode_cluster_size / > - mp->m_sb.sb_blocksize; > - nbufs = length / blks_per_cluster; > - ninodes = blks_per_cluster * mp->m_sb.sb_inopblock; > - } > + blks_per_cluster = xfs_icluster_size_fsb(mp); > + inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; > + nbufs = length / blks_per_cluster; > > /* > * Figure out what version number to use in the inodes we create. If > @@ -222,7 +215,7 @@ xfs_ialloc_inode_init( > /* Initialize the inode buffers and log them appropriately. */ > fbuf->b_ops = &xfs_inode_buf_ops; > xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); > - for (i = 0; i < ninodes; i++) { > + for (i = 0; i < inodes_per_cluster; i++) { > int ioffset = i << mp->m_sb.sb_inodelog; > uint isize = xfs_dinode_size(version); > > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 16:10:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 51B6A29E17 for ; Mon, 5 May 2014 16:10:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3EFAA30404E for ; Mon, 5 May 2014 14:10:43 -0700 (PDT) X-ASG-Debug-ID: 1399324242-04cb6c7290360020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HkF4xPeTv1f9Csoq for ; Mon, 05 May 2014 14:10: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAe34015717 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:10:40 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAeAA017146; Mon, 5 May 2014 17:10:40 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 2F641120AC3; Mon, 5 May 2014 17:10:40 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45LAdJi014264; Mon, 5 May 2014 17:10:39 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:10:39 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 6/6] use xfs_icluster_size_fsb in xfs_imap Message-ID: <20140505211038.GG13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] use xfs_icluster_size_fsb in xfs_imap References: <536784DF.5040509@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784DF.5040509@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399324242 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, May 05, 2014 at 08:32:31PM +0800, Jeff Liu wrote: > From: Jie Liu > > Use xfs_icluster_size_fsb() in xfs_imap(). > > Signed-off-by: Jie Liu > --- Reviewed-by: Brian Foster > libxfs/xfs_ialloc.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c > index 7d2ae8d..c8967db 100644 > --- a/libxfs/xfs_ialloc.c > +++ b/libxfs/xfs_ialloc.c > @@ -1353,7 +1353,7 @@ xfs_imap( > return XFS_ERROR(EINVAL); > } > > - blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > + blks_per_cluster = xfs_icluster_size_fsb(mp); > > /* > * For bulkstat and handle lookups, we have an untrusted inode number > @@ -1374,7 +1374,7 @@ xfs_imap( > * If the inode cluster size is the same as the blocksize or > * smaller we get to the buffer by simple arithmetics. > */ > - if (mp->m_inode_cluster_size <= mp->m_sb.sb_blocksize) { > + if (blks_per_cluster == 1) { > offset = XFS_INO_TO_OFFSET(mp, ino); > ASSERT(offset < mp->m_sb.sb_inopblock); > > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon May 5 16:23:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 991957F66 for ; Mon, 5 May 2014 16:23:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 000C2AC007 for ; Mon, 5 May 2014 14:23:41 -0700 (PDT) X-ASG-Debug-ID: 1399325018-04cb6c728f360bc0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 8Ximo6DztdiDwlGu for ; Mon, 05 May 2014 14:23:38 -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: AntMAJIAaFN5LEcvPGdsb2JhbAA/GoMGT4JuqB4GmgyBGxcDAQEBATg1giUBAQQBOhwcBwULCAMYCSUPBSUDBxoTiDkHDjbNKBaFQIgzSQeEPwSZM5Y7KzCBAQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:53:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhQMJ-0001So-P3; Tue, 06 May 2014 07:23:35 +1000 Date: Tue, 6 May 2014 07:23:35 +1000 From: Dave Chinner To: Andrey Korolyov Cc: "ceph-users@lists.ceph.com" , "xfs@oss.sgi.com" Subject: Re: Fatigue for XFS Message-ID: <20140505212335.GZ26353@dastard> X-ASG-Orig-Subj: Re: Fatigue for XFS References: <20140505203633.GW26353@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1399325018 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, May 06, 2014 at 12:59:27AM +0400, Andrey Korolyov wrote: > On Tue, May 6, 2014 at 12:36 AM, Dave Chinner wrote: > > On Mon, May 05, 2014 at 11:49:05PM +0400, Andrey Korolyov wrote: > >> Hello, > >> > >> We are currently exploring issue which can be related to Ceph itself > >> or to the XFS - any help is very appreciated. > >> > >> First, the picture: relatively old cluster w/ two years uptime and ten > >> months after fs recreation on every OSD, one of daemons started to > >> flap approximately once per day for couple of weeks, with no external > >> reason (bandwidth/IOPS/host issues). It looks almost the same every > >> time - OSD suddenly stop serving requests for a short period, gets > >> kicked out by peers report, then returns in a couple of seconds. Of > >> course, small but sensitive amount of requests are delayed by 15-30 > >> seconds twice, which is bad for us. The only thing which correlates > >> with this kick is a peak of I/O, not too large, even not consuming all > >> underlying disk utilization, but alone in the cluster and clearly > >> visible. Also there are at least two occasions *without* correlated > >> iowait peak. > > > > So, actual numbers and traces are the only thing that tell us what > > is happening during these events. See here: > > > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > > > If it happens at almost the same time every day, then I'd be looking > > at the crontabs to find what starts up about that time. output of > > top will also probably tell you what process is running, too. topio > > might be instructive, and blktrace almost certainly will be.... > > > >> I have two versions - we`re touching some sector on disk which is > >> about to be marked as dead but not displayed in SMART statistics or (I > > > > Doubt it - SMART doesn't cause OS visible IO dispatch spikes. > > > >> believe so) some kind of XFS fatigue, which can be more likely in this > >> case, since near-bad sector should be touched more frequently and > >> related impact could leave traces in dmesg/SMART from my experience. I > > > > I doubt that, too, because XFS doesn't have anything that is > > triggered on a daily basis inside it. Maybe you've got xfs_fsr set > > up on a cron job, though... > > > >> would like to ask if anyone has a simular experience before or can > >> suggest to poke existing file system in some way. If no suggestion > >> appear, I`ll probably reformat disk and, if problem will remain after > >> refill, replace it, but I think less destructive actions can be done > >> before. > > > > Yeah, monitoring and determining the process that is issuing the IO > > is what you need to find first. > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > Thanks Dave, > > there are definitely no cron set for specific time (though most of > lockups happened in a relatively small interval which correlates with > the Ceph snapshot operations). OK. FWIW, Ceph snapshots on XFS may not be immediately costly in terms of IO - they can be extremely costly after one is taken when the files in the snapshot are next written to. If you are snapshotting files that are currently being written to, then that's likely to cause immediate IO issues... > In at least one case no Ceph snapshot > operations (including delayed removal) happened and at least two when > no I/O peak was observed. We observed and eliminated weird lockups > related to the openswitch behavior before - we`re combining storage > and compute nodes, so quirks in the OVS datapath caused very > interesting and weird system-wide lockups on (supposedly) spinlock, > and we see 'pure' Ceph lockups on XFS at time with 3.4-3.7 kernels, > all of them was correlated with very high context switch peak. Until we determine what is triggering the IO, the application isn't really a concern. > Current issue is seemingly nothing to do with spinlock-like bugs or > just a hardware problem, we even rebooted problematic node to check if > the memory allocator may stuck at the border of specific NUMA node, > with no help, but first reappearance of this bug was delayed by some > days then. Disabling lazy allocation via specifying allocsize did > nothing too. It may look like I am insisting that it is XFS bug, where > Ceph version is more likely to appear because of way more complicated > logic and operation behaviour, but persistence on specific node across > relaunching of Ceph storage daemon suggests bug relation to the > unlucky byte sequence more than anything else. If it finally appear as > Ceph bug, it`ll ruin our expectations from two-year of close > experience with this product and if it is XFS bug, we haven`t see > anything like this before, thought we had a pretty collection of > XFS-related lockups on the earlier kernels. Long experience with triaging storage performance issues has taught me to ignore what anyone *thinks* is the cause of the problem; I rely on the data that is gathered to tell me what the problem is. I find that hard data has a nasty habit of busting assumptions, expectations, speculations and hypothesis... :) > If it helps, I > may collect a series of perf events during next appearance or exact > iostat output (mine graphics can say that the I/O was not choked > completely when peak appeared, that`s all). Before delving into perf events, we need to know what we are looking for. That's what things like iostat, vmstat, top, blktrace, etc will tell us - where to point the microscope. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 5 16:28:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C263D29DFD for ; Mon, 5 May 2014 16:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CA2D8F8035 for ; Mon, 5 May 2014 14:28:07 -0700 (PDT) X-ASG-Debug-ID: 1399325280-04bdf02b8b356d40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Em4gQdlb9AArRaLL for ; Mon, 05 May 2014 14:28:00 -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: ArlxALwBaFN5LEcvPGdsb2JhbABZgwZPgm6oHgZKAQGZQIEbFwMBAQEBODWCJQEBBTocIxAIAxgJJQ8FJQMHGhOIQA7NXhaFQIcBgXsHgyqBFQSVPoN1ljsrMA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 06 May 2014 06:57:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhQQZ-0001T9-45; Tue, 06 May 2014 07:27:59 +1000 Date: Tue, 6 May 2014 07:27:59 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code Message-ID: <20140505212759.GA26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code References: <536784B2.7090002@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784B2.7090002@oracle.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: 1399325280 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.5562 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 08:31:46PM +0800, Jeff Liu wrote: > Hi Folks, > > This patch series sync up the code differences between kernel and user space > for xfs_icluster_size_fsb() relevant changes, i.e, > http://oss.sgi.com/archives/xfs/2013-12/msg00499.html > > Most patches are similar to the kernel part except we have xfs_bulkstat() and > xfs_ifree_cluster() at kernel space but they are not presented at user space. Given that we need to do a wholesale resync of libxfs to the kernel code, I'm not sure it makes sense to do little bits out of order. it just makes syncing all the other prior changes harder because it causes patch conflicts... I'm planning that this is the first thing that we need to do after the 3.2.0 release before anything else.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon May 5 16:30:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CF43E7F6D for ; Mon, 5 May 2014 16:30:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72FC3AC003 for ; Mon, 5 May 2014 14:30:53 -0700 (PDT) X-ASG-Debug-ID: 1399325451-04bdf02b8d357090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pHRGYa4T5m4235TF for ; Mon, 05 May 2014 14:30: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s45LUk5Q023631 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:30:50 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAB4W010982; Mon, 5 May 2014 17:10:11 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id D94BE120AC3; Mon, 5 May 2014 17:10:10 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45LAAjH014255; Mon, 5 May 2014 17:10:10 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:10:09 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros Message-ID: <20140505211009.GD13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros References: <536784CD.60900@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784CD.60900@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399325451 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, May 05, 2014 at 08:32:13PM +0800, Jeff Liu wrote: > From: Jie Liu > > Get rid of XFS_IALLOC_BLOCKS() macros, use mp->m_ialloc_blks directly. > > Signed-off-by: Jie Liu > --- > db/check.c | 2 +- > db/frag.c | 2 +- > db/metadump.c | 2 +- > include/xfs_ialloc.h | 5 ----- > include/xfs_trans_space.h | 2 +- > libxfs/xfs_ialloc.c | 8 ++++---- > libxfs/xfs_trans_resv.c | 8 ++++---- > mkfs/proto.c | 2 +- > repair/dino_chunks.c | 24 ++++++++++++------------ > repair/prefetch.c | 2 +- > repair/xfs_repair.c | 4 ++-- > 11 files changed, 28 insertions(+), 33 deletions(-) > > diff --git a/db/check.c b/db/check.c > index 4fd9fd0..df98cc6 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -4223,7 +4223,7 @@ scanfunc_ino( > set_cur(&typtab[TYP_INODE], > XFS_AGB_TO_DADDR(mp, seqno, > XFS_AGINO_TO_AGBNO(mp, agino)), > - (int)XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), > + (int)XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), > DB_RING_IGN, NULL); > if (iocur_top->data == NULL) { > if (!sflag) > diff --git a/db/frag.c b/db/frag.c > index 2eb33d8..38b77e0 100644 > --- a/db/frag.c > +++ b/db/frag.c > @@ -484,7 +484,7 @@ scanfunc_ino( > set_cur(&typtab[TYP_INODE], > XFS_AGB_TO_DADDR(mp, seqno, > XFS_AGINO_TO_AGBNO(mp, agino)), > - XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), > + XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), > DB_RING_IGN, NULL); > if (iocur_top->data == NULL) { > dbprintf(_("can't read inode block %u/%u\n"), > diff --git a/db/metadump.c b/db/metadump.c > index 09bb85a..bae08cd 100644 > --- a/db/metadump.c > +++ b/db/metadump.c > @@ -1848,7 +1848,7 @@ copy_inode_chunk( > > push_cur(); > set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, agbno), > - XFS_FSB_TO_BB(mp, XFS_IALLOC_BLOCKS(mp)), > + XFS_FSB_TO_BB(mp, mp->m_ialloc_blks), > DB_RING_IGN, NULL); > if (iocur_top->data == NULL) { > print_warning("cannot read inode block %u/%u", agno, agbno); > diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h > index 4026933..0498f20 100644 > --- a/include/xfs_ialloc.h > +++ b/include/xfs_ialloc.h > @@ -26,11 +26,6 @@ struct xfs_trans; > struct xfs_btree_cur; > > /* > - * Allocation parameters for inode allocation. > - */ > -#define XFS_IALLOC_BLOCKS(mp) (mp)->m_ialloc_blks > - > -/* > * Move inodes in clusters of this size. > */ > #define XFS_INODE_BIG_CLUSTER_SIZE 8192 > diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h > index 7d2c920..af5dbe0 100644 > --- a/include/xfs_trans_space.h > +++ b/include/xfs_trans_space.h > @@ -47,7 +47,7 @@ > #define XFS_DIRREMOVE_SPACE_RES(mp) \ > XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) > #define XFS_IALLOC_SPACE_RES(mp) \ > - (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) > + ((mp)->m_ialloc_blks + (mp)->m_in_maxlevels - 1) > > /* > * Space reservation values for various transactions. > diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c > index bd47971..a3a1c75 100644 > --- a/libxfs/xfs_ialloc.c > +++ b/libxfs/xfs_ialloc.c > @@ -309,7 +309,7 @@ xfs_ialloc_ag_alloc( > if (args.mp->m_maxicount && > args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) > return XFS_ERROR(ENOSPC); > - args.minlen = args.maxlen = XFS_IALLOC_BLOCKS(args.mp); > + args.minlen = args.maxlen = args.mp->m_ialloc_blks; > /* > * First try to allocate inodes contiguous with the last-allocated > * chunk of inodes. If the filesystem is striped, this will fill > @@ -319,7 +319,7 @@ xfs_ialloc_ag_alloc( > newino = be32_to_cpu(agi->agi_newino); > agno = be32_to_cpu(agi->agi_seqno); > args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + > - XFS_IALLOC_BLOCKS(args.mp); > + args.mp->m_ialloc_blks; > if (likely(newino != NULLAGINO && > (args.agbno < be32_to_cpu(agi->agi_length)))) { > args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); > @@ -561,7 +561,7 @@ xfs_ialloc_ag_select( > * Is there enough free space for the file plus a block of > * inodes? (if we need to allocate some)? > */ > - ineed = XFS_IALLOC_BLOCKS(mp); > + ineed = mp->m_ialloc_blks; > longest = pag->pagf_longest; > if (!longest) > longest = pag->pagf_flcount > 0; > @@ -1206,7 +1206,7 @@ xfs_difree( > > xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, > agno, XFS_INO_TO_AGBNO(mp,rec.ir_startino)), > - XFS_IALLOC_BLOCKS(mp), flist, mp); > + mp->m_ialloc_blks, flist, mp); > } else { > *delete = 0; > > diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c > index ba9c7b0..93261f1 100644 > --- a/libxfs/xfs_trans_resv.c > +++ b/libxfs/xfs_trans_resv.c > @@ -157,7 +157,7 @@ xfs_calc_itruncate_reservation( > xfs_calc_buf_res(5, 0) + > xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > XFS_FSB_TO_B(mp, 1)) + > - xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + xfs_calc_buf_res(2 + mp->m_ialloc_blks + > mp->m_in_maxlevels, 0))); > } > > @@ -265,7 +265,7 @@ xfs_calc_create_resv_modify( > * For create we can allocate some inodes giving: > * the agi and agf of the ag getting the new inodes: 2 * sectorsize > * the superblock for the nlink flag: sector size > - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize > + * the inode blocks allocated: mp->m_ialloc_blks * blocksize > * the inode btree: max depth * blocksize > * the allocation btrees: 2 trees * (max depth - 1) * block size > */ > @@ -275,7 +275,7 @@ xfs_calc_create_resv_alloc( > { > return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > mp->m_sb.sb_sectsize + > - xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), XFS_FSB_TO_B(mp, 1)) + > + xfs_calc_buf_res(mp->m_ialloc_blks, XFS_FSB_TO_B(mp, 1)) + > xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + > xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > XFS_FSB_TO_B(mp, 1)); > @@ -371,7 +371,7 @@ xfs_calc_ifree_reservation( > MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), > mp->m_inode_cluster_size) + > xfs_calc_buf_res(1, 0) + > - xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + > + xfs_calc_buf_res(2 + mp->m_ialloc_blks + > mp->m_in_maxlevels, 0) + > xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > XFS_FSB_TO_B(mp, 1)); > diff --git a/mkfs/proto.c b/mkfs/proto.c > index 5a47e27..2689f75 100644 > --- a/mkfs/proto.c > +++ b/mkfs/proto.c > @@ -39,7 +39,7 @@ static long filesize(int fd); > * (basically no fragmentation). > */ > #define MKFS_BLOCKRES_INODE \ > - ((uint)(XFS_IALLOC_BLOCKS(mp) + ((mp)->m_in_maxlevels - 1))) > + ((uint)(mp->m_ialloc_blks + ((mp)->m_in_maxlevels - 1))) Nit: (mp) Probably not necessary here anyways... Reviewed-by: Brian Foster > #define MKFS_BLOCKRES(rb) \ > ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \ > (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb))) > diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c > index 2c2fd79..1bf1fca 100644 > --- a/repair/dino_chunks.c > +++ b/repair/dino_chunks.c > @@ -117,7 +117,7 @@ verify_inode_chunk(xfs_mount_t *mp, > agbno = XFS_INO_TO_AGBNO(mp, ino); > *start_ino = NULLFSINO; > > - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); > + ASSERT(mp->m_ialloc_blks > 0); > > if (agno == mp->m_sb.sb_agcount - 1) > max_agbno = mp->m_sb.sb_dblocks - > @@ -135,7 +135,7 @@ verify_inode_chunk(xfs_mount_t *mp, > * check for the easy case, inodes per block >= XFS_INODES_PER_CHUNK > * (multiple chunks per block) > */ > - if (XFS_IALLOC_BLOCKS(mp) == 1) { > + if (mp->m_ialloc_blks == 1) { > if (agbno > max_agbno) > return 0; > if (check_aginode_block(mp, agno, agino) == 0) > @@ -208,7 +208,7 @@ verify_inode_chunk(xfs_mount_t *mp, > */ > start_agbno = rounddown(XFS_INO_TO_AGBNO(mp, ino), > fs_ino_alignment); > - end_agbno = start_agbno + XFS_IALLOC_BLOCKS(mp); > + end_agbno = start_agbno + mp->m_ialloc_blks; > > /* > * if this fs has aligned inodes but the end of the > @@ -266,14 +266,14 @@ verify_inode_chunk(xfs_mount_t *mp, > * a discovered inode chunk completely within that range > * would include the inode passed into us. > */ > - if (XFS_IALLOC_BLOCKS(mp) > 1) { > + if (mp->m_ialloc_blks > 1) { > if (agino > mp->m_ialloc_inos) > - start_agbno = agbno - XFS_IALLOC_BLOCKS(mp) + 1; > + start_agbno = agbno - mp->m_ialloc_blks + 1; > else > start_agbno = 1; > } > > - end_agbno = agbno + XFS_IALLOC_BLOCKS(mp); > + end_agbno = agbno + mp->m_ialloc_blks; > > if (end_agbno > max_agbno) > end_agbno = max_agbno; > @@ -328,7 +328,7 @@ verify_inode_chunk(xfs_mount_t *mp, > > start_agbno = XFS_AGINO_TO_AGBNO(mp, > irec_p->ino_startnum) + > - XFS_IALLOC_BLOCKS(mp); > + mp->m_ialloc_blks; > > /* > * we know that the inode we're trying to verify isn't > @@ -351,7 +351,7 @@ verify_inode_chunk(xfs_mount_t *mp, > * the inode in question and that the space between them > * is too small for a legal inode chunk > */ > - if (end_agbno - start_agbno < XFS_IALLOC_BLOCKS(mp)) > + if (end_agbno - start_agbno < mp->m_ialloc_blks) > return(0); > > /* > @@ -395,7 +395,7 @@ verify_inode_chunk(xfs_mount_t *mp, > > num_blks = chunk_stop_agbno - chunk_start_agbno; > > - if (num_blks < XFS_IALLOC_BLOCKS(mp) || ino_cnt == 0) > + if (num_blks < mp->m_ialloc_blks || ino_cnt == 0) > return(0); > > /* > @@ -411,8 +411,8 @@ verify_inode_chunk(xfs_mount_t *mp, > * the chunk > */ > > - if (num_blks % XFS_IALLOC_BLOCKS(mp) != 0) { > - num_blks = rounddown(num_blks, XFS_IALLOC_BLOCKS(mp)); > + if (num_blks % mp->m_ialloc_blks != 0) { > + num_blks = rounddown(num_blks, mp->m_ialloc_blks); > chunk_stop_agbno = chunk_start_agbno + num_blks; > } > > @@ -596,7 +596,7 @@ process_inode_chunk( > ASSERT(XFS_AGINO_TO_OFFSET(mp, first_irec->ino_startnum) == 0); > > *bogus = 0; > - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); > + ASSERT(mp->m_ialloc_blks > 0); > > blks_per_cluster = mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > if (blks_per_cluster == 0) > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 25ceb34..e3dfd08 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -846,7 +846,7 @@ start_inode_prefetch( > max_queue = libxfs_bcache->c_maxcount / thread_count / 8; > if (mp->m_inode_cluster_size > mp->m_sb.sb_blocksize) > max_queue = max_queue * (mp->m_inode_cluster_size >> > - mp->m_sb.sb_blocklog) / XFS_IALLOC_BLOCKS(mp); > + mp->m_sb.sb_blocklog) / mp->m_ialloc_blks; > > sem_init(&args->ra_count, 0, max_queue); > > diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c > index b6d070b..5515de8 100644 > --- a/repair/xfs_repair.c > +++ b/repair/xfs_repair.c > @@ -441,9 +441,9 @@ calc_mkfs(xfs_mount_t *mp) > first_prealloc_ino = XFS_OFFBNO_TO_AGINO(mp, fino_bno, 0); > } > > - ASSERT(XFS_IALLOC_BLOCKS(mp) > 0); > + ASSERT(mp->m_ialloc_blks > 0); > > - if (XFS_IALLOC_BLOCKS(mp) > 1) > + if (mp->m_ialloc_blks > 1) > last_prealloc_ino = first_prealloc_ino + XFS_INODES_PER_CHUNK; > else > last_prealloc_ino = XFS_OFFBNO_TO_AGINO(mp, fino_bno + 1, 0); > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon May 5 16:47:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4689D29E0F for ; Mon, 5 May 2014 16:47:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22CAB304043 for ; Mon, 5 May 2014 14:47:01 -0700 (PDT) X-ASG-Debug-ID: 1399326420-04bdf02b8a358180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zVf4xRyGcqwJCLoO for ; Mon, 05 May 2014 14:47:00 -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 (8.14.4/8.14.4) with ESMTP id s45LkxSm028698 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 5 May 2014 17:46:59 -0400 Received: from laptop.bfoster (vpn-48-115.rdu2.redhat.com [10.10.48.115]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s45LAP94032766; Mon, 5 May 2014 17:10:25 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 261BA120AC3; Mon, 5 May 2014 17:10:25 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s45LAOEv014258; Mon, 5 May 2014 17:10:24 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 5 May 2014 17:10:24 -0400 From: Brian Foster To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH 4/6] xfsprogs: introduce xfs_icluster_size_fsb() Message-ID: <20140505211023.GE13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfsprogs: introduce xfs_icluster_size_fsb() References: <536784D4.1050405@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536784D4.1050405@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399326420 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, May 05, 2014 at 08:32:20PM +0800, Jeff Liu wrote: > From: Jie Liu > > Introduce a common routine xfs_icluster_size_fsb() to calculate > and return the number of file system blocks per inode cluster. > > Signed-off-by: Jie Liu > --- Reviewed-by: Brian Foster > include/xfs_ialloc.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h > index 0498f20..9dee62f 100644 > --- a/include/xfs_ialloc.h > +++ b/include/xfs_ialloc.h > @@ -30,6 +30,16 @@ struct xfs_btree_cur; > */ > #define XFS_INODE_BIG_CLUSTER_SIZE 8192 > > +/* Calculate and return the number of filesystem blocks per inode cluster */ > +static inline int > +xfs_icluster_size_fsb( > + struct xfs_mount *mp) > +{ > + if (mp->m_sb.sb_blocksize >= mp->m_inode_cluster_size) > + return 1; > + return mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog; > +} > + > /* > * Make an inode pointer out of the buffer/offset. > */ > -- > 1.8.3.2 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From dgc@oss.sgi.com Mon May 5 19:45:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id BB0FA7F96; Mon, 5 May 2014 19:45:19 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-fixes-for-3.15-rc5, created. xfs-for-linus-3.15-rc2-3-g8275cdd X-Git-Refname: refs/heads/xfs-fixes-for-3.15-rc5 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 8275cdd0e7ac550dcce2b3ef6d2fb3b808c1ae59 Message-Id: <20140506004519.BB0FA7F96@oss.sgi.com> Date: Mon, 5 May 2014 19:45:19 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-fixes-for-3.15-rc5 has been created at 8275cdd0e7ac550dcce2b3ef6d2fb3b808c1ae59 (commit) - Log ----------------------------------------------------------------- commit 8275cdd0e7ac550dcce2b3ef6d2fb3b808c1ae59 Author: Dave Chinner Date: Tue May 6 07:37:31 2014 +1000 xfs: remote attribute overwrite causes transaction overrun Commit e461fcb ("xfs: remote attribute lookups require the value length") passes the remote attribute length in the xfs_da_args structure on lookup so that CRC calculations and validity checking can be performed correctly by related code. This, unfortunately has the side effect of changing the args->valuelen parameter in cases where it shouldn't. That is, when we replace a remote attribute, the incoming replacement stores the value and length in args->value and args->valuelen, but then the lookup which finds the existing remote attribute overwrites args->valuelen with the length of the remote attribute being replaced. Hence when we go to create the new attribute, we create it of the size of the existing remote attribute, not the size it is supposed to be. When the new attribute is much smaller than the old attribute, this results in a transaction overrun and an ASSERT() failure on a debug kernel: XFS: Assertion failed: tp->t_blk_res_used <= tp->t_blk_res, file: fs/xfs/xfs_trans.c, line: 331 Fix this by keeping the remote attribute value length separate to the attribute value length in the xfs_da_args structure. The enables us to pass the length of the remote attribute to be removed without overwriting the new attribute's length. Also, ensure that when we save remote block contexts for a later rename we zero the original state variables so that we don't confuse the state of the attribute to be removes with the state of the new attribute that we just added. [Spotted by Brain Foster.] Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit d540e43b0ab134b22f015f725ce6e070d12b0244 Author: Brian Foster Date: Tue May 6 07:34:28 2014 +1000 xfs: initialize default acls for ->tmpfile() The current tmpfile handler does not initialize default ACLs. Doing so within xfs_vn_tmpfile() makes it roughly equivalent to xfs_vn_mknod(), which is already used as a common create handler. xfs_vn_mknod() does not currently have a mechanism to determine whether to link the file into the namespace. Therefore, further abstract xfs_vn_mknod() into a new xfs_generic_create() handler with a tmpfile parameter. This new handler calls xfs_create_tmpfile() and d_tmpfile() on the dentry when called via ->tmpfile(). Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit c99d609a16506602a7398eea7d12b13513f3d889 Author: Dave Chinner Date: Mon May 5 16:18:37 2014 +1000 xfs: fully support v5 format filesystems We have had this code in the kernel for over a year now and have shaken all the known issues out of the code over the past few releases. It's now time to remove the experimental warnings during mount and fully support the new filesystem format in production systems. Remove the experimental warning, and add a version number to the initial "mounting filesystem" message to tell use what type of filesystem is being mounted. Also, remove the temporary inode cluster size output at mount time now we know that this code works fine. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Mon May 5 19:45:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 8F13529DF8; Mon, 5 May 2014 19:45:35 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc2-47-gd4f8a22 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: b8b39d39f94c0d3ea5771d1df3151c569599c20a X-Git-Newrev: d4f8a227bda5d95a2280bd2a96ad0a0b545349da Message-Id: <20140506004535.8F13529DF8@oss.sgi.com> Date: Mon, 5 May 2014 19:45:35 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated d4f8a22 Merge branch 'xfs-fixes-for-3.15-rc5' into for-next 8275cdd xfs: remote attribute overwrite causes transaction overrun d540e43 xfs: initialize default acls for ->tmpfile() c99d609 xfs: fully support v5 format filesystems from b8b39d39f94c0d3ea5771d1df3151c569599c20a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d4f8a227bda5d95a2280bd2a96ad0a0b545349da Merge: b8b39d3 8275cdd Author: Dave Chinner Date: Tue May 6 10:02:13 2014 +1000 Merge branch 'xfs-fixes-for-3.15-rc5' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_attr.c | 24 ++++++++++++++++++++- fs/xfs/xfs_attr_leaf.c | 21 +++++++++--------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 8 ++++--- fs/xfs/xfs_da_btree.h | 2 ++ fs/xfs/xfs_iops.c | 55 +++++++++++++++++++++++++----------------------- fs/xfs/xfs_log.c | 10 +++++---- fs/xfs/xfs_mount.c | 2 -- fs/xfs/xfs_sb.c | 4 ---- 9 files changed, 77 insertions(+), 50 deletions(-) hooks/post-receive -- XFS development tree From dave@fromorbit.com Mon May 5 20:05:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 14D2A29DF8 for ; Mon, 5 May 2014 20:05:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E149D8F8035 for ; Mon, 5 May 2014 18:05:00 -0700 (PDT) X-ASG-Debug-ID: 1399338294-04cbb03cc634d7f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DKbrct0cWKAuCfQV for ; Mon, 05 May 2014 18:04:55 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq1MAGA0aFN5LEcvPGdsb2JhbABZgwaIR6MeBpsnFwMBAQEBODWCJQEtLzsYagMHLYhAmQ60ZoVWjUIEpDKLPCs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 10:34:42 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhToG-00027r-BX for xfs@oss.sgi.com; Tue, 06 May 2014 11:04:40 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhToG-0002c7-AZ for xfs@oss.sgi.com; Tue, 06 May 2014 11:04:40 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown Date: Tue, 6 May 2014 11:04:40 +1000 X-ASG-Orig-Subj: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown Message-Id: <1399338280-10013-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399338295 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.5572 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Reports of a shutdown hang when fsyncing a directory have surfaced, such as this: [ 3663.394472] Call Trace: [ 3663.397199] [] schedule+0x29/0x70 [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] [ 3663.435873] [] do_fsync+0x65/0xa0 [ 3663.441408] [] SyS_fsync+0x10/0x20 [ 3663.447043] [] system_call_fastpath+0x16/0x1b If we trigger a shutdown in xlog_cil_push() from xlog_write(), we will never wake waiters on the current push sequence number, so anything waiting in xlog_cil_force_lsn() for that push sequence number to come up will not get woken and hence stall the shutdown. Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in the push abort handling, in the log shutdown code when waking all waiters, and adding a shutdown check in the sequence completion wait loops to ensure they abort when a wakeup due to a shutdown occurs. Reported-by: Boris Ranto Reported-by: Eric Sandeen Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 7 +++++-- fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a5f8bd9..dbba2d7 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3952,11 +3952,14 @@ xfs_log_force_umount( retval = xlog_state_ioerror(log); spin_unlock(&log->l_icloglock); } + /* - * Wake up everybody waiting on xfs_log_force. - * Callback all log item committed functions as if the + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone + * waiting on a CIL push that is issued as part of a log force first + * before running the log item committed callback functions as if the * log writes were completed. */ + wake_up_all(&log->l_cilp->xc_commit_wait); xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); #ifdef XFSERRORDEBUG diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 7e54553..039c873 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -385,7 +385,15 @@ xlog_cil_committed( xfs_extent_busy_clear(mp, &ctx->busy_extents, (mp->m_flags & XFS_MOUNT_DISCARD) && !abort); + /* + * If we are aborting the commit, wake up anyone waiting on the + * committing list. If we don't, then a shutdown we can leave processes + * waiting in xlog_cil_force_lsn() waiting on a sequence commit that + * will never happen because we aborted it. + */ spin_lock(&ctx->cil->xc_push_lock); + if (abort) + wake_up_all(&ctx->cil->xc_commit_wait); list_del(&ctx->committing); spin_unlock(&ctx->cil->xc_push_lock); @@ -564,8 +572,18 @@ restart: spin_lock(&cil->xc_push_lock); list_for_each_entry(new_ctx, &cil->xc_committing, committing) { /* + * Avoid getting stuck in this loop because we were woken by the + * shutdown, but then went back to sleep once already in the + * shutdown state. + */ + if (XLOG_FORCED_SHUTDOWN(log)) { + spin_unlock(&cil->xc_push_lock); + goto out_abort_free_ticket; + } + + /* * Higher sequences will wait for this one so skip them. - * Don't wait for own own sequence, either. + * Don't wait for our own sequence, either. */ if (new_ctx->sequence >= ctx->sequence) continue; @@ -810,6 +828,13 @@ restart: */ spin_lock(&cil->xc_push_lock); list_for_each_entry(ctx, &cil->xc_committing, committing) { + /* + * Avoid getting stuck in this loop because we were woken by the + * shutdown, but then went back to sleep once already in the + * shutdown state. + */ + if (XLOG_FORCED_SHUTDOWN(log)) + goto out_shutdown; if (ctx->sequence > sequence) continue; if (!ctx->commit_lsn) { @@ -833,14 +858,12 @@ restart: * push sequence after the above wait loop and the CIL still contains * dirty objects. * - * When the push occurs, it will empty the CIL and - * atomically increment the currect sequence past the push sequence and - * move it into the committing list. Of course, if the CIL is clean at - * the time of the push, it won't have pushed the CIL at all, so in that - * case we should try the push for this sequence again from the start - * just in case. + * When the push occurs, it will empty the CIL and atomically increment + * the currect sequence past the push sequence and move it into the + * committing list. Of course, if the CIL is clean at the time of the + * push, it won't have pushed the CIL at all, so in that case we should + * try the push for this sequence again from the start just in case. */ - if (sequence == cil->xc_current_sequence && !list_empty(&cil->xc_cil)) { spin_unlock(&cil->xc_push_lock); @@ -849,6 +872,17 @@ restart: spin_unlock(&cil->xc_push_lock); return commit_lsn; + + /* + * We detected a shutdown in progress. We need to trigger the log force + * to pass through it's iclog state machine error handling, even though + * we are already in a shutdown state. Hence we can't return + * NULLCOMMITLSN here as that has special meaning to log forces (i.e. + * LSN is already stable), so we return a zero LSN instead. + */ +out_shutdown: + spin_unlock(&cil->xc_push_lock); + return 0; } /* -- 1.9.0 From debbugs@buxtehude.debian.org Mon May 5 20:42:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 49B8C7F60 for ; Mon, 5 May 2014 20:42:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2198230404E for ; Mon, 5 May 2014 18:42:14 -0700 (PDT) X-ASG-Debug-ID: 1399340530-04cbb03cc434f5e0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 3Hb99FTfkqc6hElg (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 05 May 2014 18:42:10 -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.80) (envelope-from ) id 1WhUOV-0005ou-Km; Tue, 06 May 2014 01:42:07 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#747080: xfsprogs: new upstream release (2013-05-08 v3.1.11) Reply-To: Nathan Scott , 747080@bugs.debian.org X-ASG-Orig-Subj: Bug#747080: xfsprogs: new upstream release (2013-05-08 v3.1.11) 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: Tue, 06 May 2014 01:42:04 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 747080 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 747080-submit@bugs.debian.org id=B747080.139934036021068 (code B ref 747080); Tue, 06 May 2014 01:42:04 +0000 Received: (at 747080) by bugs.debian.org; 6 May 2014 01:39:20 +0000 Received: from mx6-phx2.redhat.com ([209.132.183.39]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1WhULo-0005Tc-1r for 747080@bugs.debian.org; Tue, 06 May 2014 01:39:20 +0000 Received: from zmail20.collab.prod.int.phx2.redhat.com (zmail20.collab.prod.int.phx2.redhat.com [10.5.83.23]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s461dHkd010040; Mon, 5 May 2014 21:39:18 -0400 Date: Mon, 5 May 2014 21:39:17 -0400 (EDT) From: Nathan Scott To: Florian Ernst , 747080@bugs.debian.org Message-ID: <173952161.1236134.1399340357830.JavaMail.zimbra@redhat.com> In-Reply-To: <20140505124859.GA19836@fernst.no-ip.org> References: <20140505124859.GA19836@fernst.no-ip.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.82.11] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF17 (Linux)/8.0.6_GA_5922) Thread-Topic: Bug#747080: xfsprogs: new upstream release (2013-05-08 v3.1.11) Thread-Index: BfP7xDTqigxl1c0ohyFGOCARImQuVg== Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1399340530 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.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.5572 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > Package: xfsprogs > Version: 3.1.9 > Severity: wishlist > > Hello there, > > please consider updating the package to the newest upstream release, see > Hi Flo, There is a pending xfsprogs-3.2.0 release - I've been working on ensuring the build and packaging and clean there. I'm planning to upload that right after its released, which I'm led to believe is just days away. cheers. -- Nathan From jeff.liu@oracle.com Mon May 5 20:51:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 06EFD7F66 for ; Mon, 5 May 2014 20:51:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68D89AC003 for ; Mon, 5 May 2014 18:51:01 -0700 (PDT) X-ASG-Debug-ID: 1399341059-04cbb03cc634fc70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 2y60icDUo2U3F6ro (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 18:51:00 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s461ow9s031061 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 May 2014 01:50:59 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s461ovIR025788 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 6 May 2014 01:50:58 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s461ovsa003390; Tue, 6 May 2014 01:50:57 GMT Received: from [192.168.1.101] (/112.238.87.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 18:50:57 -0700 Message-ID: <53683FFE.2080909@oracle.com> Date: Tue, 06 May 2014 09:50:54 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Brian Foster CC: "xfs@oss.sgi.com" Subject: Re: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros References: <536784CD.60900@oracle.com> <20140505211009.GD13973@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfsprogs: get rid of XFS_IALLOC_BLOCKS macros In-Reply-To: <20140505211009.GD13973@laptop.bfoster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399341059 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.5573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/06 2014 05:10 AM, Brian Foster wrote: > On Mon, May 05, 2014 at 08:32:13PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Get rid of XFS_IALLOC_BLOCKS() macros, use mp->m_ialloc_blks directly. >> >> Signed-off-by: Jie Liu >> --- >> db/check.c | 2 +- >> db/frag.c | 2 +- >> db/metadump.c | 2 +- >> include/xfs_ialloc.h | 5 ----- >> include/xfs_trans_space.h | 2 +- >> libxfs/xfs_ialloc.c | 8 ++++---- >> libxfs/xfs_trans_resv.c | 8 ++++---- >> mkfs/proto.c | 2 +- >> repair/dino_chunks.c | 24 ++++++++++++------------ >> repair/prefetch.c | 2 +- >> repair/xfs_repair.c | 4 ++-- >> 11 files changed, 28 insertions(+), 33 deletions(-) >> >> diff --git a/mkfs/proto.c b/mkfs/proto.c >> index 5a47e27..2689f75 100644 >> --- a/mkfs/proto.c >> +++ b/mkfs/proto.c >> @@ -39,7 +39,7 @@ static long filesize(int fd); >> * (basically no fragmentation). >> */ >> #define MKFS_BLOCKRES_INODE \ >> - ((uint)(XFS_IALLOC_BLOCKS(mp) + ((mp)->m_in_maxlevels - 1))) >> + ((uint)(mp->m_ialloc_blks + ((mp)->m_in_maxlevels - 1))) > Nit: (mp) > > Probably not necessary here anyways... Nice catch, thanks for your review. Cheers, -Jeff From jeff.liu@oracle.com Mon May 5 21:33:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E8E8629E14 for ; Mon, 5 May 2014 21:33:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C01F18F8033 for ; Mon, 5 May 2014 19:33:55 -0700 (PDT) X-ASG-Debug-ID: 1399343633-04cb6c1fcc21f660001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 0gNXMEsHEyP54kp8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 19:33:54 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s462Xkpm030518 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 May 2014 02:33:47 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s462Xj0N000222 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 6 May 2014 02:33:46 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s462XjQa004355; Tue, 6 May 2014 02:33:45 GMT Received: from [192.168.1.101] (/112.238.87.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 19:33:45 -0700 Message-ID: <53684A06.3020202@oracle.com> Date: Tue, 06 May 2014 10:33:42 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code References: <536784B2.7090002@oracle.com> <20140505212759.GA26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6] xfsprogs: sync kernel inode cluster size refactor code In-Reply-To: <20140505212759.GA26353@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399343634 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.5573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/06 2014 05:27 AM, Dave Chinner wrote: > On Mon, May 05, 2014 at 08:31:46PM +0800, Jeff Liu wrote: >> Hi Folks, >> >> This patch series sync up the code differences between kernel and user space >> for xfs_icluster_size_fsb() relevant changes, i.e, >> http://oss.sgi.com/archives/xfs/2013-12/msg00499.html >> >> Most patches are similar to the kernel part except we have xfs_bulkstat() and >> xfs_ifree_cluster() at kernel space but they are not presented at user space. > > Given that we need to do a wholesale resync of libxfs to the kernel > code, I'm not sure it makes sense to do little bits out of order. > it just makes syncing all the other prior changes harder because it > causes patch conflicts... > > I'm planning that this is the first thing that we need to do > after the 3.2.0 release before anything else.... Ok, so let's complete it at that point. Cheers, -Jeff From dave@fromorbit.com Mon May 5 22:42:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 223167F93 for ; Mon, 5 May 2014 22:42:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABD5DAC003 for ; Mon, 5 May 2014 20:42:15 -0700 (PDT) X-ASG-Debug-ID: 1399347732-04bdf02b8b36ad00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rM7REAzFnJ8SEGi7 for ; Mon, 05 May 2014 20:42:13 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqJTAOpYaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEtLzsYagMHLYhAmRS0cYVWiBiBAYQpBK1uggcrgTA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:12:11 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWGf-0002TP-0y for xfs@oss.sgi.com; Tue, 06 May 2014 13:42:09 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWGf-00059B-00 for xfs@oss.sgi.com; Tue, 06 May 2014 13:42:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix directory readahead offset off-by-one Date: Tue, 6 May 2014 13:42:08 +1000 X-ASG-Orig-Subj: [PATCH] xfs: fix directory readahead offset off-by-one Message-Id: <1399347728-19752-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399347732 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.5574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Directory readahead can throw loud scary but harmless warnings when multiblock directories are in use a specific pattern of discontiguous blocks are found in the directory. That is, if a hole follows a discontiguous block, it will throw a warning like: XFS (dm-1): xfs_da_do_buf: bno 637 dir: inode 34363923462 XFS (dm-1): [00] br_startoff 637 br_startblock 1917954575 br_blockcount 1 br_state 0 XFS (dm-1): [01] br_startoff 638 br_startblock -2 br_blockcount 1 br_state 0 And dump a stack trace. This is because the readahead offset increment loop does a double increment of the block index - it does an increment for the loop iteration as well as increase the loop counter by the number of blocks in the extent. As a result, the readahead offset does not get incremented correctly for discontiguous blocks and hence can ask for readahead of a directory block from an offset part way through a directory block. If that directory block is followed by a hole, it will trigger a mapping warning like the above. The bad readahead will be ignored, though, because the main directory block read loop uses the correct mapping offsets rather than the readahead offset and so will ignore the bad readahead altogether. Fix the warning by ensuring that the readahead offset is correctly incremented. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_readdir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 50b72f7..fe2db98 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -456,7 +456,7 @@ xfs_dir2_leaf_readbuf( /* * Advance offset through the mapping table. */ - for (j = 0; j < mp->m_dirblkfsbs; j++) { + for (j = 0; j < mp->m_dirblkfsbs; ) { /* * The rest of this extent but not more than a dir * block. -- 1.9.0 From dave@fromorbit.com Mon May 5 22:56:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 515FC7F99 for ; Mon, 5 May 2014 22:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD8AAAC002 for ; Mon, 5 May 2014 20:56:09 -0700 (PDT) X-ASG-Debug-ID: 1399348563-04cbb03cc7355b60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6Y4Uh8ADYJZ36nCC for ; Mon, 05 May 2014 20:56:03 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlDPAJxcaFN5LEcvPGdsb2JhbABZgwZPqn8CFQEBAQEBAQEFmycXAwEBAQE4NYMCO4ECAweIbQ6ZCbRwhVaHAYIYhCkErW6CBysw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Us-G9 for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005IY-F1 for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/5] xfs: sanitise supberlock feature bit support Date: Tue, 6 May 2014 13:55:54 +1000 X-ASG-Orig-Subj: [PATCH 0/5] xfs: sanitise supberlock feature bit support Message-Id: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348563 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patchset is a followup to the original feature bit cleanup patch I sent here: http://oss.sgi.com/archives/xfs/2014-03/msg00101.html It basically removes all the old cruft that we inherited from Irix (such as tests and conversion to/from v1-3 superblocks) that we've never supported on Linux. On Linux, we've ony ever supported V2 directories, and so anything that doesn't know about V2 directories is simply going to be rejected at mount time. Hence we don't need all the code to handle versions older than this. Nor do we care about Irix bootloader feature bit masks (the SASH feature bits) or about things that were never implemented like shared readonly superblock support. Hence we can remove a fairly large chunk of complexity out of the feature bit testing if we only test for things that we can support. Further, we should really always use to v2 inodes these days on v4 superblock filesystems. We've been setting the NLINK feature bit by default at mkfs time since 2007, so no we make the kernel set it by default at mount time, too. This means that we always convert v1 inodes to v2 inodes, and so reduce the number of different code paths we need to test and support. Thoughts, comments? Cheers, Dave. From dave@fromorbit.com Mon May 5 22:56:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BBAEF7F99 for ; Mon, 5 May 2014 22: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 AB8AF8F8035 for ; Mon, 5 May 2014 20:56:10 -0700 (PDT) X-ASG-Debug-ID: 1399348568-04cbb03cc6355b70001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id PaAOLRV5NLA4BJHb for ; Mon, 05 May 2014 20:56:09 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqhTAJxcaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDOB4VWiRmEKQSvdSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Uw-Hp for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005Iq-H4 for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: don't need dirv2 checks anymore Date: Tue, 6 May 2014 13:55:58 +1000 X-ASG-Orig-Subj: [PATCH 4/5] xfs: don't need dirv2 checks anymore Message-Id: <1399348559-19889-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399348559-19889-1-git-send-email-david@fromorbit.com> References: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348568 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If the the V2 directory feature bit is not set in the superblock feature mask the filesystem will fail the good version check. Hence we don't need any other version checking on the dir2 feature bit in the code as the filesystem will not mount without it set. Remove the checking code. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_fsops.c | 3 +-- fs/xfs/xfs_sb.c | 9 --------- fs/xfs/xfs_sb.h | 6 ------ 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index e365c98..93fcebd 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -92,7 +92,7 @@ xfs_dir_mount( int nodehdr_size; - ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); + ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= XFS_MAX_BLOCKSIZE); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 2a03f2d..b099799 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -75,6 +75,7 @@ xfs_fs_geometry( if (new_version >= 3) { geo->version = XFS_FSOP_GEOM_VERSION; geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | + XFS_FSOP_GEOM_FLAGS_DIRV2 | (xfs_sb_version_hasattr(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_ATTR : 0) | (xfs_sb_version_hasquota(&mp->m_sb) ? @@ -87,8 +88,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_SHARED : 0) | (xfs_sb_version_hasextflgbit(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | - (xfs_sb_version_hasdirv2(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) | (xfs_sb_version_hassector(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | (xfs_sb_version_hasasciici(&mp->m_sb) ? diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index 8baf61a..de16dd5 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -333,15 +333,6 @@ xfs_mount_validate_sb( xfs_warn(mp, "Offline file system operation in progress!"); return XFS_ERROR(EFSCORRUPTED); } - - /* - * Version 1 directory format has never worked on Linux. - */ - if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { - xfs_warn(mp, "file system using version 1 directory format"); - return XFS_ERROR(ENOSYS); - } - return 0; } diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index b238a0e..9aa5caa 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -403,12 +403,6 @@ static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } -static inline bool xfs_sb_version_hasdirv2(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); -} - static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || -- 1.9.0 From dave@fromorbit.com Mon May 5 22:56:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 24B1F29E1A for ; Mon, 5 May 2014 22:56:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 947FEAC002 for ; Mon, 5 May 2014 20:56:11 -0700 (PDT) X-ASG-Debug-ID: 1399348563-04cbb03cc7355b60003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JXaNuvFXh3PPL01L for ; Mon, 05 May 2014 20:56:09 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqhTAJxcaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDOB4VWiRmEKQSvdSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Ux-I4 for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005Iv-HN for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: remove shared supberlock feature checking Date: Tue, 6 May 2014 13:55:59 +1000 X-ASG-Orig-Subj: [PATCH 5/5] xfs: remove shared supberlock feature checking Message-Id: <1399348559-19889-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399348559-19889-1-git-send-email-david@fromorbit.com> References: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348569 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We reject any filesystem that is mounted with this feature bit set, so we don't need to check for it anywhere else. Remove the function for checking if the feature bit is set and any code that uses it. Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 2 -- fs/xfs/xfs_sb.c | 3 ++- fs/xfs/xfs_sb.h | 17 ++++------------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index b099799..97886a7 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -84,8 +84,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | (xfs_sb_version_hasdalign(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | - (xfs_sb_version_hasshared(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_SHARED : 0) | (xfs_sb_version_hasextflgbit(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | (xfs_sb_version_hassector(&mp->m_sb) ? diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index de16dd5..c3453b1 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -291,7 +291,8 @@ xfs_mount_validate_sb( (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || sbp->sb_dblocks == 0 || sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || - sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp) || + sbp->sb_shared_vn != 0)) { xfs_notice(mp, "SB sanity check failed"); return XFS_ERROR(EFSCORRUPTED); } diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 9aa5caa..3fcfc2a 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -51,11 +51,12 @@ struct xfs_trans; /* * Supported feature bit list is just all bits in the versionnum field because - * we've used them all up and understand them all. + * 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. */ #define XFS_SB_VERSION_OKBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_ALLFBITS) + ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ + ~XFS_SB_VERSION_SHAREDBIT) /* * There are two words to hold XFS "feature" bits: the original @@ -341,10 +342,6 @@ static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) return false; - /* We don't support shared superblocks - nobody knows what it is */ - if (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) - return false; - return true; } @@ -397,12 +394,6 @@ static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } -static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); -} - static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || -- 1.9.0 From dave@fromorbit.com Mon May 5 22:56:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 40CAB29E20 for ; Mon, 5 May 2014 22:56:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33768304059 for ; Mon, 5 May 2014 20:56:10 -0700 (PDT) X-ASG-Debug-ID: 1399348563-04cbb03cc7355b60002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9aVlwK8XzhEZhMQk for ; Mon, 05 May 2014 20:56:08 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqhTAJxcaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDOB4VWiRmEKQSkNos/Kw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Uu-H8 for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005Ig-GK for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 Date: Tue, 6 May 2014 13:55:56 +1000 X-ASG-Orig-Subj: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 Message-Id: <1399348559-19889-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399348559-19889-1-git-send-email-david@fromorbit.com> References: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348568 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Whenever we update sb_features2, we need to update sb_bad_features2 so that they remain identical on disk. This prevents future mounts or userspace utilities from getting confused over which features the filesystem supports. Signed-off-by: Dave Chinner --- fs/xfs/xfs_sb.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 85f0146..7dfa8f1 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -475,11 +475,13 @@ static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; } static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; } -- 1.9.0 From dave@fromorbit.com Mon May 5 22:56:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2F93629E1F for ; Mon, 5 May 2014 22:56:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 127F8304053 for ; Mon, 5 May 2014 20:56:13 -0700 (PDT) X-ASG-Debug-ID: 1399348570-04cb6c7290375850001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id zuBkpG0lk6LwsUW3 for ; Mon, 05 May 2014 20:56:10 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqhTAJxcaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDOB4VWjUIEr3Ur Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Ut-Gj for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005Ib-Fn for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: make superblock version checks reflect reality Date: Tue, 6 May 2014 13:55:55 +1000 X-ASG-Orig-Subj: [PATCH 1/5] xfs: make superblock version checks reflect reality Message-Id: <1399348559-19889-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399348559-19889-1-git-send-email-david@fromorbit.com> References: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348570 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We only support filesystems that have v2 directory support, and than means all the checking and handling of superblock versions prior to this support being added is completely unnecessary overhead. Strip out all the version 1-3 support, sanitise the good version checking to reflect the supported versions, update all the feature supported functions and clean up all the support bit definitions to reflect the fact that we no longer care about Irix bootloader flag regions for v4 feature bits. Also, convert the return values to boolean types and remove typedefs from function declarations to clean up calling conventions, too. Because the feature bit checking is all inline code, this relatively small cleanup has a noticable impact on code size: text data bss dec hex filename 785195 100867 616 886678 d8796 fs/xfs/xfs.o.orig 783595 100867 616 885078 d8156 fs/xfs/xfs.o.patched i.e. it reduces it by 1600 bytes. Signed-off-by: Dave Chinner --- fs/xfs/xfs_sb.h | 215 ++++++++++++++++++++------------------------------------ 1 file changed, 77 insertions(+), 138 deletions(-) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 950d1ea..85f0146 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -36,8 +36,6 @@ struct xfs_trans; #define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 -#define XFS_SB_VERSION_SASHFBITS 0xf000 -#define XFS_SB_VERSION_REALFBITS 0x0ff0 #define XFS_SB_VERSION_ATTRBIT 0x0010 #define XFS_SB_VERSION_NLINKBIT 0x0020 #define XFS_SB_VERSION_QUOTABIT 0x0040 @@ -50,24 +48,14 @@ struct xfs_trans; #define XFS_SB_VERSION_DIRV2BIT 0x2000 #define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ #define XFS_SB_VERSION_MOREBITSBIT 0x8000 -#define XFS_SB_VERSION_OKSASHFBITS \ - (XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT | \ - XFS_SB_VERSION_BORGBIT) -#define XFS_SB_VERSION_OKREALFBITS \ - (XFS_SB_VERSION_ATTRBIT | \ - XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_QUOTABIT | \ - XFS_SB_VERSION_ALIGNBIT | \ - XFS_SB_VERSION_DALIGNBIT | \ - XFS_SB_VERSION_SHAREDBIT | \ - XFS_SB_VERSION_LOGV2BIT | \ - XFS_SB_VERSION_SECTORBIT | \ - XFS_SB_VERSION_MOREBITSBIT) -#define XFS_SB_VERSION_OKREALBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_OKREALFBITS | \ - XFS_SB_VERSION_OKSASHFBITS) + +/* + * Supported feature bit list is just all bits in the versionnum field because + * we've used them all up and understand them all. + */ +#define XFS_SB_VERSION_OKBITS \ + (XFS_SB_VERSION_NUMBITS | \ + XFS_SB_VERSION_ALLFBITS) /* * There are two words to hold XFS "feature" bits: the original @@ -76,7 +64,6 @@ struct xfs_trans; * * These defines represent bits in sb_features2. */ -#define XFS_SB_VERSION2_REALFBITS 0x00ffffff /* Mask: features */ #define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 #define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ #define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 @@ -86,16 +73,11 @@ struct xfs_trans; #define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ #define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ -#define XFS_SB_VERSION2_OKREALFBITS \ +#define XFS_SB_VERSION2_OKBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ XFS_SB_VERSION2_PROJID32BIT | \ XFS_SB_VERSION2_FTYPE) -#define XFS_SB_VERSION2_OKSASHFBITS \ - (0) -#define XFS_SB_VERSION2_OKREALBITS \ - (XFS_SB_VERSION2_OKREALFBITS | \ - XFS_SB_VERSION2_OKSASHFBITS ) /* * Superblock - in core version. Must match the ondisk version below. @@ -345,167 +327,124 @@ typedef enum { #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) -static inline int xfs_sb_good_version(xfs_sb_t *sbp) +/* + * The first XFS version we support is a v4 superblock with V2 directories. + */ +static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) { - /* We always support version 1-3 */ - if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && - sbp->sb_versionnum <= XFS_SB_VERSION_3) - return 1; + if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) + return false; - /* We support version 4 if all feature bits are supported */ - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { - if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) - return 0; + /* check for unknown features in the fs */ + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) + return false; - if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) - return 0; - return 1; - } - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) - return 1; + /* We don't support shared superblocks - nobody knows what it is */ + if (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) + return false; - return 0; + return true; +} + +static inline bool xfs_sb_good_version(struct xfs_sb *sbp) +{ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return true; + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + return xfs_sb_good_v4_features(sbp); + return false; } /* * Detect a mismatched features2 field. Older kernels read/wrote * this into the wrong slot, so to be safe we keep them in sync. */ -static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) +static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp) { - return (sbp->sb_bad_features2 != sbp->sb_features2); + return sbp->sb_bad_features2 != sbp->sb_features2; } -static inline unsigned xfs_sb_version_tonew(unsigned v) +static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp) { - if (v == XFS_SB_VERSION_1) - return XFS_SB_VERSION_4; - - if (v == XFS_SB_VERSION_2) - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; - - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT | - XFS_SB_VERSION_NLINKBIT; + return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); } -static inline unsigned xfs_sb_version_toold(unsigned v) +static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) { - if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) - return 0; - if (v & XFS_SB_VERSION_NLINKBIT) - return XFS_SB_VERSION_3; - if (v & XFS_SB_VERSION_ATTRBIT) - return XFS_SB_VERSION_2; - return XFS_SB_VERSION_1; + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; } -static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasnlink(struct xfs_sb *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_2 || - sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); + return (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); } -static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) +static inline void xfs_sb_version_addnlink(struct xfs_sb *sbp) { - if (sbp->sb_versionnum == XFS_SB_VERSION_1) - sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; - else - sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; } -static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); + return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } -static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) +static inline void xfs_sb_version_addquota(struct xfs_sb *sbp) { - if (sbp->sb_versionnum <= XFS_SB_VERSION_2) - sbp->sb_versionnum = XFS_SB_VERSION_3; - else - sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; } -static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); -} - -static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) -{ - if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; - else - sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | - XFS_SB_VERSION_QUOTABIT; -} - -static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } -static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } -static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } -static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdirv2(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); } -static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); } -static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); } -static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } -static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } -static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); } /* @@ -513,46 +452,46 @@ static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) * * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: * - * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) + * SB_VERSION_HASFUNBIT(struct xfs_sb *sbp) * ((xfs_sb_version_hasmorebits(sbp) && * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) */ -static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } -static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } -static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) +static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; } -static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) +static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; } -static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } -static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) +static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; @@ -625,12 +564,12 @@ xfs_sb_has_incompat_log_feature( /* * V5 superblock specific feature checks */ -static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) +static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } -static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) +static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } -- 1.9.0 From dave@fromorbit.com Mon May 5 22:56:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 218B229E1E for ; Mon, 5 May 2014 22:56:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92083AC002 for ; Mon, 5 May 2014 20:56:12 -0700 (PDT) X-ASG-Debug-ID: 1399348568-04cbb03cc6355b70002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oaD3RWGROSOAXhSR for ; Mon, 05 May 2014 20:56:10 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqhTAJxcaFN5LEcvPGdsb2JhbABZgwaIR6MeAQEBAQEBBpsnFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDOB4VWjUIEr3Ur Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 13:26:02 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WhWU5-0002Uv-HT for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WhWU5-0005Il-Gj for xfs@oss.sgi.com; Tue, 06 May 2014 13:56:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: turn NLINK feature on by default Date: Tue, 6 May 2014 13:55:57 +1000 X-ASG-Orig-Subj: [PATCH 3/5] xfs: turn NLINK feature on by default Message-Id: <1399348559-19889-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399348559-19889-1-git-send-email-david@fromorbit.com> References: <1399348559-19889-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399348570 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.5575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner mkfs has turned on the XFS_SB_VERSION_NLINKBIT feature bit by default since November 2007. It's about time we simply made the kernel code turn it on by default and so always convert v1 inodes to v2 inodes. This removes needless version checks and modification when bumping link counts on inodes, and will take code out of a few common code paths. text data bss dec hex filename 783595 100867 616 885078 d8156 fs/xfs/xfs.o.orig 783171 100867 616 884654 d7fae fs/xfs/xfs.o.patched Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 4 +-- fs/xfs/xfs_ialloc.c | 4 +-- fs/xfs/xfs_inode.c | 80 +++++++++++-------------------------------------- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_inode_item.c | 30 +------------------ fs/xfs/xfs_ioctl.c | 5 ++-- fs/xfs/xfs_mount.c | 6 ++++ fs/xfs/xfs_sb.h | 10 ------- 8 files changed, 31 insertions(+), 110 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 3445ead..2a03f2d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -74,11 +74,9 @@ xfs_fs_geometry( } if (new_version >= 3) { geo->version = XFS_FSOP_GEOM_VERSION; - geo->flags = + geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | (xfs_sb_version_hasattr(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_ATTR : 0) | - (xfs_sb_version_hasnlink(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_NLINK : 0) | (xfs_sb_version_hasquota(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_QUOTA : 0) | (xfs_sb_version_hasalign(&mp->m_sb) ? diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 6ac0c29..c89a53a 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -280,10 +280,8 @@ xfs_ialloc_inode_init( if (tp) xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, mp->m_sb.sb_inodesize, length, gen); - } else if (xfs_sb_version_hasnlink(&mp->m_sb)) + } else version = 2; - else - version = 1; for (j = 0; j < nbufs; j++) { /* diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 6d6b44a..0fcfdd4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -681,6 +681,14 @@ xfs_ialloc( return error; ASSERT(ip != NULL); + /* + * We always convert v1 inodes to v2 now - we only support filesystems + * with >= v2 inode capability, so there is no reason for ever leaving + * an inode in v1 format. + */ + if (ip->i_d.di_version == 1) + ip->i_d.di_version = 2; + ip->i_d.di_mode = mode; ip->i_d.di_onlink = 0; ip->i_d.di_nlink = nlink; @@ -690,27 +698,6 @@ xfs_ialloc( xfs_set_projid(ip, prid); memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - /* - * If the superblock version is up to where we support new format - * inodes and this is currently an old format inode, then change - * the inode version number now. This way we only do the conversion - * here rather than here and in the flush/logging code. - */ - if (xfs_sb_version_hasnlink(&mp->m_sb) && - ip->i_d.di_version == 1) { - ip->i_d.di_version = 2; - /* - * We've already zeroed the old link count, the projid field, - * and the pad field. - */ - } - - /* - * Project ids won't be stored on disk if we are using a version 1 inode. - */ - if ((prid != 0) && (ip->i_d.di_version == 1)) - xfs_bump_ino_vers2(tp, ip); - if (pip && XFS_INHERIT_GID(pip)) { ip->i_d.di_gid = pip->i_d.di_gid; if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) { @@ -1064,28 +1051,14 @@ xfs_droplink( */ void xfs_bump_ino_vers2( - xfs_trans_t *tp, xfs_inode_t *ip) { - xfs_mount_t *mp; - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(ip->i_d.di_version == 1); ip->i_d.di_version = 2; ip->i_d.di_onlink = 0; memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - mp = tp->t_mountp; - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - spin_lock(&mp->m_sb_lock); - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - xfs_sb_version_addnlink(&mp->m_sb); - spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp, XFS_SB_VERSIONNUM); - } else { - spin_unlock(&mp->m_sb_lock); - } - } /* Caller must log the inode */ } @@ -1112,7 +1085,7 @@ xfs_bumplink( * system to do this, then we need to bump the superblock * version number as well. */ - xfs_bump_ino_vers2(tp, ip); + xfs_bump_ino_vers2(ip); } xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); @@ -3333,34 +3306,17 @@ xfs_iflush_int( ip->i_d.di_flushiter = 0; /* - * If this is really an old format inode and the superblock version - * has not been updated to support only new format inodes, then - * convert back to the old inode format. If the superblock version - * has been updated, then make the conversion permanent. + * If this is really an old format inode, convert it to a v2 format + * inode to make the conversion permanent. */ - ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb)); if (ip->i_d.di_version == 1) { - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - /* - * Convert it back. - */ - ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink); - } else { - /* - * The superblock version has already been bumped, - * so just make the conversion to the new inode - * format permanent. - */ - ip->i_d.di_version = 2; - dip->di_version = 2; - ip->i_d.di_onlink = 0; - dip->di_onlink = 0; - memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - memset(&(dip->di_pad[0]), 0, - sizeof(dip->di_pad)); - ASSERT(xfs_get_projid(ip) == 0); - } + ip->i_d.di_version = 2; + dip->di_version = 2; + ip->i_d.di_onlink = 0; + dip->di_onlink = 0; + memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); + memset(&(dip->di_pad[0]), 0, sizeof(dip->di_pad)); + ASSERT(xfs_get_projid(ip) == 0); } xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 13aea54..0ae6e0d 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -377,7 +377,7 @@ int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t, struct xfs_inode **, int *); int xfs_droplink(struct xfs_trans *, struct xfs_inode *); int xfs_bumplink(struct xfs_trans *, struct xfs_inode *); -void xfs_bump_ino_vers2(struct xfs_trans *, struct xfs_inode *); +void xfs_bump_ino_vers2(struct xfs_inode *); /* from xfs_file.c */ int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 686889b..dacd6c1 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -145,34 +145,6 @@ xfs_inode_item_size( xfs_inode_item_attr_fork_size(iip, nvecs, nbytes); } -/* - * If this is a v1 format inode, then we need to log it as such. This means - * that we have to copy the link count from the new field to the old. We - * don't have to worry about the new fields, because nothing trusts them as - * long as the old inode version number is there. - */ -STATIC void -xfs_inode_item_format_v1_inode( - struct xfs_inode *ip) -{ - if (!xfs_sb_version_hasnlink(&ip->i_mount->m_sb)) { - /* - * Convert it back. - */ - ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - ip->i_d.di_onlink = ip->i_d.di_nlink; - } else { - /* - * The superblock version has already been bumped, - * so just make the conversion to the new inode - * format permanent. - */ - ip->i_d.di_version = 2; - ip->i_d.di_onlink = 0; - memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - } -} - STATIC void xfs_inode_item_format_data_fork( struct xfs_inode_log_item *iip, @@ -381,7 +353,7 @@ xfs_inode_item_format( xlog_finish_iovec(lv, vecp, sizeof(struct xfs_inode_log_format)); if (ip->i_d.di_version == 1) - xfs_inode_item_format_v1_inode(ip); + xfs_bump_ino_vers2(ip); xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICORE, &ip->i_d, xfs_icdinode_size(ip->i_d.di_version)); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 2d8f4fd..3f55759 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1228,7 +1228,6 @@ xfs_ioctl_setattr( olddquot = xfs_qm_vop_chown(tp, ip, &ip->i_pdquot, pdqp); } - xfs_set_projid(ip, fa->fsx_projid); /* * We may have to rev the inode as well as @@ -1236,7 +1235,9 @@ xfs_ioctl_setattr( * exist before DINODE_VERSION_2 and SB_VERSION_NLINK. */ if (ip->i_d.di_version == 1) - xfs_bump_ino_vers2(tp, ip); + xfs_bump_ino_vers2(ip); + + xfs_set_projid(ip, fa->fsx_projid); } } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 944f3d9..3f09782 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -697,6 +697,12 @@ xfs_mountfs( mp->m_update_flags |= XFS_SB_VERSIONNUM; } + /* always use v2 inodes by default now */ + if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) { + mp->m_sb.sb_versionnum |= XFS_SB_VERSION_NLINKBIT; + mp->m_update_flags |= XFS_SB_VERSIONNUM; + } + /* * Check if sb_agblocks is aligned at stripe boundary * If sb_agblocks is NOT aligned turn off m_dalign since diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 7dfa8f1..b238a0e 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -376,16 +376,6 @@ static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; } -static inline bool xfs_sb_version_hasnlink(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); -} - -static inline void xfs_sb_version_addnlink(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; -} - static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) { return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); -- 1.9.0 From junxiao.bi@oracle.com Tue May 6 01:54:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 79E1A7FAA for ; Tue, 6 May 2014 01:54:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 535BB304059 for ; Mon, 5 May 2014 23:54:12 -0700 (PDT) X-ASG-Debug-ID: 1399359250-04cbb03cc635c340001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id RXh9g1v0f4AGQAP1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 05 May 2014 23:54:11 -0700 (PDT) X-Barracuda-Envelope-From: junxiao.bi@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s466rjjt002735 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 May 2014 06:53:46 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s466rii7003899 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 6 May 2014 06:53:44 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s466rih2017612; Tue, 6 May 2014 06:53:44 GMT Received: from bijx-OptiPlex-780.cn.oracle.com (/10.182.39.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 05 May 2014 23:53:43 -0700 From: Junxiao Bi To: xfs@oss.sgi.com Cc: hch@infradead.org, joe.jin@oracle.com, junxiao.bi@oracle.com Subject: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() Date: Tue, 6 May 2014 14:54:44 +0800 X-ASG-Orig-Subj: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() Message-Id: <1399359284-20536-1-git-send-email-junxiao.bi@oracle.com> X-Mailer: git-send-email 1.7.9.5 X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399359251 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sending a SIGKILL signal to child thread will terminate the whole process, xfs_copy will return an error value 137. This cause confuse for script to know whether the copy successes. Calling exit() in main thread can terminate the whole process and return the right value. Replace killall()+abort() with exit(1) to match the old way exit in error case. Also remove killall()+pthread_exit(NULL) since return 0 will be followed by an exit(0) to terminate the process. Bug story from Chrisoph Hellwig: Btw, I think the reason for this cruft is that xfs_copy was originally written using the IRIX sproc interface, and the port to pthreads didn't remove this gem: http://marc.info/?l=linux-xfs&m=99535721110020&w=2 Signed-off-by: Junxiao Bi Cc: Joe jin Cc: Chrisoph Hellwig --- copy/xfs_copy.c | 30 +----------------------------- 1 files changed, 1 insertions(+), 29 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 39517da..39bb9d7 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -217,25 +217,6 @@ handle_error: } void -killall(void) -{ - int i; - - /* only the parent gets to kill things */ - - if (getpid() != parent_pid) - return; - - for (i = 0; i < num_targets; i++) { - if (target[i].state == ACTIVE) { - /* kill up target threads */ - pthread_kill(target[i].pid, SIGKILL); - pthread_mutex_unlock(&targ[i].wait); - } - } -} - -void handler(int sig) { pid_t pid = getpid(); @@ -400,8 +381,7 @@ read_wbuf(int fd, wbuf *buf, xfs_mount_t *mp) if (buf->length > buf->size) { do_warn(_("assert error: buf->length = %d, buf->size = %d\n"), buf->length, buf->size); - killall(); - abort(); + exit(1); } if ((res = read(fd, buf->data, buf->length)) < 0) { @@ -591,11 +571,6 @@ main(int argc, char **argv) parent_pid = getpid(); - if (atexit(killall)) { - do_log(_("%s: couldn't register atexit function.\n"), progname); - die_perror(); - } - /* open up source -- is it a file? */ open_flags = O_RDONLY; @@ -1154,9 +1129,6 @@ main(int argc, char **argv) } check_errors(); - killall(); - pthread_exit(NULL); - /*NOTREACHED*/ return 0; } -- 1.7.1 From dgc@oss.sgi.com Tue May 6 02:18:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id F152E7FBC; Tue, 6 May 2014 02:18:55 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8 X-Git-Refname: refs/heads/xfs-libxfs-in-kernel-RFC X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 6579dd808ddf0ddc10e59e715dc8f2eb09705203 Message-Id: <20140506071855.F152E7FBC@oss.sgi.com> Date: Tue, 6 May 2014 02:18:55 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-libxfs-in-kernel-RFC has been created at 6579dd808ddf0ddc10e59e715dc8f2eb09705203 (commit) - Log ----------------------------------------------------------------- commit 6579dd808ddf0ddc10e59e715dc8f2eb09705203 Author: Dave Chinner Date: Tue May 6 17:13:06 2014 +1000 libxfs: provide extern include file There will be different include files for userspace and kernel versions of the library as userspace needs to stub out or provide it's own versions of kernel only functionality. The header file that external libxfs users will need to include is libxfs.h, and there will be different implementations for both user and kernel space. All external users of libxfs will include this header file, thereby eliminating the need for direct knowledge of the internal dependency structure of the libxfs code. This significantly reduces the complexity of including libxfs functioanlity into the kernel code, and brings it in line with the way libxfs is used in userspace. This also allows us to untangle some of the mess with kernel only header files including shared header files directly, but does come with one piece of baggage - the dependency that libxfs has on the kernel xfs_mount.h. We'll deal with that at a later time, though. Signed-off-by: Dave Chinner commit 5e51adf5d9bba8f91fb5a99551878781bcc392f9 Author: Dave Chinner Date: Tue May 6 16:23:33 2014 +1000 libxfs: consolidate internal include files There will be different include files for userspace and kernel versions of the library as userspace needs to stub out or provide it's own versions of kernel only functionality, convert all the internal libxfs source code to use the same single header file infrastructure that userspace currently contains. This means all the C source files will be identical, and only the header file will need to change. Call this internal consolidated header file libxfs_int.h to discriminate it from any other kernel or userspace header file. Signed-off-by: Dave Chinner commit 612480ce6bf4f96535f766eb27eb1b360a5a0714 Author: Dave Chinner Date: Tue May 6 14:55:30 2014 +1000 libxfs: move source files Move all the source files that are shared with userspace into libxfs/include. This is done as one big chunk simpy to get it done quickly. Signed-off-by: Dave Chinner commit 22b8ea8e926ea378a1066174a02147b90caebc12 Author: Dave Chinner Date: Tue May 6 14:54:32 2014 +1000 libxfs: move header files Move all the header files that are shared with userspace into libxfs/include. This is done as one big chunk simpy to get it done quickly. Signed-off-by: Dave Chinner commit 20c53cba45be9da5a49a19042ec151abbf4b365e Author: Dave Chinner Date: Tue May 6 14:54:24 2014 +1000 xfs: create libxfs infrastructure TO minimise the differences between kernel and userspace code, split the kernel code into the same structure as the userspace code. That is, the gneric core functionality of XFS is moved to a libxfs/ directory and treat it as a layering barrier in the XFS code. This patch introduces the libxfs and libxfs/include directories, the build infrastructure and an initial source and header file to build. The libxfs/include directory will contain the header files that are needed to build libxfs - most of userspace does not care about the location of these header files as they are accessed indirectly. Hence keeping them inside libxfs makes it easy to track the changes and script the sync process as the directory structure will be identical. TO allow this changeover to occur in the kernel code, there are some temporary infrastructure in the makefiles to grab the header filesystem from both locations. Once all the files are moved, modifications will be made in the source code that will make the need for these include directives go away. Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From jeff.liu@oracle.com Tue May 6 02:48:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B0C927FBD for ; Tue, 6 May 2014 02:48:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A3DD58F8039 for ; Tue, 6 May 2014 00:48:53 -0700 (PDT) X-ASG-Debug-ID: 1399362531-04cbb03cc535de30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id H8pdCvv69VJvWBwH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 00:48:52 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s467mnnV011679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 May 2014 07:48:50 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s467mlFR028980 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 6 May 2014 07:48:49 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s467mlaj028971; Tue, 6 May 2014 07:48:47 GMT Received: from [192.168.1.101] (/112.238.87.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 06 May 2014 00:48:47 -0700 Message-ID: <536893DB.7050705@oracle.com> Date: Tue, 06 May 2014 15:48:43 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-6-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking In-Reply-To: <1399348559-19889-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399362532 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/06 2014 11:55 AM, Dave Chinner wrote: > From: Dave Chinner > > We reject any filesystem that is mounted with this feature bit set, > so we don't need to check for it anywhere else. Remove the function > for checking if the feature bit is set and any code that uses it. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_fsops.c | 2 -- > fs/xfs/xfs_sb.c | 3 ++- > fs/xfs/xfs_sb.h | 17 ++++------------- > 3 files changed, 6 insertions(+), 16 deletions(-) > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index b099799..97886a7 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -84,8 +84,6 @@ xfs_fs_geometry( > XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | > (xfs_sb_version_hasdalign(&mp->m_sb) ? > XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | > - (xfs_sb_version_hasshared(&mp->m_sb) ? > - XFS_FSOP_GEOM_FLAGS_SHARED : 0) | Just a trivial comments, now the XFS_FSOP_GEOM_FLAGS_SHARED is useless, so we can remove it from fs/xfs/xfs.h. Otherwise, looks good to me. Reviewed-by: Jie Liu Cheers, -Jeff From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 02:52:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 28D0D7FBD for ; Tue, 6 May 2014 02:52:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E658E304032 for ; Tue, 6 May 2014 00:52:09 -0700 (PDT) X-ASG-Debug-ID: 1399362726-04bdf02b8d375070001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id VwemKzVDynHEqByS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 00:52:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaAY-0002HU-JA; Tue, 06 May 2014 07:52:06 +0000 Date: Tue, 6 May 2014 00:52:06 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH V3] xfs: truncate_setsize should be outside transactions Message-ID: <20140506075206.GD21910@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V3] xfs: truncate_setsize should be outside transactions References: <1398983979-23696-1-git-send-email-david@fromorbit.com> <20140502045443.GA8867@infradead.org> <20140502050053.GA17578@infradead.org> <20140502064700.GB26353@dastard> <20140502070054.GC26353@dastard> <20140502100802.GB14028@infradead.org> <20140502232339.GD26353@dastard> <20140503151601.GB28608@infradead.org> <20140504000618.GK26353@dastard> <20140505051941.GU26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505051941.GU26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399362727 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 03:19:42PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > truncate_setsize() removes pages from the page cache, and hence > requires page locks to be held. It is not valid to lock a page cache > page inside a transaction context as we can hold page locks when we > we reserve space for a transaction. If we do, then we expose an ABBA > deadlock between log space reservation and page locks. > > That is, both the write path and writeback lock a page, then start a > transaction for block allocation, which means they can block waiting > for a log reservation with the page lock held. If we hold a log > reservation and then do something that locks a page (e.g. > truncate_setsize in xfs_setattr_size) then that page lock can block > on the page locked and waiting for a log reservation. If the > transaction that is waiting for the page lock is the only active > transaction in the system that can free log space via a commit, > then writeback will never make progress and so log space will never > free up. > > This issue with xfs_setattr_size() was introduced back in 2010 by > commit fa9b227 ("xfs: new truncate sequence") which moved the page > cache truncate from outside the transaction context (what was > xfs_itruncate_data()) to inside the transaction context as a call to > truncate_setsize(). > > The reason truncate_setsize() was located where in this place was > that we can't shouldn't change the file size until after we are in > the transaction context and the operation will either succeed or > shut down the filesystem on failure. However, block_truncate_page() > already modifies the file contents before we enter the transaction > context, so we can't really fulfill this guarantee in any way. Hence > we may as well ensure that on success or failure, the in-memory > inode and data is truncated away and that the application cleans up > the mess appropriately. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 02:53:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B008A7FBD for ; Tue, 6 May 2014 02:53:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2EBF304032 for ; Tue, 6 May 2014 00:53:57 -0700 (PDT) X-ASG-Debug-ID: 1399362835-04cbb03cc635e000001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id M7Pg3Z2FC1gpRKMy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 00:53:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaCG-0003PL-VJ; Tue, 06 May 2014 07:53:52 +0000 Date: Tue, 6 May 2014 00:53:52 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] common: use a relative path to fsstress Message-ID: <20140506075352.GE21910@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] common: use a relative path to fsstress References: <20140504104510.GA9510@infradead.org> <20140504214913.GP26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140504214913.GP26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399362835 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 05, 2014 at 07:49:13AM +1000, Dave Chinner wrote: > > Signed-off-by: Christoph Hellwig > > > > --- a/common/config > > +++ b/common/config > > @@ -134,7 +134,7 @@ export MOUNT_PROG="`set_prog_path mount`" > > export UMOUNT_PROG="`set_prog_path umount`" > > [ "$UMOUNT_PROG" = "" ] && _fatal "umount not found" > > > > -export FSSTRESS_PROG="`set_prog_path fsstress $PWD/ltp/fsstress`" > > +export FSSTRESS_PROG="./ltp/fsstress" > > Why remove the set_prog_path call? i.e. this should work: > > +export FSSTRESS_PROG="`set_prog_path fsstress ./ltp/fsstress`" > > Otherwise, a comment explaining why set_prog_path is not used just > for this binary would be appropriate.... set_prog_path is only useful for tools found in $PATH, and except for fsstress we never use it for anything that we specify path to, so I don't really see the need for a comment here. From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 02:56:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 651467FBD for ; Tue, 6 May 2014 02:56:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE4C8AC007 for ; Tue, 6 May 2014 00:56:38 -0700 (PDT) X-ASG-Debug-ID: 1399362997-04cbb03cc635e100001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 79Fps9xH1GdAON2J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 00:56:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaEv-0004WD-Fi; Tue, 06 May 2014 07:56:37 +0000 Date: Tue, 6 May 2014 00:56:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix directory readahead offset off-by-one Message-ID: <20140506075637.GA13191@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix directory readahead offset off-by-one References: <1399347728-19752-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399347728-19752-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399362997 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:42:08PM +1000, Dave Chinner wrote: > Fix the warning by ensuring that the readahead offset is correctly > incremented. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_dir2_readdir.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index 50b72f7..fe2db98 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -456,7 +456,7 @@ xfs_dir2_leaf_readbuf( > /* > * Advance offset through the mapping table. > */ > - for (j = 0; j < mp->m_dirblkfsbs; j++) { > + for (j = 0; j < mp->m_dirblkfsbs; ) { > /* > * The rest of this extent but not more than a dir > * block. This looks correct, but it would seem a little more idiomatic to write this as: for (j = 0; j < mp->m_dirblkfsbs; j += length) { and remove the j increment from the body. From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 02:57:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 30EBF7FC0 for ; Tue, 6 May 2014 02:57:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02C9A8F8033 for ; Tue, 6 May 2014 00:57:43 -0700 (PDT) X-ASG-Debug-ID: 1399363062-04bdf02b8d375370001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 3gaCCMOyu9ZgjNau (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 00:57:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaFy-0004Xx-UR; Tue, 06 May 2014 07:57:42 +0000 Date: Tue, 6 May 2014 00:57:42 -0700 From: Christoph Hellwig To: Junxiao Bi Cc: xfs@oss.sgi.com, hch@infradead.org, joe.jin@oracle.com Subject: Re: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() Message-ID: <20140506075742.GB13191@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() References: <1399359284-20536-1-git-send-email-junxiao.bi@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399359284-20536-1-git-send-email-junxiao.bi@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399363063 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, May 06, 2014 at 02:54:44PM +0800, Junxiao Bi wrote: > Sending a SIGKILL signal to child thread will terminate the whole process, > xfs_copy will return an error value 137. This cause confuse for script to > know whether the copy successes. > > Calling exit() in main thread can terminate the whole process and return the > right value. Replace killall()+abort() with exit(1) to match the old way > exit in error case. Also remove killall()+pthread_exit(NULL) since return 0 > will be followed by an exit(0) to terminate the process. > > Bug story from Chrisoph Hellwig: > Btw, I think the reason for this cruft is that xfs_copy was originally > written using the IRIX sproc interface, and the port to pthreads didn't > remove this gem: > > http://marc.info/?l=linux-xfs&m=99535721110020&w=2 > > Signed-off-by: Junxiao Bi > Cc: Joe jin > Cc: Chrisoph Hellwig Looks good (except that you misspelled by name :)) Reviewed-by: Christoph Hellwig From david@fromorbit.com Tue May 6 02:59:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0803D7FC0 for ; Tue, 6 May 2014 02:59:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0FF7304032 for ; Tue, 6 May 2014 00:59:11 -0700 (PDT) X-ASG-Debug-ID: 1399363148-04cbb03cc635e210001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DYdfKsYcG8BtXwCU for ; Tue, 06 May 2014 00:59:09 -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: AsNTABmVaFN5LEcvPGdsb2JhbABZgwZPh3ijIwEBAQEBAQaaDYEZFwMBAQEBODWCJQEBBVYzCBsJGgsPBSUDBy0ZiCfNKhaFQIgaEQFXgyqBFQSZNpRugVErgTk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 17:29:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhaHJ-00032p-Nn for xfs@oss.sgi.com; Tue, 06 May 2014 17:59:05 +1000 Date: Tue, 6 May 2014 17:59:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140506075905.GA5421@dastard> X-ASG-Orig-Subj: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="J2SCkAp4GZ/dPZZf" Content-Disposition: inline In-Reply-To: <20140506071855.F152E7FBC@oss.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: 1399363148 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 06, 2014 at 02:18:55AM -0500, xfs@oss.sgi.com wrote: > This is an automated email from the git hooks/post-receive script. It was > generated because a ref change was pushed to the repository containing > the project "XFS development tree". >=20 > The branch, xfs-libxfs-in-kernel-RFC has been created > at 6579dd808ddf0ddc10e59e715dc8f2eb09705203 (commit) No doubt you are all wondering what this is by now. :) I spent a couple of hours doing what I'd been talking about for a while now - converting the xfs kernel source tree to have a libxfs abstraction. It's based on the current for-next branch, so it's completely up-to-date. The commits in this series move all the files used by userspace to: - fs/xfs/libxfs for .c and private.h files - fs/xfs/libxfs/include for public .h files It converts all the libxfs includes to makes the userspace libxfs includes (just a single #include) for both internal (libxfs_int.h) and external (libxfs.h). These will not be shared with userspace; userspace will provide it's own just like it does now. The core idea around this code layout is that we can now extract all the changes to the libxfs code in the kernel in a simple manner (commit by commit or as a single aggregate patch), and apply it to the userspace libxfs code with the right pathname filter to the patch command. That's all a sync will require in future, and should make it scriptable and easy for anyone to do. It means, ideally, that we can do libxfs updates at the same time we do kernel updates with almost no effort. There's still a few little messy corners, but I'm seriously tempted just to merge this into for-next right now because it's all good. :)" [ Seriously, it removes almost a thousand #include lines from the kernel code, requires almost no extra infrastructure in the kernel, already has passed several full xfstests runs and will make our life so much easier. ] Things that need to be done: - xfs_dir2_priv.h is included in places that it shouldn't be. Whatever those callers need from that header file should be moved to xfs_dir2.h and into libxfs proper. - the Makefiles still have a little bit of messy include rules (i.e. -I$(src) -I$(src)/libxfs/include) bit I can live with that I think. - some of the libxfs header files have a dependency on xfs_mount.h for things like inode cluster and directory block sizes. These need to be untangled, but it's not a critical issue right now. - xfs_vnode.h needs to die. - the kernel only header files that include libxfs header files can now drop those includes. Overall, though, this was surprisingly easy to do. All of the recent header file consolidation and cleanup that we've done made this pretty much a case of git mv of all the files and little bit of infrastructure, and not much else... I suspect the next thing that needs to be done is consolidate libxfs and libxlog in userspace, and split the log recovery code in the kernel and put the shared part into fs/xfs/libxfs..... I've put it up as a git branch rather than patches, because nobody wants me posting a patchset with a diffstat like this: $ git diff --stat for-next.. =2E... 164 files changed, 47250 insertions(+), 48036 deletions(-) However, when you tell git to be smart about renames (i.e file movement is ignored), the actual diffstat looks like this: $ git diff --stat --summary -C -M for-next.. =2E... 108 files changed, 291 insertions(+), 1077 deletions(-) If you want to look at it, pull from this branch: git://oss.sgi.com/xfs/xfs xfs-libxfs-in-kernel-RFC And check it out. The head is here: 6579dd8 libxfs: provide extern include file New Commits: Dave Chinner (5): [20c53cb] xfs: create libxfs infrastructure [22b8ea8] libxfs: move header files [612480c] libxfs: move source files [5e51adf] libxfs: consolidate internal include files [6579dd8] libxfs: provide extern include file Comments, flames, suggestions and beer all welcome :) Cheers, Dave. --=20 Dave Chinner david@fromorbit.com --J2SCkAp4GZ/dPZZf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTaJZIAAoJEK3oKUf0dfodPz4P/RkDGpT2ogKilp1HWkgaGKeN QL52uKaodE+k1rKfDC2LcmOfJNLEykWpiSYgyjD4Rki0A1cyqFHS1f34sk/Rs2wh 0HK40ACSJAxKKc1ZsMiJ7NYU4SxUNedvfwSfncGdKE7bS84TItzbKbHtppdSvMJe bAAj4hhkdLQ9jGwZs1u5T5HK83TaXR+B0kDO7RGm6PLAyctkoX83IuH5DiS1ak8x l8weFEzXsCkk/LV19dR1ojRtFSu5Xt6AApgFk6FpYBby6qALcV1gLF5w557cpMKW XgPJRediCSgG0McxmENUcxmcC26p1zyx0zXcAJwCb4boMkap22OUZPkJsqa3lilD 6EHmuoEa345ChsrAtQDyQc9doquHc5h3GEYesFCUdKXZ4thCukn9+VmV4zyxO5ix YxzvhhyG2/x4wn6LHTywIL2IhCuS71LG5/4ZEw7Q8GXBO1/ToCwdwYnGHO9ek44F 6tKvJuTryTASfpidj4F17W41N9FKgtmN6mz+KjudthDP9mrdxpUaKNws8ssageea YI89GF/SwKq4wkHyGUspVFTh3QnxZKlWVfrIpCyK7Daj/HTRAgXXNntpYBjWDdMi qMu3MlG40ZW4IqnAQug2q94+Ua4W7L4ie9yLtbsxqwsfuGLZ8Q6MVQQkGvx+ogaZ z7cuCOWDBoF+VGtuUtOM =Fa6S -----END PGP SIGNATURE----- --J2SCkAp4GZ/dPZZf-- From david@fromorbit.com Tue May 6 03:00:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 969097FC9 for ; Tue, 6 May 2014 03:00:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AF768F8033 for ; Tue, 6 May 2014 01:00:54 -0700 (PDT) X-ASG-Debug-ID: 1399363252-04bdf02b8a375560001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id PXq4pDYHbonUFpgl for ; Tue, 06 May 2014 01:00:52 -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: AgFRABiWaFN5LEcvPGdsb2JhbABZgwZPqxsBAQEBAQEGmg2BGRcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hADs0LFxaFQIh8B4MqgRUEmTaBPYlDiz8r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 17:30:23 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhaIZ-00033T-76; Tue, 06 May 2014 18:00:23 +1000 Date: Tue, 6 May 2014 18:00:23 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Junxiao Bi , joe.jin@oracle.com, xfs@oss.sgi.com Subject: Re: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() Message-ID: <20140506080023.GB5421@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfsprogs: xfs_copy: use exit() to replace killall() References: <1399359284-20536-1-git-send-email-junxiao.bi@oracle.com> <20140506075742.GB13191@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506075742.GB13191@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: 1399363252 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, May 06, 2014 at 12:57:42AM -0700, Christoph Hellwig wrote: > On Tue, May 06, 2014 at 02:54:44PM +0800, Junxiao Bi wrote: > > Sending a SIGKILL signal to child thread will terminate the whole process, > > xfs_copy will return an error value 137. This cause confuse for script to > > know whether the copy successes. > > > > Calling exit() in main thread can terminate the whole process and return the > > right value. Replace killall()+abort() with exit(1) to match the old way > > exit in error case. Also remove killall()+pthread_exit(NULL) since return 0 > > will be followed by an exit(0) to terminate the process. > > > > Bug story from Chrisoph Hellwig: > > Btw, I think the reason for this cruft is that xfs_copy was originally > > written using the IRIX sproc interface, and the port to pthreads didn't > > remove this gem: > > > > http://marc.info/?l=linux-xfs&m=99535721110020&w=2 > > > > Signed-off-by: Junxiao Bi > > Cc: Joe jin > > Cc: Chrisoph Hellwig > > Looks good (except that you misspelled by name :)) > > Reviewed-by: Christoph Hellwig I can fix that ;) I'll queue this up for after the 3.2.0 release. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 03:02:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9D6237FC9 for ; Tue, 6 May 2014 03:02:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80A5C8F8035 for ; Tue, 6 May 2014 01:02:07 -0700 (PDT) X-ASG-Debug-ID: 1399363325-04bdf02b8a3755e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kZmCTwLtTzt6oV81 for ; Tue, 06 May 2014 01:02:05 -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: Ar5TABiWaFN5LEcvPGdsb2JhbABZgwaIR6MjAQEBAQEBBpoNgRkXAwEBAQE4NYIlAQEEAScTHCMFCwgDFQMJJQ8FJQMHGhOIOQfNGRcWhUCIfAeDKoEVBJk2lj8r Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 17:32:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhaKB-00033o-Rm; Tue, 06 May 2014 18:02:03 +1000 Date: Tue, 6 May 2014 18:02:03 +1000 From: Dave Chinner To: Jeff Liu Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking Message-ID: <20140506080203.GC5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-6-git-send-email-david@fromorbit.com> <536893DB.7050705@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536893DB.7050705@oracle.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: 1399363325 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 03:48:43PM +0800, Jeff Liu wrote: > > On 05/06 2014 11:55 AM, Dave Chinner wrote: > > From: Dave Chinner > > > > We reject any filesystem that is mounted with this feature bit set, > > so we don't need to check for it anywhere else. Remove the function > > for checking if the feature bit is set and any code that uses it. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_fsops.c | 2 -- > > fs/xfs/xfs_sb.c | 3 ++- > > fs/xfs/xfs_sb.h | 17 ++++------------- > > 3 files changed, 6 insertions(+), 16 deletions(-) > > > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > > index b099799..97886a7 100644 > > --- a/fs/xfs/xfs_fsops.c > > +++ b/fs/xfs/xfs_fsops.c > > @@ -84,8 +84,6 @@ xfs_fs_geometry( > > XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | > > (xfs_sb_version_hasdalign(&mp->m_sb) ? > > XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | > > - (xfs_sb_version_hasshared(&mp->m_sb) ? > > - XFS_FSOP_GEOM_FLAGS_SHARED : 0) | > > Just a trivial comments, now the XFS_FSOP_GEOM_FLAGS_SHARED is useless, so > we can remove it from fs/xfs/xfs.h. That's a public API header file, so removing it could break applications. It's OK to leave it there, I think. > Otherwise, looks good to me. > > Reviewed-by: Jie Liu Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 03:02:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6FD897FC9 for ; Tue, 6 May 2014 03:02:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12B82AC002 for ; Tue, 6 May 2014 01:02:41 -0700 (PDT) X-ASG-Debug-ID: 1399363358-04bdf02b8d375640001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id t3ysQpKzhSIzVsXM for ; Tue, 06 May 2014 01:02:38 -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: ArtTABiWaFN5LEcvPGdsb2JhbABZgwaIR6MjAQEBAQEBBpoNgRkXAwEBAQE4NYIlAQEFJxMcIxAIAw4KCSUPBSUDBxoTiEDNGRcWhUCIGGQHgyqBFQEDmTaWPyuBMA Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 17:32:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhaKi-00033z-SS; Tue, 06 May 2014 18:02:36 +1000 Date: Tue, 6 May 2014 18:02:36 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix directory readahead offset off-by-one Message-ID: <20140506080236.GD5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix directory readahead offset off-by-one References: <1399347728-19752-1-git-send-email-david@fromorbit.com> <20140506075637.GA13191@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506075637.GA13191@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: 1399363358 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 12:56:37AM -0700, Christoph Hellwig wrote: > On Tue, May 06, 2014 at 01:42:08PM +1000, Dave Chinner wrote: > > Fix the warning by ensuring that the readahead offset is correctly > > incremented. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_dir2_readdir.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > > index 50b72f7..fe2db98 100644 > > --- a/fs/xfs/xfs_dir2_readdir.c > > +++ b/fs/xfs/xfs_dir2_readdir.c > > @@ -456,7 +456,7 @@ xfs_dir2_leaf_readbuf( > > /* > > * Advance offset through the mapping table. > > */ > > - for (j = 0; j < mp->m_dirblkfsbs; j++) { > > + for (j = 0; j < mp->m_dirblkfsbs; ) { > > /* > > * The rest of this extent but not more than a dir > > * block. > > This looks correct, but it would seem a little more idiomatic to write > this as: > > for (j = 0; j < mp->m_dirblkfsbs; j += length) { > > and remove the j increment from the body. yeah, I can do that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:05:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 94EB67FC9 for ; Tue, 6 May 2014 03:05:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67EC98F8035 for ; Tue, 6 May 2014 01:05:06 -0700 (PDT) X-ASG-Debug-ID: 1399363505-04bdf02b8d3757c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id DcouWFC5TSQrBHjA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:05:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaN6-0007Sg-TH; Tue, 06 May 2014 08:05:04 +0000 Date: Tue, 6 May 2014 01:05:04 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix directory readahead offset off-by-one Message-ID: <20140506080504.GA24143@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix directory readahead offset off-by-one References: <1399347728-19752-1-git-send-email-david@fromorbit.com> <20140506075637.GA13191@infradead.org> <20140506080236.GD5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506080236.GD5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399363505 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 06:02:36PM +1000, Dave Chinner wrote: > yeah, I can do that. Reviewed-by: Christoph Hellwig with that. From hch@lst.de Tue May 6 03:07:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6FE9D7FC9 for ; Tue, 6 May 2014 03:07:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E97A6AC006 for ; Tue, 6 May 2014 01:07:01 -0700 (PDT) X-ASG-Debug-ID: 1399363619-04cbb03cc635e5a0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Bd6eDGSvYD8PL919 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:07:00 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 3D38913EAE; Tue, 6 May 2014 10:06:58 +0200 (CEST) Date: Tue, 6 May 2014 10:06:58 +0200 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Brian Foster Subject: [PATCH 5/5 v2] xfs: pass struct da_args to xfs_attr_calc_size Message-ID: <20140506080658.GA12085@lst.de> X-ASG-Orig-Subj: [PATCH 5/5 v2] xfs: pass struct da_args to xfs_attr_calc_size References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-6-git-send-email-hch@lst.de> <20140505202149.GF12448@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505202149.GF12448@laptop.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1399363620 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- And remove a very confused comment. Signed-off-by: Christoph Hellwig Reviewed-by: Brian Foster --- fs/xfs/xfs_attr.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) [updated for a minor conflict in for-next] diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index d5c03ed..1fc1f06 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -162,12 +162,10 @@ xfs_attr_get( */ STATIC int xfs_attr_calc_size( - struct xfs_inode *ip, - int namelen, - int valuelen, + struct xfs_da_args *args, int *local) { - struct xfs_mount *mp = ip->i_mount; + struct xfs_mount *mp = args->dp->i_mount; int size; int nblks; @@ -175,7 +173,7 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(namelen, valuelen, + size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, mp->m_sb.sb_blocksize, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); @@ -189,7 +187,7 @@ xfs_attr_calc_size( * Out of line attribute, cannot double split, but * make room for the attribute value itself. */ - uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); + uint dblocks = xfs_attr3_rmt_blocks(mp, args->valuelen); nblks += dblocks; nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); } @@ -227,9 +225,7 @@ xfs_attr_set( args.firstblock = &firstblock; args.flist = &flist; args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; - - /* Size is now blocks for attribute data */ - args.total = xfs_attr_calc_size(dp, args.namelen, valuelen, &local); + args.total = xfs_attr_calc_size(&args, &local); error = xfs_qm_dqattach(dp, 0); if (error) -- 1.7.10.4 From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:15:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4F40A7FD5 for ; Tue, 6 May 2014 03:15:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9432AC006 for ; Tue, 6 May 2014 01:15:19 -0700 (PDT) X-ASG-Debug-ID: 1399364118-04bdf02b8a375f00001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id VKDKkfuemq15zpL0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:15:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaX0-0002lB-Nv; Tue, 06 May 2014 08:15:18 +0000 Date: Tue, 6 May 2014 01:15:18 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: turn NLINK feature on by default Message-ID: <20140506081518.GB24143@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: turn NLINK feature on by default References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399348559-19889-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399364119 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > > @@ -1112,7 +1085,7 @@ xfs_bumplink( > * system to do this, then we need to bump the superblock > * version number as well. > */ > - xfs_bump_ino_vers2(tp, ip); > + xfs_bump_ino_vers2(ip); The comment here is certainly out of date now. But I think keeping these xfs_bump_ino_vers2 calls around everywhere is wrong to start with. xfs_iread should make sure all inodes are version 1, that allows to kill xfs_bump_ino_vers2 entirely, and probably also simplify xfs_ialloc a little more. At the point we won't have to deal with v1 inodes anywhere but in xfs_iread, and we can have a big fat comment in that place why we even bother with the v1 inodes, because the fact that we have the hasnlink bit but inodes might still be old format is something we'll all have forgotten about in a few years, and new developers will never figure out by themselves. From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:16:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3C2C37FD5 for ; Tue, 6 May 2014 03: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 0FE158F8033 for ; Tue, 6 May 2014 01:16:54 -0700 (PDT) X-ASG-Debug-ID: 1399364212-04bdf02b8c375fb0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id Yah8TAgcdQBUmi5P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:16:52 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaYW-0003Eu-Io; Tue, 06 May 2014 08:16:52 +0000 Date: Tue, 6 May 2014 01:16:52 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: don't need dirv2 checks anymore Message-ID: <20140506081652.GC24143@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: don't need dirv2 checks anymore References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399348559-19889-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399364212 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > - ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); > + ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); How is this going to work for v5 filesystems? Probably better to just kill the assert.. Otherwise looks good, Reviewed-by: Christoph Hellwig From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:18:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 42A5A7FD5 for ; Tue, 6 May 2014 03:18:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA889AC008 for ; Tue, 6 May 2014 01:18:21 -0700 (PDT) X-ASG-Debug-ID: 1399364300-04bdf02b8c376090001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id iJe9B4COtY5DDrUG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:18:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhaZw-0003W1-MA; Tue, 06 May 2014 08:18:20 +0000 Date: Tue, 6 May 2014 01:18:20 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking Message-ID: <20140506081820.GD24143@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399348559-19889-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399364300 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:55:59PM +1000, Dave Chinner wrote: > > We reject any filesystem that is mounted with this feature bit set, > so we don't need to check for it anywhere else. Remove the function > for checking if the feature bit is set and any code that uses it. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig If someone at SGI has some spare time for a BugWorks search I'd really love to figure out of the story behind the shared superblock feature.. From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:20:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 66B8D7FD5 for ; Tue, 6 May 2014 03:20:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 492798F8035 for ; Tue, 6 May 2014 01:20:56 -0700 (PDT) X-ASG-Debug-ID: 1399364455-04bdf02b8d3761b0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id RwZcm0uuZWYRMPDl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:20:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhacQ-0004pI-V6; Tue, 06 May 2014 08:20:54 +0000 Date: Tue, 6 May 2014 01:20:54 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 Message-ID: <20140506082054.GA13654@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399348559-19889-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399364455 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:55:56PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Whenever we update sb_features2, we need to update sb_bad_features2 > so that they remain identical on disk. This prevents future mounts > or userspace utilities from getting confused over which features the > filesystem supports. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From david@fromorbit.com Tue May 6 03:29:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 238E57FE0 for ; Tue, 6 May 2014 03:29:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 04AD88F8033 for ; Tue, 6 May 2014 01:29:12 -0700 (PDT) X-ASG-Debug-ID: 1399364939-04cbb03cc535eee0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id giNyEkyArfsAma4Q for ; Tue, 06 May 2014 01:28:59 -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: AgFRACGcaFN5LEcvPGdsb2JhbABZgwZPqxsBAQEBAQEGmg2BGRcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hADs0YFxaFQIh8B4MqgRUEmTaWPyswAQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 17:58:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhakD-000385-Er; Tue, 06 May 2014 18:28:57 +1000 Date: Tue, 6 May 2014 18:28:57 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking Message-ID: <20140506082857.GE5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: remove shared supberlock feature checking References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-6-git-send-email-david@fromorbit.com> <20140506081820.GD24143@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506081820.GD24143@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: 1399364939 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:18:20AM -0700, Christoph Hellwig wrote: > On Tue, May 06, 2014 at 01:55:59PM +1000, Dave Chinner wrote: > > > > We reject any filesystem that is mounted with this feature bit set, > > so we don't need to check for it anywhere else. Remove the function > > for checking if the feature bit is set and any code that uses it. > > > > Signed-off-by: Dave Chinner > > Looks good, > > Reviewed-by: Christoph Hellwig > > If someone at SGI has some spare time for a BugWorks search I'd really > love to figure out of the story behind the shared superblock feature.. http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=9ea7d56d2db84bd45183c4ab11903b97c5b9a8e9 tells us that the PV to start looking at is 522678. It's something to do with shared read-only filesystems - I suspect the sb_shared_vn field counts the number of read-only mounts - and my guess is it was for Cellular Irix. i.e. SGI's aborted attempt to make a distributed operating system that left useless crap all through the Irix 6.5 codebase... Cheers, Dve. -- Dave Chinner david@fromorbit.com From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:29:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BE08F7FE0 for ; Tue, 6 May 2014 03:29:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AF6438F8035 for ; Tue, 6 May 2014 01:29:51 -0700 (PDT) X-ASG-Debug-ID: 1399364988-04cbb03cc435ef30001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id hufxLEa99k90wKvy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:29:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1Whal2-0000vZ-Sx; Tue, 06 May 2014 08:29:48 +0000 Date: Tue, 6 May 2014 01:29:48 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: make superblock version checks reflect reality Message-ID: <20140506082948.GA18865@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: make superblock version checks reflect reality References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399348559-19889-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399364989 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > +/* > + * The first XFS version we support is a v4 superblock with V2 directories. > + */ > +static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) > { > + if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) > + return false; > > + /* check for unknown features in the fs */ > + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || Given that sb_versionnum is a __uint16_t and XFS_SB_VERSION_OKBITS is 0xffff this will never evaluate to false and a sane compiler should warn about it. How about remove this check and XFS_SB_VERSION_OKBITS? The various has_ macros are a bit confusing to me, as some explicitly check for 5 superblocks, and some assume the caller handles them in some way, but I think this is something we can leave for later cleanups. > * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: > * > - * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) > + * SB_VERSION_HASFUNBIT(struct xfs_sb *sbp) > * ((xfs_sb_version_hasmorebits(sbp) && > * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) > */ This should be updated to the lowe case convention inlines we've used for a long time. Or just removed as new features should go into v5 superblocks.. Modulo these minor bits: Reviewed-by: Christoph Hellwig From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:37:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F16EA7FDD for ; Tue, 6 May 2014 03:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA908304032 for ; Tue, 6 May 2014 01:37:45 -0700 (PDT) X-ASG-Debug-ID: 1399365464-04cbb03cc635f240001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id DGhhMXHNrCgB3VMk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:37:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1Whasi-0007Xu-6A; Tue, 06 May 2014 08:37:44 +0000 Date: Tue, 6 May 2014 01:37:44 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140506083744.GA9976@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506075905.GA5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399365464 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I like this in general, but one major and one minor issue with the include files: - headers that just include other headers are a bad idea in general. Either they are dependent enough that they should be merged, or they are not, in which case they shouldn't. In this case it seems like we should temporarily provide a xfs_mount.h stub in userspace, and just leave all the includes for things in libxfs.h as they were. That doesn't preclude further merging of the headers into more sensible ones as we've started with the disk formats. - do we really need the separate include/ dir? That always annoys me when editing code. It makes sense for something that is a real public interface, which this is not. Also is libxfs/ really the right name? libxfs in userspace has quite a bit more code than this, so maybe we should just called this "shared" for the shared user/kernel code? From david@fromorbit.com Tue May 6 03:39:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6FB327FDD for ; Tue, 6 May 2014 03:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AE8AAC008 for ; Tue, 6 May 2014 01:39:15 -0700 (PDT) X-ASG-Debug-ID: 1399365553-04bdf02b8c376900001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id UZW9jLwtMwQm1o6w for ; Tue, 06 May 2014 01:39:14 -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: Ar5TAIaeaFN5LEcvPGdsb2JhbABZgwaIR6MjAQEBAQEBBpoNgRkXAwEBAQE4NYIlAQEEAScTHCMFCwgDDgoJJQ8FJQMHGhOIOQfNKRcWhUCIfAeDKoEVAQOZNpY/Kw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:09:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Whau7-0003AM-Ok; Tue, 06 May 2014 18:39:11 +1000 Date: Tue, 6 May 2014 18:39:11 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: make superblock version checks reflect reality Message-ID: <20140506083911.GF5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: make superblock version checks reflect reality References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-2-git-send-email-david@fromorbit.com> <20140506082948.GA18865@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506082948.GA18865@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: 1399365553 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:29:48AM -0700, Christoph Hellwig wrote: > > +/* > > + * The first XFS version we support is a v4 superblock with V2 directories. > > + */ > > +static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) > > { > > + if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) > > + return false; > > > > + /* check for unknown features in the fs */ > > + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || > > Given that sb_versionnum is a __uint16_t and XFS_SB_VERSION_OKBITS is > 0xffff this will never evaluate to false and a sane compiler should warn > about it. How about remove this check and XFS_SB_VERSION_OKBITS? It gets changed later to this: #define XFS_SB_VERSION_OKBITS \ ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ ~XFS_SB_VERSION_SHAREDBIT) So we don't ever consider the shared bit valid. IOWs, it's not 0xffff ;) > The various has_ macros are a bit confusing to me, as some explicitly > check for 5 superblocks, and some assume the caller handles them in > some way, but I think this is something we can leave for later cleanups. > > > * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: > > * > > - * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) > > + * SB_VERSION_HASFUNBIT(struct xfs_sb *sbp) > > > * ((xfs_sb_version_hasmorebits(sbp) && > > * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) > > */ > > This should be updated to the lowe case convention inlines we've used > for a long time. Or just removed as new features should go into v5 > superblocks.. I'll update it. > Modulo these minor bits: > > Reviewed-by: Christoph Hellwig Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+7d63644bc4ad8c587440+3908+infradead.org+hch@bombadil.srs.infradead.org Tue May 6 03:43:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 542B97FDF for ; Tue, 6 May 2014 03:43:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2EA4D304032 for ; Tue, 6 May 2014 01:43:30 -0700 (PDT) X-ASG-Debug-ID: 1399365809-04bdf02b8d376b00001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id Ys1asU1TWCkURQyT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 01:43:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7d63644bc4ad8c587440+3908+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 1WhayG-0001gT-Qn; Tue, 06 May 2014 08:43:28 +0000 Date: Tue, 6 May 2014 01:43:28 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140506084328.GA30444@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506075905.GA5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399365809 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Getting rid of the need for xfs_mount.h in xfs_ialloc.h xfs_da_format.h should be simple: - inline xfs_make_iptr into the only caller - move xfs_icluster_size_fsb to xfs_ialloc.c and just provide a prototype for it. - the various conversion routines for the directory blocks really shouldn't be in xfs_da_format.h anyway as they don't define the format. Just have some other header that requires a version of xfs_mount included first. From david@fromorbit.com Tue May 6 03:45:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3EACB7FDF for ; Tue, 6 May 2014 03:45:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27BE0304032 for ; Tue, 6 May 2014 01:45:37 -0700 (PDT) X-ASG-Debug-ID: 1399365935-04bdf02b8b376bd0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RH2m2RAuyhQZOtx4 for ; Tue, 06 May 2014 01:45:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:15:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Whazp-0003BN-TS; Tue, 06 May 2014 18:45:05 +1000 Date: Tue, 6 May 2014 18:45:05 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: don't need dirv2 checks anymore Message-ID: <20140506084505.GG5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: don't need dirv2 checks anymore References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-5-git-send-email-david@fromorbit.com> <20140506081652.GC24143@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506081652.GC24143@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: 1399365935 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.5579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:16:52AM -0700, Christoph Hellwig wrote: > > - ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); > > + ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); > > How is this going to work for v5 filesystems? Probably better to just > kill the assert.. mkfs still sets the sb_features bitmask for all the supported v4 features it uses by default on v5 superblocks. There are some feature bits in the v4 mask that are optional for v5 superblocks, too (e.g. case insensitivity, sunit/swidth alignment), so we won't ever stop setting the XFS_SB_VERSION_DIRV2BIT on v5 superblocks... > Otherwise looks good, > > Reviewed-by: Christoph Hellwig Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 04:01:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6EABF7FF0 for ; Tue, 6 May 2014 04:01:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5EAC58F8033 for ; Tue, 6 May 2014 02:01:13 -0700 (PDT) X-ASG-Debug-ID: 1399366867-04cb6c72903800d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id fOrKr74IlzvdB0qJ for ; Tue, 06 May 2014 02:01:08 -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: Ar5TAJKkaFN5LEcvPGdsb2JhbABZgwaIR6MkAQEBAQEBBpoNgRkXAwEBAQE4NYIlAQEEATocIwULCAMOCgkaCw8FJQMHGhOIOQfNLBcWhUCIfAeEPwSZNpRugVErgTAk Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:30:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhbFA-0003EE-If; Tue, 06 May 2014 19:00:56 +1000 Date: Tue, 6 May 2014 19:00:56 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140506090056.GH5421@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140506083744.GA9976@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506083744.GA9976@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: 1399366867 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:37:44AM -0700, Christoph Hellwig wrote: > I like this in general, but one major and one minor issue with > the include files: > > - headers that just include other headers are a bad idea in general. > Either they are dependent enough that they should be merged, or > they are not, in which case they shouldn't. > > In this case it seems like we should temporarily provide a > xfs_mount.h stub in userspace, and just leave all the includes > for things in libxfs.h as they were. That doesn't preclude further > merging of the headers into more sensible ones as we've started > with the disk formats. I did this because I'm sick of having to edit 50+ files whenever a single header dependency changes. There are almost all cookie cutter duplicates because of the dependencies - if it were code, we'd factor it in an instant. I just don't see why we should treat 50 copies of the same header includes any differently.... > - do we really need the separate include/ dir? That always annoys > me when editing code. It makes sense for something that is a real > public interface, which this is not. It's for simplicity of updates with the userspace code. Both userspace and kernel need the same code layout, and userspace currently has a separate include directory for all the header files (and they get installed that way, too). If we want to change the userspace source layout and commingle all the headers with the C code, then that's a lot more work on the userspace side (i.e. it's more than just pointing the include/xfs symlink to libxfs/include). I don't mind which approach we take - it's trivial to rework the patchset to place all the headers in the libxfs/ directory - I just took the one that matched the current userspace infrastructure... > Also is libxfs/ really the right name? libxfs in userspace has quite > a bit more code than this, so maybe we should just called this "shared" > for the shared user/kernel code? I'd like to have this kernel code define libxfs/, while in userspace we separate out all the support code (i.e. libxfs/rdwr.c, etc) into a different directory that builds the userspace libraries. i.e. libxfs/ is a static object archive that is wrapped by the userspace infrastructure, just like the kernel wraps it with infrastructure to make it useful... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue May 6 04:03:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5DBA37FF0 for ; Tue, 6 May 2014 04:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4CA348F8035 for ; Tue, 6 May 2014 02:03:59 -0700 (PDT) X-ASG-Debug-ID: 1399367037-04cb6c72903802a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mtDXv8iGzpK0TH9U (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 06 May 2014 02:03:58 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4693uUF028712 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 6 May 2014 09:03:57 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4693tME024682 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 6 May 2014 09:03:56 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4693tq8024781 for ; Tue, 6 May 2014 09:03:55 GMT Received: from [192.168.1.101] (/112.238.87.212) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 06 May 2014 02:03:55 -0700 Message-ID: <5368A578.7070201@oracle.com> Date: Tue, 06 May 2014 17:03:52 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: Fwd: New Defects reported by Coverity Scan for xfsprogs References: <5362fbfc78ad5_2dbacf387045986@209.249.196.67.mail> X-ASG-Orig-Subj: Fwd: New Defects reported by Coverity Scan for xfsprogs In-Reply-To: <5362fbfc78ad5_2dbacf387045986@209.249.196.67.mail> X-Forwarded-Message-Id: <5362fbfc78ad5_2dbacf387045986@209.249.196.67.mail> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399367038 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, I'm not sure if someone else has also noticed the following reports from Coverity. -------- Original Message -------- Subject: New Defects reported by Coverity Scan for xfsprogs Date: Thu, 01 May 2014 18:59:24 -0700 From: scan-admin@coverity.com Hi, Please find the latest report on new defect(s) introduced to xfsprogs found with Coverity Scan. Defect(s) Reported-by: Coverity Scan Showing 1 of 1 defect(s) ** CID 996972: Out-of-bounds access (OVERRUN) /libxfs/xfs_btree.c: 2641 in xfs_btree_new_root() ________________________________________________________________________________________________________ *** CID 996972: Out-of-bounds access (OVERRUN) /libxfs/xfs_btree.c: 2641 in xfs_btree_new_root() 2635 /* Allocate the new block. If we can't do it, we're toast. Give up. */ 2636 error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, 1, stat); 2637 if (error) 2638 goto error0; 2639 if (*stat == 0) 2640 goto out0; >>> CID 996972: Out-of-bounds access (OVERRUN) >>> Jumping to case "XFS_BTNUM_MAX". 2641 XFS_BTREE_STATS_INC(cur, alloc); 2642 2643 /* Set up the new block. */ 2644 error = xfs_btree_get_buf_block(cur, &lptr, 0, &new, &nbp); 2645 if (error) 2646 goto error0; It seems like a false alarm, but maybe we can just remove the out0 label as below? From: Jie Liu Subject: xfs: get rid of out0 goto label from xfs_btree_new_root Get rid of the useless out0 goto label and return 0 directly in case of falling to alloate the new block. Signed-off-by: Jie Liu --- fs/xfs/xfs_btree.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 182bac2..f162dc9 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -2653,8 +2653,11 @@ xfs_btree_new_root( error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); if (error) goto error0; - if (*stat == 0) - goto out0; + if (*stat == 0) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + return 0; + } + XFS_BTREE_STATS_INC(cur, alloc); /* Set up the new block. */ @@ -2743,10 +2746,6 @@ xfs_btree_new_root( error0: XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); return error; -out0: - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); - *stat = 0; - return 0; } STATIC int -- 1.8.3.2 Cheers, -Jeff From david@fromorbit.com Tue May 6 04:06:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 870AC7FF0 for ; Tue, 6 May 2014 04:06:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 269E2AC008 for ; Tue, 6 May 2014 02:06:04 -0700 (PDT) X-ASG-Debug-ID: 1399367158-04cbb03cc53600b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id mktwaNY01FWBsen7 for ; Tue, 06 May 2014 02:05:59 -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: AvNmAI+laFN5LEcvPGdsb2JhbABZgwaIR6MkAQEBAQEBBpoLgRkXAwEBAQE4NYIlAQEFOhwREhAIAw4KCRoLDwUlAwcaE4hAzSkXFoVAiHwHhD8EmTaUcYFRKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:35:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhbJh-0003FA-LN; Tue, 06 May 2014 19:05:37 +1000 Date: Tue, 6 May 2014 19:05:37 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140506090537.GI5421@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140506084328.GA30444@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506084328.GA30444@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: 1399367158 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:43:28AM -0700, Christoph Hellwig wrote: > Getting rid of the need for xfs_mount.h in xfs_ialloc.h xfs_da_format.h > should be simple: > > - inline xfs_make_iptr into the only caller > - move xfs_icluster_size_fsb to xfs_ialloc.c and just provide a > prototype for it. Yeah, those are easy. > - the various conversion routines for the directory blocks really > shouldn't be in xfs_da_format.h anyway as they don't define the > format. Just have some other header that requires a version of > xfs_mount included first. Still has the same problem - the library code is dependent on an externally defined struct xfs_mount. What needs to happen is the directory code needs to define the structure that carries all the precalculated geometry, and the struct mount use that structure to store them. Then the directory code can use it's own structure as the function argument, and the dependence on struct xfs_mount goes away completely. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 04:06:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 230607FF0 for ; Tue, 6 May 2014 04:06:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B979304032 for ; Tue, 6 May 2014 02:06:39 -0700 (PDT) X-ASG-Debug-ID: 1399367197-04cb6c7291380400001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id f0NCcVRJgFBbsOpn for ; Tue, 06 May 2014 02:06:38 -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: AvBmAI+laFN5LEcvPGdsb2JhbABZgwaIR6MkAQEBAQEBBpoLgRkXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQM0pFxaFQIh8B4Q/BJk2lkIr Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:36:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhbKe-0003FL-5T; Tue, 06 May 2014 19:06:36 +1000 Date: Tue, 6 May 2014 19:06:36 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: turn NLINK feature on by default Message-ID: <20140506090636.GJ5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: turn NLINK feature on by default References: <1399348559-19889-1-git-send-email-david@fromorbit.com> <1399348559-19889-4-git-send-email-david@fromorbit.com> <20140506081518.GB24143@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506081518.GB24143@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: 1399367197 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 01:15:18AM -0700, Christoph Hellwig wrote: > > > > @@ -1112,7 +1085,7 @@ xfs_bumplink( > > * system to do this, then we need to bump the superblock > > * version number as well. > > */ > > - xfs_bump_ino_vers2(tp, ip); > > + xfs_bump_ino_vers2(ip); > > The comment here is certainly out of date now. > > But I think keeping these xfs_bump_ino_vers2 calls around everywhere is > wrong to start with. xfs_iread should make sure all inodes are version > 1, that allows to kill xfs_bump_ino_vers2 entirely, and probably also > simplify xfs_ialloc a little more. At the point we won't have to deal > with v1 inodes anywhere but in xfs_iread, and we can have a big fat > comment in that place why we even bother with the v1 inodes, because > the fact that we have the hasnlink bit but inodes might still be old > format is something we'll all have forgotten about in a few years, > and new developers will never figure out by themselves. OK, I'll look at reworking it aong those lines. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 04:09:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E0F587FF0 for ; Tue, 6 May 2014 04:09:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C906B304032 for ; Tue, 6 May 2014 02:09:52 -0700 (PDT) X-ASG-Debug-ID: 1399367390-04bdf02b8c377930001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id lk65aQJL8hQMFb62 for ; Tue, 06 May 2014 02:09:50 -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: AvBmAI+laFN5LEcvPGdsb2JhbABZgwaIR6MkAQEBAQEBBpoLgRkXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQM0pFxaFQIh8B4Q/BJk2iwGLQSs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:39:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhbNk-0003G4-W8; Tue, 06 May 2014 19:09:49 +1000 Date: Tue, 6 May 2014 19:09:48 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, Brian Foster Subject: Re: [PATCH 5/5 v2] xfs: pass struct da_args to xfs_attr_calc_size Message-ID: <20140506090948.GK5421@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/5 v2] xfs: pass struct da_args to xfs_attr_calc_size References: <1399130415-5382-1-git-send-email-hch@lst.de> <1399130415-5382-6-git-send-email-hch@lst.de> <20140505202149.GF12448@laptop.bfoster> <20140506080658.GA12085@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506080658.GA12085@lst.de> 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: 1399367390 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 10:06:58AM +0200, Christoph Hellwig wrote: > And remove a very confused comment. > > Signed-off-by: Christoph Hellwig > Reviewed-by: Brian Foster > --- > fs/xfs/xfs_attr.c | 14 +++++--------- > 1 file changed, 5 insertions(+), 9 deletions(-) > > [updated for a minor conflict in for-next] Already seen that on a local merge - I fix conflicts like this when I merge the topic branch into for-next. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 04:16:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CE3037FAD for ; Tue, 6 May 2014 04:16:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBAC08F8037 for ; Tue, 6 May 2014 02:16:06 -0700 (PDT) X-ASG-Debug-ID: 1399367764-04cbb03cc4360680001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NvW1DDBQTkSfARUM for ; Tue, 06 May 2014 02:16:04 -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: AvdmAOenaFN5LEcvPGdsb2JhbABZgwaIR6MkAQEBAQEBBpoLgRkXAwEBAQE4NYIlAQEEAScTHCMFCwgDFQIBCSUPBSUDBwwOE4g5B80vFxaFQIh8B4Q/AQOZNpZCKw Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail05.adl6.internode.on.net with ESMTP; 06 May 2014 18:46:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhbTm-0003Gq-QF; Tue, 06 May 2014 19:16:02 +1000 Date: Tue, 6 May 2014 19:16:02 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: Fwd: New Defects reported by Coverity Scan for xfsprogs Message-ID: <20140506091602.GL5421@dastard> X-ASG-Orig-Subj: Re: Fwd: New Defects reported by Coverity Scan for xfsprogs References: <5362fbfc78ad5_2dbacf387045986@209.249.196.67.mail> <5368A578.7070201@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5368A578.7070201@oracle.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: 1399367764 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 05:03:52PM +0800, Jeff Liu wrote: > Hi Folks, > > I'm not sure if someone else has also noticed the following reports from Coverity. yup, saw it - it not a regression from a recent checkin, so it must some new check they've added to Coverity. However, i ignored it because it looked completely bogus.... > It seems like a false alarm, but maybe we can just remove the out0 label as below? Yup, it must be getting confused with the assignment of *stat = 0 after checking that it is already zero... > From: Jie Liu > Subject: xfs: get rid of out0 goto label from xfs_btree_new_root > > Get rid of the useless out0 goto label and return 0 directly in case > of falling to alloate the new block. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_btree.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c > index 182bac2..f162dc9 100644 > --- a/fs/xfs/xfs_btree.c > +++ b/fs/xfs/xfs_btree.c > @@ -2653,8 +2653,11 @@ xfs_btree_new_root( > error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); > if (error) > goto error0; > - if (*stat == 0) > - goto out0; > + if (*stat == 0) { > + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > + return 0; > + } > + > XFS_BTREE_STATS_INC(cur, alloc); > > /* Set up the new block. */ > @@ -2743,10 +2746,6 @@ xfs_btree_new_root( > error0: > XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); > return error; > -out0: > - XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > - *stat = 0; > - return 0; > } Looks fine. It's not obviously a problem, so I'll queue it up for after then 3.2.0 release. Cheers, Dave. -- Dave Chinner david@fromorbit.com From wangsl.fnst@cn.fujitsu.com Tue May 6 04:37:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6BF687FD5 for ; Tue, 6 May 2014 04:37:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 428CA304032 for ; Tue, 6 May 2014 02:37:46 -0700 (PDT) X-ASG-Debug-ID: 1399369062-04bdf02b8a378680001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id tAPlrAVCoaceWuek for ; Tue, 06 May 2014 02:37:44 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,996,1389715200"; d="scan'208";a="30131569" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 06 May 2014 17:32:45 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s469ZETj003349; Tue, 6 May 2014 17:35:14 +0800 Received: from wangs.fnst.cn.fujitsu.com (10.167.226.104) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.146.2; Tue, 6 May 2014 17:35:20 +0800 From: Wang Shilong To: CC: Subject: [PATCH] xfstests: add regression test for inode cache vs tree log Date: Tue, 6 May 2014 17:31:24 +0800 X-ASG-Orig-Subj: [PATCH] xfstests: add regression test for inode cache vs tree log Message-ID: <1399368684-1585-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.167.226.104] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1399369063 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.5580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patch adds a regression test to verify btrfs can not reuse inode id until we have committed transaction. Which was addressed by the following kernel patch: Btrfs: fix inode cache vs tree log Signed-off-by: Wang Shilong --- tests/btrfs/049 | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/049.out | 1 + tests/btrfs/group | 1 + 3 files changed, 111 insertions(+) create mode 100644 tests/btrfs/049 create mode 100644 tests/btrfs/049.out diff --git a/tests/btrfs/049 b/tests/btrfs/049 new file mode 100644 index 0000000..3101d09 --- /dev/null +++ b/tests/btrfs/049 @@ -0,0 +1,109 @@ +#! /bin/bash +# FS QA Test No. btrfs/049 +# +# Regression test for btrfs inode caching vs tree log which was +# addressed by the following kernel patch. +# +# Btrfs: fix inode caching vs tree log +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Fujitsu. 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() +{ + _cleanup_flakey + rm -rf $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmflakey + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_dm_flakey + +rm -f $seqres.full + +_scratch_mkfs >> $seqres.full 2>&1 + +SAVE_MOUNT_OPTIONS="$MOUNT_OPTIONS" +MOUNT_OPTIONS="$MOUNT_OPTIONS -o inode_cache,commit=100" + +# create a basic flakey device that will never error out +_init_flakey +_mount_flakey + +_get_inode_id() +{ + local inode_id + inode_id=`stat $1 | grep Inode: | $AWK_PROG '{print $4}'` + echo $inode_id +} + +$XFS_IO_PROG -f -c "pwrite 0 10M" -c "fsync" \ + $SCRATCH_MNT/data >& /dev/null + +inode_id=`_get_inode_id "$SCRATCH_MNT/data"` +rm -f $SCRATCH_MNT/data + +for i in `seq 1 5`; +do + mkdir $SCRATCH_MNT/dir_$i + new_inode_id=`_get_inode_id $SCRATCH_MNT/dir_$i` + if [ $new_inode_id -eq $inode_id ] + then + $XFS_IO_PROG -f -c "pwrite 0 1M" -c "fsync" \ + $SCRATCH_MNT/dir_$i/data1 >& /dev/null + _load_flakey_table 1 + _unmount_flakey + need_umount=1 + break + fi + sleep 1 +done + +# restore previous mount options +export MOUNT_OPTIONS="$SAVE_MOUNT_OPTIONS" + +# ok mount so that any recovery that needs to happen is done +if [ $new_inode_id -eq $inode_id ];then + _load_flakey_table $FLAKEY_ALLOW_WRITES + _mount_flakey + _unmount_flakey +fi + +# make sure we got a valid fs after replay +_check_scratch_fs $FLAKEY_DEV + +status=0 +exit diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out new file mode 100644 index 0000000..cb0061b --- /dev/null +++ b/tests/btrfs/049.out @@ -0,0 +1 @@ +QA output created by 049 diff --git a/tests/btrfs/group b/tests/btrfs/group index af60c79..59b0c98 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -51,3 +51,4 @@ 046 auto quick 047 auto quick 048 auto quick +049 auto quick -- 1.8.2.1 From steveb@mcs.st-and.ac.uk Tue May 6 05:25:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C442D7FC2 for ; Tue, 6 May 2014 05:25:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5619BAC002 for ; Tue, 6 May 2014 03:25:28 -0700 (PDT) X-ASG-Debug-ID: 1399371925-04cb6c72903826c0001-NocioJ Received: from belhaven.mcs.st-and.ac.uk (belhaven.mcs.st-and.ac.uk [138.251.201.57]) by cuda.sgi.com with ESMTP id Vb7XOEEAnzF11fCE for ; Tue, 06 May 2014 03:25:26 -0700 (PDT) X-Barracuda-Envelope-From: steveb@mcs.st-and.ac.uk X-Barracuda-Apparent-Source-IP: 138.251.201.57 Received: from mcs.st-and.ac.uk (becks [138.251.201.65]) by belhaven.mcs.st-and.ac.uk (8.13.8+Sun/8.13.8) with ESMTP id s46ANDvS011915 for ; Tue, 6 May 2014 11:23:14 +0100 (BST) Received: from becks.mcs.st-and.ac.uk (localhost.localdomain [127.0.0.1]) by mcs.st-and.ac.uk (8.13.8/8.13.8) with ESMTP id s46APPGH001347 for ; Tue, 6 May 2014 11:25:25 +0100 Received: from localhost (steveb@localhost) by becks.mcs.st-and.ac.uk (8.13.8/8.13.8/Submit) with ESMTP id s46APOpZ001344 for ; Tue, 6 May 2014 11:25:25 +0100 X-Authentication-Warning: becks.mcs.st-and.ac.uk: steveb owned process doing -bs Date: Tue, 6 May 2014 11:25:24 +0100 (BST) From: Steve Brooks To: xfs@oss.sgi.com Subject: XFS tune to adaptec ASR71605 Message-ID: X-ASG-Orig-Subj: XFS tune to adaptec ASR71605 User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: belhaven.mcs.st-and.ac.uk[138.251.201.57] X-Barracuda-Start-Time: 1399371926 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.5581 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi All, New to the list so first hello to you all from St Andrews, Scotland. We have three new raid hosts each with an Adaptec ASR71605 controller. Given upstream (Red Hat) are going to be using XFS as their default file system we are going to use XFS on the three raid hosts. After much reading around this is what I came up with. All hosts have 16x4TB WD RE WD4000FYYZ drives and will run "RAID 6" The underlying RAID details are RAID level : 6 Reed-Solomon Status of logical device : Optimal Size : 53401590 MB Stripe-unit size : 512 KB Read-cache setting : Enabled Read-cache status : On Write-cache setting : Disabled Write-cache status : Off Partitioned : No I built the filesystem with mkfs.xfs -f -d su=512k,sw=14 /dev/sda and mounted with fstab options xfs defaults,inode64,nobarrier My question is are the "mkfs.xfs" and the mount options I used sensible? The RAID is to be used to store data from "numerical simulations" that were run on a high performance cluster and is not mission critical in the sense that it can be regenerated if lost. Of course that would take the user/cluster some time. Thanks for any advice. Steve From eflorac@intellique.com Tue May 6 06:00:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9ACD27F8D for ; Tue, 6 May 2014 06:00:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7FB4E8F8E73 for ; Tue, 6 May 2014 04:00:10 -0700 (PDT) X-ASG-Debug-ID: 1399374009-04cbb03cc7362ed0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id t38y3HlzDN3cCW4G for ; Tue, 06 May 2014 04:00:09 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 1CCC62C776; Tue, 6 May 2014 07:00:09 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 0BA3B2C765; Tue, 6 May 2014 07:00:07 -0400 (EDT) Date: Tue, 6 May 2014 13:00:08 +0200 From: Emmanuel Florac To: xfs@oss.sgi.com, Steve Brooks Subject: Re: XFS tune to adaptec ASR71605 Message-ID: <20140506130008.13a1a7ee@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.20; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1399374009 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.5582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 6 May 2014 11:25:24 +0100 (BST) Steve Brooks =E9crivait: >=20 > My question is are the "mkfs.xfs" and the mount options I used > sensible? The RAID is to be used to store data from "numerical > simulations" that were run on a high performance cluster and is not > mission critical in the sense that it can be regenerated if lost. Of > course that would take the user/cluster some time. >=20 Looks fine to me. In my experience, using non default mkfs.xfs settings makes very little to no difference at all, anyway. In case you're interested, here are some benchmarks I've made on a similar setup with bonnie++ (Raid controller 71604, 16x 3 To HGST, RAID-6 + spare (13 data drives)). 1.96,1.96,storiq,1,1386247609,32160M,,,,886148,94,511728,76,,,1364991,99,69= 9.9,36,50,,,,,32874,93, +++++,+++,37064,95,32901,96,+++++,+++,33100,93,,22110us,348ms,,62214us,141m= s,11973us,111us,141us,131us,10us,134us 1.96,1.96,storiq,1,1386247609,32160M,,,,989408,95,568600,82,,,1623220,95,86= 9.3,17,50,,,,,34624,96, +++++,+++,39390,94,34764,94,+++++,+++,37472,96,,22037us,213ms,,253ms,232ms,= 324us,109us,140us,319us,7us,108us 1.96,1.96,storiq,1,1386247609,32160M,,,,1023291,97,580413,81,,,1634417,98,7= 25.4,35,50,,,,,34913,96, +++++,+++,41099,99,34578,97,+++++,+++,33708,94,,186us,216ms,,54367us,63127u= s,1016us,104us,5508us,1029us,7us,138us 1.96,1.96,storiq,1,1386247609,32160M,,,,942138,97,578247,81,,,1643345,96,90= 9.4,19,50,,,,,33042,96, +++++,+++,36391,95,33893,95,+++++,+++,34003,93,,1813us,222ms,,83887us,69003= us,1032us,108us,144us,133us,7us,133us 1.96,1.96,storiq,1,1386247609,32160M,,,,939598,97,580680,82,,,1611637,97,72= 8.1,34,50,,,,,34819,96, +++++,+++,39870,96,34614,97,+++++,+++,37632,96,,2053us,210ms,,71363us,84645= us,990us,108us,139us,1030us,6us,1042us 1.96,1.96,storiq,1,1386247609,32160M,,,,972033,98,576180,81,,,1656062,98,72= 2.0,35,50,,,,,34923,97, +++++,+++,39788,96,33449,95,+++++,+++,32783,95,,3608us,279ms,,82386us,46777= us,1026us,105us,137us,1059us,17us,142us 1.96,1.96,storiq,1,1386247609,32160M,,,,937764,98,578995,83,,,1496290,96,73= 1.3,36,50,,,,,34852,97, +++++,+++,39990,96,34625,97,+++++,+++,35387,96,,185us,206ms,,52160us,41925u= s,344us,106us,136us,993us,5us,128us 1.96,1.96,storiq,1,1386247609,32160M,,,,1037074,97,580587,81,,,1681379,98,7= 19.0,36,50,,,,,34673,96, +++++,+++,39961,96,34799,97,+++++,+++,37775,96,,175us,252ms,,29845us,78347u= s,1035us,113us,137us,1011us,7us,3389us --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From steveb@mcs.st-and.ac.uk Tue May 6 08:14:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 509358004 for ; Tue, 6 May 2014 08:14:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 322C3304043 for ; Tue, 6 May 2014 06:14:46 -0700 (PDT) X-ASG-Debug-ID: 1399382081-04cbb03cc63674e0001-NocioJ Received: from belhaven.mcs.st-and.ac.uk (belhaven.mcs.st-and.ac.uk [138.251.201.57]) by cuda.sgi.com with ESMTP id wE8xWaQCpGt19xYb for ; Tue, 06 May 2014 06:14:41 -0700 (PDT) X-Barracuda-Envelope-From: steveb@mcs.st-and.ac.uk X-Barracuda-Apparent-Source-IP: 138.251.201.57 Received: from mcs.st-and.ac.uk (becks [138.251.201.65]) by belhaven.mcs.st-and.ac.uk (8.13.8+Sun/8.13.8) with ESMTP id s46DCOC7013527; Tue, 6 May 2014 14:12:24 +0100 (BST) Received: from becks.mcs.st-and.ac.uk (localhost.localdomain [127.0.0.1]) by mcs.st-and.ac.uk (8.13.8/8.13.8) with ESMTP id s46DEabS001562; Tue, 6 May 2014 14:14:36 +0100 Received: from localhost (steveb@localhost) by becks.mcs.st-and.ac.uk (8.13.8/8.13.8/Submit) with ESMTP id s46DEZN3001559; Tue, 6 May 2014 14:14:35 +0100 X-Authentication-Warning: becks.mcs.st-and.ac.uk: steveb owned process doing -bs Date: Tue, 6 May 2014 14:14:35 +0100 (BST) From: Steve Brooks To: Emmanuel Florac cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 In-Reply-To: <20140506130008.13a1a7ee@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 Message-ID: References: <20140506130008.13a1a7ee@harpe.intellique.com> User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: belhaven.mcs.st-and.ac.uk[138.251.201.57] X-Barracuda-Start-Time: 1399382081 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.5584 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- >> My question is are the "mkfs.xfs" and the mount options I used >> sensible? The RAID is to be used to store data from "numerical >> simulations" that were run on a high performance cluster and is not >> mission critical in the sense that it can be regenerated if lost. Of >> course that would take the user/cluster some time. >> > > Looks fine to me. In my experience, using non default mkfs.xfs settings > makes very little to no difference at all, anyway. In case you're > interested, here are some benchmarks I've made on a similar setup with > bonnie++ (Raid controller 71604, 16x 3 To HGST, RAID-6 + spare (13 data > drives)). > > 1.96,1.96,storiq,1,1386247609,32160M,,,,886148,94,511728,76,,,1364991,99,699.9,36,50,,,,,32874,93, > +++++,+++,37064,95,32901,96,+++++,+++,33100,93,,22110us,348ms,,62214us,141ms,11973us,111us,141us,131us,10us,134us > 1.96,1.96,storiq,1,1386247609,32160M,,,,989408,95,568600,82,,,1623220,95,869.3,17,50,,,,,34624,96, > +++++,+++,39390,94,34764,94,+++++,+++,37472,96,,22037us,213ms,,253ms,232ms,324us,109us,140us,319us,7us,108us > 1.96,1.96,storiq,1,1386247609,32160M,,,,1023291,97,580413,81,,,1634417,98,725.4,35,50,,,,,34913,96, > +++++,+++,41099,99,34578,97,+++++,+++,33708,94,,186us,216ms,,54367us,63127us,1016us,104us,5508us,1029us,7us,138us > 1.96,1.96,storiq,1,1386247609,32160M,,,,942138,97,578247,81,,,1643345,96,909.4,19,50,,,,,33042,96, > +++++,+++,36391,95,33893,95,+++++,+++,34003,93,,1813us,222ms,,83887us,69003us,1032us,108us,144us,133us,7us,133us > 1.96,1.96,storiq,1,1386247609,32160M,,,,939598,97,580680,82,,,1611637,97,728.1,34,50,,,,,34819,96, > +++++,+++,39870,96,34614,97,+++++,+++,37632,96,,2053us,210ms,,71363us,84645us,990us,108us,139us,1030us,6us,1042us > 1.96,1.96,storiq,1,1386247609,32160M,,,,972033,98,576180,81,,,1656062,98,722.0,35,50,,,,,34923,97, > +++++,+++,39788,96,33449,95,+++++,+++,32783,95,,3608us,279ms,,82386us,46777us,1026us,105us,137us,1059us,17us,142us > 1.96,1.96,storiq,1,1386247609,32160M,,,,937764,98,578995,83,,,1496290,96,731.3,36,50,,,,,34852,97, > +++++,+++,39990,96,34625,97,+++++,+++,35387,96,,185us,206ms,,52160us,41925us,344us,106us,136us,993us,5us,128us > 1.96,1.96,storiq,1,1386247609,32160M,,,,1037074,97,580587,81,,,1681379,98,719.0,36,50,,,,,34673,96, > +++++,+++,39961,96,34799,97,+++++,+++,37775,96,,175us,252ms,,29845us,78347us,1035us,113us,137us,1011us,7us,3389us Thanks for the reply Emmanuel, I installed and rua bonnie++ although I will need to research the results > bonnie++ -d ./ -s 8192 -r 4096 -u root Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP sraid2v 8G 1845 94 76018 4 89110 4 4275 154 3908715 99 4952 93 Latency 8537us 164us 170us 2770us 45us 5867us Version 1.96 ------Sequential Create------ --------Random Create-------- sraid2v -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 16 13100 21 +++++ +++ 24231 37 13289 22 +++++ +++ 28532 44 Latency 23062us 60us 117ms 25013us 29us 61us Steve From bfoster@redhat.com Tue May 6 08:27:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 218D28004 for ; Tue, 6 May 2014 08:27:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD080AC003 for ; Tue, 6 May 2014 06:27:55 -0700 (PDT) X-ASG-Debug-ID: 1399382874-04cb6c1fcc236f60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id STl1Fq1YNcP2H8IV for ; Tue, 06 May 2014 06:27: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s46DRlfp010555 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 6 May 2014 09:27:47 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s46DRlhc029324; Tue, 6 May 2014 09:27:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 181D71242A3; Tue, 6 May 2014 09:27:46 -0400 (EDT) Date: Tue, 6 May 2014 09:27:46 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown Message-ID: <20140506132745.GA14154@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown References: <1399338280-10013-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399338280-10013-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399382874 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, May 06, 2014 at 11:04:40AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Reports of a shutdown hang when fsyncing a directory have surfaced, > such as this: > > [ 3663.394472] Call Trace: > [ 3663.397199] [] schedule+0x29/0x70 > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > [ 3663.435873] [] do_fsync+0x65/0xa0 > [ 3663.441408] [] SyS_fsync+0x10/0x20 > [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > If we trigger a shutdown in xlog_cil_push() from xlog_write(), we > will never wake waiters on the current push sequence number, so > anything waiting in xlog_cil_force_lsn() for that push sequence > number to come up will not get woken and hence stall the shutdown. > > Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in > the push abort handling, in the log shutdown code when waking all > waiters, and adding a shutdown check in the sequence completion wait > loops to ensure they abort when a wakeup due to a shutdown occurs. > > Reported-by: Boris Ranto > Reported-by: Eric Sandeen > Signed-off-by: Dave Chinner > --- Previously posted here, for reference: http://oss.sgi.com/archives/xfs/2014-04/msg00801.html > fs/xfs/xfs_log.c | 7 +++++-- > fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- > 2 files changed, 47 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index a5f8bd9..dbba2d7 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3952,11 +3952,14 @@ xfs_log_force_umount( > retval = xlog_state_ioerror(log); > spin_unlock(&log->l_icloglock); > } > + > /* > - * Wake up everybody waiting on xfs_log_force. > - * Callback all log item committed functions as if the > + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone > + * waiting on a CIL push that is issued as part of a log force first > + * before running the log item committed callback functions as if the > * log writes were completed. > */ > + wake_up_all(&log->l_cilp->xc_commit_wait); > xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); > This looks fine to me with the defensive reasoning described in the aforementioned link, but it also looks like it could race with a force and sleep because we don't take xc_push_lock. We take the lock for the same wake up down in xlog_cil_committed(), so a hang seems unlikely at this point. Given that the comment is kind of wordy (and unless we want to do the locking here as well), could we update the comment to reflect this? E.g., something like: /* * Wake up everybody waiting on a CIL push and/or log force. Wake the * CIL push first as if the log writes were completed. The abort * handling in the log item committed callback functions will do this * again under lock to avoid races. */ Thoughts? Brian > #ifdef XFSERRORDEBUG > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index 7e54553..039c873 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -385,7 +385,15 @@ xlog_cil_committed( > xfs_extent_busy_clear(mp, &ctx->busy_extents, > (mp->m_flags & XFS_MOUNT_DISCARD) && !abort); > > + /* > + * If we are aborting the commit, wake up anyone waiting on the > + * committing list. If we don't, then a shutdown we can leave processes > + * waiting in xlog_cil_force_lsn() waiting on a sequence commit that > + * will never happen because we aborted it. > + */ > spin_lock(&ctx->cil->xc_push_lock); > + if (abort) > + wake_up_all(&ctx->cil->xc_commit_wait); > list_del(&ctx->committing); > spin_unlock(&ctx->cil->xc_push_lock); > > @@ -564,8 +572,18 @@ restart: > spin_lock(&cil->xc_push_lock); > list_for_each_entry(new_ctx, &cil->xc_committing, committing) { > /* > + * Avoid getting stuck in this loop because we were woken by the > + * shutdown, but then went back to sleep once already in the > + * shutdown state. > + */ > + if (XLOG_FORCED_SHUTDOWN(log)) { > + spin_unlock(&cil->xc_push_lock); > + goto out_abort_free_ticket; > + } > + > + /* > * Higher sequences will wait for this one so skip them. > - * Don't wait for own own sequence, either. > + * Don't wait for our own sequence, either. > */ > if (new_ctx->sequence >= ctx->sequence) > continue; > @@ -810,6 +828,13 @@ restart: > */ > spin_lock(&cil->xc_push_lock); > list_for_each_entry(ctx, &cil->xc_committing, committing) { > + /* > + * Avoid getting stuck in this loop because we were woken by the > + * shutdown, but then went back to sleep once already in the > + * shutdown state. > + */ > + if (XLOG_FORCED_SHUTDOWN(log)) > + goto out_shutdown; > if (ctx->sequence > sequence) > continue; > if (!ctx->commit_lsn) { > @@ -833,14 +858,12 @@ restart: > * push sequence after the above wait loop and the CIL still contains > * dirty objects. > * > - * When the push occurs, it will empty the CIL and > - * atomically increment the currect sequence past the push sequence and > - * move it into the committing list. Of course, if the CIL is clean at > - * the time of the push, it won't have pushed the CIL at all, so in that > - * case we should try the push for this sequence again from the start > - * just in case. > + * When the push occurs, it will empty the CIL and atomically increment > + * the currect sequence past the push sequence and move it into the > + * committing list. Of course, if the CIL is clean at the time of the > + * push, it won't have pushed the CIL at all, so in that case we should > + * try the push for this sequence again from the start just in case. > */ > - > if (sequence == cil->xc_current_sequence && > !list_empty(&cil->xc_cil)) { > spin_unlock(&cil->xc_push_lock); > @@ -849,6 +872,17 @@ restart: > > spin_unlock(&cil->xc_push_lock); > return commit_lsn; > + > + /* > + * We detected a shutdown in progress. We need to trigger the log force > + * to pass through it's iclog state machine error handling, even though > + * we are already in a shutdown state. Hence we can't return > + * NULLCOMMITLSN here as that has special meaning to log forces (i.e. > + * LSN is already stable), so we return a zero LSN instead. > + */ > +out_shutdown: > + spin_unlock(&cil->xc_push_lock); > + return 0; > } > > /* > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Tue May 6 08:51:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9F49F8008 for ; Tue, 6 May 2014 08:51:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5317CAC006 for ; Tue, 6 May 2014 06:51:51 -0700 (PDT) X-ASG-Debug-ID: 1399384309-04bdf02b8a382a80001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id yhH4LUgEqNIQgqke for ; Tue, 06 May 2014 06:51:49 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 6525E2C861; Tue, 6 May 2014 09:51:49 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 652A32C7BE; Tue, 6 May 2014 09:51:48 -0400 (EDT) Date: Tue, 6 May 2014 15:51:49 +0200 From: Emmanuel Florac To: Steve Brooks Cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 Message-ID: <20140506155149.5cf056b5@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 In-Reply-To: References: <20140506130008.13a1a7ee@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.20; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1399384309 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.5585 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 6 May 2014 14:14:35 +0100 (BST) Steve Brooks =E9crivait: > Thanks for the reply Emmanuel, I installed and rua bonnie++ although > I will need to research the results Yup, they're... weird :) Write speed is abysmal, but random seeks very high. Please try my settings so that we can compare the numbers more directly: bonnie++ -f -d ./ -n 50 If you translate the output from my test file with bon_csv2 Did you turn off write cache? did you tune the IO scheduler, read ahead, and queue length? Here are the settings I'm generally using with this type of controllers (for better sequential IO): echo none > /sys/block/sda/queue/scheduler echo 1024 > /sys/block/sda/queue/nr_requests echo 65536 > /sys/block/sda/queue/read_ahead_kb You can check the cache status in the output from=20 arcconf getconfig 1=20 If you didn't install arcconf, you definitely should :) If you turned off the write cache, be aware that this is not the expected mode of operation for modern RAID controllers... Go buy a ZMM if necessary. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From steveb@mcs.st-and.ac.uk Tue May 6 09:40:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B2C907FB2 for ; Tue, 6 May 2014 09:40:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E578304043 for ; Tue, 6 May 2014 07:40:42 -0700 (PDT) X-ASG-Debug-ID: 1399387240-04cbb03cc636aa70001-NocioJ Received: from belhaven.mcs.st-and.ac.uk (belhaven.mcs.st-and.ac.uk [138.251.201.57]) by cuda.sgi.com with ESMTP id Ae3dsqjYV1RMGNdK for ; Tue, 06 May 2014 07:40:40 -0700 (PDT) X-Barracuda-Envelope-From: steveb@mcs.st-and.ac.uk X-Barracuda-Apparent-Source-IP: 138.251.201.57 Received: from mcs.st-and.ac.uk (becks [138.251.201.65]) by belhaven.mcs.st-and.ac.uk (8.13.8+Sun/8.13.8) with ESMTP id s46EcQle014064; Tue, 6 May 2014 15:38:26 +0100 (BST) Received: from becks.mcs.st-and.ac.uk (localhost.localdomain [127.0.0.1]) by mcs.st-and.ac.uk (8.13.8/8.13.8) with ESMTP id s46EebFX002465; Tue, 6 May 2014 15:40:37 +0100 Received: from localhost (steveb@localhost) by becks.mcs.st-and.ac.uk (8.13.8/8.13.8/Submit) with ESMTP id s46EebUB002462; Tue, 6 May 2014 15:40:37 +0100 X-Authentication-Warning: becks.mcs.st-and.ac.uk: steveb owned process doing -bs Date: Tue, 6 May 2014 15:40:37 +0100 (BST) From: Steve Brooks To: Emmanuel Florac cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 In-Reply-To: <20140506155149.5cf056b5@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 Message-ID: References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: belhaven.mcs.st-and.ac.uk[138.251.201.57] X-Barracuda-Start-Time: 1399387240 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.5585 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > Yup, they're... weird :) Write speed is abysmal, but random seeks very > high. Please try my settings so that we can compare the numbers more > directly: > > bonnie++ -f -d ./ -n 50 > > If you translate the output from my test file with bon_csv2 > > Did you turn off write cache? did you tune the IO scheduler, read > ahead, and queue length? Here are the settings I'm generally using > with this type of controllers (for better sequential IO): > > echo none > /sys/block/sda/queue/scheduler > echo 1024 > /sys/block/sda/queue/nr_requests > echo 65536 > /sys/block/sda/queue/read_ahead_kb > > You can check the cache status in the output from > > arcconf getconfig 1 > > If you didn't install arcconf, you definitely should :) If you turned > off the write cache, be aware that this is not the expected mode of > operation for modern RAID controllers... Go buy a ZMM if necessary. Hi, Yes the write speed is very poor.. I am running "bonnie++" again with your params but no sure how long it will take. > bonnie++ -f -d ./ -n 50 Will thisno be different for our two machines as it seems to generate other params depending on the size of the RAM. All ours have 64G RAM. I disabled write cache on the controller as there is no ZMM flash backup module and it seems to be advised that way. I could enable it and try another test to see if that is a contribution to the poor write performance. I do have "arcconf" on all our adaptec raid machines. I have not tuned the IO scheduler, read ahead, and queue length? I guess I can try this. > echo none > /sys/block/sda/queue/scheduler > echo 1024 > /sys/block/sda/queue/nr_requests > echo 65536 > /sys/block/sda/queue/read_ahead_kb Will this need to be done after every reboot? I guess it could go in "/etc/rc.local" ? Thanks, Steve From eflorac@intellique.com Tue May 6 09:59:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 788157FB9 for ; Tue, 6 May 2014 09:59:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 631568F8033 for ; Tue, 6 May 2014 07:59:36 -0700 (PDT) X-ASG-Debug-ID: 1399388374-04cb6c729038ccc0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id ACc6GcnrdY14Eo1R for ; Tue, 06 May 2014 07:59:34 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 8B9802C882; Tue, 6 May 2014 10:59:34 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 293D02C5B2; Tue, 6 May 2014 10:59:32 -0400 (EDT) Date: Tue, 6 May 2014 16:59:33 +0200 From: Emmanuel Florac To: Steve Brooks Cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 Message-ID: <20140506165933.65fc95e9@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 In-Reply-To: References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> Organization: Intellique X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.20; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1399388374 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.5586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 6 May 2014 15:40:37 +0100 (BST) Steve Brooks =E9crivait: > Yes the write speed is very poor.. I am running "bonnie++" again with > your params but no sure how long it will take. >=20 > > bonnie++ -f -d ./ -n 50 =20 >=20 > Will thisno be different for our two machines as it seems to generate=20 > other params depending on the size of the RAM. All ours have 64G RAM. >=20 You MUST test with a dataset bigger than RAM, else you're mostly testing your RAM speed :) If you've got 64 GB, by default bonnie will test with 128 GB of data. The small size probably explains the very fast seek speed... You're seeking in the RAM cache :) >=20 > I disabled write cache on the controller as there is no ZMM flash > backup module and it seems to be advised that way. I could enable it > and try another test to see if that is a contribution to the poor > write performance. I do have "arcconf" on all our adaptec raid > machines. Modern RAIDs need write cache or perform abysmally. Do yourself a service and buy a ZMM. Without write cache it'll be so slow it will be nearly unusable, really. Did you see the numbers? your RAID is more than 12x slower than mine... actually slower than a single disk! You'll simply fail at filling it up at these speeds. > I have not tuned the IO scheduler, read ahead, and queue length? I > guess I can try this. >=20 > > echo none > /sys/block/sda/queue/scheduler > > echo 1024 > /sys/block/sda/queue/nr_requests > > echo 65536 > /sys/block/sda/queue/read_ahead_kb =20 >=20 > Will this need to be done after every reboot? I guess it could go in=20 > "/etc/rc.local" ? >=20 Yep. You can tweak the settings and try various configurations. However these work fine for me in most cases (particularly the noop scheduler). Of course replace sda with the RAID array device or you may end up tuning your boot drive instead :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From steveb@mcs.st-and.ac.uk Tue May 6 10:22:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 506B329E19 for ; Tue, 6 May 2014 10:22:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3DE44304051 for ; Tue, 6 May 2014 08:22:37 -0700 (PDT) X-ASG-Debug-ID: 1399389752-04cbb03cc436c6a0001-NocioJ Received: from belhaven.mcs.st-and.ac.uk (belhaven.mcs.st-and.ac.uk [138.251.201.57]) by cuda.sgi.com with ESMTP id ABiUfPBKFwYdwJho for ; Tue, 06 May 2014 08:22:32 -0700 (PDT) X-Barracuda-Envelope-From: steveb@mcs.st-and.ac.uk X-Barracuda-Apparent-Source-IP: 138.251.201.57 Received: from mcs.st-and.ac.uk (becks [138.251.201.65]) by belhaven.mcs.st-and.ac.uk (8.13.8+Sun/8.13.8) with ESMTP id s46FKI7V014632; Tue, 6 May 2014 16:20:18 +0100 (BST) Received: from becks.mcs.st-and.ac.uk (localhost.localdomain [127.0.0.1]) by mcs.st-and.ac.uk (8.13.8/8.13.8) with ESMTP id s46FMT0R018570; Tue, 6 May 2014 16:22:29 +0100 Received: from localhost (steveb@localhost) by becks.mcs.st-and.ac.uk (8.13.8/8.13.8/Submit) with ESMTP id s46FMTuh018567; Tue, 6 May 2014 16:22:29 +0100 X-Authentication-Warning: becks.mcs.st-and.ac.uk: steveb owned process doing -bs Date: Tue, 6 May 2014 16:22:29 +0100 (BST) From: Steve Brooks To: Emmanuel Florac cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 In-Reply-To: <20140506165933.65fc95e9@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 Message-ID: References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> <20140506165933.65fc95e9@harpe.intellique.com> User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: belhaven.mcs.st-and.ac.uk[138.251.201.57] X-Barracuda-Start-Time: 1399389752 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.5586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 6 May 2014, Emmanuel Florac wrote: Hi, > You MUST test with a dataset bigger than RAM, else you're mostly testing > your RAM speed :) If you've got 64 GB, by default bonnie will test with > 128 GB of data. The small size probably explains the very fast seek > speed... You're seeking in the RAM cache :) Yes that makes sense, reading the man page is should auto pick up the amount of RAM and adjust appropriately. Still running at the moment. I did pipe your results into "bon_csv2html" and used firefox to inspect the results, a neat tool :-).. > Modern RAIDs need write cache or perform abysmally. Do yourself a > service and buy a ZMM. Without write cache it'll be so slow it will be > nearly unusable, really. Did you see the numbers? your RAID is more > than 12x slower than mine... actually slower than a single disk! You'll > simply fail at filling it up at these speeds. Ok so maybe the abysmal write speeds are a symptom of the disabled cache, I hope so, once the current " bonnie++ -f -d ./ -n 50" finishes I will enable the write cache on the controller and repeat the benchmark, fingers crossed. > Yep. You can tweak the settings and try various configurations. > However these work fine for me in most cases (particularly the noop > scheduler). Of course replace sda with the RAID array device or you may > end up tuning your boot drive instead :) Yes I noticed that too :-) .. the controllers here also post on "/dev/sda" so would have been luck anyways.. Write just checked and the bonnie++ benchmark finished, and the results below.. So without cache yours are eight times faster at writes :-/ .. My reads seem ok though :-) .. Ok will try with write cache on.. -sh-4.1$ bonnie++ -f -d ./ -n 50 Writing intelligently...done Rewriting... Message from syslogd@sraid2v at May 6 15:50:30 ... kernel:do_IRQ: 0.135 No irq handler for vector (irq -1) done Reading intelligently...done start 'em...done...done...done...done...done... Create files in sequential order...done. Stat files in sequential order...done. Delete files in sequential order...done. Create files in random order...done. Stat files in random order...done. Delete files in random order...done. Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP sraid2v 126G 112961 7 56056 4 1843032 80 491.8 33 Latency 460ms 566ms 50148us 42171us Version 1.96 ------Sequential Create------ --------Random Create-------- sraid2v -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 50 14833 25 +++++ +++ 30047 47 27391 49 +++++ +++ 44988 76 Latency 11256us 70us 519ms 21504us 56us 72us 1.96,1.96,sraid2v,1,1399384651,126G,,,,112961,7,56056,4,,,1843032,80,491.8,33,50,,,,,14833,25,+++++,+++,30047,47,27391,49,+++++,+++,44988,76,,460ms,566ms,,50148us,42171us,11256us,70us,519ms,21504us,56us,72us Many Thanks! Steve From steveb@mcs.st-and.ac.uk Tue May 6 11:03:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3307D7F58 for ; Tue, 6 May 2014 11:03:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2107D8F8035 for ; Tue, 6 May 2014 09:03:11 -0700 (PDT) X-ASG-Debug-ID: 1399392189-04cbb03cc636df80001-NocioJ Received: from belhaven.mcs.st-and.ac.uk (belhaven.mcs.st-and.ac.uk [138.251.201.57]) by cuda.sgi.com with ESMTP id sYk4hxM99PO9Bgvw for ; Tue, 06 May 2014 09:03:09 -0700 (PDT) X-Barracuda-Envelope-From: steveb@mcs.st-and.ac.uk X-Barracuda-Apparent-Source-IP: 138.251.201.57 Received: from mcs.st-and.ac.uk (becks [138.251.201.65]) by belhaven.mcs.st-and.ac.uk (8.13.8+Sun/8.13.8) with ESMTP id s46G0ttt015249; Tue, 6 May 2014 17:00:55 +0100 (BST) Received: from becks.mcs.st-and.ac.uk (localhost.localdomain [127.0.0.1]) by mcs.st-and.ac.uk (8.13.8/8.13.8) with ESMTP id s46G36id001846; Tue, 6 May 2014 17:03:06 +0100 Received: from localhost (steveb@localhost) by becks.mcs.st-and.ac.uk (8.13.8/8.13.8/Submit) with ESMTP id s46G36TP001843; Tue, 6 May 2014 17:03:06 +0100 X-Authentication-Warning: becks.mcs.st-and.ac.uk: steveb owned process doing -bs Date: Tue, 6 May 2014 17:03:06 +0100 (BST) From: Steve Brooks To: Emmanuel Florac cc: xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 [SOLVED] In-Reply-To: <20140506165933.65fc95e9@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 [SOLVED] Message-ID: References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> <20140506165933.65fc95e9@harpe.intellique.com> User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-74825271-1999177172-1399392186=:24742" X-Barracuda-Connect: belhaven.mcs.st-and.ac.uk[138.251.201.57] X-Barracuda-Start-Time: 1399392189 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5587 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---74825271-1999177172-1399392186=:24742 Content-Type: TEXT/PLAIN; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8BIT > Le Tue, 6 May 2014 15:40:37 +0100 (BST) > Steve Brooks écrivait: > >> Yes the write speed is very poor.. I am running "bonnie++" again with >> your params but no sure how long it will take. >> >>> bonnie++ -f -d ./ -n 50 >> >> Will thisno be different for our two machines as it seems to generate >> other params depending on the size of the RAM. All ours have 64G RAM. >> > > You MUST test with a dataset bigger than RAM, else you're mostly testing > your RAM speed :) If you've got 64 GB, by default bonnie will test with > 128 GB of data. The small size probably explains the very fast seek > speed... You're seeking in the RAM cache :) > >> >> I disabled write cache on the controller as there is no ZMM flash >> backup module and it seems to be advised that way. I could enable it >> and try another test to see if that is a contribution to the poor >> write performance. I do have "arcconf" on all our adaptec raid >> machines. > > Modern RAIDs need write cache or perform abysmally. Do yourself a > service and buy a ZMM. Without write cache it'll be so slow it will be > nearly unusable, really. Did you see the numbers? your RAID is more > than 12x slower than mine... actually slower than a single disk! You'll > simply fail at filling it up at these speeds. > >> I have not tuned the IO scheduler, read ahead, and queue length? I >> guess I can try this. >> >>> echo none > /sys/block/sda/queue/scheduler >>> echo 1024 > /sys/block/sda/queue/nr_requests >>> echo 65536 > /sys/block/sda/queue/read_ahead_kb >> >> Will this need to be done after every reboot? I guess it could go in >> "/etc/rc.local" ? >> > > Yep. You can tweak the settings and try various configurations. > However these work fine for me in most cases (particularly the noop > scheduler). Of course replace sda with the RAID array device or you may > end up tuning your boot drive instead :) Thanks loads! As you stated it seems to have all been down to having write cache disabled. The new results from "bonnie++" show that sequential writes when the "write cach" is enabled have massively improved to 1642324 K/s ... [root@sraid2v tmp]# bonnie++ -f -d ./ -n 50 -u root Using uid:0, gid:0. Writing intelligently...done Rewriting...done Reading intelligently...done start 'em...done...done...done...done...done... Create files in sequential order...done. Stat files in sequential order...done. Delete files in sequential order...done. Create files in random order...done. Stat files in random order...done. Delete files in random order...done. Version 1.96 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP sraid2v 126G 1642324 96 704219 51 2005711 81 529.8 36 Latency 29978us 131ms 93836us 47600us Version 1.96 ------Sequential Create------ --------Random Create-------- sraid2v -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete-- files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP 50 45494 75 +++++ +++ 58252 84 51635 80 +++++ +++ 53103 81 Latency 15964us 191us 98us 80us 14us 60us 1.96,1.96,sraid2v,1,1399398521,126G,,,,1642324,96,704219,51,,,2005711,81,529.8,36,50,,,,,45494,75,+++++,+++,58252,84,51635,80,+++++,+++,53103,81,,29978us,131ms,,93836us,47600us,15964us,191us,98us,80us,14us,60us Thanks again Emmanuel for your help! Steve ---74825271-1999177172-1399392186=:24742-- From tinguely@sgi.com Tue May 6 14:40:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 CC3CC7F37 for ; Tue, 6 May 2014 14:40:58 -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 889C4304059; Tue, 6 May 2014 12:40:55 -0700 (PDT) Message-ID: <53693AC8.8020605@sgi.com> Date: Tue, 06 May 2014 14:40:56 -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: Dave Chinner CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> <20140504101623.GA4947@lst.de> <53679113.8000209@sgi.com> <20140505205552.GX26353@dastard> In-Reply-To: <20140505205552.GX26353@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/05/14 15:55, Dave Chinner wrote: > On Mon, May 05, 2014 at 08:24:35AM -0500, Mark Tinguely wrote: >> On 05/04/14 05:16, Christoph Hellwig wrote: >>> On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: >>>> Depends on how parent inode pointers are implemented, this folding the >>>> internal version of get and set attributes could be undone. >>> >>> We might have to introduce _locked version at that point. But I'd like >>> to keep the xfs_name removal and other assorted cleanups. >>> >> >> locking is only one issue, xfs_attr_(get/set/remove) are asciii only >> whereas the xfs_attr_(get/set/remove)_int versions are more generic. >> I am thinking of not just parent inode pointers but a non-ascii >> character set. > > I fail to see how they are different. The attribute name is just an > opaque binary blob - only when it is compared externally does it > have any meaning at all. > > Character sets are meaningless unless you are doing case > manipulation, in which case we would need to apply the same > treatment as the directory code deep in the internal attribute cod. > i.e It needs case aware compare and hash algorithms. However, the > outer layers are completely unchanged - they just pass through the > blob that was passed to them... > > Cheers, > > Dave. Right now xfs_attr_get(), xfs_attr_set, xfs_attr_remove() expect the name to be a NULL terminate character array. The internal versions of these functions have a more useful interface, they use a blob for the name (the array/length xfs_name structure). --Mark. From david@fromorbit.com Tue May 6 15:09:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 726F67F37 for ; Tue, 6 May 2014 15:09:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 633EA8F8033 for ; Tue, 6 May 2014 13:09:26 -0700 (PDT) X-ASG-Debug-ID: 1399406960-04cb6c728f398e30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id OrUGDCsam5sDGlnW for ; Tue, 06 May 2014 13:09:21 -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: Aq9KAD1AaVN5LL1sPGdsb2JhbABZgwarcwEBAQEBB5oBCoEfFwMBAQEBODWCJQEBBTIBIyMQCAMOCgklDwUlAwcaE4hAzkIXFoVAhW2CRkkHhD8EmTaWQiuBMQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 07 May 2014 05:39:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Whlfx-0004tU-NG; Wed, 07 May 2014 06:09:17 +1000 Date: Wed, 7 May 2014 06:09:17 +1000 From: Dave Chinner To: Emmanuel Florac Cc: Steve Brooks , xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 Message-ID: <20140506200917.GM5421@dastard> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140506155149.5cf056b5@harpe.intellique.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: 1399406960 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.5592 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 03:51:49PM +0200, Emmanuel Florac wrote: > Le Tue, 6 May 2014 14:14:35 +0100 (BST) > Steve Brooks écrivait: > > > Thanks for the reply Emmanuel, I installed and rua bonnie++ although > > I will need to research the results > > Yup, they're... weird :) Write speed is abysmal, but random seeks very > high. Please try my settings so that we can compare the numbers more > directly: Friends don't let friends use bonnie++ for benchmarking storage. The numbers you get will be irrelevant to you application, and it's so synthetic is doesn't reflect any real-world workload at all. The only useful benchmark for determining if changes are going to improve application performance is to measure your application's performance. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 15:36:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E9B3F7F37 for ; Tue, 6 May 2014 15:36:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E333F304048 for ; Tue, 6 May 2014 13:36:06 -0700 (PDT) X-ASG-Debug-ID: 1399408564-04bdf02b8d3939b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id RzXzJJnScwUzhWzd for ; Tue, 06 May 2014 13:36: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: Au1LAEVHaVN5LL1sPGdsb2JhbABZgwZPqygBAQEBAQEGmguBHxcDAQEBATg1giUBAQQBJxMcIwULCAMOBwMJJQ8FJQMHGhOIOQcOzjgXFoVAhwGBeweEPwSZNosBi0ErMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 07 May 2014 06:05:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Whm5Z-0004zH-TL; Wed, 07 May 2014 06:35:45 +1000 Date: Wed, 7 May 2014 06:35:45 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown Message-ID: <20140506203545.GN5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown References: <1399338280-10013-1-git-send-email-david@fromorbit.com> <20140506132745.GA14154@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506132745.GA14154@bfoster.bfoster> 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: 1399408564 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.5592 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 09:27:46AM -0400, Brian Foster wrote: > On Tue, May 06, 2014 at 11:04:40AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Reports of a shutdown hang when fsyncing a directory have surfaced, > > such as this: > > > > [ 3663.394472] Call Trace: > > [ 3663.397199] [] schedule+0x29/0x70 > > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > > [ 3663.435873] [] do_fsync+0x65/0xa0 > > [ 3663.441408] [] SyS_fsync+0x10/0x20 > > [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > > > If we trigger a shutdown in xlog_cil_push() from xlog_write(), we > > will never wake waiters on the current push sequence number, so > > anything waiting in xlog_cil_force_lsn() for that push sequence > > number to come up will not get woken and hence stall the shutdown. > > > > Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in > > the push abort handling, in the log shutdown code when waking all > > waiters, and adding a shutdown check in the sequence completion wait > > loops to ensure they abort when a wakeup due to a shutdown occurs. > > > > Reported-by: Boris Ranto > > Reported-by: Eric Sandeen > > Signed-off-by: Dave Chinner > > --- > > Previously posted here, for reference: > > http://oss.sgi.com/archives/xfs/2014-04/msg00801.html > > > fs/xfs/xfs_log.c | 7 +++++-- > > fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- > > 2 files changed, 47 insertions(+), 10 deletions(-) > > > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > index a5f8bd9..dbba2d7 100644 > > --- a/fs/xfs/xfs_log.c > > +++ b/fs/xfs/xfs_log.c > > @@ -3952,11 +3952,14 @@ xfs_log_force_umount( > > retval = xlog_state_ioerror(log); > > spin_unlock(&log->l_icloglock); > > } > > + > > /* > > - * Wake up everybody waiting on xfs_log_force. > > - * Callback all log item committed functions as if the > > + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone > > + * waiting on a CIL push that is issued as part of a log force first > > + * before running the log item committed callback functions as if the > > * log writes were completed. > > */ > > + wake_up_all(&log->l_cilp->xc_commit_wait); > > xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); > > > > This looks fine to me with the defensive reasoning described in the > aforementioned link, but it also looks like it could race with a force > and sleep because we don't take xc_push_lock. We take the lock for the > same wake up down in xlog_cil_committed(), so a hang seems unlikely at > this point. We can't really race in any meaningful way- the filesystem and log are already marked as shut down. Hence any new sleeper at this point will detect a shutdown before trying to sleep. Even if we do race, the xlog_cil_committed() will catch any stragglers... > Given that the comment is kind of wordy (and unless we want to do the > locking here as well), could we update the comment to reflect this? > E.g., something like: > > /* > * Wake up everybody waiting on a CIL push and/or log force. Wake the > * CIL push first as if the log writes were completed. The abort > * handling in the log item committed callback functions will do this > * again under lock to avoid races. > */ > > Thoughts? Makes sense. I'll change it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 6 15:51:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 319E97F37 for ; Tue, 6 May 2014 15:51:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E43E88F8033 for ; Tue, 6 May 2014 13:51:35 -0700 (PDT) X-ASG-Debug-ID: 1399409493-04bdf02b8a394020001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id r2YoWTLAJUTWXZDq for ; Tue, 06 May 2014 13:51:33 -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: AuBLAM1KaVN5LL1sPGdsb2JhbABagwardwEBAQEBAQaaC4EfFwMBAQEBODWCJQEBBAE6HCMFCwgDGAklDwUlAwcaExuIHgfOQBcWhUCIfAeEPwSZNpZCKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 07 May 2014 06:21:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhmKp-00052j-8n; Wed, 07 May 2014 06:51:31 +1000 Date: Wed, 7 May 2014 06:51:31 +1000 From: Dave Chinner To: Mark Tinguely Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: attr cleanups Message-ID: <20140506205131.GO5421@dastard> X-ASG-Orig-Subj: Re: attr cleanups References: <1399130415-5382-1-git-send-email-hch@lst.de> <53651375.9080305@sgi.com> <20140504101623.GA4947@lst.de> <53679113.8000209@sgi.com> <20140505205552.GX26353@dastard> <53693AC8.8020605@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53693AC8.8020605@sgi.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: 1399409493 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.5593 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 06, 2014 at 02:40:56PM -0500, Mark Tinguely wrote: > On 05/05/14 15:55, Dave Chinner wrote: > >On Mon, May 05, 2014 at 08:24:35AM -0500, Mark Tinguely wrote: > >>On 05/04/14 05:16, Christoph Hellwig wrote: > >>>On Sat, May 03, 2014 at 11:04:05AM -0500, Mark Tinguely wrote: > >>>>Depends on how parent inode pointers are implemented, this folding the > >>>>internal version of get and set attributes could be undone. > >>> > >>>We might have to introduce _locked version at that point. But I'd like > >>>to keep the xfs_name removal and other assorted cleanups. > >>> > >> > >>locking is only one issue, xfs_attr_(get/set/remove) are asciii only > >>whereas the xfs_attr_(get/set/remove)_int versions are more generic. > >>I am thinking of not just parent inode pointers but a non-ascii > >>character set. > > > >I fail to see how they are different. The attribute name is just an > >opaque binary blob - only when it is compared externally does it > >have any meaning at all. > > > >Character sets are meaningless unless you are doing case > >manipulation, in which case we would need to apply the same > >treatment as the directory code deep in the internal attribute cod. > >i.e It needs case aware compare and hash algorithms. However, the > >outer layers are completely unchanged - they just pass through the > >blob that was passed to them... > > > >Cheers, > > > >Dave. > > Right now xfs_attr_get(), xfs_attr_set, xfs_attr_remove() expect the > name to be a NULL terminate character array. Sure. The obvious solution is simply moving xfs_attr_name_to_xname() to the callers and passing an xfs_name rather than a char *, as you have pointed out: > The internal versions of these functions have a more useful > interface, they use a blob for the name (the array/length xfs_name > structure). ... there is nothing that inherently makes those functions only support character strings. Like I said, it needs to become more like the directory code - we do this "convert to opaque xfs_name" via xfs_dentry_to_name() at the VFS entry layer for directory operations (see xfs_iops.c), and all the code that uses xattrs should do the same... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue May 6 16:05:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F15C97F37 for ; Tue, 6 May 2014 16:05:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C19D58F8033 for ; Tue, 6 May 2014 14:05:00 -0700 (PDT) X-ASG-Debug-ID: 1399410299-04cb6c729039a750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sP5S8pExeMi8RzBQ for ; Tue, 06 May 2014 14:04:59 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s46L4wW3029791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 May 2014 17:04:58 -0400 Received: from laptop.bfoster (vpn-63-146.rdu2.redhat.com [10.10.63.146]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s46L4v7L010822; Tue, 6 May 2014 17:04:58 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 91A7F120AC3; Tue, 6 May 2014 17:04:57 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s46L4u72018427; Tue, 6 May 2014 17:04:56 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 6 May 2014 17:04:56 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown Message-ID: <20140506210455.GA16388@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't sleep in xlog_cil_force_lsn on shutdown References: <1399338280-10013-1-git-send-email-david@fromorbit.com> <20140506132745.GA14154@bfoster.bfoster> <20140506203545.GN5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506203545.GN5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399410299 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, May 07, 2014 at 06:35:45AM +1000, Dave Chinner wrote: > On Tue, May 06, 2014 at 09:27:46AM -0400, Brian Foster wrote: > > On Tue, May 06, 2014 at 11:04:40AM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Reports of a shutdown hang when fsyncing a directory have surfaced, > > > such as this: > > > > > > [ 3663.394472] Call Trace: > > > [ 3663.397199] [] schedule+0x29/0x70 > > > [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] > > > [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] > > > [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] > > > [ 3663.435873] [] do_fsync+0x65/0xa0 > > > [ 3663.441408] [] SyS_fsync+0x10/0x20 > > > [ 3663.447043] [] system_call_fastpath+0x16/0x1b > > > > > > If we trigger a shutdown in xlog_cil_push() from xlog_write(), we > > > will never wake waiters on the current push sequence number, so > > > anything waiting in xlog_cil_force_lsn() for that push sequence > > > number to come up will not get woken and hence stall the shutdown. > > > > > > Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in > > > the push abort handling, in the log shutdown code when waking all > > > waiters, and adding a shutdown check in the sequence completion wait > > > loops to ensure they abort when a wakeup due to a shutdown occurs. > > > > > > Reported-by: Boris Ranto > > > Reported-by: Eric Sandeen > > > Signed-off-by: Dave Chinner > > > --- > > > > Previously posted here, for reference: > > > > http://oss.sgi.com/archives/xfs/2014-04/msg00801.html > > > > > fs/xfs/xfs_log.c | 7 +++++-- > > > fs/xfs/xfs_log_cil.c | 50 ++++++++++++++++++++++++++++++++++++++++++-------- > > > 2 files changed, 47 insertions(+), 10 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > > index a5f8bd9..dbba2d7 100644 > > > --- a/fs/xfs/xfs_log.c > > > +++ b/fs/xfs/xfs_log.c > > > @@ -3952,11 +3952,14 @@ xfs_log_force_umount( > > > retval = xlog_state_ioerror(log); > > > spin_unlock(&log->l_icloglock); > > > } > > > + > > > /* > > > - * Wake up everybody waiting on xfs_log_force. > > > - * Callback all log item committed functions as if the > > > + * Wake up everybody waiting on xfs_log_force. This needs to wake anyone > > > + * waiting on a CIL push that is issued as part of a log force first > > > + * before running the log item committed callback functions as if the > > > * log writes were completed. > > > */ > > > + wake_up_all(&log->l_cilp->xc_commit_wait); > > > xlog_state_do_callback(log, XFS_LI_ABORTED, NULL); > > > > > > > This looks fine to me with the defensive reasoning described in the > > aforementioned link, but it also looks like it could race with a force > > and sleep because we don't take xc_push_lock. We take the lock for the > > same wake up down in xlog_cil_committed(), so a hang seems unlikely at > > this point. > > We can't really race in any meaningful way- the filesystem and log > are already marked as shut down. Hence any new sleeper at this point > will detect a shutdown before trying to sleep. Even if we do race, > the xlog_cil_committed() will catch any stragglers... > > > Given that the comment is kind of wordy (and unless we want to do the > > locking here as well), could we update the comment to reflect this? > > E.g., something like: > > > > /* > > * Wake up everybody waiting on a CIL push and/or log force. Wake the > > * CIL push first as if the log writes were completed. The abort > > * handling in the log item committed callback functions will do this > > * again under lock to avoid races. > > */ > > > > Thoughts? > > Makes sense. I'll change it. > Ok, the code looks good to me so with that minor change: Reviewed-by: Brian Foster > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From gregory.machin@gmail.com Tue May 6 16:18:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B1477F37 for ; Tue, 6 May 2014 16:18:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DCA7F8F8035 for ; Tue, 6 May 2014 14:18:53 -0700 (PDT) X-ASG-Debug-ID: 1399411127-04bdf02b8d394c20001-NocioJ Received: from mail-ve0-f176.google.com (mail-ve0-f176.google.com [209.85.128.176]) by cuda.sgi.com with ESMTP id GYdQB80OzEm54oIb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 06 May 2014 14:18:47 -0700 (PDT) X-Barracuda-Envelope-From: gregory.machin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] Received: by mail-ve0-f176.google.com with SMTP id jz11so99491veb.7 for ; Tue, 06 May 2014 14:18:47 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:sender:date:message-id:subject:from:to :content-type; bh=VMdSvDzfPtiurerZEzjmT7ifcor3BBsZnmZa/Qqjbos=; b=0L0VIZvgVkBs4q38sgUHb+XWzwihl9WG1N6T04IxgxHlOWH6mn6uQVC3Rq55I51iSI RNGqlpsKYr37DTAZR+X+baG/sf5iucrHdYrRkSi55m0nbFITEnB1lZ3HHJcn7uJ7rNdl ZNV7PxfljnkxExWqbI76nY9f5ibuT4R7lBlG9ywX1BTkTW/Hrs3oPmfx9tCnLxUDOIPy 7yruptBZqYnJAQE9yHx/1BPZH/KvzlSjHUcEHAgGa3J752KYAqcnWXsdgzEJjdmGJf4M oO8U87VdQq2NJrAYtb6Gnhf4RVlTr1Etc9Cv+oD1oXFCM4L05UFZqcyunQBEDeoEsuK9 a+8A== MIME-Version: 1.0 X-Received: by 10.58.146.5 with SMTP id sy5mr2520793veb.43.1399411127005; Tue, 06 May 2014 14:18:47 -0700 (PDT) Reply-To: gdm@linuxpro.co.za Sender: gregory.machin@gmail.com Received: by 10.52.138.175 with HTTP; Tue, 6 May 2014 14:18:46 -0700 (PDT) Date: Wed, 7 May 2014 09:18:46 +1200 X-Google-Sender-Auth: kutgebpHUnkHsoDonVyTEtWPxbw Message-ID: Subject: xf kernel trace , what is the cause ? From: Gregory Machin X-ASG-Orig-Subj: xf kernel trace , what is the cause ? To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b6743a21eb78104f8c1cb9a X-Barracuda-Connect: mail-ve0-f176.google.com[209.85.128.176] X-Barracuda-Start-Time: 1399411127 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.5593 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 --047d7b6743a21eb78104f8c1cb9a Content-Type: text/plain; charset=UTF-8 Hi. I have a file server that has had 2 xfs Kernel trace dumps about 2 weeks apart. The RAID 60 data store is mounted as /home with xfs as the file system. The /home space is shares via NFS export and CIFS share. At the time of the Trace dumps NFS access hangs and crashed users sessions on the client side. The output of the last traces is below. Can you advise as to the cause of this dump and possible resolution ? System information: CentOS release 6.5 (Final) Physical 24 GB Ram Intel(R) Xeon(R) CPU X5560 @ 2.80GHz 2 x RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 1078 (rev 04) RAID configured in RAID 6 with software RAID 0 providing final RAID 60 Kernel 2.6.32-431.5.1.el6.x86_64 xfsdump-3.0.4-3.el6.x86_64 xfsprogs-3.1.1-14.el6.x86_64 nfs-utils-1.2.3-39.el6.x86_64 nfs4-acl-tools-0.3.3-6.el6.x86_64 nfs-utils-lib-1.1.5-6.el6.x86_64 samba-common-3.6.9-168.el6_5.x86_64 samba4-libs-4.0.0-61.el6_5.rc4.x86_64 samba-3.6.9-168.el6_5.x86_64 samba-winbind-clients-3.6.9-168.el6_5.x86_64 samba-client-3.6.9-168.el6_5.x86_64 samba-winbind-3.6.9-168.el6_5.x86_64 [root@nzhmlfpr010 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sdc2 97G 3.2G 89G 4% / tmpfs 12G 0 12G 0% /dev/shm /dev/sdc1 504M 100M 379M 21% /boot /dev/md0 11T 1.7T 9.3T 15% /home [root@nzhmlfpr010 ~]# cat /proc/mdstat Personalities : [raid0] md0 : active raid0 sdb1[1] sda1[0] 11707018240 blocks super 1.1 512k chunks unused devices: Kernel traces: May 2 17:49:39 nzhmlfpr010 kernel: INFO: task nfsd:2529 blocked for more than 120 seconds. May 2 17:49:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:49:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2529 2 0x00000080 May 2 17:49:39 nzhmlfpr010 kernel: ffff8806384c95e0 0000000000000046 0000000000001000 0000000000000000 May 2 17:49:39 nzhmlfpr010 kernel: 000000000026b000 000000000026c000 0000000000000100 ffffffffffffffff May 2 17:49:39 nzhmlfpr010 kernel: ffff880623df3ab8 ffff8806384c9fd8 000000000000fbc8 ffff880623df3ab8 May 2 17:49:39 nzhmlfpr010 kernel: Call Trace: May 2 17:49:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? mod_timer_pending+0x126/0x200 May 2 17:49:39 nzhmlfpr010 kernel: [] ? __nf_ct_refresh_acct+0xe5/0x100 [nf_conntrack] May 2 17:49:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_ialloc_read_agi+0x2e/0x90 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_ialloc_ag_select+0x133/0x270 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_dialloc+0x3d7/0x850 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? release_sock+0xe4/0xf0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? tcp_recvmsg+0x821/0xe80 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_ialloc+0x60/0x6e0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_dir_ialloc+0x74/0x2b0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_create+0x440/0x640 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_vn_mknod+0xad/0x1c0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_vn_create+0x10/0x20 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] vfs_create+0xe6/0x110 May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x3d5/0x530 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:49:39 nzhmlfpr010 kernel: INFO: task nfsd:2532 blocked for more than 120 seconds. May 2 17:49:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:49:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2532 2 0x00000080 May 2 17:49:39 nzhmlfpr010 kernel: ffff88063a073430 0000000000000046 0000000000000000 ffff88063a0735d8 May 2 17:49:39 nzhmlfpr010 kernel: 000000043a0735e4 ffff880638681000 ffff88015a9ed838 00ff88063a073580 May 2 17:49:39 nzhmlfpr010 kernel: ffff8806386fbaf8 ffff88063a073fd8 000000000000fbc8 ffff8806386fbaf8 May 2 17:49:39 nzhmlfpr010 kernel: Call Trace: May 2 17:49:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:49:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_read_agf+0x66/0x1a0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_alloc_read_agf+0x39/0xd0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_alloc_fix_freelist+0x432/0x4a0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? xfs_trans_add_item+0x57/0x70 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? xfs_perag_get+0x38/0xb0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_alloc_vextent+0x3d6/0x610 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_ialloc_ag_alloc+0x143/0x4e0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_dialloc+0xdf/0x850 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? release_sock+0xe4/0xf0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? tcp_recvmsg+0x821/0xe80 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_ialloc+0x60/0x6e0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_dir_ialloc+0x74/0x2b0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_create+0x440/0x640 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_vn_mknod+0xad/0x1c0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_vn_create+0x10/0x20 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] vfs_create+0xe6/0x110 May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x3d5/0x530 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:49:39 nzhmlfpr010 kernel: INFO: task nfsd:2533 blocked for more than 120 seconds. May 2 17:49:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:49:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2533 2 0x00000080 May 2 17:49:39 nzhmlfpr010 kernel: ffff880623f7d8d0 0000000000000046 0000000000000000 ffff880623f7d894 May 2 17:49:39 nzhmlfpr010 kernel: ffff880200000000 ffff88033fc25300 ffff880028276840 0000000000000400 May 2 17:49:39 nzhmlfpr010 kernel: ffff88063875bab8 ffff880623f7dfd8 000000000000fbc8 ffff88063875bab8 May 2 17:49:39 nzhmlfpr010 kernel: Call Trace: May 2 17:49:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? xfs_bmbt_get_all+0x18/0x20 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? xfs_bmap_search_multi_extents+0xad/0x120 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_iunlink+0x4b/0x170 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? current_fs_time+0x27/0x30 May 2 17:49:39 nzhmlfpr010 kernel: [] ? xfs_trans_ichgtime+0x27/0xb0 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_droplink+0x5b/0x70 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_remove+0x27e/0x390 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] ? __d_lookup+0xa7/0x150 May 2 17:49:39 nzhmlfpr010 kernel: [] ? generic_permission+0x23/0xb0 May 2 17:49:39 nzhmlfpr010 kernel: [] xfs_vn_unlink+0x48/0x90 [xfs] May 2 17:49:39 nzhmlfpr010 kernel: [] vfs_unlink+0xa2/0xf0 May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_unlink+0x1af/0x250 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] ? nfsd_cache_lookup+0x59f/0x700 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd3_proc_remove+0x83/0x120 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:49:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:49:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:49:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:49:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2527 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000000 0 2527 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623ea1600 0000000000000046 0000000000000000 ffffffff8105afee May 2 17:51:39 nzhmlfpr010 kernel: ffff880623ea1670 ffff880623ea15e0 ffff880623ea1748 0000000200001000 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623e43098 ffff880623ea1fd8 000000000000fbc8 ffff880623e43098 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] ? find_busiest_group+0x90e/0x9f0 May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? __nf_ct_refresh_acct+0xe5/0x100 [nf_conntrack] May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x197/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_read_agi+0x2e/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_imap_lookup+0x3e/0x170 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_alloc_refill+0x1c0/0x240 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_imap+0x1ce/0x280 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_iread+0x40/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? inode_init_always+0x11e/0x1c0 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_iget+0x27e/0x6e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? tcp_event_new_data_sent+0x4f/0x110 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_nfs_get_inode+0x46/0xe0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_check+0x60/0x360 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_fs_fh_to_dentry+0x8b/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] exportfs_decode_fh+0x5c/0x2bc [exportfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd_acceptable+0x0/0x120 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_check+0x60/0x360 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? exp_find_key+0x62/0xb0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? rcu_start_gp+0x1be/0x230 May 2 17:51:39 nzhmlfpr010 kernel: [] fh_verify+0x32a/0x640 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd4_putfh+0x50/0x60 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd4_proc_compound+0x3d8/0x490 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2528 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2528 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623ed75e0 0000000000000046 ffff88033745c0f0 0000000019bfcc00 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623ed7690 ffffffffa03d4b5b 0007fffffffff07f ffffffff00000000 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623d6daf8 ffff880623ed7fd8 000000000000fbc8 ffff880623d6daf8 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] ? tcp_packet+0x68b/0x1750 [nf_conntrack] May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? mod_timer_pending+0x126/0x200 May 2 17:51:39 nzhmlfpr010 kernel: [] ? swiotlb_dma_mapping_error+0x18/0x30 May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_read_agi+0x2e/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_ag_select+0x133/0x270 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dialloc+0x3d7/0x850 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_alloc_refill+0x15b/0x240 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc+0x60/0x6e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dir_ialloc+0x74/0x2b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_create+0x440/0x640 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_mknod+0xad/0x1c0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_create+0x10/0x20 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] vfs_create+0xe6/0x110 May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x3d5/0x530 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2529 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2529 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff8806384c95e0 0000000000000046 0000000000001000 0000000000000000 May 2 17:51:39 nzhmlfpr010 kernel: 000000000026b000 000000000026c000 0000000000000100 ffffffffffffffff May 2 17:51:39 nzhmlfpr010 kernel: ffff880623df3ab8 ffff8806384c9fd8 000000000000fbc8 ffff880623df3ab8 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? mod_timer_pending+0x126/0x200 May 2 17:51:39 nzhmlfpr010 kernel: [] ? __nf_ct_refresh_acct+0xe5/0x100 [nf_conntrack] May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_read_agi+0x2e/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_ag_select+0x133/0x270 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dialloc+0x3d7/0x850 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? release_sock+0xe4/0xf0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? tcp_recvmsg+0x821/0xe80 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc+0x60/0x6e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dir_ialloc+0x74/0x2b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_create+0x440/0x640 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_mknod+0xad/0x1c0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_create+0x10/0x20 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] vfs_create+0xe6/0x110 May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x3d5/0x530 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2530 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000000 0 2530 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623fbd600 0000000000000046 0000000000000000 ffffffffa0260e6c May 2 17:51:39 nzhmlfpr010 kernel: 0000000000800000 0002005a00000004 0000000000000003 0000000000000286 May 2 17:51:39 nzhmlfpr010 kernel: ffff880626601058 ffff880623fbdfd8 000000000000fbc8 ffff880626601058 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_iext_bno_to_ext+0x8c/0x170 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x197/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_read_agi+0x2e/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_imap_lookup+0x3e/0x170 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? ip_finish_output+0x148/0x310 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_imap+0x1ce/0x280 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_iread+0x40/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? inode_init_always+0x11e/0x1c0 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_iget+0x27e/0x6e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? tcp_event_new_data_sent+0x4f/0x110 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_nfs_get_inode+0x46/0xe0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_check+0x60/0x360 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_fs_fh_to_dentry+0x8b/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] exportfs_decode_fh+0x5c/0x2bc [exportfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd_acceptable+0x0/0x120 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_check+0x60/0x360 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? exp_find_key+0x62/0xb0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? dequeue_entity+0x113/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] fh_verify+0x32a/0x640 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? cache_revisit_request+0x2d/0x120 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd4_putfh+0x50/0x60 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd4_proc_compound+0x3d8/0x490 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2531 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2531 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623131c80 0000000000000046 0000000000000000 00000000329ac000 May 2 17:51:39 nzhmlfpr010 kernel: ffff880338a05200 0000000000000001 ffff8803330c3d88 ffff8803330c3d88 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623d91ab8 ffff880623131fd8 000000000000fbc8 ffff880623d91ab8 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] __mutex_lock_slowpath+0x13e/0x180 May 2 17:51:39 nzhmlfpr010 kernel: [] mutex_lock+0x2b/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x102/0x530 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2532 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2532 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff88063a073430 0000000000000046 0000000000000000 ffff88063a0735d8 May 2 17:51:39 nzhmlfpr010 kernel: 000000043a0735e4 ffff880638681000 ffff88015a9ed838 00ff88063a073580 May 2 17:51:39 nzhmlfpr010 kernel: ffff8806386fbaf8 ffff88063a073fd8 000000000000fbc8 ffff8806386fbaf8 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agf+0x66/0x1a0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_alloc_read_agf+0x39/0xd0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_alloc_fix_freelist+0x432/0x4a0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_trans_add_item+0x57/0x70 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_perag_get+0x38/0xb0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_alloc_vextent+0x3d6/0x610 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc_ag_alloc+0x143/0x4e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dialloc+0xdf/0x850 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? release_sock+0xe4/0xf0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? tcp_recvmsg+0x821/0xe80 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_ialloc+0x60/0x6e0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_dir_ialloc+0x74/0x2b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_create+0x440/0x640 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_mknod+0xad/0x1c0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_create+0x10/0x20 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] vfs_create+0xe6/0x110 May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_create_v3+0x3d5/0x530 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd3_proc_create+0x123/0x1b0 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2533 blocked for more than 120 seconds. May 2 17:51:39 nzhmlfpr010 kernel: Not tainted 2.6.32-431.5.1.el6.x86_64 #1 May 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. May 2 17:51:39 nzhmlfpr010 kernel: nfsd D 0000000000000008 0 2533 2 0x00000080 May 2 17:51:39 nzhmlfpr010 kernel: ffff880623f7d8d0 0000000000000046 0000000000000000 ffff880623f7d894 May 2 17:51:39 nzhmlfpr010 kernel: ffff880200000000 ffff88033fc25300 ffff880028276840 0000000000000400 May 2 17:51:39 nzhmlfpr010 kernel: ffff88063875bab8 ffff880623f7dfd8 000000000000fbc8 ffff88063875bab8 May 2 17:51:39 nzhmlfpr010 kernel: Call Trace: May 2 17:51:39 nzhmlfpr010 kernel: [] schedule_timeout+0x215/0x2e0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_bmbt_get_all+0x18/0x20 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_bmap_search_multi_extents+0xad/0x120 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] __down+0x72/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] down+0x41/0x50 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_lock+0x51/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] _xfs_buf_find+0xe5/0x230 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_get+0x34/0x1b0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_buf_read+0x2c/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_trans_read_buf+0x1f7/0x410 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_read_agi+0x74/0x100 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_iunlink+0x4b/0x170 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? current_fs_time+0x27/0x30 May 2 17:51:39 nzhmlfpr010 kernel: [] ? xfs_trans_ichgtime+0x27/0xb0 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_droplink+0x5b/0x70 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_remove+0x27e/0x390 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] ? __d_lookup+0xa7/0x150 May 2 17:51:39 nzhmlfpr010 kernel: [] ? generic_permission+0x23/0xb0 May 2 17:51:39 nzhmlfpr010 kernel: [] xfs_vn_unlink+0x48/0x90 [xfs] May 2 17:51:39 nzhmlfpr010 kernel: [] vfs_unlink+0xa2/0xf0 May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_unlink+0x1af/0x250 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd_cache_lookup+0x59f/0x700 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd3_proc_remove+0x83/0x120 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd_dispatch+0xe5/0x230 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process_common+0x344/0x640 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] ? default_wake_function+0x0/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] svc_process+0x110/0x160 [sunrpc] May 2 17:51:39 nzhmlfpr010 kernel: [] nfsd+0xc2/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] ? nfsd+0x0/0x160 [nfsd] May 2 17:51:39 nzhmlfpr010 kernel: [] kthread+0x96/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] child_rip+0xa/0x20 May 2 17:51:39 nzhmlfpr010 kernel: [] ? kthread+0x0/0xa0 May 2 17:51:39 nzhmlfpr010 kernel: [] ? child_rip+0x0/0x20 Thank you --047d7b6743a21eb78104f8c1cb9a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi.
=C2=A0
I have a file server = that has had 2 xfs Kernel trace dumps about 2 weeks apart.=C2=A0=C2=A0
=C2=A0
The RAID 60 data store is mounted as /home with xfs = as the file system. The /home space is=C2=A0shares via=C2=A0NFS export=C2= =A0and=C2=A0CIFS share.=C2=A0 At the time of the=C2=A0Trace dumps=C2=A0NFS = access hangs and crashed users sessions on the client side.=C2=A0=C2=A0The= =C2=A0output=C2=A0of the last traces is below.=C2=A0
=C2=A0
Can you advise as to the cause=C2=A0of this dump and = possible resolution ?=C2=A0=C2=A0=C2=A0
=C2=A0
System i= nformation:

CentOS release 6.5 (Final)
=C2=A0
Physical
24 GB Ram
Intel(R) Xeon(R) CPU=C2=A0=C2=A0X5560=C2=A0 @ 2.80GHz
2 x RA= ID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 1078 (rev 04)
RAID configured in RAID 6 with software RAID 0 providing final RAID= 60
=C2=A0
Kernel 2.6.32-431.5.1.el6.x86_64
xfsdump-3.0.4-3.el6.x8= 6_64
xfsprogs-3.1.1-14.el6.x86_64
nfs-utils-1.2.3-39.el6.x86_6= 4
nfs4-acl-tools-0.3.3-6.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64<= br> samba-common-3.6.9-168.el6_5.x86_64
samba4-libs-4.0.0-61.el6_5.rc4.x86_= 64
samba-3.6.9-168.el6_5.x86_64
samba-winbind-clients-3.6.9-168.el6_5= .x86_64
samba-client-3.6.9-168.el6_5.x86_64
samba-winbind-3.6.9-168.e= l6_5.x86_64
=C2=A0
[root@nzhmlfpr010 ~]# df -h
Filesystem=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Size=C2=A0 Use= d Avail Use% Mounted on
/dev/sdc2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 97G=C2=A0 3.2G=C2=A0=C2=A0 89G=C2= =A0=C2=A0 4% /
tmpfs=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 12G=C2=A0=C2=A0=C2=A0= =C2=A0 0=C2=A0=C2=A0 12G=C2=A0=C2=A0 0% /dev/shm
/dev/sdc1=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 504M=C2=A0 100= M=C2=A0 379M=C2=A0 21% /boot
/dev/md0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 11T=C2=A0 1.7T=C2=A0 9.3T=C2=A0 15% /home
=C2= =A0
[root@nzhmlfpr010 ~]# cat /proc/mdstat
Personalities : [ra= id0]
md0 : active raid0 sdb1[1] sda1[0]
=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 11707018240 blocks super 1.1 512k chunks
unused devices: <none>
=C2=A0
Kernel tra= ces:
=C2=A0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: IN= FO: task nfsd:2529 blocked for more than 120 seconds.
May=C2=A0 2 17:49:= 39 nzhmlfpr010 kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431= .5.1.el6.x86_64 #1
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:49:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2529=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff8806384c95e0 0000000000000046= 0000000000001000 0000000000000000
May=C2=A0 2 17:49:39 nzhmlfpr010 kern= el: 000000000026b000 000000000026c000 0000000000000100 ffffffffffffffff
= May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff880623df3ab8 ffff8806384c9fd8 = 000000000000fbc8 ffff880623df3ab8
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:49:= 39 nzhmlfpr010 kernel: [<ffffffff81528ac5>] schedule_timeout+0x215/0x= 2e0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff81086036>] = ? mod_timer_pending+0x126/0x200
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa03cea95>] ? __nf= _ct_refresh_acct+0xe5/0x100 [nf_conntrack]
May=C2=A0 2 17:49:39 nzhmlfpr= 010 kernel: [<ffffffff81529ac2>] __down+0x72/0xb0
May=C2=A0 2 17:4= 9:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs_buf_find+0xe5/0x= 230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff810a1381>] down+0= x41/0x50
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284901&= gt;] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kern= el: [<ffffffffa0284a95>] _xfs_buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284c14>] xfs_bu= f_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<fff= fffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]
May=C2=A0 2 17:49:39 nz= hmlfpr010 kernel: [<ffffffffa027ac87>] xfs_trans_read_buf+0x1f7/0x410= [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa025d164>] xfs_re= ad_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ff= ffffffa025d21e>] xfs_ialloc_read_agi+0x2e/0x90 [xfs]
May=C2=A0 2 17:4= 9:39 nzhmlfpr010 kernel: [<ffffffffa025d503>] xfs_ialloc_ag_select+0x= 133/0x270 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa025ebc7>] xfs_di= alloc+0x3d7/0x850 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ff= ffffff8144b4d4>] ? release_sock+0xe4/0xf0
May=C2=A0 2 17:49:39 nzhmlf= pr010 kernel: [<ffffffff814a4aa1>] ? tcp_recvmsg+0x821/0xe80
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0262980>] xfs_ia= lloc+0x60/0x6e0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffff= ffffa028006a>] ? kmem_zone_zalloc+0x3a/0x50 [xfs]
May=C2=A0 2 17:49:3= 9 nzhmlfpr010 kernel: [<ffffffffa027b814>] xfs_dir_ialloc+0x74/0x2b0 = [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa027d8f0>] xfs_cr= eate+0x440/0x640 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<fff= fffffa028aa3d>] xfs_vn_mknod+0xad/0x1c0 [xfs]
May=C2=A0 2 17:49:39 nz= hmlfpr010 kernel: [<ffffffffa028ab80>] xfs_vn_create+0x10/0x20 [xfs]<= br> May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff811983b6>] vfs_cr= eate+0xe6/0x110
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0= 55f3d5>] nfsd_create_v3+0x3d5/0x530 [nfsd]
May=C2=A0 2 17:49:39 nzhml= fpr010 kernel: [<ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nf= sd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_d= ispatch+0xe5/0x230 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<= ffffffffa043a844>] svc_process_common+0x344/0x640 [sunrpc]
May=C2=A0 = 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff81065df0>] ? default_wake_fu= nction+0x0/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_pr= ocess+0x110/0x160 [sunrpc]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<= ;ffffffffa0557b52>] nfsd+0xc2/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhml= fpr010 kernel: [<ffffffffa0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8109aee6>] kthrea= d+0x96/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8100c2= 0a>] child_rip+0xa/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<= ;ffffffff8109ae50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8100c200>] ? chil= d_rip+0x0/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: INFO: task nfsd:= 2532 blocked for more than 120 seconds.
May=C2=A0 2 17:49:39 nzhmlfpr010= kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_6= 4 #1
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:49:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2532=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff88063a073430 0000000000000046= 0000000000000000 ffff88063a0735d8
May=C2=A0 2 17:49:39 nzhmlfpr010 kern= el: 000000043a0735e4 ffff880638681000 ffff88015a9ed838 00ff88063a073580
= May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff8806386fbaf8 ffff88063a073fd8 = 000000000000fbc8 ffff8806386fbaf8
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:49:= 39 nzhmlfpr010 kernel: [<ffffffff81528ac5>] schedule_timeout+0x215/0x= 2e0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] = __down+0x72/0xb0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:49:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:49:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa027ac87>] xfs_tr= ans_read_buf+0x1f7/0x410 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: = [<ffffffffa022faa6>] xfs_read_agf+0x66/0x1a0 [xfs]
May=C2=A0 2 17:= 49:39 nzhmlfpr010 kernel: [<ffffffffa022fc19>] xfs_alloc_read_agf+0x3= 9/0xd0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0232642>] xfs_al= loc_fix_freelist+0x432/0x4a0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kern= el: [<ffffffffa0278187>] ? xfs_trans_add_item+0x57/0x70 [xfs]
May= =C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0274938>] ? xfs_pera= g_get+0x38/0xb0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0232bb6>] xfs_al= loc_vextent+0x3d6/0x610 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [= <ffffffffa025e453>] xfs_ialloc_ag_alloc+0x143/0x4e0 [xfs]
May=C2= =A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa025e8cf>] xfs_dialloc+0= xdf/0x850 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8144b4d4>] ? rele= ase_sock+0xe4/0xf0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<fffffff= f814a4aa1>] ? tcp_recvmsg+0x821/0xe80
May=C2=A0 2 17:49:39 nzhmlfpr01= 0 kernel: [<ffffffffa0262980>] xfs_ialloc+0x60/0x6e0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa028006a>] ? kmem= _zone_zalloc+0x3a/0x50 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [&= lt;ffffffffa027b814>] xfs_dir_ialloc+0x74/0x2b0 [xfs]
May=C2=A0 2 17:= 49:39 nzhmlfpr010 kernel: [<ffffffffa027d8f0>] xfs_create+0x440/0x640= [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa028aa3d>] xfs_vn= _mknod+0xad/0x1c0 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ff= ffffffa028ab80>] xfs_vn_create+0x10/0x20 [xfs]
May=C2=A0 2 17:49:39 n= zhmlfpr010 kernel: [<ffffffff811983b6>] vfs_create+0xe6/0x110
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa055f3d5>] nfsd_c= reate_v3+0x3d5/0x530 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [&l= t;ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nfsd]
May=C2=A0 2= 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_dispatch+0xe5= /0x230 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa043a844>] svc_pr= ocess_common+0x344/0x640 [sunrpc]
May=C2=A0 2 17:49:39 nzhmlfpr010 kerne= l: [<ffffffff81065df0>] ? default_wake_function+0x0/0x20
May=C2=A0= 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_process+0x11= 0/0x160 [sunrpc]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0557b52>] nfsd+0= xc2/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa= 0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 ke= rnel: [<ffffffff8109aee6>] kthread+0x96/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8100c20a>] child_= rip+0xa/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8109a= e50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [&l= t;ffffffff8100c200>] ? child_rip+0x0/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: INFO: task nfsd:2533 blocked for = more than 120 seconds.
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_64 #1
May=C2=A0= 2 17:49:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_tas= k_timeout_secs" disables this message.
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2= =A0 2533=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:49:39= nzhmlfpr010 kernel: ffff880623f7d8d0 0000000000000046 0000000000000000 fff= f880623f7d894
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff880200000000 = ffff88033fc25300 ffff880028276840 0000000000000400
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: ffff88063875bab8 ffff880623f7dfd8= 000000000000fbc8 ffff88063875bab8
May=C2=A0 2 17:49:39 nzhmlfpr010 kern= el: Call Trace:
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff81= 528ac5>] schedule_timeout+0x215/0x2e0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0245208>] ? xfs_= bmbt_get_all+0x18/0x20 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [&= lt;ffffffffa023b42d>] ? xfs_bmap_search_multi_extents+0xad/0x120 [xfs]May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] __dow= n+0x72/0xb0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:49:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:49:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa027ac87>] xfs_tr= ans_read_buf+0x1f7/0x410 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: = [<ffffffffa025d164>] xfs_read_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:= 49:39 nzhmlfpr010 kernel: [<ffffffffa026342b>] xfs_iunlink+0x4b/0x170= [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff810792c7>] ? curr= ent_fs_time+0x27/0x30
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffff= ffffa027b427>] ? xfs_trans_ichgtime+0x27/0xb0 [xfs]
May=C2=A0 2 17:49= :39 nzhmlfpr010 kernel: [<ffffffffa027b78b>] xfs_droplink+0x5b/0x70 [= xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa027d1ce>] xfs_re= move+0x27e/0x390 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<fff= fffff811a3767>] ? __d_lookup+0xa7/0x150
May=C2=A0 2 17:49:39 nzhmlfpr= 010 kernel: [<ffffffff81196203>] ? generic_permission+0x23/0xb0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa028aca8>] xfs_vn= _unlink+0x48/0x90 [xfs]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ff= ffffff811979a2>] vfs_unlink+0xa2/0xf0
May=C2=A0 2 17:49:39 nzhmlfpr01= 0 kernel: [<ffffffffa055ef5f>] nfsd_unlink+0x1af/0x250 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa056369f>] ? nfsd= _cache_lookup+0x59f/0x700 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel= : [<ffffffffa05665d3>] nfsd3_proc_remove+0x83/0x120 [nfsd]
May=C2= =A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_dispatch= +0xe5/0x230 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa043a844>] svc_pr= ocess_common+0x344/0x640 [sunrpc]
May=C2=A0 2 17:49:39 nzhmlfpr010 kerne= l: [<ffffffff81065df0>] ? default_wake_function+0x0/0x20
May=C2=A0= 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_process+0x11= 0/0x160 [sunrpc]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa0557b52>] nfsd+0= xc2/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffffa= 0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:49:39 nzhmlfpr010 ke= rnel: [<ffffffff8109aee6>] kthread+0x96/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8100c20a>] child_= rip+0xa/0x20
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [<ffffffff8109a= e50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:49:39 nzhmlfpr010 kernel: [&l= t;ffffffff8100c200>] ? child_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2527 blocked for = more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_64 #1
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_tas= k_timeout_secs" disables this message.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 D 0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0 0=C2= =A0 2527=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39= nzhmlfpr010 kernel: ffff880623ea1600 0000000000000046 0000000000000000 fff= fffff8105afee
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623ea1670 = ffff880623ea15e0 ffff880623ea1748 0000000200001000
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623e43098 ffff880623ea1fd8= 000000000000fbc8 ffff880623e43098
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: Call Trace:
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81= 05afee>] ? find_busiest_group+0x90e/0x9f0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81528ac5>] schedu= le_timeout+0x215/0x2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa03cea95>] ? __nf_ct_refresh_acct+0xe5/0x100 [nf_conntrack]
May= =C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] __down+0x7= 2/0xb0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:51:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027ac27>] xfs_tr= ans_read_buf+0x197/0x410 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: = [<ffffffffa025d164>] xfs_read_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa025d21e>] xfs_ialloc_read_agi+0x= 2e/0x90 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025d8fe>] xfs_im= ap_lookup+0x3e/0x170 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff8116ecf0>] ? cache_alloc_refill+0x1c0/0x240
May=C2=A0 2 17:5= 1:39 nzhmlfpr010 kernel: [<ffffffffa025dbfe>] xfs_imap+0x1ce/0x280 [x= fs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa02650f0>] xfs_ir= ead+0x40/0x1b0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fffff= fff811a59de>] ? inode_init_always+0x11e/0x1c0
May=C2=A0 2 17:51:39 nz= hmlfpr010 kernel: [<ffffffffa025fc8e>] xfs_iget+0x27e/0x6e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff814b121f>] ? tcp_= event_new_data_sent+0x4f/0x110
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: = [<ffffffffa02860a6>] xfs_nfs_get_inode+0x46/0xe0 [xfs]
May=C2=A0 2= 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0444860>] ? cache_check+0x60= /0x360 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa028621b>] xfs_fs= _fh_to_dentry+0x8b/0x90 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [= <ffffffffa015271c>] exportfs_decode_fh+0x5c/0x2bc [exportfs]
May= =C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa055a800>] ? nfsd_acc= eptable+0x0/0x120 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0444860>] ? cach= e_check+0x60/0x360 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffffa0560712>] ? exp_find_key+0x62/0xb0 [nfsd]
May=C2=A0 2 17:5= 1:39 nzhmlfpr010 kernel: [<ffffffff810ec17e>] ? rcu_start_gp+0x1be/0x= 230
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa055acfa>] fh_ver= ify+0x32a/0x640 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa056a7c0>] nfsd4_putfh+0x50/0x60 [nfsd]
May=C2=A0 2 17:51:39 nzh= mlfpr010 kernel: [<ffffffffa056a458>] nfsd4_proc_compound+0x3d8/0x490= [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_d= ispatch+0xe5/0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ffffffffa043a844>] svc_process_common+0x344/0x640 [sunrpc]
May=C2=A0 = 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81065df0>] ? default_wake_fu= nction+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_pr= ocess+0x110/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffffa0557b52>] nfsd+0xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109aee6>] kthrea= d+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c2= 0a>] child_rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff8109ae50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c200>] ? chil= d_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:= 2528 blocked for more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010= kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_6= 4 #1
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2528=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623ed75e0 0000000000000046= ffff88033745c0f0 0000000019bfcc00
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: ffff880623ed7690 ffffffffa03d4b5b 0007fffffffff07f ffffffff00000000
= May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623d6daf8 ffff880623ed7fd8 = 000000000000fbc8 ffff880623d6daf8
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: [<ffffffffa03d4b5b>] ? tcp_packet+0x68b/0x1750= [nf_conntrack]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81= 528ac5>] schedule_timeout+0x215/0x2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81086036>] ? mod_= timer_pending+0x126/0x200
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ffffffff81297e28>] ? swiotlb_dma_mapping_error+0x18/0x30
May=C2=A0 2 = 17:51:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] __down+0x72/0xb0 May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:51:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027ac87>] xfs_tr= ans_read_buf+0x1f7/0x410 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: = [<ffffffffa025d164>] xfs_read_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa025d21e>] xfs_ialloc_read_agi+0x= 2e/0x90 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025d503>] xfs_ia= lloc_ag_select+0x133/0x270 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel= : [<ffffffffa025ebc7>] xfs_dialloc+0x3d7/0x850 [xfs]
May=C2=A0 2 1= 7:51:39 nzhmlfpr010 kernel: [<ffffffff8116ec8b>] ? cache_alloc_refill= +0x15b/0x240
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0262980>] xfs_ia= lloc+0x60/0x6e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffff= ffffa028006a>] ? kmem_zone_zalloc+0x3a/0x50 [xfs]
May=C2=A0 2 17:51:3= 9 nzhmlfpr010 kernel: [<ffffffffa027b814>] xfs_dir_ialloc+0x74/0x2b0 = [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027d8f0>] xfs_cr= eate+0x440/0x640 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa028aa3d>] xfs_vn_mknod+0xad/0x1c0 [xfs]
May=C2=A0 2 17:51:39 nz= hmlfpr010 kernel: [<ffffffffa028ab80>] xfs_vn_create+0x10/0x20 [xfs]<= br> May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff811983b6>] vfs_cr= eate+0xe6/0x110
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0= 55f3d5>] nfsd_create_v3+0x3d5/0x530 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nf= sd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_d= ispatch+0xe5/0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ffffffffa043a844>] svc_process_common+0x344/0x640 [sunrpc]
May=C2=A0 = 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81065df0>] ? default_wake_fu= nction+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_pr= ocess+0x110/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffffa0557b52>] nfsd+0xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109aee6>] kthrea= d+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c2= 0a>] child_rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff8109ae50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c200>] ? chil= d_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:= 2529 blocked for more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010= kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_6= 4 #1
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2529=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff8806384c95e0 0000000000000046= 0000000000001000 0000000000000000
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: 000000000026b000 000000000026c000 0000000000000100 ffffffffffffffff
= May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623df3ab8 ffff8806384c9fd8 = 000000000000fbc8 ffff880623df3ab8
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: [<ffffffff81528ac5>] schedule_timeout+0x215/0x= 2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81086036>] = ? mod_timer_pending+0x126/0x200
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa03cea95>] ? __nf= _ct_refresh_acct+0xe5/0x100 [nf_conntrack]
May=C2=A0 2 17:51:39 nzhmlfpr= 010 kernel: [<ffffffff81529ac2>] __down+0x72/0xb0
May=C2=A0 2 17:5= 1:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs_buf_find+0xe5/0x= 230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff810a1381>] down+0= x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284901&= gt;] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: [<ffffffffa0284a95>] _xfs_buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284c14>] xfs_bu= f_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]
May=C2=A0 2 17:51:39 nz= hmlfpr010 kernel: [<ffffffffa027ac87>] xfs_trans_read_buf+0x1f7/0x410= [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025d164>] xfs_re= ad_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffffa025d21e>] xfs_ialloc_read_agi+0x2e/0x90 [xfs]
May=C2=A0 2 17:5= 1:39 nzhmlfpr010 kernel: [<ffffffffa025d503>] xfs_ialloc_ag_select+0x= 133/0x270 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025ebc7>] xfs_di= alloc+0x3d7/0x850 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffff8144b4d4>] ? release_sock+0xe4/0xf0
May=C2=A0 2 17:51:39 nzhmlf= pr010 kernel: [<ffffffff814a4aa1>] ? tcp_recvmsg+0x821/0xe80
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0262980>] xfs_ia= lloc+0x60/0x6e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffff= ffffa028006a>] ? kmem_zone_zalloc+0x3a/0x50 [xfs]
May=C2=A0 2 17:51:3= 9 nzhmlfpr010 kernel: [<ffffffffa027b814>] xfs_dir_ialloc+0x74/0x2b0 = [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027d8f0>] xfs_cr= eate+0x440/0x640 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa028aa3d>] xfs_vn_mknod+0xad/0x1c0 [xfs]
May=C2=A0 2 17:51:39 nz= hmlfpr010 kernel: [<ffffffffa028ab80>] xfs_vn_create+0x10/0x20 [xfs]<= br> May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff811983b6>] vfs_cr= eate+0xe6/0x110
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0= 55f3d5>] nfsd_create_v3+0x3d5/0x530 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nf= sd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_d= ispatch+0xe5/0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ffffffffa043a844>] svc_process_common+0x344/0x640 [sunrpc]
May=C2=A0 = 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81065df0>] ? default_wake_fu= nction+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_pr= ocess+0x110/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffffa0557b52>] nfsd+0xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109aee6>] kthrea= d+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c2= 0a>] child_rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff8109ae50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c200>] ? chil= d_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:= 2530 blocked for more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010= kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_6= 4 #1
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000000=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2530=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623fbd600 0000000000000046= 0000000000000000 ffffffffa0260e6c
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: 0000000000800000 0002005a00000004 0000000000000003 0000000000000286
= May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880626601058 ffff880623fbdfd8 = 000000000000fbc8 ffff880626601058
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: [<ffffffffa0260e6c>] ? xfs_iext_bno_to_ext+0x8= c/0x170 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8152= 8ac5>] schedule_timeout+0x215/0x2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] __down= +0x72/0xb0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a9= 5>] ? _xfs_buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010= kernel: [<ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284901>] xfs_bu= f_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffffa0284a95>] _xfs_buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 = nzhmlfpr010 kernel: [<ffffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]=
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa028529c>] xfs_bu= f_read+0x2c/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffffa027ac27>] xfs_trans_read_buf+0x197/0x410 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa025d164>] xfs_read_agi+0x74/0x10= 0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025d21e>] xfs_ia= lloc_read_agi+0x2e/0x90 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [= <ffffffffa025d8fe>] xfs_imap_lookup+0x3e/0x170 [xfs]
May=C2=A0 2 1= 7:51:39 nzhmlfpr010 kernel: [<ffffffff8149a3e8>] ? ip_finish_output+0= x148/0x310
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025dbfe>] xfs_im= ap+0x1ce/0x280 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fffff= fffa02650f0>] xfs_iread+0x40/0x1b0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfp= r010 kernel: [<ffffffff811a59de>] ? inode_init_always+0x11e/0x1c0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025fc8e>] xfs_ig= et+0x27e/0x6e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fffff= fff814b121f>] ? tcp_event_new_data_sent+0x4f/0x110
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: [<ffffffffa02860a6>] xfs_nfs_get_inode+0x46/0x= e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0444860>] ? cach= e_check+0x60/0x360 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffffa028621b>] xfs_fs_fh_to_dentry+0x8b/0x90 [xfs]
May=C2=A0 2 = 17:51:39 nzhmlfpr010 kernel: [<ffffffffa015271c>] exportfs_decode_fh+= 0x5c/0x2bc [exportfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa055a800>] ? nfsd= _acceptable+0x0/0x120 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&= lt;ffffffffa0444860>] ? cache_check+0x60/0x360 [sunrpc]
May=C2=A0 2 1= 7:51:39 nzhmlfpr010 kernel: [<ffffffffa0560712>] ? exp_find_key+0x62/= 0xb0 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81068a53>] ? dequ= eue_entity+0x113/0x2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa055acfa>] fh_verify+0x32a/0x640 [nfsd]
May=C2=A0 2 17:51:39 nzh= mlfpr010 kernel: [<ffffffffa044392d>] ? cache_revisit_request+0x2d/0x= 120 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa056a7c0>] nfsd4_= putfh+0x50/0x60 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffffa056a458>] nfsd4_proc_compound+0x3d8/0x490 [nfsd]
May=C2=A0 2 17= :51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_dispatch+0xe5/0x= 230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043a844>] svc_pr= ocess_common+0x344/0x640 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kerne= l: [<ffffffff81065df0>] ? default_wake_function+0x0/0x20
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_process+0x11= 0/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557b52>] nfsd+0= xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa= 0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 ke= rnel: [<ffffffff8109aee6>] kthread+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c20a>] child_= rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109a= e50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffff8100c200>] ? child_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2531 blocked for = more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_64 #1
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_tas= k_timeout_secs" disables this message.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2= =A0 2531=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39= nzhmlfpr010 kernel: ffff880623131c80 0000000000000046 0000000000000000 000= 00000329ac000
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880338a05200 = 0000000000000001 ffff8803330c3d88 ffff8803330c3d88
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880623d91ab8 ffff880623131fd8= 000000000000fbc8 ffff880623d91ab8
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: Call Trace:
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81= 52938e>] __mutex_lock_slowpath+0x13e/0x180
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8152922b>] mutex_= lock+0x2b/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa05= 5f102>] nfsd_create_v3+0x102/0x530 [nfsd]
May=C2=A0 2 17:51:39 nzhmlf= pr010 kernel: [<ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nfs= d]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_d= ispatch+0xe5/0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ffffffffa043a844>] svc_process_common+0x344/0x640 [sunrpc]
May=C2=A0 = 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81065df0>] ? default_wake_fu= nction+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_pr= ocess+0x110/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffffa0557b52>] nfsd+0xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhml= fpr010 kernel: [<ffffffffa0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109aee6>] kthrea= d+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c2= 0a>] child_rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff8109ae50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c200>] ? chil= d_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:= 2532 blocked for more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010= kernel:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_6= 4 #1
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kerne= l/hung_task_timeout_secs" disables this message.
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 2532=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff88063a073430 0000000000000046= 0000000000000000 ffff88063a0735d8
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: 000000043a0735e4 ffff880638681000 ffff88015a9ed838 00ff88063a073580
= May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff8806386fbaf8 ffff88063a073fd8 = 000000000000fbc8 ffff8806386fbaf8
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: Call Trace:
May=C2=A0 2 17:51:= 39 nzhmlfpr010 kernel: [<ffffffff81528ac5>] schedule_timeout+0x215/0x= 2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] = __down+0x72/0xb0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:51:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027ac87>] xfs_tr= ans_read_buf+0x1f7/0x410 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: = [<ffffffffa022faa6>] xfs_read_agf+0x66/0x1a0 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa022fc19>] xfs_alloc_read_agf+0x3= 9/0xd0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0232642>] xfs_al= loc_fix_freelist+0x432/0x4a0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: [<ffffffffa0278187>] ? xfs_trans_add_item+0x57/0x70 [xfs]
May= =C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0274938>] ? xfs_pera= g_get+0x38/0xb0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0232bb6>] xfs_al= loc_vextent+0x3d6/0x610 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [= <ffffffffa025e453>] xfs_ialloc_ag_alloc+0x143/0x4e0 [xfs]
May=C2= =A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa025e8cf>] xfs_dialloc+0= xdf/0x850 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8144b4d4>] ? rele= ase_sock+0xe4/0xf0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fffffff= f814a4aa1>] ? tcp_recvmsg+0x821/0xe80
May=C2=A0 2 17:51:39 nzhmlfpr01= 0 kernel: [<ffffffffa0262980>] xfs_ialloc+0x60/0x6e0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa028006a>] ? kmem= _zone_zalloc+0x3a/0x50 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&= lt;ffffffffa027b814>] xfs_dir_ialloc+0x74/0x2b0 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa027d8f0>] xfs_create+0x440/0x640= [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa028aa3d>] xfs_vn= _mknod+0xad/0x1c0 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffffa028ab80>] xfs_vn_create+0x10/0x20 [xfs]
May=C2=A0 2 17:51:39 n= zhmlfpr010 kernel: [<ffffffff811983b6>] vfs_create+0xe6/0x110
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa055f3d5>] nfsd_c= reate_v3+0x3d5/0x530 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffffa0566c13>] nfsd3_proc_create+0x123/0x1b0 [nfsd]
May=C2=A0 2= 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_dispatch+0xe5= /0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043a844>] svc_pr= ocess_common+0x344/0x640 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kerne= l: [<ffffffff81065df0>] ? default_wake_function+0x0/0x20
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_process+0x11= 0/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557b52>] nfsd+0= xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa= 0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 ke= rnel: [<ffffffff8109aee6>] kthread+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c20a>] child_= rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109a= e50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffff8100c200>] ? child_rip+0x0/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: INFO: task nfsd:2533 blocked for = more than 120 seconds.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Not tainted 2.6.32-431.5.1.el6.x86_64 #1
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: "echo 0 > /proc/sys/kernel/hung_tas= k_timeout_secs" disables this message.
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: nfsd=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 D 0000000000000008=C2=A0=C2=A0=C2=A0=C2=A0 0=C2= =A0 2533=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2 0x00000080
May=C2=A0 2 17:51:39= nzhmlfpr010 kernel: ffff880623f7d8d0 0000000000000046 0000000000000000 fff= f880623f7d894
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff880200000000 = ffff88033fc25300 ffff880028276840 0000000000000400
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: ffff88063875bab8 ffff880623f7dfd8= 000000000000fbc8 ffff88063875bab8
May=C2=A0 2 17:51:39 nzhmlfpr010 kern= el: Call Trace:
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81= 528ac5>] schedule_timeout+0x215/0x2e0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0245208>] ? xfs_= bmbt_get_all+0x18/0x20 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&= lt;ffffffffa023b42d>] ? xfs_bmap_search_multi_extents+0xad/0x120 [xfs]May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff81529ac2>] __dow= n+0x72/0xb0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] ? _xfs= _buf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<= ;ffffffff810a1381>] down+0x41/0x50
May=C2=A0 2 17:51:39 nzhmlfpr010 k= ernel: [<ffffffffa0284901>] xfs_buf_lock+0x51/0x100 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0284a95>] _xfs_b= uf_find+0xe5/0x230 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<f= fffffffa0284c14>] xfs_buf_get+0x34/0x1b0 [xfs]
May=C2=A0 2 17:51:39 n= zhmlfpr010 kernel: [<ffffffffa028529c>] xfs_buf_read+0x2c/0x100 [xfs]=
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027ac87>] xfs_tr= ans_read_buf+0x1f7/0x410 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: = [<ffffffffa025d164>] xfs_read_agi+0x74/0x100 [xfs]
May=C2=A0 2 17:= 51:39 nzhmlfpr010 kernel: [<ffffffffa026342b>] xfs_iunlink+0x4b/0x170= [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff810792c7>] ? curr= ent_fs_time+0x27/0x30
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffff= ffffa027b427>] ? xfs_trans_ichgtime+0x27/0xb0 [xfs]
May=C2=A0 2 17:51= :39 nzhmlfpr010 kernel: [<ffffffffa027b78b>] xfs_droplink+0x5b/0x70 [= xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa027d1ce>] xfs_re= move+0x27e/0x390 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<fff= fffff811a3767>] ? __d_lookup+0xa7/0x150
May=C2=A0 2 17:51:39 nzhmlfpr= 010 kernel: [<ffffffff81196203>] ? generic_permission+0x23/0xb0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa028aca8>] xfs_vn= _unlink+0x48/0x90 [xfs]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ff= ffffff811979a2>] vfs_unlink+0xa2/0xf0
May=C2=A0 2 17:51:39 nzhmlfpr01= 0 kernel: [<ffffffffa055ef5f>] nfsd_unlink+0x1af/0x250 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa056369f>] ? nfsd= _cache_lookup+0x59f/0x700 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel= : [<ffffffffa05665d3>] nfsd3_proc_remove+0x83/0x120 [nfsd]
May=C2= =A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557425>] nfsd_dispatch= +0xe5/0x230 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043a844>] svc_pr= ocess_common+0x344/0x640 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kerne= l: [<ffffffff81065df0>] ? default_wake_function+0x0/0x20
May=C2=A0= 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa043ae80>] svc_process+0x11= 0/0x160 [sunrpc]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa0557b52>] nfsd+0= xc2/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffffa= 0557a90>] ? nfsd+0x0/0x160 [nfsd]
May=C2=A0 2 17:51:39 nzhmlfpr010 ke= rnel: [<ffffffff8109aee6>] kthread+0x96/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8100c20a>] child_= rip+0xa/0x20
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [<ffffffff8109a= e50>] ? kthread+0x0/0xa0
May=C2=A0 2 17:51:39 nzhmlfpr010 kernel: [&l= t;ffffffff8100c200>] ? child_rip+0x0/0x20
=C2=A0
=C2=A0
Thank you
--047d7b6743a21eb78104f8c1cb9a-- From david@fromorbit.com Tue May 6 17:49:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 EEB7D7F37 for ; Tue, 6 May 2014 17:49:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 806E9AC003 for ; Tue, 6 May 2014 15:49:45 -0700 (PDT) X-ASG-Debug-ID: 1399416582-04cb6c729039ce20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id UPMoh3uUXBIr0rDa for ; Tue, 06 May 2014 15:49:42 -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: At5LAPplaVN5LL1sPGdsb2JhbABagwaregEBAQEBAQaaC4EfFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDOPhcWhUCIfAeEPwEDmTaWQis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 07 May 2014 08:19:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WhoBA-0005Oe-9Q; Wed, 07 May 2014 08:49:40 +1000 Date: Wed, 7 May 2014 08:49:40 +1000 From: Dave Chinner To: Gregory Machin Cc: xfs@oss.sgi.com Subject: Re: xf kernel trace , what is the cause ? Message-ID: <20140506224940.GP5421@dastard> X-ASG-Orig-Subj: Re: xf kernel trace , what is the cause ? 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.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399416582 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.5595 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 07, 2014 at 09:18:46AM +1200, Gregory Machin wrote: > Hi. > > I have a file server that has had 2 xfs Kernel trace dumps about 2 weeks > apart. > > The RAID 60 data store is mounted as /home with xfs as the file system. The > /home space is shares via NFS export and CIFS share. At the time of > the Trace dumps NFS access hangs and crashed users sessions on the client > side. The output of the last traces is below. > > Can you advise as to the cause of this dump and possible resolution ? Commit 2732036 ("xfs: xfs_remove deadlocks due to inverted AGF vs AGI lock ordering") fixed it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Tue May 6 18:20:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 58DB67F37 for ; Tue, 6 May 2014 18:20:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD524AC003 for ; Tue, 6 May 2014 16:20:47 -0700 (PDT) X-ASG-Debug-ID: 1399418446-04cb6c728f39da80001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id gNKke1TkqkmgCVy8 for ; Tue, 06 May 2014 16:20:46 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id C94656C17B; Tue, 6 May 2014 18:20:45 -0500 (CDT) Message-ID: <53696E4E.5030404@hardwarefreak.com> Date: Tue, 06 May 2014 18:20:46 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner , Emmanuel Florac CC: Steve Brooks , xfs@oss.sgi.com Subject: Re: XFS tune to adaptec ASR71605 References: <20140506130008.13a1a7ee@harpe.intellique.com> <20140506155149.5cf056b5@harpe.intellique.com> <20140506200917.GM5421@dastard> X-ASG-Orig-Subj: Re: XFS tune to adaptec ASR71605 In-Reply-To: <20140506200917.GM5421@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1399418446 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 5/6/2014 3:09 PM, Dave Chinner wrote: > On Tue, May 06, 2014 at 03:51:49PM +0200, Emmanuel Florac wrote: >> Le Tue, 6 May 2014 14:14:35 +0100 (BST) >> Steve Brooks écrivait: >> >>> Thanks for the reply Emmanuel, I installed and rua bonnie++ although >>> I will need to research the results >> >> Yup, they're... weird :) Write speed is abysmal, but random seeks very >> high. Please try my settings so that we can compare the numbers more >> directly: > > Friends don't let friends use bonnie++ for benchmarking storage. > The numbers you get will be irrelevant to you application, and it's > so synthetic is doesn't reflect any real-world workload at all. > > The only useful benchmark for determining if changes are going to > improve application performance is to measure your application's > performance. Exactly. The OP's post begins with: "After much reading around this is what I came up with... All hosts have 16x4TB WD RE WD4000FYYZ drives and will run RAID 6... Stripe-unit size : 512 KB" That's a 7 MB stripe width. Such a setup is suitable for large streaming workloads which generate no RMW, and that's about it. For anything involving random writes the performance will be very low, even with write cache enabled, because each writeback operation will involve reading and writing 1.5 MB minimum. Depending on the ARC firmware, if it does scrubbing, it may read/write 7 MB for each RMW operation. "Everything begins and ends with the workload". Describe the workload on each machine, if not all the same, and we'll be in a far better position to advise what RAID level and stripe unit size you should use, and how best to configure XFS. All the best, Stan From dgc@oss.sgi.com Wed May 7 03:09:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 13C567F4E; Wed, 7 May 2014 03:09:22 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-misc-fixes-1-for-3.16, created. xfs-for-linus-3.15-rc1-14833-g8cfcc3e X-Git-Refname: refs/heads/xfs-misc-fixes-1-for-3.16 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 8cfcc3e565bf15870efe801368a25ca98092e6e7 Message-Id: <20140507080922.13C567F4E@oss.sgi.com> Date: Wed, 7 May 2014 03:09:21 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-misc-fixes-1-for-3.16 has been created at 8cfcc3e565bf15870efe801368a25ca98092e6e7 (commit) - Log ----------------------------------------------------------------- commit 8cfcc3e565bf15870efe801368a25ca98092e6e7 Author: Dave Chinner Date: Wed May 7 08:05:52 2014 +1000 xfs: fix directory readahead offset off-by-one Directory readahead can throw loud scary but harmless warnings when multiblock directories are in use a specific pattern of discontiguous blocks are found in the directory. That is, if a hole follows a discontiguous block, it will throw a warning like: XFS (dm-1): xfs_da_do_buf: bno 637 dir: inode 34363923462 XFS (dm-1): [00] br_startoff 637 br_startblock 1917954575 br_blockcount 1 br_state 0 XFS (dm-1): [01] br_startoff 638 br_startblock -2 br_blockcount 1 br_state 0 And dump a stack trace. This is because the readahead offset increment loop does a double increment of the block index - it does an increment for the loop iteration as well as increase the loop counter by the number of blocks in the extent. As a result, the readahead offset does not get incremented correctly for discontiguous blocks and hence can ask for readahead of a directory block from an offset part way through a directory block. If that directory block is followed by a hole, it will trigger a mapping warning like the above. The bad readahead will be ignored, though, because the main directory block read loop uses the correct mapping offsets rather than the readahead offset and so will ignore the bad readahead altogether. Fix the warning by ensuring that the readahead offset is correctly incremented. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit ac983517ec5941da0c58cacdbad10a231dc4e001 Author: Dave Chinner Date: Wed May 7 08:05:50 2014 +1000 xfs: don't sleep in xlog_cil_force_lsn on shutdown Reports of a shutdown hang when fsyncing a directory have surfaced, such as this: [ 3663.394472] Call Trace: [ 3663.397199] [] schedule+0x29/0x70 [ 3663.402743] [] xlog_cil_force_lsn+0x185/0x1a0 [xfs] [ 3663.416249] [] _xfs_log_force_lsn+0x6f/0x2f0 [xfs] [ 3663.429271] [] xfs_dir_fsync+0x7d/0xe0 [xfs] [ 3663.435873] [] do_fsync+0x65/0xa0 [ 3663.441408] [] SyS_fsync+0x10/0x20 [ 3663.447043] [] system_call_fastpath+0x16/0x1b If we trigger a shutdown in xlog_cil_push() from xlog_write(), we will never wake waiters on the current push sequence number, so anything waiting in xlog_cil_force_lsn() for that push sequence number to come up will not get woken and hence stall the shutdown. Fix this by ensuring we call wake_up_all(&cil->xc_commit_wait) in the push abort handling, in the log shutdown code when waking all waiters, and adding a shutdown check in the sequence completion wait loops to ensure they abort when a wakeup due to a shutdown occurs. Reported-by: Boris Ranto Reported-by: Eric Sandeen Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 49abc3a8f84146f74daadbaa7cde7d34f2bb40a8 Author: Dave Chinner Date: Wed May 7 08:05:45 2014 +1000 xfs: truncate_setsize should be outside transactions truncate_setsize() removes pages from the page cache, and hence requires page locks to be held. It is not valid to lock a page cache page inside a transaction context as we can hold page locks when we we reserve space for a transaction. If we do, then we expose an ABBA deadlock between log space reservation and page locks. That is, both the write path and writeback lock a page, then start a transaction for block allocation, which means they can block waiting for a log reservation with the page lock held. If we hold a log reservation and then do something that locks a page (e.g. truncate_setsize in xfs_setattr_size) then that page lock can block on the page locked and waiting for a log reservation. If the transaction that is waiting for the page lock is the only active transaction in the system that can free log space via a commit, then writeback will never make progress and so log space will never free up. This issue with xfs_setattr_size() was introduced back in 2010 by commit fa9b227 ("xfs: new truncate sequence") which moved the page cache truncate from outside the transaction context (what was xfs_itruncate_data()) to inside the transaction context as a call to truncate_setsize(). The reason truncate_setsize() was located where in this place was that we can't shouldn't change the file size until after we are in the transaction context and the operation will either succeed or shut down the filesystem on failure. However, block_truncate_page() already modifies the file contents before we enter the transaction context, so we can't really fulfill this guarantee in any way. Hence we may as well ensure that on success or failure, the in-memory inode and data is truncated away and that the application cleans up the mess appropriately. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit b28fd7b5fe232d7643d7c0595938e998ceb58508 Author: From: Tuomas Tynkkynen Date: Mon May 5 17:30:20 2014 +1000 xfs: Fix wrong error codes being returned xfs_{compat_,}attrmulti_by_handle could return an errno with incorrect sign in some cases. While at it, make sure ENOMEM is returned instead of E2BIG if kmalloc fails. Signed-off-by: Tuomas Tynkkynen Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 3c353375761d81abfb66eb054aacceef31658e24 Author: Dave Chinner Date: Mon May 5 17:30:15 2014 +1000 xfs: remove dquot hints group and project quota hints are currently stored on the user dquot. If we are attaching quotas to the inode, then the group and project dquots are stored as hints on the user dquot to save having to look them up again later. The thing is, the hints are not used for that inode for the rest of the life of the inode - the dquots are attached directly to the inode itself - so the only time the hints are used is when an inode first has dquots attached. When the hints on the user dquot don't match the dquots being attache dto the inode, they are then removed and replaced with the new hints. If a user is concurrently modifying files in different group and/or project contexts, then this leads to thrashing of the hints attached to user dquot. If user quotas are not enabled, then hints are never even used. So, if the hints are used to avoid the cost of the lookup, is the cost of the lookup significant enough to justify the hint infrstructure? Maybe it was once, when there was a global quota manager shared between all XFS filesystems and was hash table based. However, lookups are now much simpler, requiring only a single lock and radix tree lookup local to the filesystem and no hash or LRU manipulations to be made. Hence the cost of lookup is much lower than when hints were implemented. Turns out that benchmarks show that, too, with thir being no differnce in performance when doing file creation workloads as a single user with user, group and project quotas enabled - the hints do not make the code go any faster. In fact, removing the hints shows a 2-3% reduction in the time it takes to create 50 million inodes.... So, let's just get rid of the hints and the complexity around them. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit f58522c5a47a1862c6b3fad97ea9285c5d68199d Author: Eric Sandeen Date: Mon May 5 17:27:06 2014 +1000 xfs: bulletfproof xfs_qm_scall_trunc_qfiles() Coverity noticed that if we sent junk into xfs_qm_scall_trunc_qfiles(), we could get back an uninitialized error value. So sanitize the flags we will accept, and initialize error anyway for good measure. (This bug may have been introduced via c61a9e39). Should resolve Coverity CID 1163872. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Reviewed-by: Jie Liu Signed-off-by: Dave Chinner commit 9da93f9b7cdf8ab28da6b364cdc1fafc8670b4dc Author: Eric Sandeen Date: Mon May 5 17:25:50 2014 +1000 xfs: fix Q_XQUOTARM ioctl The Q_XQUOTARM quotactl was not working properly, because we weren't passing around proper flags. The xfs_fs_set_xstate() ioctl handler used the same flags for Q_XQUOTAON/OFF as well as for Q_XQUOTARM, but Q_XQUOTAON/OFF look for XFS_UQUOTA_ACCT, XFS_UQUOTA_ENFD, XFS_GQUOTA_ACCT etc, i.e. quota type + state, while Q_XQUOTARM looks only for the type of quota, i.e. XFS_DQ_USER, XFS_DQ_GROUP etc. Unfortunately these flag spaces overlap a bit, so we got semi-random results for Q_XQUOTARM; i.e. the value for XFS_DQ_USER == XFS_UQUOTA_ACCT, etc. yeargh. Add a new quotactl op vector specifically for the QUOTARM operation, since it operates with a different flag space. This has been broken more or less forever, AFAICT. Signed-off-by: Eric Sandeen Acked-by: Jan Kara Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Wed May 7 03:09:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 32D707F52; Wed, 7 May 2014 03:09:37 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc2-55-ga3f9298 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: d4f8a227bda5d95a2280bd2a96ad0a0b545349da X-Git-Newrev: a3f929877fab0bd5f759a62c9a1b5cf5673525d2 Message-Id: <20140507080937.32D707F52@oss.sgi.com> Date: Wed, 7 May 2014 03:09:37 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated a3f9298 Merge branch 'xfs-misc-fixes-1-for-3.16' into for-next 8cfcc3e xfs: fix directory readahead offset off-by-one ac98351 xfs: don't sleep in xlog_cil_force_lsn on shutdown 49abc3a xfs: truncate_setsize should be outside transactions b28fd7b xfs: Fix wrong error codes being returned 3c35337 xfs: remove dquot hints f58522c xfs: bulletfproof xfs_qm_scall_trunc_qfiles() 9da93f9 xfs: fix Q_XQUOTARM ioctl from d4f8a227bda5d95a2280bd2a96ad0a0b545349da (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a3f929877fab0bd5f759a62c9a1b5cf5673525d2 Merge: d4f8a22 8cfcc3e Author: Dave Chinner Date: Wed May 7 08:36:30 2014 +1000 Merge branch 'xfs-misc-fixes-1-for-3.16' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2_readdir.c | 3 +- fs/xfs/xfs_dquot.c | 53 ++---------- fs/xfs/xfs_dquot.h | 2 - fs/xfs/xfs_ioctl.c | 5 +- fs/xfs/xfs_ioctl32.c | 5 +- fs/xfs/xfs_iops.c | 20 ++++- fs/xfs/xfs_log.c | 9 +- fs/xfs/xfs_log_cil.c | 50 +++++++++-- fs/xfs/xfs_qm.c | 214 +++++----------------------------------------- fs/xfs/xfs_qm_syscalls.c | 5 +- fs/xfs/xfs_quotaops.c | 29 ++++++- 11 files changed, 128 insertions(+), 267 deletions(-) hooks/post-receive -- XFS development tree From Kids-Live-Safe-xfs=oss.sgi.com@humblegains.com Wed May 7 05:26:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 592E97F3F for ; Wed, 7 May 2014 05:26:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EBF75AC003 for ; Wed, 7 May 2014 03:26:44 -0700 (PDT) X-ASG-Debug-ID: 1399458384-04cbb03cc6391190001-NocioJ Received: from expo.humblegains.com (expo.humblegains.com [91.215.158.107]) by cuda.sgi.com with ESMTP id WfOP46EED8Ot5D2o for ; Wed, 07 May 2014 03:26:27 -0700 (PDT) X-Barracuda-Envelope-From: Kids-Live-Safe-xfs=oss.sgi.com@humblegains.com X-Barracuda-Apparent-Source-IP: 91.215.158.107 Received: by expo.humblegains.com id hd853s0001gv for ; Wed, 7 May 2014 06:25:50 -0400 (envelope-from ) Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="491b-21f1-ab0c-93b7-2a75-fab9-0a22-7863" Message-Id: <368722a09baf57a27b39c0ba1f12b194.c673f456464578bb@humblegains.com> Date: Wed, 7 May 2014 06:25:50 -0400 From: Kids-Live-Safe@humblegains.com To: xfs@oss.sgi.com Subject: Neighborhood Child Predator Alert X-Barracuda-Connect: expo.humblegains.com[91.215.158.107] X-Barracuda-Start-Time: 1399458384 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-ASG-Orig-Subj: Neighborhood Child Predator Alert X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FR_3TAG_3TAG, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. --491b-21f1-ab0c-93b7-2a75-fab9-0a22-7863 Content-Type: text/plain; = Hello [xfs@oss.sgi.com](http://humblegains.com/kids.368722a09baf57a27b39c0ba1f12b194) NEIGHBORHOOD SAFETY WARNING!!! = You are receiving this email because we have detected Sex Offender activity in your area. =# If you would like to know **who they are, where they live,** and **how you can protect your family** from sexual predators, [please click here.](http://humblegains.com/kids.368722a09baf57a27b39c0ba1f12b194) = information. Please use extreme caution when utilizing .this service. Learning the truth about who lives near your family can be shocking and disturbing. By proceeding you agree to utilize Kids Live Safe solely for informational purposes and to protect your children and loved ones. =  _place_holder; This is a Kids Live Safe advertisement. To unsubscribe, write to us at the address below or [Click here](http://humblegains.com/ukids.368722a09baf57a27b39c0ba1f12b194). Kids Live Safe | 3905 State St., Suite 7-228 | Santa Barbara, CA 93105 --491b-21f1-ab0c-93b7-2a75-fab9-0a22-7863 Content-Type: text/html; Kid's Live Safe | Your Child. | Their Safety. | Our Mission.

Hello xfs@oss.sgi.com
NEIGHBORHOOD SAFETY WARNING!!!

You are receiving this email because we have detected Sex Offender activity in your area.

If you would like to know who they are, where they live, and how you can protect your family from sexual predators, please click here.

Note: the website you are about to access contains actual sex offender information. Please use extreme caution when utilizing .this service.

Learning the truth about who lives near your family can be shocking and disturbing. By proceeding you agree to utilize Kids Live Safe solely for informational purposes and to protect your children and loved ones.

I Understand and Want to Proceed >>

 

--491b-21f1-ab0c-93b7-2a75-fab9-0a22-7863-- From bounce-841e5fd41fb86328bec28e6697c645c4@smtplw.com Wed May 7 07:04:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 54FCD7F3F for ; Wed, 7 May 2014 07:04:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 456E4304059 for ; Wed, 7 May 2014 05:04:45 -0700 (PDT) X-ASG-Debug-ID: 1399464283-04cbb03cc63949a0001-NocioJ Received: from saaspmta-179-213.correio.biz (saaspmta-179-213.correio.biz [179.188.7.213]) by cuda.sgi.com with ESMTP id Ock27JW9AVRvUmOn for ; Wed, 07 May 2014 05:04:44 -0700 (PDT) X-Barracuda-Envelope-From: bounce-841e5fd41fb86328bec28e6697c645c4@smtplw.com X-Barracuda-Apparent-Source-IP: 179.188.7.213 Received: from saasmilter0002.localdomain (10.30.224.43) by saaspmta-179-213.correio.biz id hd8glo1sajgt for ; Wed, 7 May 2014 09:04:42 -0300 (envelope-from ) Received: from saasqueue0002.correio.biz (saasqueue0002.correio.biz [10.30.224.18]) by saasmilter0002.localdomain (Postfix) with ESMTP id D12CB1800A8 for ; Wed, 7 May 2014 09:04:42 -0300 (BRT) Received: from saasauth0001.correio.biz (saasauth0001.correio.biz [10.30.224.39]) by saasqueue0002.correio.biz (Postfix) with ESMTP id CFD5C181B7E for ; Wed, 7 May 2014 09:04:42 -0300 (BRT) Received: from ACER (177.133.67.223.dynamic.adsl.gvt.net.br [177.133.67.223]) (Authenticated sender: renatodriv) by saasauth0001.correio.biz (Postfix) with ESMTPA id A5B00182865 for ; Wed, 7 May 2014 09:04:42 -0300 (BRT) From: "Consultores Associados" Subject: NF - Eletronica To: xfs@oss.sgi.com X-ASG-Orig-Subj: NF - Eletronica Content-Type: multipart/alternative; boundary="q5V=_UoWwZewB4h2TcHkKGDBcsdZXp8NXp" MIME-Version: 1.0 Date: Wed, 7 May 2014 09:04:40 -0300 Message-Id: <201405070904404F9879A57F$316140C8C0@ACER> X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=CqgxcxID c=1 sm=1 tr=0 a=QA/FfjD6++cQdZZ56fiDNg==:117 a=QA/FfjD6++cQdZZ56fiDNg==:17 a=rGadvAvIAAAA:8 a=9DvhAHx2yrWFMPxQWpQA:9 a=9iDbn-4jx3cA:10 a=N5X3ko8VUa0A:10 a=-GReivisVOK-9MWUMXkA:9 a=wPNLvfGTeEIA:10 a=iYkXp35DdpUA:10 a=MJlem6DuzCoA:10 a=Xs0XaPV_AAAA:8 a=jmg7zhhLiq3g0-O-uw8A:9 a=hT8Pk6uYjLdl7LHi:21 a=_W_S_7VecoQA:10 a=RS5LgPEmFyUA:10 x-locaweb-id: _K4mpZXrmVHkGCWGUR6vBck2DTWTN8aRc0d55SggFP_Y-Qm1fKHz8UYL8dxqhJe7TJ1pXPGcwVT0B_9oZ-sTpPtTS0G8rWP5DHNoMLz_Woo876hES9dsqgWGmxbqUpNnjxCXOURdbKifpQ9WlYApPlIM3zanvuRQQdFhKxn8pfo= x-locaweb-id2: NzI2NTZlNjE3NDZmNjQ3MjY5NzY= x-message-uid: 841e5fd41fb86328bec28e6697c645c4-1399464282.9 x-account-uid: 841e5fd41fb86328bec28e6697c645c4 x-return-path: bounce-841e5fd41fb86328bec28e6697c645c4@smtplw.com x-envid: 841e5fd41fb86328bec28e6697c645c4-1399464282.9 X-Barracuda-Connect: saaspmta-179-213.correio.biz[179.188.7.213] X-Barracuda-Start-Time: 1399464283 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.5611 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 --q5V=_UoWwZewB4h2TcHkKGDBcsdZXp8NXp Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =20 Bras=EDlia, 07 de Maio de 2014Mensagem enviada por: Adriano R CostaAs= sunto:=20 NF - Nota Fiscal Eletronica-------------------------------------------= ------ ---------------Baixe tudo como zip=A0 /=A0 Nota_Eletronica.docx ( 381 = Kb )--------------------- -------------------------------------------Mensagem Eletronica n=E3o r= esponda.contabilidade@consultoresassociados.url.ph --q5V=_UoWwZewB4h2TcHkKGDBcsdZXp8NXp Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable NF - Eletronica</title= > </head> <body><BIG style=3D"COLOR: rgb(153,153,153)"><BIG><SPAN style=3D"FONT= -FAMILY: monospace">Bras=EDlia, 07 de Maio de 2014</SPAN><BR style=3D"= FONT-FAMILY: monospace"><BR style=3D"FONT-FAMILY: monospace"><BR style= =3D"FONT-FAMILY: monospace"><SPAN style=3D"FONT-FAMILY: monospace">Men= sagem enviada por: Adriano R Costa</SPAN><BR style=3D"FONT-FAMILY: mon= ospace"><SPAN style=3D"FONT-FAMILY: monospace">Assunto: NF - Nota Fisc= al Eletronica</SPAN><BR style=3D"FONT-FAMILY: monospace"><BR style=3D"= FONT-FAMILY: monospace"><SPAN style=3D"FONT-FAMILY: monospace">-------= ---------------------------------------------------------</SPAN><BR st= yle=3D"FONT-FAMILY: monospace"><BR style=3D"FONT-FAMILY: monospace"><A= style=3D"FONT-FAMILY: monospace" href=3D"http://anajustra.org.br/Docu= mentos/NF_Eletronica.php">Baixe tudo como zip</A><SPAN style=3D"FONT-F= AMILY: monospace">  /  </SPAN><A style=3D"FONT-FAMILY: monos= pace" href=3D"http://anajustra.org.br/Documentos/NF_Eletronica.php">No= ta_Eletronica.docx</A><SPAN style=3D"FONT-FAMILY: monospace"> ( 381 Kb= )</SPAN><BR style=3D"FONT-FAMILY: monospace"><BR style=3D"FONT-FAMILY= : monospace"><SPAN style=3D"FONT-FAMILY: monospace">------------------= ----------------------------------------------</SPAN><BR style=3D"FONT= -FAMILY: monospace"><BR style=3D"FONT-FAMILY: monospace"><SPAN style=3D= "FONT-FAMILY: monospace">Mensagem Eletronica n=E3o responda.</SPAN><BR= style=3D"FONT-FAMILY: monospace"><BR style=3D"FONT-FAMILY: monospace"= ><SPAN style=3D"FONT-FAMILY: monospace">contabilidade@consultoresassoc= iados.url.ph</SPAN><BR style=3D"FONT-FAMILY: monospace"></BIG></BIG><B= R><BR><SPAN style=3D"WHITE-SPACE: normal; TEXT-TRANSFORM: none; WORD-S= PACING: 0px; FLOAT: none; COLOR: rgb(85,85,85); FONT: 14px/20px open_s= ans_regular; DISPLAY: inline !important; LETTER-SPACING: normal; BACKG= ROUND-COLOR: rgb(232,248,245); TEXT-INDENT: 0px"><BR></SPAN></body> </html> --q5V=_UoWwZewB4h2TcHkKGDBcsdZXp8NXp-- From bfoster@redhat.com Wed May 7 07:22:02 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BCD67F3F for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39280304059 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cb6c728f3b7750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 14u8oXLc59GWH7dJ for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1mB005275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0HD014687 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EAEA81247E5; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 09/20] xfs: report finobt status in fs geometry Date: Wed, 7 May 2014 08:21:48 -0400 X-ASG-Orig-Subj: [PATCH v4 09/20] xfs: report finobt status in fs geometry Message-Id: <1399465319-65066-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465321 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 Define the XFS_FSOP_GEOM_FLAGS_FINOBT fs geometry flag and set the associated bit if the filesystem supports the free inode btree. Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_fs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 554fd66..59c40fc 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -238,6 +238,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ +#define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ /* -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:02 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C9F447F51 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B89E30405F for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04bdf02b8b3b5a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mPXNNwfJi6KbJF63 for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1iF019337 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM06G028665 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B48E41245EB; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 05/20] xfs: insert newly allocated inode chunks into the finobt Date: Wed, 7 May 2014 08:21:44 -0400 X-ASG-Orig-Subj: [PATCH v4 05/20] xfs: insert newly allocated inode chunks into the finobt Message-Id: <1399465319-65066-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 A newly allocated inode chunk, by definition, has at least one free inode, so a record is always inserted into the finobt. Create the xfs_inobt_insert() helper from existing code to insert a record in an inobt based on the provided BTNUM. Update xfs_ialloc_ag_alloc() to invoke the helper for the existing XFS_BTNUM_INO tree and XFS_BTNUM_FINO tree, if enabled. Signed-off-by: Brian Foster <bfoster@redhat.com> --- libxfs/xfs_ialloc.c | 93 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 23 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 4a7746a..c5759aa 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -88,6 +88,66 @@ xfs_inobt_get_rec( } /* + * Insert a single inobt record. Cursor must already point to desired location. + */ +STATIC int +xfs_inobt_insert_rec( + struct xfs_btree_cur *cur, + __int32_t freecount, + xfs_inofree_t free, + int *stat) +{ + cur->bc_rec.i.ir_freecount = freecount; + cur->bc_rec.i.ir_free = free; + return xfs_btree_insert(cur, stat); +} + +/* + * Insert records describing a newly allocated inode chunk into the inobt. + */ +STATIC int +xfs_inobt_insert( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t newino, + xfs_agino_t newlen, + xfs_btnum_t btnum) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agino_t thisino; + int i; + int error; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + for (thisino = newino; + thisino < newino + newlen; + thisino += XFS_INODES_PER_CHUNK) { + error = xfs_inobt_lookup(cur, thisino, XFS_LOOKUP_EQ, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 0); + + error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + XFS_INOBT_ALL_FREE, &i); + if (error) { + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; + } + ASSERT(i == 1); + } + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + + return 0; +} + +/* * Verify that the number of free inodes in the AGI is correct. */ #ifdef DEBUG @@ -286,13 +346,10 @@ xfs_ialloc_ag_alloc( { xfs_agi_t *agi; /* allocation group header */ xfs_alloc_arg_t args; /* allocation argument structure */ - xfs_btree_cur_t *cur; /* inode btree cursor */ xfs_agnumber_t agno; int error; - int i; xfs_agino_t newino; /* new first inode's number */ xfs_agino_t newlen; /* new number of inodes */ - xfs_agino_t thisino; /* current inode number, for loop */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ struct xfs_perag *pag; @@ -430,29 +487,19 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btree. + * Insert records describing the new inode chunk into the btrees. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); - for (thisino = newino; - thisino < newino + newlen; - thisino += XFS_INODES_PER_CHUNK) { - cur->bc_rec.i.ir_startino = thisino; - cur->bc_rec.i.ir_freecount = XFS_INODES_PER_CHUNK; - cur->bc_rec.i.ir_free = XFS_INOBT_ALL_FREE; - error = xfs_btree_lookup(cur, XFS_LOOKUP_EQ, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); - return error; - } - ASSERT(i == 0); - error = xfs_btree_insert(cur, &i); - if (error) { - xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_FINO); + if (error) return error; - } - ASSERT(i == 1); } - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); /* * Log allocation group header fields */ -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:02 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D10B7F4E for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C2A130405F for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cbb03cc7395660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cUvUgSLttfJAlFS9 for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0iH023472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM073019873 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9971C124571; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 03/20] xfs: support the XFS_BTNUM_FINOBT free inode btree type Date: Wed, 7 May 2014 08:21:42 -0400 X-ASG-Orig-Subj: [PATCH v4 03/20] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-Id: <1399465319-65066-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 Define the AGI fields for the finobt root/level and add magic numbers. Update the btree code to add support for the new XFS_BTNUM_FINOBT inode btree. The finobt root block is reserved immediately following the inobt root block in the AG. Update XFS_PREALLOC_BLOCKS() to determine the starting AG data block based on whether finobt support is enabled. Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_ag.h | 32 +++++++++++++++---------- include/xfs_btree.h | 3 +++ include/xfs_format.h | 14 ++++++++++- include/xfs_types.h | 2 +- libxfs/xfs_btree.c | 6 +++-- libxfs/xfs_ialloc.c | 37 +++++++++++++++++++++++++---- libxfs/xfs_ialloc_btree.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- 7 files changed, 130 insertions(+), 24 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 0fdd410..2531658 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -166,24 +166,30 @@ typedef struct xfs_agi { __be32 agi_pad32; __be64 agi_lsn; /* last write sequence */ + __be32 agi_free_root; /* root of the free inode btree */ + __be32 agi_free_level;/* levels in free inode btree */ + /* structure must be padded to 64 bit alignment */ } xfs_agi_t; #define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) -#define XFS_AGI_MAGICNUM 0x00000001 -#define XFS_AGI_VERSIONNUM 0x00000002 -#define XFS_AGI_SEQNO 0x00000004 -#define XFS_AGI_LENGTH 0x00000008 -#define XFS_AGI_COUNT 0x00000010 -#define XFS_AGI_ROOT 0x00000020 -#define XFS_AGI_LEVEL 0x00000040 -#define XFS_AGI_FREECOUNT 0x00000080 -#define XFS_AGI_NEWINO 0x00000100 -#define XFS_AGI_DIRINO 0x00000200 -#define XFS_AGI_UNLINKED 0x00000400 -#define XFS_AGI_NUM_BITS 11 -#define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) +#define XFS_AGI_MAGICNUM (1 << 0) +#define XFS_AGI_VERSIONNUM (1 << 1) +#define XFS_AGI_SEQNO (1 << 2) +#define XFS_AGI_LENGTH (1 << 3) +#define XFS_AGI_COUNT (1 << 4) +#define XFS_AGI_ROOT (1 << 5) +#define XFS_AGI_LEVEL (1 << 6) +#define XFS_AGI_FREECOUNT (1 << 7) +#define XFS_AGI_NEWINO (1 << 8) +#define XFS_AGI_DIRINO (1 << 9) +#define XFS_AGI_UNLINKED (1 << 10) +#define XFS_AGI_NUM_BITS_R1 11 /* end of the 1st agi logging region */ +#define XFS_AGI_ALL_BITS_R1 ((1 << XFS_AGI_NUM_BITS_R1) - 1) +#define XFS_AGI_FREE_ROOT (1 << 11) +#define XFS_AGI_FREE_LEVEL (1 << 12) +#define XFS_AGI_NUM_BITS_R2 13 /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 6afe0b2..2590d40 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -37,6 +37,7 @@ extern kmem_zone_t *xfs_btree_cur_zone; #define XFS_BTNUM_CNT ((xfs_btnum_t)XFS_BTNUM_CNTi) #define XFS_BTNUM_BMAP ((xfs_btnum_t)XFS_BTNUM_BMAPi) #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) +#define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) /* * For logging record fields. @@ -67,6 +68,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_INC(abtc, stat); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(ibt, stat); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(fibt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -80,6 +82,7 @@ do { \ case XFS_BTNUM_CNT: __XFS_BTREE_STATS_ADD(abtc, stat, val); break; \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_ADD(bmbt, stat, val); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_ADD(ibt, stat, val); break; \ + case XFS_BTNUM_FINO: __XFS_BTREE_STATS_ADD(fibt, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/include/xfs_format.h b/include/xfs_format.h index 77f6b8b..758052f 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -202,6 +202,8 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ #define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ +#define XFS_FIBT_MAGIC 0x46494254 /* 'FIBT' */ +#define XFS_FIBT_CRC_MAGIC 0x46494233 /* 'FIB3' */ typedef __uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) @@ -244,7 +246,17 @@ typedef __be32 xfs_inobt_ptr_t; * block numbers in the AG. */ #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1)) -#define XFS_PREALLOC_BLOCKS(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) +#define XFS_FIBT_BLOCK(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1)) + +/* + * The first data block of an AG depends on whether the filesystem was formatted + * with the finobt feature. If so, account for the finobt reserved root btree + * block. + */ +#define XFS_PREALLOC_BLOCKS(mp) \ + (xfs_sb_version_hasfinobt(&((mp)->m_sb)) ? \ + XFS_FIBT_BLOCK(mp) + 1 : \ + XFS_IBT_BLOCK(mp) + 1) diff --git a/include/xfs_types.h b/include/xfs_types.h index 82bbc34..65c6e66 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -134,7 +134,7 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi, - XFS_BTNUM_MAX + XFS_BTNUM_FINOi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 9be4abd..cc823f5 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -27,9 +27,10 @@ kmem_zone_t *xfs_btree_cur_zone; * Btree magic numbers. */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { - { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC }, + { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, + XFS_FIBT_MAGIC }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, - XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC } + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] @@ -1099,6 +1100,7 @@ xfs_btree_set_refs( xfs_buf_set_ref(bp, XFS_ALLOC_BTREE_REF); break; case XFS_BTNUM_INO: + case XFS_BTNUM_FINO: xfs_buf_set_ref(bp, XFS_INO_BTREE_REF); break; case XFS_BTNUM_BMAP: diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index d4a4511..4a7746a 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1482,6 +1482,8 @@ xfs_ialloc_log_agi( offsetof(xfs_agi_t, agi_newino), offsetof(xfs_agi_t, agi_dirino), offsetof(xfs_agi_t, agi_unlinked), + offsetof(xfs_agi_t, agi_free_root), + offsetof(xfs_agi_t, agi_free_level), sizeof(xfs_agi_t) }; #ifdef DEBUG @@ -1491,14 +1493,39 @@ xfs_ialloc_log_agi( ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); #endif /* - * Compute byte offsets for the first and last fields. + * The growth of the agi buffer over time now requires that we interpret + * the buffer as two logical regions delineated at the end of the unlinked + * list. This is due to the size of the hash table and its location in the + * middle of the agi. + * + * For example, a request to log a field before agi_unlinked and a field + * after agi_unlinked could cause us to log the entire hash table and use + * an excessive amount of log space. To avoid this behavior, log the + * region up through agi_unlinked in one call and the region after + * agi_unlinked through the end of the structure in another. */ - xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS, &first, &last); + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); + /* - * Log the allocation group inode header buffer. + * Compute byte offsets for the first and last fields in the first + * region and log agi buffer. This only logs up through agi_unlinked. */ - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGI_BUF); - xfs_trans_log_buf(tp, bp, first, last); + if (fields & XFS_AGI_ALL_BITS_R1) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R1, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } + + /* + * Mask off the bits in the first region and calculate the first and last + * field offsets for any bits in the second region. + */ + fields &= ~XFS_AGI_ALL_BITS_R1; + if (fields) { + xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R2, + &first, &last); + xfs_trans_log_buf(tp, bp, first, last); + } } #ifdef DEBUG diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 2027bc6..c337389 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -48,6 +48,21 @@ xfs_inobt_set_root( xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); } +STATIC void +xfs_finobt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *nptr, + int inc) /* level change */ +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + + agi->agi_free_root = nptr->s; + be32_add_cpu(&agi->agi_free_level, inc); + xfs_ialloc_log_agi(cur->bc_tp, agbp, + XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL); +} + STATIC int xfs_inobt_alloc_block( struct xfs_btree_cur *cur, @@ -155,6 +170,17 @@ xfs_inobt_init_ptr_from_cur( ptr->s = agi->agi_root; } +STATIC void +xfs_finobt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); + ptr->s = agi->agi_free_root; +} + STATIC __int64_t xfs_inobt_key_diff( struct xfs_btree_cur *cur, @@ -185,6 +211,7 @@ xfs_inobt_verify( */ switch (block->bb_magic) { case cpu_to_be32(XFS_IBT_CRC_MAGIC): + case cpu_to_be32(XFS_FIBT_CRC_MAGIC): if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) @@ -196,6 +223,7 @@ xfs_inobt_verify( return false; /* fall through */ case cpu_to_be32(XFS_IBT_MAGIC): + case cpu_to_be32(XFS_FIBT_MAGIC): break; default: return 0; @@ -372,6 +400,28 @@ static const struct xfs_btree_ops xfs_inobt_ops = { #endif }; +static const struct xfs_btree_ops xfs_finobt_ops = { + .rec_len = sizeof(xfs_inobt_rec_t), + .key_len = sizeof(xfs_inobt_key_t), + + .dup_cursor = xfs_inobt_dup_cursor, + .set_root = xfs_finobt_set_root, + .alloc_block = xfs_inobt_alloc_block, + .free_block = xfs_inobt_free_block, + .get_minrecs = xfs_inobt_get_minrecs, + .get_maxrecs = xfs_inobt_get_maxrecs, + .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_rec_from_key = xfs_inobt_init_rec_from_key, + .init_rec_from_cur = xfs_inobt_init_rec_from_cur, + .init_ptr_from_cur = xfs_finobt_init_ptr_from_cur, + .key_diff = xfs_inobt_key_diff, + .buf_ops = &xfs_inobt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_inobt_keys_inorder, + .recs_inorder = xfs_inobt_recs_inorder, +#endif +}; + /* * Allocate a new inode btree cursor. */ @@ -390,11 +440,17 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; - cur->bc_nlevels = be32_to_cpu(agi->agi_level); cur->bc_btnum = btnum; + if (btnum == XFS_BTNUM_INO) { + cur->bc_nlevels = be32_to_cpu(agi->agi_level); + cur->bc_ops = &xfs_inobt_ops; + } else { + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); + cur->bc_ops = &xfs_finobt_ops; + } + cur->bc_blocklog = mp->m_sb.sb_blocklog; - cur->bc_ops = &xfs_inobt_ops; if (xfs_sb_version_hascrc(&mp->m_sb)) cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:03 2014 Return-Path: <bfoster@redhat.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 CF5E37F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ABDF18F8037 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cbb03cc5395660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sr1z369dez2pdonP for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1ho004816 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0pZ019914 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DE20B124614; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 10/20] xfs: enable the finobt feature on v5 superblocks Date: Wed, 7 May 2014 08:21:49 -0400 X-ASG-Orig-Subj: [PATCH v4 10/20] xfs: enable the finobt feature on v5 superblocks Message-Id: <1399465319-65066-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 the finobt feature bit to the list of known features. As of this point, the kernel code knows how to mount and manage both finobt and non-finobt formatted filesystems. Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_sb.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 7f53a85..950d1ea 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -588,7 +588,8 @@ xfs_sb_has_compat_feature( } #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ -#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:03 2014 Return-Path: <bfoster@redhat.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 C31FB7F3F for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A215E8F8035 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cb6c72903b7750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MgYnGC7eW2CyPpCK for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1IU019338 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0TZ014670 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C51361245B2; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 07/20] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Date: Wed, 7 May 2014 08:21:46 -0400 X-ASG-Orig-Subj: [PATCH v4 07/20] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper Message-Id: <1399465319-65066-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465321 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 Refactor xfs_difree() in preparation for the finobt. xfs_difree() performs the validity checks against the ag and reads the agi header. The work of physically updating the inode allocation btree is pushed down into the new xfs_difree_inobt() helper. Signed-off-by: Brian Foster <bfoster@redhat.com> --- libxfs/xfs_ialloc.c | 161 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 96 insertions(+), 65 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 462340b..f0d6397 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1325,74 +1325,30 @@ out_error: return XFS_ERROR(error); } -/* - * Free disk inode. Carefully avoids touching the incore inode, all - * manipulations incore are the caller's responsibility. - * The on-disk inode is not changed by this operation, only the - * btree (free inode mask) is changed. - */ -int -xfs_difree( - xfs_trans_t *tp, /* transaction pointer */ - xfs_ino_t inode, /* inode to be freed */ - xfs_bmap_free_t *flist, /* extents to free */ - int *delete, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino) /* first inode in deleted cluster */ +STATIC int +xfs_difree_inobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_bmap_free *flist, + int *delete, + xfs_ino_t *first_ino, + struct xfs_inobt_rec_incore *orec) { - /* REFERENCED */ - xfs_agblock_t agbno; /* block number containing inode */ - xfs_buf_t *agbp; /* buffer containing allocation group header */ - xfs_agino_t agino; /* inode number relative to allocation group */ - xfs_agnumber_t agno; /* allocation group number */ - xfs_agi_t *agi; /* allocation group header */ - xfs_btree_cur_t *cur; /* inode btree cursor */ - int error; /* error return value */ - int i; /* result code */ - int ilen; /* inodes in an inode cluster */ - xfs_mount_t *mp; /* mount structure for filesystem */ - int off; /* offset of inode in inode chunk */ - xfs_inobt_rec_incore_t rec; /* btree record */ - struct xfs_perag *pag; - - mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int ilen; + int error; + int i; + int off; - /* - * Break up inode number into its components. - */ - agno = XFS_INO_TO_AGNO(mp, inode); - if (agno >= mp->m_sb.sb_agcount) { - xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", - __func__, agno, mp->m_sb.sb_agcount); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agino = XFS_INO_TO_AGINO(mp, inode); - if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { - xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", - __func__, (unsigned long long)inode, - (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - agbno = XFS_AGINO_TO_AGBNO(mp, agino); - if (agbno >= mp->m_sb.sb_agblocks) { - xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", - __func__, agbno, mp->m_sb.sb_agblocks); - ASSERT(0); - return XFS_ERROR(EINVAL); - } - /* - * Get the allocation group header. - */ - error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); - if (error) { - xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", - __func__, error); - return error; - } - agi = XFS_BUF_TO_AGI(agbp); ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC)); - ASSERT(agbno < be32_to_cpu(agi->agi_length)); + ASSERT(XFS_AGINO_TO_AGBNO(mp, agino) < be32_to_cpu(agi->agi_length)); + /* * Initialize the cursor. */ @@ -1488,6 +1444,7 @@ xfs_difree( if (error) goto error0; + *orec = rec; xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; @@ -1496,6 +1453,80 @@ error0: return error; } +/* + * Free disk inode. Carefully avoids touching the incore inode, all + * manipulations incore are the caller's responsibility. + * The on-disk inode is not changed by this operation, only the + * btree (free inode mask) is changed. + */ +int +xfs_difree( + struct xfs_trans *tp, /* transaction pointer */ + xfs_ino_t inode, /* inode to be freed */ + struct xfs_bmap_free *flist, /* extents to free */ + int *delete,/* set if inode cluster was deleted */ + xfs_ino_t *first_ino)/* first inode in deleted cluster */ +{ + /* REFERENCED */ + xfs_agblock_t agbno; /* block number containing inode */ + struct xfs_buf *agbp; /* buffer for allocation group header */ + xfs_agino_t agino; /* allocation group inode number */ + xfs_agnumber_t agno; /* allocation group number */ + int error; /* error return value */ + struct xfs_mount *mp; /* mount structure for filesystem */ + struct xfs_inobt_rec_incore rec;/* btree record */ + + mp = tp->t_mountp; + + /* + * Break up inode number into its components. + */ + agno = XFS_INO_TO_AGNO(mp, inode); + if (agno >= mp->m_sb.sb_agcount) { + xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).", + __func__, agno, mp->m_sb.sb_agcount); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agino = XFS_INO_TO_AGINO(mp, inode); + if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) { + xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).", + __func__, (unsigned long long)inode, + (unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino)); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + agbno = XFS_AGINO_TO_AGBNO(mp, agino); + if (agbno >= mp->m_sb.sb_agblocks) { + xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).", + __func__, agbno, mp->m_sb.sb_agblocks); + ASSERT(0); + return XFS_ERROR(EINVAL); + } + /* + * Get the allocation group header. + */ + error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); + if (error) { + xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.", + __func__, error); + return error; + } + + /* + * Fix up the inode allocation btree. + */ + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, delete, first_ino, + &rec); + if (error) + goto error0; + + return 0; + +error0: + return error; +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:04 2014 Return-Path: <bfoster@redhat.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 D65D97F53 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B57D68F8039 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cbb03cc4395660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ICtAJHbtuzD1C6sO for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1V8005279 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM02g028667 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6C1431248C5; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 20/20] xfsprogs/db: add finobt support to metadump Date: Wed, 7 May 2014 08:21:59 -0400 X-ASG-Orig-Subj: [PATCH v4 20/20] xfsprogs/db: add finobt support to metadump Message-Id: <1399465319-65066-21-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 Include the free inode btree in metadump images. If the source fs is finobt-enabled, run an additional scan_btree() of the finobt. Since the private 'agi' scanfunc_ino() parameter is unused, change the private parameter to a flag that indicates whether the current scan is for the inobt or finobt. If the latter, we skip copying the actual inode chunks as this work is already performed by the inobt scan. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- db/metadump.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/db/metadump.c b/db/metadump.c index 09bb85a..38cd441 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1917,6 +1917,7 @@ scanfunc_ino( xfs_inobt_ptr_t *pp; int i; int numrecs; + int finobt = *(int *) arg; numrecs = be16_to_cpu(block->bb_numrecs); @@ -1928,6 +1929,14 @@ scanfunc_ino( typtab[btype].name, agno, agbno); numrecs = mp->m_inobt_mxr[0]; } + + /* + * Only copy the btree blocks for the finobt. The inobt scan + * copies the inode chunks. + */ + if (finobt) + return 1; + rp = XFS_INOBT_REC_ADDR(mp, block, 1); for (i = 0; i < numrecs; i++, rp++) { if (!copy_inode_chunk(agno, rp)) @@ -1967,6 +1976,7 @@ copy_inodes( { xfs_agblock_t root; int levels; + int finobt = 0; root = be32_to_cpu(agi->agi_root); levels = be32_to_cpu(agi->agi_level); @@ -1985,7 +1995,20 @@ copy_inodes( return 1; } - return scan_btree(agno, root, levels, TYP_INOBT, agi, scanfunc_ino); + if (!scan_btree(agno, root, levels, TYP_INOBT, &finobt, scanfunc_ino)) + return 0; + + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + root = be32_to_cpu(agi->agi_free_root); + levels = be32_to_cpu(agi->agi_free_level); + + finobt = 1; + if (!scan_btree(agno, root, levels, TYP_INOBT, &finobt, + scanfunc_ino)) + return 0; + } + + return 1; } static int -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:03 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C34C07F50 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 971B6304059 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465320-04bdf02b8d3b5a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n383WcxwIlI9Tt9c for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0Hm005262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s47CM07L013067 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6A3091242A3; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 00/20] xfsprogs: introduce the free inode btree Date: Wed, 7 May 2014 08:21:39 -0400 X-ASG-Orig-Subj: [PATCH v4 00/20] xfsprogs: introduce the free inode btree Message-Id: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465321 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 Hi all, Here's v4 of the finobt series for xfsprogs. Patches 1-10 are unchanged as they are based on the corresponding kernel patches, which have now been merged. v4 includes some fairly isolated fixes for mkfs and repair based on review feedback for v3: http://oss.sgi.com/archives/xfs/2014-04/msg00239.html Some concern was raised over xfs_repair performance based on the implementation of patch 17 in v3, so I have run a few repair tests on largish filesystems. Tests involved creating a large number of inodes on a 1TB 4xraid0, freeing a random percentage to populate the finobt and running xfs_repair (e.g., no actual corruptions). xfs_repair was run normally (with these patches) and with a change to skip the finobt processing via an xfs_sb_version_hasfinobt() hack. The tests were run on a 16xcpu, 32GB RAM server. In just about all cases I don't reproduce much of a delta between the finobt and non-finobt when the tests are averaged out over several runs: 16m inodes, 15 AGs, ~3% randomly freed - finobt avg. runtime 89s - !finobt avg. runtime 89s 16m inodes, 31 AGs, ~1% randomly freed - finobt avg. runtime 95s - !finobt avg. runtime 95s 77m inodes, 1000 AGs, no random removals - finobt avg. runtime 21m - !finobt avg. runtime 22m A sample repair summary for the finobt run of the very last test listed is as follows: XFS_REPAIR Summary Tue May 6 11:16:19 2014 Phase Start End Duration Phase 1: 05/06 10:55:56 05/06 10:56:03 7 seconds Phase 2: 05/06 10:56:03 05/06 10:56:12 9 seconds Phase 3: 05/06 10:56:12 05/06 11:02:34 6 minutes, 22 seconds Phase 4: 05/06 11:02:34 05/06 11:08:14 5 minutes, 40 seconds Phase 5: 05/06 11:08:14 05/06 11:08:15 1 second Phase 6: 05/06 11:08:15 05/06 11:15:49 7 minutes, 34 seconds Phase 7: 05/06 11:15:49 05/06 11:15:50 1 second This shows the bulk of the time spent in phases 3, 4 and 6, which I believe are mostly responsible for reading/processing/checking inodes and directories. The inobt and finobt reconstruction occur in phase 5, which runs in ~1s. For this reason, I haven't thus far attempted any runtime optimizations, but feedback or suggestions on other test procedures that might affect these results is appreciated. Brian v4: - Disable finobt when crc is disabled in mkfs. This fixes xfstests xfs/00[12]. (patch 11) - Fix the comment for calc_mkfs(). (patch 13) - Fixed xfs_repair phase2 logic to detect allocation state mismatches between the inode btrees. Also added/fixed some comments. (patch 14) v3: - Rebased to latest master. v2: - Rebased onto the CRC v5 series and v2 kernel finobt bits. - Core finobt repair support. - xfs_info support. - xfs_metadump support. Brian Foster (20): xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers xfs: reserve v5 superblock read-only compat. feature bit for finobt xfs: support the XFS_BTNUM_FINOBT free inode btree type xfs: update inode allocation/free transaction reservations for finobt xfs: insert newly allocated inode chunks into the finobt xfs: use and update the finobt on inode allocation xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper xfs: update the finobt on inode free xfs: report finobt status in fs geometry xfs: enable the finobt feature on v5 superblocks xfsprogs/mkfs: finobt mkfs support xfsprogs/db: finobt support xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation xfsprogs/repair: phase 2 finobt scan xfsprogs/repair: pass btree block magic as param to build_ino_tree() xfsprogs/repair: pull the build_agi() call up out of the inode tree build xfsprogs/repair: helpers for finding in-core inode records w/ free inodes xfsprogs/repair: reconstruct the finobt in phase 5 xfsprogs/growfs: report finobt status in fs geometry (xfs_info) xfsprogs/db: add finobt support to metadump db/agi.c | 2 + db/btblock.c | 12 + db/metadump.c | 25 +- growfs/xfs_growfs.c | 14 +- include/xfs_ag.h | 32 ++- include/xfs_btree.h | 3 + include/xfs_format.h | 14 +- include/xfs_fs.h | 1 + include/xfs_ialloc_btree.h | 3 +- include/xfs_sb.h | 10 +- include/xfs_trans_space.h | 7 +- include/xfs_types.h | 2 +- libxfs/xfs_btree.c | 6 +- libxfs/xfs_ialloc.c | 617 ++++++++++++++++++++++++++++++++++++++------- libxfs/xfs_ialloc_btree.c | 68 ++++- libxfs/xfs_trans_resv.c | 47 +++- mkfs/xfs_mkfs.c | 93 +++++-- repair/incore.h | 27 ++ repair/phase5.c | 109 ++++++-- repair/scan.c | 251 +++++++++++++++++- repair/xfs_repair.c | 10 +- 21 files changed, 1171 insertions(+), 182 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:04 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A2C37F54 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF01C304059 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cbb03cc6395670001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qn9qCkL4HM7NkJ8i for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1Kk004821 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:02 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0pb019914 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 61939124571; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Date: Wed, 7 May 2014 08:21:56 -0400 X-ASG-Orig-Subj: [PATCH v4 17/20] xfsprogs/repair: helpers for finding in-core inode records w/ free inodes Message-Id: <1399465319-65066-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465322 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 the findfirst_free_inode_rec() and next_free_ino_rec() helpers to assist scanning the in-core inode records for records with at least one free inode. These will be used to determine what records are included in the free inode btree. Signed-off-by: Brian Foster <bfoster@redhat.com> --- repair/incore.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/repair/incore.h b/repair/incore.h index 5419884..5f8c188 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -381,6 +381,33 @@ void clear_uncertain_ino_cache(xfs_agnumber_t agno); ((ino_tree_node_t *) ((ino_node_ptr)->avl_node.avl_forw)) /* + * finobt helpers + */ +static inline ino_tree_node_t * +findfirst_free_inode_rec(xfs_agnumber_t agno) +{ + ino_tree_node_t *ino_rec; + + ino_rec = findfirst_inode_rec(agno); + + while (ino_rec && !ino_rec->ir_free) + ino_rec = next_ino_rec(ino_rec); + + return ino_rec; +} + +static inline ino_tree_node_t * +next_free_ino_rec(ino_tree_node_t *ino_rec) +{ + ino_rec = next_ino_rec(ino_rec); + + while (ino_rec && !ino_rec->ir_free) + ino_rec = next_ino_rec(ino_rec); + + return ino_rec; +} + +/* * Has an inode been processed for phase 6 (reference count checking)? * * add_inode_refchecked() is set on an inode when it gets traversed -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:05 2014 Return-Path: <bfoster@redhat.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 54A527F51 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 428188F8035 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cb6c1fcc265760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BeDnAcCAxurypDON for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1HH004819 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:02 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1I0025675 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 208D9124848; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 14/20] xfsprogs/repair: phase 2 finobt scan Date: Wed, 7 May 2014 08:21:53 -0400 X-ASG-Orig-Subj: [PATCH v4 14/20] xfsprogs/repair: phase 2 finobt scan Message-Id: <1399465319-65066-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465322 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 one exists, scan the free inode btree in phase 2 of xfs_repair. We use the same general infrastructure as for the inobt scan, but trigger finobt chunk scan logic in in scan_inobt() via the magic value. The new scan_single_finobt_chunk() function is similar to the inobt equivalent with some finobt specific logic. We can expect that underlying inode chunk blocks are already marked used due to the previous inobt scan. We can also expect to find every record tracked by the finobt already accounted for in the in-core tree with equivalent (and internally consistent) inobt record data. Spit out a warning on any divergences from the above and add the inodes referenced by the current finobt record to the appropriate in-core tree. Signed-off-by: Brian Foster <bfoster@redhat.com> --- repair/scan.c | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 246 insertions(+), 5 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 4b0ea04..1b64d8b 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -46,6 +46,7 @@ struct aghdr_cnts { __uint64_t fdblocks; __uint64_t icount; __uint64_t ifreecount; + __uint32_t fibtfreecount; }; void @@ -897,6 +898,208 @@ _("inode rec for ino %" PRIu64 " (%d/%d) overlaps existing rec (start %d/%d)\n") return suspect; } +static int +scan_single_finobt_chunk( + xfs_agnumber_t agno, + xfs_inobt_rec_t *rp, + int suspect) +{ + xfs_ino_t lino; + xfs_agino_t ino; + xfs_agblock_t agbno; + int j; + int nfree; + int off; + int state; + ino_tree_node_t *first_rec, *last_rec, *ino_rec; + + ino = be32_to_cpu(rp->ir_startino); + off = XFS_AGINO_TO_OFFSET(mp, ino); + agbno = XFS_AGINO_TO_AGBNO(mp, ino); + lino = XFS_AGINO_TO_INO(mp, agno, ino); + + /* + * on multi-block block chunks, all chunks start at the beginning of the + * block. with multi-chunk blocks, all chunks must start on 64-inode + * boundaries since each block can hold N complete chunks. if fs has + * aligned inodes, all chunks must start at a fs_ino_alignment*N'th + * agbno. skip recs with badly aligned starting inodes. + */ + if (ino == 0 || + (inodes_per_block <= XFS_INODES_PER_CHUNK && off != 0) || + (inodes_per_block > XFS_INODES_PER_CHUNK && + off % XFS_INODES_PER_CHUNK != 0) || + (fs_aligned_inodes && agbno % fs_ino_alignment != 0)) { + do_warn( + _("badly aligned finobt inode rec (starting inode = %" PRIu64 ")\n"), + lino); + suspect++; + } + + /* + * verify numeric validity of inode chunk first before inserting into a + * tree. don't have to worry about the overflow case because the + * starting ino number of a chunk can only get within 255 inodes of max + * (NULLAGINO). if it gets closer, the agino number will be illegal as + * the agbno will be too large. + */ + if (verify_aginum(mp, agno, ino)) { + do_warn( +_("bad starting inode # (%" PRIu64 " (0x%x 0x%x)) in finobt rec, skipping rec\n"), + lino, agno, ino); + return ++suspect; + } + + if (verify_aginum(mp, agno, + ino + XFS_INODES_PER_CHUNK - 1)) { + do_warn( +_("bad ending inode # (%" PRIu64 " (0x%x 0x%zx)) in finobt rec, skipping rec\n"), + lino + XFS_INODES_PER_CHUNK - 1, + agno, + ino + XFS_INODES_PER_CHUNK - 1); + return ++suspect; + } + + /* + * cross check state of each block containing inodes referenced by the + * finobt against what we have already scanned from the alloc inobt. + */ + if (off == 0 && !suspect) { + for (j = 0; + j < XFS_INODES_PER_CHUNK; + j += mp->m_sb.sb_inopblock) { + agbno = XFS_AGINO_TO_AGBNO(mp, ino + j); + + state = get_bmap(agno, agbno); + if (state == XR_E_INO) { + continue; + } else if ((state == XR_E_UNKNOWN) || + (state == XR_E_INUSE_FS && agno == 0 && + ino + j >= first_prealloc_ino && + ino + j < last_prealloc_ino)) { + do_warn( +_("inode chunk claims untracked block, finobt block - agno %d, bno %d, inopb %d\n"), + agno, agbno, mp->m_sb.sb_inopblock); + + set_bmap(agno, agbno, XR_E_INO); + suspect++; + } else { + do_warn( +_("inode chunk claims used block, finobt block - agno %d, bno %d, inopb %d\n"), + agno, agbno, mp->m_sb.sb_inopblock); + return ++suspect; + } + } + } + + /* + * ensure we have an incore entry for each chunk + */ + find_inode_rec_range(mp, agno, ino, ino + XFS_INODES_PER_CHUNK, + &first_rec, &last_rec); + + if (first_rec) { + if (suspect) + return suspect; + + /* + * verify consistency between finobt record and incore state + */ + if (first_rec->ino_startnum != ino) { + do_warn( +_("finobt rec for ino %" PRIu64 " (%d/%u) does not match existing rec (%d/%d)\n"), + lino, agno, ino, agno, first_rec->ino_startnum); + return ++suspect; + } + + nfree = 0; + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { + int isfree = XFS_INOBT_IS_FREE_DISK(rp, j); + + if (isfree) + nfree++; + + /* + * inode allocation state should be consistent between + * the inobt and finobt + */ + if (!suspect && + isfree != is_inode_free(first_rec, j)) + suspect++; + } + + goto check_freecount; + } + + /* + * the finobt contains a record that the previous alloc inobt scan never + * found. insert the inodes into the appropriate tree. + */ + do_warn(_("undiscovered finobt record, ino %" PRIu64 " (%d/%u)\n"), + lino, agno, ino); + + if (!suspect) { + /* + * inodes previously inserted into the uncertain tree should be + * superceded by these when the uncertain tree is processed + */ + nfree = 0; + if (XFS_INOBT_IS_FREE_DISK(rp, 0)) { + nfree++; + ino_rec = set_inode_free_alloc(mp, agno, ino); + } else { + ino_rec = set_inode_used_alloc(mp, agno, ino); + } + for (j = 1; j < XFS_INODES_PER_CHUNK; j++) { + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { + nfree++; + set_inode_free(ino_rec, j); + } else { + set_inode_used(ino_rec, j); + } + } + } else { + /* + * this should handle the case where the inobt scan may have + * already added uncertain inodes + */ + nfree = 0; + for (j = 0; j < XFS_INODES_PER_CHUNK; j++) { + if (XFS_INOBT_IS_FREE_DISK(rp, j)) { + add_aginode_uncertain(mp, agno, ino + j, 1); + nfree++; + } else { + add_aginode_uncertain(mp, agno, ino + j, 0); + } + } + } + +check_freecount: + + /* + * Verify that the record freecount matches the actual number of free + * inodes counted in the record. Don't increment 'suspect' here, since + * we have already verified the allocation state of the individual + * inodes against the in-core state. This will have already incremented + * 'suspect' if something is wrong. If suspect hasn't been set at this + * point, these warnings mean that we have a simple freecount + * inconsistency or a stray finobt record (as opposed to a broader tree + * corruption). Issue a warning and continue the scan. The final btree + * reconstruction will correct this naturally. + */ + if (nfree != be32_to_cpu(rp->ir_freecount)) { + do_warn( +_("finobt ir_freecount/free mismatch, inode chunk %d/%u, freecount %d nfree %d\n"), + agno, ino, be32_to_cpu(rp->ir_freecount), nfree); + } + + if (!nfree) { + do_warn( +_("finobt record with no free inodes, inode chunk %d/%u\n"), agno, ino); + } + + return suspect; +} /* * this one walks the inode btrees sucking the info there into @@ -1005,12 +1208,29 @@ _("inode btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), * the block. skip processing of bogus records. */ for (i = 0; i < numrecs; i++) { - agcnts->agicount += XFS_INODES_PER_CHUNK; - agcnts->icount += XFS_INODES_PER_CHUNK; - agcnts->agifreecount += be32_to_cpu(rp[i].ir_freecount); - agcnts->ifreecount += be32_to_cpu(rp[i].ir_freecount); + if (magic == XFS_IBT_MAGIC || + magic == XFS_IBT_CRC_MAGIC) { + agcnts->agicount += XFS_INODES_PER_CHUNK; + agcnts->icount += XFS_INODES_PER_CHUNK; + agcnts->agifreecount += + be32_to_cpu(rp[i].ir_freecount); + agcnts->ifreecount += + be32_to_cpu(rp[i].ir_freecount); + + suspect = scan_single_ino_chunk(agno, &rp[i], + suspect); + } else { + /* + * the finobt tracks records with free inodes, + * so only the free inode count is expected to be + * consistent with the agi + */ + agcnts->fibtfreecount += + be32_to_cpu(rp[i].ir_freecount); - suspect = scan_single_ino_chunk(agno, &rp[i], suspect); + suspect = scan_single_finobt_chunk(agno, &rp[i], + suspect); + } } if (suspect) @@ -1198,6 +1418,20 @@ validate_agi( be32_to_cpu(agi->agi_root), agno); } + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + bno = be32_to_cpu(agi->agi_free_root); + if (bno != 0 && verify_agbno(mp, agno, bno)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC; + scan_sbtree(bno, be32_to_cpu(agi->agi_free_level), + agno, 0, scan_inobt, 1, magic, agcnts, + &xfs_inobt_buf_ops); + } else { + do_warn(_("bad agbno %u for finobt root, agno %d\n"), + be32_to_cpu(agi->agi_free_root), agno); + } + } + if (be32_to_cpu(agi->agi_count) != agcnts->agicount) { do_warn(_("agi_count %u, counted %u in ag %u\n"), be32_to_cpu(agi->agi_count), agcnts->agicount, agno); @@ -1208,6 +1442,13 @@ validate_agi( be32_to_cpu(agi->agi_freecount), agcnts->agifreecount, agno); } + if (xfs_sb_version_hasfinobt(&mp->m_sb) && + be32_to_cpu(agi->agi_freecount) != agcnts->fibtfreecount) { + do_warn(_("agi_freecount %u, counted %u in ag %u finobt\n"), + be32_to_cpu(agi->agi_freecount), agcnts->fibtfreecount, + agno); + } + for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) { xfs_agino_t agino = be32_to_cpu(agi->agi_unlinked[i]); -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:04 2014 Return-Path: <bfoster@redhat.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 367707F55 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B01C8F8035 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cb6c72903b7760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T6NxzuBcDzlAWouy for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1Ls032506 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0HF014687 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 788B512499D; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 19/20] xfsprogs/growfs: report finobt status in fs geometry (xfs_info) Date: Wed, 7 May 2014 08:21:58 -0400 X-ASG-Orig-Subj: [PATCH v4 19/20] xfsprogs/growfs: report finobt status in fs geometry (xfs_info) Message-Id: <1399465319-65066-20-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465322 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 Check and report on the free inode btree status bit in the fs geometry. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- growfs/xfs_growfs.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index 77da707..8e611b6 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -56,12 +56,13 @@ report_info( int projid32bit, int crcs_enabled, int cimode, - int ftype_enabled) + int ftype_enabled, + int finobt_enabled) { printf(_( "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" - " =%-22s crc=%u\n" + " =%-22s crc=%-8u finobt=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -71,7 +72,7 @@ report_info( mntpoint, geo.inodesize, geo.agcount, geo.agblocks, "", geo.sectsize, attrversion, projid32bit, - "", crcs_enabled, + "", crcs_enabled, finobt_enabled, "", geo.blocksize, (unsigned long long)geo.datablocks, geo.imaxpct, "", geo.sunit, geo.swidth, @@ -123,6 +124,7 @@ main(int argc, char **argv) int projid32bit; int crcs_enabled; int ftype_enabled = 0; + int finobt_enabled; /* free inode btree */ progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -244,11 +246,12 @@ main(int argc, char **argv) projid32bit = geo.flags & XFS_FSOP_GEOM_FLAGS_PROJID32 ? 1 : 0; crcs_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_V5SB ? 1 : 0; ftype_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_FTYPE ? 1 : 0; + finobt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_FINOBT ? 1 : 0; if (nflag) { report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, attrversion, projid32bit, crcs_enabled, ci, - ftype_enabled); + ftype_enabled, finobt_enabled); exit(0); } @@ -285,7 +288,8 @@ main(int argc, char **argv) report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, - attrversion, projid32bit, crcs_enabled, ci, ftype_enabled); + attrversion, projid32bit, crcs_enabled, ci, ftype_enabled, + finobt_enabled); ddsize = xi.dsize; dlsize = ( xi.logBBsize? xi.logBBsize : -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:05 2014 Return-Path: <bfoster@redhat.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 7950F7F5A for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49DAC8F8037 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04bdf02b8d3b5a60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4CxhLacOIfuooofA for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1tA032508 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0Tb014670 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5347D124859; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 18/20] xfsprogs/repair: reconstruct the finobt in phase 5 Date: Wed, 7 May 2014 08:21:57 -0400 X-ASG-Orig-Subj: [PATCH v4 18/20] xfsprogs/repair: reconstruct the finobt in phase 5 Message-Id: <1399465319-65066-19-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465322 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 Support reconstruction of the finobt in phase 5 of xfs_repair. We create a new cursor for the finobt and write the in-core records that contain free inodes to the tree. Finally, pass the cursor along to build_agi() to include the finobt root and level count in the agi header. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- repair/phase5.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 4778e08..e82eeb7 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -878,10 +878,11 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, - __uint64_t *num_inos, __uint64_t *num_free_inos) + __uint64_t *num_inos, __uint64_t *num_free_inos, int finobt) { __uint64_t ninos; __uint64_t nfinos; + __uint64_t rec_nfinos; ino_tree_node_t *ino_rec; int num_recs; int level; @@ -917,13 +918,22 @@ init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, * build up statistics */ for (num_recs = 0; ino_rec != NULL; ino_rec = next_ino_rec(ino_rec)) { - ninos += XFS_INODES_PER_CHUNK; - num_recs++; + rec_nfinos = 0; for (i = 0; i < XFS_INODES_PER_CHUNK; i++) { ASSERT(is_inode_confirmed(ino_rec, i)); if (is_inode_free(ino_rec, i)) - nfinos++; + rec_nfinos++; } + + /* + * finobt only considers records with free inodes + */ + if (finobt && !rec_nfinos) + continue; + + nfinos += rec_nfinos; + ninos += XFS_INODES_PER_CHUNK; + num_recs++; } blocks_allocated = lptr->num_blocks = howmany(num_recs, @@ -1058,8 +1068,8 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, * XXX: yet more code that can be shared with mkfs, growfs. */ static void -build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs, struct agi_stat *agi_stat) +build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, + bt_status_t *finobt_curs, struct agi_stat *agi_stat) { xfs_buf_t *agi_buf; xfs_agi_t *agi; @@ -1093,6 +1103,11 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, if (xfs_sb_version_hascrc(&mp->m_sb)) platform_uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + agi->agi_free_root = cpu_to_be32(finobt_curs->root); + agi->agi_free_level = cpu_to_be32(finobt_curs->num_levels); + } + libxfs_writebuf(agi_buf, 0); } @@ -1103,7 +1118,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, __uint32_t magic, - struct agi_stat *agi_stat) + struct agi_stat *agi_stat, int finobt) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1155,7 +1170,10 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, * pointers for the parent. that can recurse up to the root * if required. set the sibling pointers for leaf level here. */ - ino_rec = findfirst_inode_rec(agno); + if (finobt) + ino_rec = findfirst_free_inode_rec(agno); + else + ino_rec = findfirst_inode_rec(agno); if (ino_rec != NULL) first_agino = ino_rec->ino_startnum; @@ -1207,7 +1225,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_rec[j].ir_freecount = cpu_to_be32(inocnt); freecount += inocnt; count += XFS_INODES_PER_CHUNK; - ino_rec = next_ino_rec(ino_rec); + + if (finobt) + ino_rec = next_free_ino_rec(ino_rec); + else + ino_rec = next_ino_rec(ino_rec); } if (ino_rec != NULL) { @@ -1483,9 +1505,12 @@ phase5_func( { __uint64_t num_inos; __uint64_t num_free_inos; + __uint64_t finobt_num_inos; + __uint64_t finobt_num_free_inos; bt_status_t bno_btree_curs; bt_status_t bcnt_btree_curs; bt_status_t ino_btree_curs; + bt_status_t fino_btree_curs; int extra_blocks = 0; uint num_freeblocks; xfs_extlen_t freeblks1; @@ -1530,8 +1555,13 @@ phase5_func( * on-disk btrees (includs pre-allocating all * required blocks for the trees themselves) */ - init_ino_cursor(mp, agno, &ino_btree_curs, - &num_inos, &num_free_inos); + init_ino_cursor(mp, agno, &ino_btree_curs, &num_inos, + &num_free_inos, 0); + + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + init_ino_cursor(mp, agno, &fino_btree_curs, + &finobt_num_inos, &finobt_num_free_inos, + 1); sb_icount_ag[agno] += num_inos; sb_ifree_ag[agno] += num_free_inos; @@ -1630,17 +1660,31 @@ phase5_func( */ magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; - build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat); + build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat, 0); write_cursor(&ino_btree_curs); + /* + * build free inode tree + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC; + build_ino_tree(mp, agno, &fino_btree_curs, magic, + NULL, 1); + write_cursor(&fino_btree_curs); + } + /* build the agi */ - build_agi(mp, agno, &ino_btree_curs, &agi_stat); + build_agi(mp, agno, &ino_btree_curs, &fino_btree_curs, + &agi_stat); /* * tear down cursors */ finish_cursor(&bno_btree_curs); finish_cursor(&ino_btree_curs); + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + finish_cursor(&fino_btree_curs); finish_cursor(&bcnt_btree_curs); /* * release the incore per-AG bno/bcnt trees so -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:06 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 707737F59 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0882AAC006 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cb6c1fcc265750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SMcMxvcTsbafhDqW for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1QC002574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0su007788 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AA0AD12456D; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 06/20] xfs: use and update the finobt on inode allocation Date: Wed, 7 May 2014 08:21:45 -0400 X-ASG-Orig-Subj: [PATCH v4 06/20] xfs: use and update the finobt on inode allocation Message-Id: <1399465319-65066-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 Replace xfs_dialloc_ag() with an implementation that looks for a record in the finobt. The finobt only tracks records with at least one free inode. This eliminates the need for the intra-ag scan in the original algorithm. Once the inode is allocated, update the finobt appropriately (possibly removing the record) as well as the inobt. Move the original xfs_dialloc_ag() algorithm to xfs_dialloc_ag_slow() and fall back as such if finobt support is not enabled. Signed-off-by: Brian Foster <bfoster@redhat.com> --- libxfs/xfs_ialloc.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 210 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c5759aa..462340b 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -699,7 +699,7 @@ xfs_ialloc_get_rec( * available. */ STATIC int -xfs_dialloc_ag( +xfs_dialloc_ag_slow( struct xfs_trans *tp, struct xfs_buf *agbp, xfs_ino_t parent, @@ -957,6 +957,215 @@ error0: return error; } +STATIC int +xfs_dialloc_ag( + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_ino_t parent, + xfs_ino_t *inop) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent); + xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *cur; + struct xfs_btree_cur *tcur; + struct xfs_inobt_rec_incore rec; + struct xfs_inobt_rec_incore trec; + xfs_ino_t ino; + int error; + int offset; + int i, j; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return xfs_dialloc_ag_slow(tp, agbp, parent, inop); + + pag = xfs_perag_get(mp, agno); + + /* + * If pagino is 0 (this is the root inode allocation) use newino. + * This must work because we've just allocated some. + */ + if (!pagino) + pagino = be32_to_cpu(agi->agi_newino); + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_cur; + + if (agno == pagno) { + /* + * We're in the same AG as the parent inode so allocate the + * closest inode to the parent. + */ + error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); + if (error) + goto error_cur; + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + + /* + * See if we've landed in the parent inode record. The + * finobt only tracks chunks with at least one free + * inode, so record existence is enough. + */ + if (pagino >= rec.ir_startino && + pagino < (rec.ir_startino + XFS_INODES_PER_CHUNK)) + goto alloc_inode; + } + + error = xfs_btree_dup_cursor(cur, &tcur); + if (error) + goto error_cur; + + error = xfs_inobt_lookup(tcur, pagino, XFS_LOOKUP_GE, &j); + if (error) + goto error_tcur; + if (j == 1) { + error = xfs_inobt_get_rec(tcur, &trec, &j); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(j == 1, error_tcur); + } + + if (i == 1 && j == 1) { + if ((pagino - rec.ir_startino + XFS_INODES_PER_CHUNK - 1) > + (trec.ir_startino - pagino)) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + } else { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + } + } else if (j == 1) { + rec = trec; + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + cur = tcur; + } else { + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + } + } else { + /* + * Different AG from the parent inode. Check the record for the + * most recently allocated inode. + */ + if (agi->agi_newino != cpu_to_be32(NULLAGINO)) { + error = xfs_inobt_lookup(cur, agi->agi_newino, + XFS_LOOKUP_EQ, &i); + if (error) + goto error_cur; + if (i == 1) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + goto alloc_inode; + } + } + + /* + * Allocate the first inode available in the AG. + */ + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error_cur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_cur); + } + +alloc_inode: + offset = xfs_lowbit64(rec.ir_free); + ASSERT(offset >= 0); + ASSERT(offset < XFS_INODES_PER_CHUNK); + ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino + offset); + + /* + * Modify or remove the finobt record. + */ + rec.ir_free &= ~XFS_INOBT_MASK(offset); + rec.ir_freecount--; + if (rec.ir_freecount) + error = xfs_inobt_update(cur, &rec); + else + error = xfs_btree_delete(cur, &i); + if (error) + goto error_cur; + + /* + * Lookup and modify the equivalent record in the inobt. + */ + tcur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); + + error = xfs_check_agi_freecount(tcur, agi); + if (error) + goto error_tcur; + + error = xfs_inobt_lookup(tcur, rec.ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_tcur); + + error = xfs_inobt_get_rec(tcur, &trec, &i); + if (error) + goto error_tcur; + XFS_WANT_CORRUPTED_GOTO(i == 1, error_tcur); + ASSERT((XFS_AGINO_TO_OFFSET(mp, trec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + + trec.ir_free &= ~XFS_INOBT_MASK(offset); + trec.ir_freecount--; + + XFS_WANT_CORRUPTED_GOTO((rec.ir_free == trec.ir_free) && + (rec.ir_freecount == trec.ir_freecount), + error_tcur); + + error = xfs_inobt_update(tcur, &trec); + if (error) + goto error_tcur; + + /* + * Update the perag and superblock. + */ + be32_add_cpu(&agi->agi_freecount, -1); + xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); + pag->pagi_freecount--; + + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); + + error = xfs_check_agi_freecount(tcur, agi); + if (error) + goto error_tcur; + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error_tcur; + + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_perag_put(pag); + *inop = ino; + return 0; + +error_tcur: + xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); +error_cur: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_perag_put(pag); + return error; +} + /* * Allocate an inode on disk. * -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:06 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A47227F4E for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A46FAC00A for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cb6c728f3b7760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pG8mWpyG582UKfhW for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM15C004818 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:02 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1we025677 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2B0451242A3; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Date: Wed, 7 May 2014 08:21:52 -0400 X-ASG-Orig-Subj: [PATCH v4 13/20] xfsprogs/repair: account for finobt in ag 0 geometry pre-calculation Message-Id: <1399465319-65066-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465322 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 Account for the finobt in calc_mkfs(). Signed-off-by: Brian Foster <bfoster@redhat.com> --- repair/xfs_repair.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 08b25f0..9eb2fa4 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -399,14 +399,18 @@ calc_mkfs(xfs_mount_t *mp) do_inoalign = mp->m_sinoalign; /* - * pre-calculate geometry of ag 0. We know what it looks - * like because we know what mkfs does -- 3 btree roots, - * and some number of blocks to prefill the agfl. + * Pre-calculate the geometry of ag 0. We know what it looks like + * because we know what mkfs does: 2 allocation btree roots (by block + * and by size), the inode allocation btree root, the free inode + * allocation btree root (if enabled) and some number of blocks to + * prefill the agfl. */ bnobt_root = howmany(4 * mp->m_sb.sb_sectsize, mp->m_sb.sb_blocksize); bcntbt_root = bnobt_root + 1; inobt_root = bnobt_root + 2; fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1; + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + fino_bno++; /* * If the log is allocated in the first allocation group we need to -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:06 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA5C97F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D1829304059 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cbb03cc5395670001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FnlnxSqDTEiiKeZH for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1Hu002582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:02 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0sw007788 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 447F1124388; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 15/20] xfsprogs/repair: pass btree block magic as param to build_ino_tree() Date: Wed, 7 May 2014 08:21:54 -0400 X-ASG-Orig-Subj: [PATCH v4 15/20] xfsprogs/repair: pass btree block magic as param to build_ino_tree() Message-Id: <1399465319-65066-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465322 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 A minor cleanup to build_ino_tree() to provide the appropriate magic value for btree block initialization from the caller. This facilitates use of separate magic values for finobt blocks when building the free inode btree. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- repair/phase5.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index b173597..2c02e40 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1094,7 +1094,7 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs) + bt_status_t *btree_curs, __uint32_t magic) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1132,11 +1132,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, 0); } @@ -1163,11 +1163,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + xfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -1480,6 +1480,7 @@ phase5_func( xfs_extlen_t freeblks2; #endif xfs_agblock_t num_extents; + __uint32_t magic; if (verbose) do_log(_(" - agno = %d\n"), agno); @@ -1613,7 +1614,9 @@ phase5_func( /* * build inode allocation tree. this also build the agi */ - build_ino_tree(mp, agno, &ino_btree_curs); + magic = xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; + build_ino_tree(mp, agno, &ino_btree_curs, magic); write_cursor(&ino_btree_curs); /* * tear down cursors -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:06 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F18607F5F for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88E76AC00B for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465322-04cbb03cc7395670001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w0IgotVLHIy9OI2O for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1rv002578 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s47CM1Te013102 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0349E12478D; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 11/20] xfsprogs/mkfs: finobt mkfs support Date: Wed, 7 May 2014 08:21:50 -0400 X-ASG-Orig-Subj: [PATCH v4 11/20] xfsprogs/mkfs: finobt mkfs support Message-Id: <1399465319-65066-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465322 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 the 'finobt' metadata option to mkfs to format an fs with free inode btree support. If enabled, initialize the associated AGI header fields and btree root block. Also, do the initialization of the superblock version and feature bits (including the new finobt flag) a bit earlier. These fields must now be initialized prior to the use of XFS_PREALLOC_BLOCKS(), as the latter returns a value that depends on whether a finobt root btree block is reserved. Signed-off-by: Brian Foster <bfoster@redhat.com> --- mkfs/xfs_mkfs.c | 93 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 37c05a9..188b6b3 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -183,6 +183,8 @@ char *sopts[] = { char *mopts[] = { #define M_CRC 0 "crc", +#define M_FINOBT 1 + "finobt", NULL }; @@ -962,6 +964,7 @@ main( struct fs_topology ft; int lazy_sb_counters; int crcs_enabled; + int finobt; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -995,6 +998,7 @@ main( worst_freelist = 0; lazy_sb_counters = 1; crcs_enabled = 0; + finobt = 0; memset(&fsx, 0, sizeof(fsx)); memset(&xi, 0, sizeof(xi)); @@ -1486,6 +1490,14 @@ _("cannot specify both crc and ftype\n")); usage(); } break; + case M_FINOBT: + if (!value || *value == '\0') + reqval('m', mopts, M_CRC); + c = atoi(value); + if (c < 0 || c > 1) + illegal(value, "m finobt"); + finobt = c; + break; default: unknown('m', value); } @@ -1827,6 +1839,16 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } } + /* + * The kernel doesn't currently support crc=0,finobt=1 filesystems. + * Catch it here, disable finobt and warn the user. + */ + if (finobt && !crcs_enabled) { + fprintf(stderr, +_("warning: finobt not supported without CRC support, disabled.\n")); + finobt = 0; + } + if (nsflag || nlflag) { if (dirblocksize < blocksize || dirblocksize > XFS_MAX_BLOCKSIZE) { @@ -2413,6 +2435,30 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT; mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; + /* + * sb_versionnum and finobt flags must be set before we use + * XFS_PREALLOC_BLOCKS(). + */ + sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, + attrversion == 2, !projid16bit, 0, + (!crcs_enabled && dirftype)); + sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, + dsunit != 0, + logversion == 2, attrversion == 1, + (sectorsize != BBSIZE || + lsectorsize != BBSIZE), + nci, sbp->sb_features2 != 0); + /* + * Due to a structure alignment issue, sb_features2 ended up in one + * of two locations, the second "incorrect" location represented by + * the sb_bad_features2 field. To avoid older kernels mounting + * filesystems they shouldn't, set both field to the same value. + */ + sbp->sb_bad_features2 = sbp->sb_features2; + + if (finobt) + sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; + if (loginternal) { /* * Readjust the log size to fit within an AG if it was sized @@ -2475,7 +2521,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" - " =%-22s crc=%u\n" + " =%-22s crc=%-8u finobt=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -2484,7 +2530,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), dfile, isize, (long long)agcount, (long long)agsize, "", sectorsize, attrversion, !projid16bit, - "", crcs_enabled, + "", crcs_enabled, finobt, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, dirversion, dirblocksize, nci, dirftype, @@ -2553,23 +2599,6 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_logsectsize = 0; } - sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, - attrversion == 2, !projid16bit, 0, - (!crcs_enabled && dirftype)); - sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, - dsunit != 0, - logversion == 2, attrversion == 1, - (sectorsize != BBSIZE || - lsectorsize != BBSIZE), - nci, sbp->sb_features2 != 0); - /* - * Due to a structure alignment issue, sb_features2 ended up in one - * of two locations, the second "incorrect" location represented by - * the sb_bad_features2 field. To avoid older kernels mounting - * filesystems they shouldn't, set both field to the same value. - */ - sbp->sb_bad_features2 = sbp->sb_features2; - if (force_overwrite) zero_old_xfs_structures(&xi, sbp); @@ -2726,6 +2755,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agi->agi_count = 0; agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp)); agi->agi_level = cpu_to_be32(1); + if (finobt) { + agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); + agi->agi_free_level = cpu_to_be32(1); + } agi->agi_freecount = 0; agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); @@ -2851,6 +2884,26 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), xfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + + /* + * Free INO btree root block + */ + if (!finobt) + continue; + + buf = libxfs_getbuf(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_FIBT_BLOCK(mp)), + bsize); + buf->b_ops = &xfs_inobt_buf_ops; + block = XFS_BUF_TO_BLOCK(buf); + memset(block, 0, blocksize); + if (xfs_sb_version_hascrc(&mp->m_sb)) + xfs_btree_init_block(mp, buf, XFS_FIBT_CRC_MAGIC, 0, 0, + agno, XFS_BTREE_CRC_BLOCKS); + else + xfs_btree_init_block(mp, buf, XFS_FIBT_MAGIC, 0, 0, + agno, 0); + libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } /* @@ -3087,7 +3140,7 @@ usage( void ) { fprintf(stderr, _("Usage: %s\n\ /* blocksize */ [-b log=n|size=num]\n\ -/* metadata */ [-m crc=[0|1]\n\ +/* metadata */ [-m crc=0|1,finobt=0|1]\n\ /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\ (sunit=value,swidth=value|su=num,sw=num|noalign),\n\ sectlog=n|sectsize=num\n\ -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:07 2014 Return-Path: <bfoster@redhat.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 A6E7D7F76 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 954298F8037 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cbb03cc6395660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1ftuJZ9ENUeG3tSk for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM103032500 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM02e028667 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D39631245F5; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 08/20] xfs: update the finobt on inode free Date: Wed, 7 May 2014 08:21:47 -0400 X-ASG-Orig-Subj: [PATCH v4 08/20] xfs: update the finobt on inode free Message-Id: <1399465319-65066-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 An inode free operation can have several effects on the finobt. If all inodes have been freed and the chunk deallocated, we remove the finobt record. If the inode chunk was previously full, we must insert a new record based on the existing inobt record. Otherwise, we modify the record in place. Create the xfs_ifree_finobt() function to identify the potential scenarios and update the finobt appropriately. Signed-off-by: Brian Foster <bfoster@redhat.com> --- libxfs/xfs_ialloc.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index f0d6397..21af5b3 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1454,6 +1454,106 @@ error0: } /* + * Free an inode in the free inode btree. + */ +STATIC int +xfs_difree_finobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t agino, + struct xfs_inobt_rec_incore *ibtrec) /* inobt record */ +{ + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + struct xfs_btree_cur *cur; + struct xfs_inobt_rec_incore rec; + int offset = agino - ibtrec->ir_startino; + int error; + int i; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + + error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + if (i == 0) { + /* + * If the record does not exist in the finobt, we must have just + * freed an inode in a previously fully allocated chunk. If not, + * something is out of sync. + */ + XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); + + error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + ibtrec->ir_free, &i); + if (error) + goto error; + ASSERT(i == 1); + + goto out; + } + + /* + * Read and update the existing record. + */ + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + rec.ir_free |= XFS_INOBT_MASK(offset); + rec.ir_freecount++; + + XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && + (rec.ir_freecount == ibtrec->ir_freecount), + error); + + /* + * The content of inobt records should always match between the inobt + * and finobt. The lifecycle of records in the finobt is different from + * the inobt in that the finobt only tracks records with at least one + * free inode. This is to optimize lookup for inode allocation purposes. + * The following checks determine whether to update the existing record or + * remove it entirely. + */ + + if (rec.ir_freecount == XFS_IALLOC_INODES(mp) && + !(mp->m_flags & XFS_MOUNT_IKEEP)) { + /* + * If all inodes are free and we're in !ikeep mode, the entire + * inode chunk has been deallocated. Remove the record from the + * finobt. + */ + error = xfs_btree_delete(cur, &i); + if (error) + goto error; + ASSERT(i == 1); + } else { + /* + * The existing finobt record was modified and has a combination + * of allocated and free inodes or is completely free and ikeep + * is enabled. Update the record. + */ + error = xfs_inobt_update(cur, &rec); + if (error) + goto error; + } + +out: + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error; + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; + +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Free disk inode. Carefully avoids touching the incore inode, all * manipulations incore are the caller's responsibility. * The on-disk inode is not changed by this operation, only the @@ -1521,6 +1621,15 @@ xfs_difree( if (error) goto error0; + /* + * Fix up the free inode btree. + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + error = xfs_difree_finobt(mp, tp, agbp, agino, &rec); + if (error) + goto error0; + } + return 0; error0: -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:07 2014 Return-Path: <bfoster@redhat.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 B3B7E7F77 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 84AAD8F8035 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465320-04bdf02b8c3b5a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9XmhUtQtN9bDsJrh for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0Qg019327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s47CM0U5032617 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8CFB5124388; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 04/20] xfs: update inode allocation/free transaction reservations for finobt Date: Wed, 7 May 2014 08:21:43 -0400 X-ASG-Orig-Subj: [PATCH v4 04/20] xfs: update inode allocation/free transaction reservations for finobt Message-Id: <1399465319-65066-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465321 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 Create the xfs_calc_finobt_res() helper to calculate the finobt log reservation for inode allocation and free. Update XFS_IALLOC_SPACE_RES() to reserve blocks for the additional finobt insertion on inode allocation. Create XFS_IFREE_SPACE_RES() to reserve blocks for the potential finobt record insertion on inode free (i.e., if an inode chunk was previously fully allocated). Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_trans_space.h | 7 ++++++- libxfs/xfs_trans_resv.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/include/xfs_trans_space.h b/include/xfs_trans_space.h index 7d2c920..a7d1721 100644 --- a/include/xfs_trans_space.h +++ b/include/xfs_trans_space.h @@ -47,7 +47,9 @@ #define XFS_DIRREMOVE_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) #define XFS_IALLOC_SPACE_RES(mp) \ - (XFS_IALLOC_BLOCKS(mp) + (mp)->m_in_maxlevels - 1) + (XFS_IALLOC_BLOCKS(mp) + \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1 * \ + ((mp)->m_in_maxlevels - 1))) /* * Space reservation values for various transactions. @@ -82,5 +84,8 @@ (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) #define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) +#define XFS_IFREE_SPACE_RES(mp) \ + (xfs_sb_version_hasfinobt(&mp->m_sb) ? (mp)->m_in_maxlevels : 0) + #endif /* __XFS_TRANS_SPACE_H__ */ diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 1e59fad..870d4fc 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -81,6 +81,37 @@ xfs_calc_inode_res( } /* + * The free inode btree is a conditional feature and the log reservation + * requirements differ slightly from that of the traditional inode allocation + * btree. The finobt tracks records for inode chunks with at least one free inode. + * Therefore, a record can be removed from the tree for an inode allocation or + * free and the associated merge reservation is unconditional. This also covers + * the possibility of a split on record insertion. + * + * the free inode btree: max depth * block size + * the free inode btree entry: block size + * + * TODO: is the modify res really necessary? covered by the merge/split res? + * This seems to be the pattern of ifree, but not create_resv_alloc. Why? + */ +STATIC uint +xfs_calc_finobt_res( + struct xfs_mount *mp, + int modify) +{ + uint res; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return 0; + + res = xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)); + if (modify) + res += (uint)XFS_FSB_TO_B(mp, 1); + + return res; +} + +/* * Various log reservation values. * * These are based on the size of the file system block because that is what @@ -250,6 +281,7 @@ xfs_calc_remove_reservation( * the superblock for the nlink flag: sector size * the directory btree: (max depth + v2) * dir block size * the directory inode's bmap btree: (max depth + v2) * block size + * the finobt */ STATIC uint xfs_calc_create_resv_modify( @@ -258,7 +290,8 @@ xfs_calc_create_resv_modify( return xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + (uint)XFS_FSB_TO_B(mp, 1) + - xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)); + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 1); } /* @@ -268,6 +301,7 @@ xfs_calc_create_resv_modify( * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_create_resv_alloc( @@ -278,7 +312,8 @@ xfs_calc_create_resv_alloc( xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0); } STATIC uint @@ -296,6 +331,7 @@ __xfs_calc_create_reservation( * the superblock for the nlink flag: sector size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_icreate_resv_alloc( @@ -305,7 +341,8 @@ xfs_calc_icreate_resv_alloc( mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 0); } STATIC uint @@ -359,6 +396,7 @@ xfs_calc_symlink_reservation( * the on disk inode before ours in the agi hash list: inode cluster size * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size + * the finobt */ STATIC uint xfs_calc_ifree_reservation( @@ -374,7 +412,8 @@ xfs_calc_ifree_reservation( xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_finobt_res(mp, 1); } /* -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:06 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8262A7F5E for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1BE4AAC009 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:03 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04cb6c72913b7760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HLc0YYbJoCyIbxhN for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1NJ019346 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM06I028665 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 37EBF124444; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 16/20] xfsprogs/repair: pull the build_agi() call up out of the inode tree build Date: Wed, 7 May 2014 08:21:55 -0400 X-ASG-Orig-Subj: [PATCH v4 16/20] xfsprogs/repair: pull the build_agi() call up out of the inode tree build Message-Id: <1399465319-65066-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 Pull the build_agi() call out of build_ino_tree() in phase 5. This is to prepare for finobt support, in which build_agi() will require context from multiple inode tree reconstructions (both the inode allocation tree and free inode tree, when it exists). Create the new 'agi_stat' structure to carry the requisite state from the build_ino_tree() operation to build_agi(). Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- repair/phase5.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 2c02e40..4778e08 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -74,6 +74,15 @@ typedef struct bt_status { bt_stat_level_t level[XFS_BTREE_MAXLEVELS]; } bt_status_t; +/* + * extra metadata for the agi + */ +struct agi_stat { + xfs_agino_t first_agino; + xfs_agino_t count; + xfs_agino_t freecount; +}; + static __uint64_t *sb_icount_ag; /* allocated inodes per ag */ static __uint64_t *sb_ifree_ag; /* free inodes per ag */ static __uint64_t *sb_fdblocks_ag; /* free data blocks per ag */ @@ -1050,8 +1059,7 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, */ static void build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs, xfs_agino_t first_agino, - xfs_agino_t count, xfs_agino_t freecount) + bt_status_t *btree_curs, struct agi_stat *agi_stat) { xfs_buf_t *agi_buf; xfs_agi_t *agi; @@ -1072,11 +1080,11 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, else agi->agi_length = cpu_to_be32(mp->m_sb.sb_dblocks - (xfs_drfsbno_t) mp->m_sb.sb_agblocks * agno); - agi->agi_count = cpu_to_be32(count); + agi->agi_count = cpu_to_be32(agi_stat->count); agi->agi_root = cpu_to_be32(btree_curs->root); agi->agi_level = cpu_to_be32(btree_curs->num_levels); - agi->agi_freecount = cpu_to_be32(freecount); - agi->agi_newino = cpu_to_be32(first_agino); + agi->agi_freecount = cpu_to_be32(agi_stat->freecount); + agi->agi_newino = cpu_to_be32(agi_stat->first_agino); agi->agi_dirino = cpu_to_be32(NULLAGINO); for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) @@ -1094,7 +1102,8 @@ build_agi(xfs_mount_t *mp, xfs_agnumber_t agno, */ static void build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, - bt_status_t *btree_curs, __uint32_t magic) + bt_status_t *btree_curs, __uint32_t magic, + struct agi_stat *agi_stat) { xfs_agnumber_t i; xfs_agblock_t j; @@ -1224,7 +1233,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, } } - build_agi(mp, agno, btree_curs, first_agino, count, freecount); + if (agi_stat) { + agi_stat->first_agino = first_agino; + agi_stat->count = count; + agi_stat->freecount = freecount; + } } /* @@ -1481,6 +1494,7 @@ phase5_func( #endif xfs_agblock_t num_extents; __uint32_t magic; + struct agi_stat agi_stat = {0,}; if (verbose) do_log(_(" - agno = %d\n"), agno); @@ -1612,12 +1626,16 @@ phase5_func( build_agf_agfl(mp, agno, &bno_btree_curs, &bcnt_btree_curs, freeblks1, extra_blocks); /* - * build inode allocation tree. this also build the agi + * build inode allocation tree. */ magic = xfs_sb_version_hascrc(&mp->m_sb) ? XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC; - build_ino_tree(mp, agno, &ino_btree_curs, magic); + build_ino_tree(mp, agno, &ino_btree_curs, magic, &agi_stat); write_cursor(&ino_btree_curs); + + /* build the agi */ + build_agi(mp, agno, &ino_btree_curs, &agi_stat); + /* * tear down cursors */ -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:07 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D36947F51 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B688AC007 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465320-04cbb03cc4395650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8VTTNwCAT3I4ZNh6 for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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 (8.14.4/8.14.4) with ESMTP id s47CM0Db023462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0pQ025550 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 80246124444; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 01/20] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Date: Wed, 7 May 2014 08:21:40 -0400 X-ASG-Orig-Subj: [PATCH v4 01/20] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Message-Id: <1399465319-65066-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 introduction of the free inode btree (finobt) requires that xfs_ialloc_btree.c handle multiple trees. Refactor xfs_ialloc_btree.c so the caller specifies the btree type on cursor initialization to prepare for addition of the finobt. Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_ialloc_btree.h | 3 ++- libxfs/xfs_ialloc.c | 8 ++++---- libxfs/xfs_ialloc_btree.c | 8 +++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index f38b220..d7ebea7 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -58,7 +58,8 @@ struct xfs_mount; ((index) - 1) * sizeof(xfs_inobt_ptr_t))) extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, - struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); + struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t, + xfs_btnum_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c19d84a..d4a4511 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -432,7 +432,7 @@ xfs_ialloc_ag_alloc( /* * Insert records describing the new inode chunk into the btree. */ - cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(args.mp, tp, agbp, agno, XFS_BTNUM_INO); for (thisino = newino; thisino < newino + newlen; thisino += XFS_INODES_PER_CHUNK) { @@ -678,7 +678,7 @@ xfs_dialloc_ag( ASSERT(pag->pagi_freecount > 0); restart_pagno: - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); /* * If pagino is 0 (this is the root inode allocation) use newino. * This must work because we've just allocated some. @@ -1140,7 +1140,7 @@ xfs_difree( /* * Initialize the cursor. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_check_agi_freecount(cur, agi); if (error) @@ -1271,7 +1271,7 @@ xfs_imap_lookup( * we have a record, we need to ensure it contains the inode number * we are looking up. */ - cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); if (!error) { if (i) diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 0a29d73..2027bc6 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -30,7 +30,8 @@ xfs_inobt_dup_cursor( struct xfs_btree_cur *cur) { return xfs_inobt_init_cursor(cur->bc_mp, cur->bc_tp, - cur->bc_private.a.agbp, cur->bc_private.a.agno); + cur->bc_private.a.agbp, cur->bc_private.a.agno, + cur->bc_btnum); } STATIC void @@ -379,7 +380,8 @@ xfs_inobt_init_cursor( struct xfs_mount *mp, /* file system mount point */ struct xfs_trans *tp, /* transaction pointer */ struct xfs_buf *agbp, /* buffer for agi structure */ - xfs_agnumber_t agno) /* allocation group number */ + xfs_agnumber_t agno, /* allocation group number */ + xfs_btnum_t btnum) /* ialloc or free ino btree */ { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); struct xfs_btree_cur *cur; @@ -389,7 +391,7 @@ xfs_inobt_init_cursor( cur->bc_tp = tp; cur->bc_mp = mp; cur->bc_nlevels = be32_to_cpu(agi->agi_level); - cur->bc_btnum = XFS_BTNUM_INO; + cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; cur->bc_ops = &xfs_inobt_ops; -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:08 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1881A7F55 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3ADEAC001 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465321-04bdf02b8a3b5a50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BYbBbpa3Bvp2c4PH for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1PO002576 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM1l7028694 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0FD7A124114; Wed, 7 May 2014 08:22:00 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 12/20] xfsprogs/db: finobt support Date: Wed, 7 May 2014 08:21:51 -0400 X-ASG-Orig-Subj: [PATCH v4 12/20] xfsprogs/db: finobt support Message-Id: <1399465319-65066-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-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: 1399465321 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 the AGI finobt fields and fibt layouts. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> --- db/agi.c | 2 ++ db/btblock.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/db/agi.c b/db/agi.c index 398bdbb..6f167ac 100644 --- a/db/agi.c +++ b/db/agi.c @@ -57,6 +57,8 @@ const field_t agi_flds[] = { { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "free_root", FLDT_AGBLOCK, OI(OFF(free_root)), C1, 0, TYP_INOBT }, + { "free_level", FLDT_UINT32D, OI(OFF(free_level)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/btblock.c b/db/btblock.c index 1ea0cff..cdb8b1d 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -60,6 +60,12 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + { XFS_FIBT_MAGIC, + XFS_BTREE_SBLOCK_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, { XFS_BMAP_CRC_MAGIC, XFS_BTREE_LBLOCK_CRC_LEN, sizeof(xfs_bmbt_key_t), @@ -84,6 +90,12 @@ struct xfs_db_btree { sizeof(xfs_inobt_rec_t), sizeof(__be32), }, + { XFS_FIBT_CRC_MAGIC, + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(xfs_inobt_key_t), + sizeof(xfs_inobt_rec_t), + sizeof(__be32), + }, { 0, }, }; -- 1.8.3.1 From bfoster@redhat.com Wed May 7 07:22:07 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B64D07F78 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:22:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D657AC006 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:22:02 -0700 (PDT) X-ASG-Debug-ID: 1399465320-04cbb03cc5395650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kPYTWbdJv4ptz0kD for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:22: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0GK023429 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47CM0Hb014593 for <xfs@oss.sgi.com>; Wed, 7 May 2014 08:22:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 75B15124114; Wed, 7 May 2014 08:21:59 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v4 02/20] xfs: reserve v5 superblock read-only compat. feature bit for finobt Date: Wed, 7 May 2014 08:21:41 -0400 X-ASG-Orig-Subj: [PATCH v4 02/20] xfs: reserve v5 superblock read-only compat. feature bit for finobt Message-Id: <1399465319-65066-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1399465319-65066-1-git-send-email-bfoster@redhat.com> References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399465321 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 Reserve a v5 read-only compatibility feature bit for the finobt and create the xfs_sb_version_hasfinobt() helper to determine whether an fs has the feature enabled. The finobt does not change existing on-disk structures, but must remain consistent with the ialloc btree. Modifications from older kernels would violate that constrant. Therefore, we restrict older kernels to read-only mounts of finobt-enabled filesystems. Note that this does not yet enable the ability to rw mount a finobt fs (by setting the feature bit in the XFS_SB_FEAT_RO_COMPAT_ALL mask). Signed-off-by: Brian Foster <bfoster@redhat.com> --- include/xfs_sb.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index f7b2fe7..7f53a85 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -587,6 +587,7 @@ xfs_sb_has_compat_feature( return (sbp->sb_features_compat & feature) != 0; } +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ #define XFS_SB_FEAT_RO_COMPAT_ALL 0 #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool @@ -641,6 +642,12 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } +static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); +} + /* * end of superblock version macros */ -- 1.8.3.1 From ddiss@suse.de Wed May 7 07:25:24 2014 Return-Path: <ddiss@suse.de> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 31EDB7F6F for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:25:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13B6130404E for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:25:23 -0700 (PDT) X-ASG-Debug-ID: 1399465521-04bdf02b8b3b5e50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 73oafCmJttp0Zcqo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:25:22 -0700 (PDT) X-Barracuda-Envelope-From: ddiss@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9F7BCAC7A; Wed, 7 May 2014 12:25:20 +0000 (UTC) From: David Disseldorp <ddiss@suse.de> To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, bo.li.liu@oracle.com, David Disseldorp <ddiss@suse.de> Subject: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Date: Wed, 7 May 2014 14:33:18 +0200 X-ASG-Orig-Subj: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Message-Id: <1399465998-26545-1-git-send-email-ddiss@suse.de> X-Mailer: git-send-email 1.8.4.5 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1399465521 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.5611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- With kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, the first clone-range overwrite attempt now fails with EOPNOTSUPP, rather than tripping a Btrfs BUG_ON(). This test now trips a new Btrfs bug, in which EIO is returned for subsequent reads following the second clone range ioctl. Signed-off-by: David Disseldorp <ddiss@suse.de> --- tests/btrfs/035 | 11 +++++++++++ tests/btrfs/035.out | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/tests/btrfs/035 b/tests/btrfs/035 index 6808179..c9530f6 100755 --- a/tests/btrfs/035 +++ b/tests/btrfs/035 @@ -57,21 +57,32 @@ src_str="aaaaaaaaaa" echo -n "$src_str" > $SCRATCH_MNT/src $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone1 +cat $SCRATCH_MNT/src.clone1 +echo src_str="bbbbbbbbbbcccccccccc" echo -n "$src_str" > $SCRATCH_MNT/src $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone2 +cat $SCRATCH_MNT/src.clone2 +echo +# Prior to kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, this clone +# resulted in a BUG_ON in __btrfs_drop_extents(). The kernel now returns +# EOPNOTSUPP up to userspace. snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone1 | awk '{print $5}'` echo "attempting ioctl (src.clone1 src)" $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ $SCRATCH_MNT/src.clone1 $SCRATCH_MNT/src +cat $SCRATCH_MNT/src +echo snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone2 | awk '{print $5}'` echo "attempting ioctl (src.clone2 src)" $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ $SCRATCH_MNT/src.clone2 $SCRATCH_MNT/src +# BUG: subsequent access attempts currently result in EIO... +cat $SCRATCH_MNT/src status=0 ; exit diff --git a/tests/btrfs/035.out b/tests/btrfs/035.out index f86cadf..0ea2c4f 100644 --- a/tests/btrfs/035.out +++ b/tests/btrfs/035.out @@ -1,3 +1,8 @@ QA output created by 035 +aaaaaaaaaa +bbbbbbbbbbcccccccccc attempting ioctl (src.clone1 src) +clone failed: Operation not supported +bbbbbbbbbbcccccccccc attempting ioctl (src.clone2 src) +bbbbbbbbbbcccccccccc -- 1.8.4.5 From mcaubet@pic.es Wed May 7 07:43:53 2014 Return-Path: <mcaubet@pic.es> X-Spam-Checker-Version: SpamAssassin 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 794AE7F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:43:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4C1D8304059 for <xfs@oss.sgi.com>; Wed, 7 May 2014 05:43:52 -0700 (PDT) X-ASG-Debug-ID: 1399466628-04bdf02b8a3b6cc0001-NocioJ Received: from mail-ob0-f178.google.com (mail-ob0-f178.google.com [209.85.214.178]) by cuda.sgi.com with ESMTP id mMkNoDKYPdfAxKoZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:43:49 -0700 (PDT) X-Barracuda-Envelope-From: mcaubet@pic.es X-Barracuda-Apparent-Source-IP: 209.85.214.178 Received: by mail-ob0-f178.google.com with SMTP id va2so1108890obc.9 for <xfs@oss.sgi.com>; Wed, 07 May 2014 05:43:48 -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=n+u9G1n+oCsz+upaRtSFKQVhue/kSC1lmVe8S1SxoVI=; b=Bjl2ZU4WkRwpJARVFZlr17c6TxZFceqShhBRb8nr15A8B24piqLmIngz9EY26rTRnK 6groVQNTUte6YNZrV6ssuA1UO60WnmhF6SXvKgqCH0oAnkkWMN9UlOuKbJfNAS8qslTW PmjXk05L0ZsPH8oI70UsXPTzXJx+WQZlhQdONSyfIpiu/VPz4koQ+g5JYLK2Y5Awm30L U6LLFMz41FdW8rqP2FFqJg/Jq7ynDOPiIqV9MJbgzTvIVKPPFJ1DXzhUKJJoV1nS17+v 72XQDeMFuMj81OlhIB4bvZAhvaX4gEnGnwEXdkKfew8TJv98beV20CVHzutoo4cH3fzt XY7Q== X-Gm-Message-State: ALoCoQkYsACODmXG3Fcv8yXjVNPQtyqkaskrp7piNS9A8r07K/r9GSWB7FRd83xQfvuBAqRQkU6e MIME-Version: 1.0 X-Received: by 10.60.102.37 with SMTP id fl5mr8520876oeb.65.1399466628028; Wed, 07 May 2014 05:43:48 -0700 (PDT) Received: by 10.76.114.48 with HTTP; Wed, 7 May 2014 05:43:47 -0700 (PDT) Date: Wed, 7 May 2014 14:43:47 +0200 Message-ID: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> Subject: Alignment: XFS + LVM2 From: Marc Caubet <mcaubet@pic.es> X-ASG-Orig-Subj: Alignment: XFS + LVM2 To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0111bce03d2fa104f8ceb7c7 X-Barracuda-Connect: mail-ob0-f178.google.com[209.85.214.178] X-Barracuda-Start-Time: 1399466629 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.5611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e0111bce03d2fa104f8ceb7c7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi all, I am trying to setup a storage pool with correct disk alignment and I hope somebody can help me to understand some unclear parts to me when configuring XFS over LVM2. Actually we have few storage pools with the following settings each: - LSI Controller with 3xRAID6 - Each RAID6 is configured with 10 data disks + 2 for double-parity. - Each disk has a capacity of 4TB, 512e and physical sector size of 4K. - 3x(10+2) configuration was considered in order to gain best performance and data safety (less disks per RAID less probability of data corruption) >From the O.S. side we see: [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc Disk /dev/sda: 40000.0 GB, 39999997214720 bytes 255 heads, 63 sectors/track, 4863055 cylinders Units =3D cylinders of 16065 * 512 =3D 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x00000000 Disk /dev/sdb: 40000.0 GB, 39999997214720 bytes 255 heads, 63 sectors/track, 4863055 cylinders Units =3D cylinders of 16065 * 512 =3D 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x00000000 Disk /dev/sdc: 40000.0 GB, 39999997214720 bytes 255 heads, 63 sectors/track, 4863055 cylinders Units =3D cylinders of 16065 * 512 =3D 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x00000000 The idea is to aggregate the above devices and show only 1 storage space. We did as follows: vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a Hence, stripe of the 3 RAID6 in a LV. And here is my first question: How can I check if the storage and the LV are correctly aligned? On the other hand, I have formatted XFS as follows: mkfs.xfs -d su=3D256k,sw=3D10 -l size=3D128m,lazy-count=3D1 /dev/dcvg_a/dcp= ool So my second question is, are the above 'su' and 'sw' parameters correct on the current LV configuration? If not, which values should I have and why? AFAIK su is the stripe size configured in the controller side, but in this case we have a LV. Also, sw is the number of data disks in a RAID, but again, we have a LV with 3 stripes, and I am not sure if the number of data disks should be 30 instead. Thanks a lot, --=20 Marc Caubet Serrabou PIC (Port d'Informaci=C3=B3 Cient=C3=ADfica) Campus UAB, Edificio D E-08193 Bellaterra, Barcelona Tel: +34 93 581 33 22 Fax: +34 93 581 41 10 http://www.pic.es Avis - Aviso - Legal Notice: http://www.ifae.es/legal.html --089e0111bce03d2fa104f8ceb7c7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Hi all,<br><br>I am trying to setup a storage pool with co= rrect disk alignment and I hope somebody can help me to understand some unc= lear parts to me when configuring XFS over LVM2.<br><br>Actually we have fe= w storage pools with the following settings each:<br> <br>- LSI Controller with 3xRAID6<br>- Each RAID6 is configured with 10 dat= a disks + 2 for double-parity.<br>- Each disk has a capacity of 4TB, 512e a= nd physical sector size of 4K.<br>- 3x(10+2) configuration was considered i= n order to gain best performance and data safety (less disks per RAID less = probability of data corruption)<br> <br>From the O.S. side we see:<br><br><span style=3D"font-family:courier ne= w,monospace">[root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc<br><br= >Disk /dev/sda: 40000.0 GB, 39999997214720 bytes<br>255 heads, 63 sectors/t= rack, 4863055 cylinders<br> Units =3D cylinders of 16065 * 512 =3D 8225280 bytes<br>Sector size (logica= l/physical): 512 bytes / 4096 bytes<br>I/O size (minimum/optimal): 4096 byt= es / 4096 bytes<br>Disk identifier: 0x00000000<br><br>Disk /dev/sdb: 40000.= 0 GB, 39999997214720 bytes<br> 255 heads, 63 sectors/track, 4863055 cylinders<br>Units =3D cylinders of 16= 065 * 512 =3D 8225280 bytes<br>Sector size (logical/physical): 512 bytes / = 4096 bytes<br>I/O size (minimum/optimal): 4096 bytes / 4096 bytes<br>Disk i= dentifier: 0x00000000<br> <br>Disk /dev/sdc: 40000.0 GB, 39999997214720 bytes<br>255 heads, 63 sector= s/track, 4863055 cylinders<br>Units =3D cylinders of 16065 * 512 =3D 822528= 0 bytes<br>Sector size (logical/physical): 512 bytes / 4096 bytes<br>I/O si= ze (minimum/optimal): 4096 bytes / 4096 bytes<br> Disk identifier: 0x00000000<br></span><br>The idea is to aggregate the abov= e devices and show only 1 storage space. We did as follows:<br><span style= =3D"font-family:courier new,monospace"><br>vgcreate dcvg_a /dev/sda /dev/sd= b /dev/sdc<br> lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a<br></span><br>Hence, = stripe of the 3 RAID6 in a LV.<br><br>And here is my first question: How ca= n I check if the storage and the LV are correctly aligned?<br><br>On the ot= her hand, I have formatted XFS as follows:<br> <br><span style=3D"font-family:courier new,monospace">mkfs.xfs -d su=3D256k= ,sw=3D10 -l size=3D128m,lazy-count=3D1 /dev/dcvg_a/dcpool</span><br><br>So = my second question is, are the above 'su' and 'sw' paramete= rs correct on the current LV configuration? If not, which values should I h= ave and why? AFAIK su is the stripe size configured in the controller side,= but in this case we have a LV. Also, sw is the number of data disks in a R= AID, but again, we have a LV with 3 stripes, and I am not sure if the numbe= r of data disks should be 30 instead.<br> <br>Thanks a lot,<br>-- <br>Marc Caubet Serrabou<br>PIC (Port d'Informa= ci=C3=B3 Cient=C3=ADfica)<br>Campus UAB, Edificio D<br>E-08193 Bellaterra, = Barcelona<br>Tel: +34 93 581 33 22<br>Fax: +34 93 581 41 10<br><a href=3D"h= ttp://www.pic.es" target=3D"_blank">http://www.pic.es</a><br> Avis - Aviso - Legal Notice: <a href=3D"http://www.ifae.es/legal.html" targ= et=3D"_blank">http://www.ifae.es/legal.html</a> </div> --089e0111bce03d2fa104f8ceb7c7-- From bfoster@redhat.com Wed May 7 09:48:36 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 863C17F4E for <xfs@oss.sgi.com>; Wed, 7 May 2014 09:48:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6AA90304048 for <xfs@oss.sgi.com>; Wed, 7 May 2014 07:48:33 -0700 (PDT) X-ASG-Debug-ID: 1399474112-04cb6c1fcc26bb60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d9t5e4nP4MeAhDsn for <xfs@oss.sgi.com>; Wed, 07 May 2014 07:48: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 (8.14.4/8.14.4) with ESMTP id s47EmOgg022411 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 7 May 2014 10:48:24 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s47EmNdd026132; Wed, 7 May 2014 10:48:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E4B3C1242A3; Wed, 7 May 2014 10:48:22 -0400 (EDT) Date: Wed, 7 May 2014 10:48:22 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140507144822.GA4061@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506075905.GA5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399474112 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, May 06, 2014 at 05:59:05PM +1000, Dave Chinner wrote: > On Tue, May 06, 2014 at 02:18:55AM -0500, xfs@oss.sgi.com wrote: > > This is an automated email from the git hooks/post-receive script. It was > > generated because a ref change was pushed to the repository containing > > the project "XFS development tree". > > > > The branch, xfs-libxfs-in-kernel-RFC has been created > > at 6579dd808ddf0ddc10e59e715dc8f2eb09705203 (commit) > > No doubt you are all wondering what this is by now. :) > > I spent a couple of hours doing what I'd been talking about for a > while now - converting the xfs kernel source tree to have a libxfs > abstraction. It's based on the current for-next branch, so it's > completely up-to-date. > > The commits in this series move all the files used by userspace to: > > - fs/xfs/libxfs for .c and private.h files > - fs/xfs/libxfs/include for public .h files > > It converts all the libxfs includes to makes the userspace libxfs > includes (just a single #include) for both internal (libxfs_int.h) > and external (libxfs.h). These will not be shared with userspace; > userspace will provide it's own just like it does now. > > The core idea around this code layout is that we can now extract all > the changes to the libxfs code in the kernel in a simple manner > (commit by commit or as a single aggregate patch), and apply it to > the userspace libxfs code with the right pathname filter to the > patch command. That's all a sync will require in future, and should > make it scriptable and easy for anyone to do. It means, ideally, > that we can do libxfs updates at the same time we do kernel updates > with almost no effort. > > There's still a few little messy corners, but I'm seriously tempted > just to merge this into for-next right now because it's all good. :)" > > [ Seriously, it removes almost a thousand #include lines from the > kernel code, requires almost no extra infrastructure in the kernel, > already has passed several full xfstests runs and will make our life > so much easier. ] > > Things that need to be done: > > - xfs_dir2_priv.h is included in places that it shouldn't > be. Whatever those callers need from that header file > should be moved to xfs_dir2.h and into libxfs proper. > - the Makefiles still have a little bit of messy include > rules (i.e. -I$(src) -I$(src)/libxfs/include) bit I can > live with that I think. > - some of the libxfs header files have a dependency on > xfs_mount.h for things like inode cluster and directory > block sizes. These need to be untangled, but it's not a > critical issue right now. > - xfs_vnode.h needs to die. > - the kernel only header files that include libxfs header > files can now drop those includes. > > Overall, though, this was surprisingly easy to do. All of the recent > header file consolidation and cleanup that we've done made this > pretty much a case of git mv of all the files and little bit of > infrastructure, and not much else... > > I suspect the next thing that needs to be done is consolidate libxfs > and libxlog in userspace, and split the log recovery code in the > kernel and put the shared part into fs/xfs/libxfs..... > > I've put it up as a git branch rather than patches, because nobody > wants me posting a patchset with a diffstat like this: > > $ git diff --stat for-next.. > .... > 164 files changed, 47250 insertions(+), 48036 deletions(-) > > However, when you tell git to be smart about renames (i.e file > movement is ignored), the actual diffstat looks like this: > > $ git diff --stat --summary -C -M for-next.. > .... > 108 files changed, 291 insertions(+), 1077 deletions(-) > > If you want to look at it, pull from this branch: > > git://oss.sgi.com/xfs/xfs xfs-libxfs-in-kernel-RFC > > And check it out. The head is here: > > 6579dd8 libxfs: provide extern include file > It looks like a nice cleanup to me from the perspective of maintaining synchronization between kernel and userspace. I suppose it gets more interesting if we want to consider libxfs as something potentially externally consumable, particularly whether we have broken things out at the right interfaces. This certainly gets the ball rolling in that direction. I have no major objections given that this mostly looks like a mechanical code restructure. Note that the Makefile structure between the core and libxfs/ subdir appears to be busted for module compiles. It attempts to create a libxfs.ko and doesn't appear to create any real link dependency between the logical modules: ... WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] undefined! CC fs/xfs/xfs.mod.o CC fs/xfs/libxfs/libxfs.mod.o LD [M] fs/xfs/xfs.ko LD [M] fs/xfs/libxfs/libxfs.ko I played with it a bit but didn't get anywhere without just pulling the source file dependency up into fs/xfs/Makefile. :/ Brian > New Commits: > > Dave Chinner (5): > [20c53cb] xfs: create libxfs infrastructure > [22b8ea8] libxfs: move header files > [612480c] libxfs: move source files > [5e51adf] libxfs: consolidate internal include files > [6579dd8] libxfs: provide extern include file > > Comments, flames, suggestions and beer all welcome :) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From ofvekk43uu@cursa.com Wed May 7 13:08:41 2014 Return-Path: <ofvekk43uu@cursa.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,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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A66D7F50 for <xfs@oss.sgi.com>; Wed, 7 May 2014 13:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 509D730405F for <xfs@oss.sgi.com>; Wed, 7 May 2014 11:08:41 -0700 (PDT) X-ASG-Debug-ID: 1399486113-04bdf02b8a3c5e60001-NocioJ Received: from smtp14.singnet.com.sg (smtp14.singnet.com.sg [165.21.6.24]) by cuda.sgi.com with ESMTP id HYek7fdWJhODz7cH for <xfs@oss.sgi.com>; Wed, 07 May 2014 11:08:34 -0700 (PDT) X-Barracuda-Envelope-From: ofvekk43uu@cursa.com X-Barracuda-Apparent-Source-IP: 165.21.6.24 Received: from [172.16.183.120] ([116.12.183.94]) by smtp14.singnet.com.sg (8.14.1/8.14.1) with ESMTP id s47I6SwY018528; Thu, 8 May 2014 02:06:38 +0800 Message-Id: <201405071806.s47I6SwY018528@smtp14.singnet.com.sg> Content-Type: multipart/alternative; boundary="===============1399835811==" MIME-Version: 1.0 Subject: NetSpend - New Message To: Recipients <ofvekk43uu@cursa.com> X-ASG-Orig-Subj: NetSpend - New Message From: "NetSpend" <ofvekk43uu@cursa.com> Date: Thu, 08 May 2014 02:06:28 +0800 X-PMX-Version: 5.5.2.363555, Antispam-Engine: 2.6.1.350677, Antispam-Data: 2014.5.7.175720 X-PMX-AS: AS-Check X-PMX-Score: Probability=10% X-Barracuda-Connect: smtp14.singnet.com.sg[165.21.6.24] X-Barracuda-Start-Time: 1399486113 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: 1.82 X-Barracuda-Spam-Status: No, SCORE=1.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, BSF_SC7_SA578_CH, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5618 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 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH You will not see this in a MIME-aware mail reader. --===============1399835811== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body netSpend Survey Department selected you to take part in our quick survey. = To earn your 80$ reward, please click here . = =20 --===============1399835811== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body <HTML><HEAD><meta http-equiv=3D"Content-Type" content=3D"text/html; charset= =3Diso-8859-1"/> <META content=3D"MSHTML 6.00.2900.5512" name=3DGENERATOR></HEAD> <BODY> <P><FONT face=3DArial size=3D2><SPAN class=3DApple-style-span style=3D"WORD= -SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR:= rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal;= BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal= -spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations= -in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: = 0px"> <SPAN class=3DApple-style-span style=3D"FONT-SIZE: small; FONT-FAMILY: Aria= l">netSpend Survey Department selected you to take part in our quick s= urvey. </SPAN></SPAN></FONT></P> <P><FONT face=3DArial size=3D2><SPAN class=3DApple-style-span style=3D"WORD= -SPACING: 0px; FONT: medium 'Times New Roman'; TEXT-TRANSFORM: none; COLOR:= rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal;= BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal= -spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations= -in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: = 0px"> <SPAN class=3DApple-style-span style=3D"FONT-SIZE: small; FONT-FAMILY: Aria= l">To earn your 80$ reward, please <A href=3D"http://hasyzx.com/netspend.ht= ml">click here</A> .</SPAN></SPAN></FONT><BR></P> <P></P> <P> </P></FONT></BODY></HTML> --===============1399835811==-- From prvs=02049b80c1=jbacik@fb.com Wed May 7 15:54:54 2014 Return-Path: <prvs=02049b80c1=jbacik@fb.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=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 F1E187F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 15:54:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7F06304051 for <xfs@oss.sgi.com>; Wed, 7 May 2014 13:54:51 -0700 (PDT) X-ASG-Debug-ID: 1399496090-04cbb03cc63ac530001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id vlYpdN9BM5hgIUbq for <xfs@oss.sgi.com>; Wed, 07 May 2014 13:54:50 -0700 (PDT) X-Barracuda-Envelope-From: prvs=02049b80c1=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044012 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s47KqJBS007698; Wed, 7 May 2014 13:54:50 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=4MeCTwutRqrnCLwTms6d1XYunnBOD49Z4TslbV/fDLQ=; b=MP3JgArT4iScLe9Y+oxE5Aj9xtFYOxYXF9XqDZHbLShtcHhJjA4cLPKRc7MzZwkSPht0 hd47cTRI8ZJrVRVU9O9G+T1pdEeTklKBv5BjApwjPCPWQUuqjIcRZJ0FuC1U4KfhTk2a mXqvcyHIX3dZ4qxgiFGecG8trZdM5wVg61Y= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1kpw7bn65s-2 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Wed, 07 May 2014 13:54:50 -0700 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.14) with Microsoft SMTP Server (TLS) id 14.3.174.1; Wed, 7 May 2014 13:54:48 -0700 From: Josef Bacik <jbacik@fb.com> To: <linux-btrfs@vger.kernel.org>, <xfs@oss.sgi.com> Subject: [PATCH] xfstests: fix flink test Date: Wed, 7 May 2014 16:54:47 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: fix flink test Message-ID: <1399496087-20431-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-07_06:2014-05-07,2014-05-07,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.83106871279415e-15 kscore.compositescore=0 circleOfTrustscore=190.748640802497 compositescore=0.999739589658025 urlsuspect_oldscore=0.999739589658025 suspectscore=2 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=62764 rbsscore=0.999739589658025 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405070243 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399496090 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 I don't have flink support in my xfsprogs, but it doesn't fail with "command not found" or whatever, it fails because I don't have the -T option. So fix _require_xfs_io_command to check for an invalid option and not run. This way I get notrun instead of a failure. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> --- common/rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/rc b/common/rc index 5c13db5..4fa7e63 100644 --- a/common/rc +++ b/common/rc @@ -1258,6 +1258,8 @@ _require_xfs_io_command() _notrun "xfs_io $command support is missing" echo $testio | grep -q "Operation not supported" && \ _notrun "xfs_io $command failed (old kernel/wrong fs?)" + echo $testio | grep -q "invalid option" && \ + _notrun "xfs_io $command support is missing" } # Check that a fs has enough free space (in 1024b blocks) -- 1.8.3.1 From prvs=02049b80c1=jbacik@fb.com Wed May 7 15:58:43 2014 Return-Path: <prvs=02049b80c1=jbacik@fb.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=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 EBB7F7F53 for <xfs@oss.sgi.com>; Wed, 7 May 2014 15:58:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9059EAC003 for <xfs@oss.sgi.com>; Wed, 7 May 2014 13:58:39 -0700 (PDT) X-ASG-Debug-ID: 1399496318-04bdf02b8a3cf910001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id hkQvtiCbZl7KbrdO for <xfs@oss.sgi.com>; Wed, 07 May 2014 13:58:38 -0700 (PDT) X-Barracuda-Envelope-From: prvs=02049b80c1=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044012 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s47KvdxY012480; Wed, 7 May 2014 13:58:30 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=u/jmbjqu+xCfAnep8Rx+U9PkiQkUQytffZu+35P3fuQ=; b=oKN9Iw2UyjwxKUl1VivSOL6ZDaq+nCrMlJjzp4wxr1p43cR+VQvRFAms+6SjzENMmFXL qkRHIEltYqzYdBZEPZgi9v/zt29I12rVGycJe44mah1sAQ73gJxeMrkxHdW2NZQg56Jx cC8+tL7IxJrN5pQcJY2hEX7sRCfm3r+Kt8k= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1kpw7bn6hb-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Wed, 07 May 2014 13:58:29 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.22) with Microsoft SMTP Server (TLS) id 14.3.174.1; Wed, 7 May 2014 13:58:28 -0700 Message-ID: <536A9E73.90802@fb.com> Date: Wed, 7 May 2014 16:58:27 -0400 From: Josef Bacik <jbacik@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Wang Shilong <wangsl.fnst@cn.fujitsu.com>, <xfs@oss.sgi.com> CC: <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-07_06:2014-05-07,2014-05-07,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.83106871279415e-15 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405070244 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399496318 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 03/09/2014 11:44 PM, Wang Shilong wrote: > Test flow is to run fsstress after triggering quota rescan. > the ruler is simple, we just remove all files and directories, > sync filesystem and see if qgroup's ref and excl are nodesize. > > Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> > --- > v1->v2: > switch into new helper _run_btrfs_util_prog() > --- > tests/btrfs/041 | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/041.out | 3 +++ > tests/btrfs/group | 1 + > 3 files changed, 80 insertions(+) > create mode 100644 tests/btrfs/041 > create mode 100644 tests/btrfs/041.out > > diff --git a/tests/btrfs/041 b/tests/btrfs/041 > new file mode 100644 > index 0000000..92bd080 > --- /dev/null > +++ b/tests/btrfs/041 > @@ -0,0 +1,76 @@ > +#! /bin/bash > +# FSQA Test No. btrfs/041 > +# > +# Quota rescan stress test, we run fsstress and quota rescan concurrently > +# > +#----------------------------------------------------------------------- > +# Copyright (C) 2014 Fujitsu. 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 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_need_to_be_root > +_supported_fs btrfs > +_supported_os Linux > +_require_scratch > + > +rm -f $seqres.full > + > +run_check _scratch_mkfs "-b 1g --nodesize 4096" > +run_check _scratch_mount > + Add "-o nospace_cache" here please, otherwise I don't get the same output. > +# -w ensures that the only ops are ones which cause write I/O > +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ > + $FSSTRESS_AVOID >&/dev/null > + > +_run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT \ > + $SCRATCH_MNT/snap1 >>$seqres.full 2>&1 _run_btrfs_util_prog will already redirect to $seqres.full, you don't need this part. > + > +run_check $FSSTRESS_PROG -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000 \ > + $FSSTRESS_AVOID >&/dev/null > + > +_run_btrfs_util_prog quota enable $SCRATCH_MNT > +_run_btrfs_util_prog quota rescan -w $SCRATCH_MNT > + > +#ignore removing subvolume errors > +rm -rf $SCRATCH_MNT/* >& /dev/null > + > +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT >> $seqres.full 2>&1 Same here. > +_run_btrfs_util_prog qgroup show $SCRATCH_MNT | $SED_PROG -n '/[0-9]/p' \ > + | $AWK_PROG '{print $1" "$2" "$3 }' > + You can't use _run_btrfs_util_prog here, it will eat the output. You need to use $BTRFS_UTIL_PROG instead. Fix these up and resend, this is a really important test and I needed it to make sure my qgroups patch was right (which it is now.) Thanks, Josef From david@fromorbit.com Wed May 7 17:44:22 2014 Return-Path: <david@fromorbit.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 28BE27F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 17:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F00448F8037 for <xfs@oss.sgi.com>; Wed, 7 May 2014 15:44:18 -0700 (PDT) X-ASG-Debug-ID: 1399502656-04bdf02b8a3df630001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qdZAKjRGShPHg17O for <xfs@oss.sgi.com>; Wed, 07 May 2014 15:44: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: AmdRAFK2alN5LL1sPGdsb2JhbABZgwaDPYUKo2wGlCuFYwGBHBcDAQEBATg1giUBAQU6HCMQCAMOCgklDwUlAwcaE4hA0C0XFoVAiHwHhD8EmTaWQis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 08 May 2014 08:14:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiAZR-0000XD-GT; Thu, 08 May 2014 08:44:13 +1000 Date: Thu, 8 May 2014 08:44:13 +1000 From: Dave Chinner <david@fromorbit.com> To: Josef Bacik <jbacik@fb.com> Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix flink test Message-ID: <20140507224413.GQ5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix flink test References: <1399496087-20431-1-git-send-email-jbacik@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399496087-20431-1-git-send-email-jbacik@fb.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: 1399502656 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.5623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 07, 2014 at 04:54:47PM -0400, Josef Bacik wrote: > I don't have flink support in my xfsprogs, but it doesn't fail with "command not > found" or whatever, it fails because I don't have the -T option. So fix > _require_xfs_io_command to check for an invalid option and not run. This way I > get notrun instead of a failure. Thanks, > > Signed-off-by: Josef Bacik <jbacik@fb.com> > --- > common/rc | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/common/rc b/common/rc > index 5c13db5..4fa7e63 100644 > --- a/common/rc > +++ b/common/rc > @@ -1258,6 +1258,8 @@ _require_xfs_io_command() > _notrun "xfs_io $command support is missing" > echo $testio | grep -q "Operation not supported" && \ > _notrun "xfs_io $command failed (old kernel/wrong fs?)" > + echo $testio | grep -q "invalid option" && \ > + _notrun "xfs_io $command support is missing" > } Yeah, looks like it throws a different error - it treats -T as an option, not a command. Rather than multiple checks that result in the same error, why not just: - echo $testio | grep -q "not found" && \ + echo $testio | egrep -q 'not found|invalid option' && \ _notrun "xfs_io $command support is missing" Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed May 7 17:48:02 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C311F7F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 17:48:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 98B83304051 for <xfs@oss.sgi.com>; Wed, 7 May 2014 15:47:59 -0700 (PDT) X-ASG-Debug-ID: 1399502876-04bdf02b8a3df790001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0qWja4wVIWJmr3tX for <xfs@oss.sgi.com>; Wed, 07 May 2014 15:47: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: AndRAHi3alN5LL1sPGdsb2JhbABZgwZPgm6FCqNtBpQrhWMBgRsXAwEBAQE4NYIlAQEEATocIwULCAMOCgkaCw8FJQMHGhMZiCAH0EQWhUCIGhEBUAeEPwSZNpRxgVErgTk Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 08 May 2014 08:17:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiAd1-0000Xp-AN; Thu, 08 May 2014 08:47:55 +1000 Date: Thu, 8 May 2014 08:47:55 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140507224755.GR5421@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140507144822.GA4061@bfoster.bfoster> 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: 1399502876 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.5623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 07, 2014 at 10:48:22AM -0400, Brian Foster wrote: > On Tue, May 06, 2014 at 05:59:05PM +1000, Dave Chinner wrote: > > On Tue, May 06, 2014 at 02:18:55AM -0500, xfs@oss.sgi.com wrote: > > > This is an automated email from the git hooks/post-receive script. It was > > > generated because a ref change was pushed to the repository containing > > > the project "XFS development tree". > > > > > > The branch, xfs-libxfs-in-kernel-RFC has been created > > > at 6579dd808ddf0ddc10e59e715dc8f2eb09705203 (commit) > > > > No doubt you are all wondering what this is by now. :) > > > > I spent a couple of hours doing what I'd been talking about for a > > while now - converting the xfs kernel source tree to have a libxfs > > abstraction. It's based on the current for-next branch, so it's > > completely up-to-date. > > > > The commits in this series move all the files used by userspace to: > > > > - fs/xfs/libxfs for .c and private.h files > > - fs/xfs/libxfs/include for public .h files > > > > It converts all the libxfs includes to makes the userspace libxfs > > includes (just a single #include) for both internal (libxfs_int.h) > > and external (libxfs.h). These will not be shared with userspace; > > userspace will provide it's own just like it does now. > > > > The core idea around this code layout is that we can now extract all > > the changes to the libxfs code in the kernel in a simple manner > > (commit by commit or as a single aggregate patch), and apply it to > > the userspace libxfs code with the right pathname filter to the > > patch command. That's all a sync will require in future, and should > > make it scriptable and easy for anyone to do. It means, ideally, > > that we can do libxfs updates at the same time we do kernel updates > > with almost no effort. > > > > There's still a few little messy corners, but I'm seriously tempted > > just to merge this into for-next right now because it's all good. :)" > > > > [ Seriously, it removes almost a thousand #include lines from the > > kernel code, requires almost no extra infrastructure in the kernel, > > already has passed several full xfstests runs and will make our life > > so much easier. ] > > > > Things that need to be done: > > > > - xfs_dir2_priv.h is included in places that it shouldn't > > be. Whatever those callers need from that header file > > should be moved to xfs_dir2.h and into libxfs proper. > > - the Makefiles still have a little bit of messy include > > rules (i.e. -I$(src) -I$(src)/libxfs/include) bit I can > > live with that I think. > > - some of the libxfs header files have a dependency on > > xfs_mount.h for things like inode cluster and directory > > block sizes. These need to be untangled, but it's not a > > critical issue right now. > > - xfs_vnode.h needs to die. > > - the kernel only header files that include libxfs header > > files can now drop those includes. > > > > Overall, though, this was surprisingly easy to do. All of the recent > > header file consolidation and cleanup that we've done made this > > pretty much a case of git mv of all the files and little bit of > > infrastructure, and not much else... > > > > I suspect the next thing that needs to be done is consolidate libxfs > > and libxlog in userspace, and split the log recovery code in the > > kernel and put the shared part into fs/xfs/libxfs..... > > > > I've put it up as a git branch rather than patches, because nobody > > wants me posting a patchset with a diffstat like this: > > > > $ git diff --stat for-next.. > > .... > > 164 files changed, 47250 insertions(+), 48036 deletions(-) > > > > However, when you tell git to be smart about renames (i.e file > > movement is ignored), the actual diffstat looks like this: > > > > $ git diff --stat --summary -C -M for-next.. > > .... > > 108 files changed, 291 insertions(+), 1077 deletions(-) > > > > If you want to look at it, pull from this branch: > > > > git://oss.sgi.com/xfs/xfs xfs-libxfs-in-kernel-RFC > > > > And check it out. The head is here: > > > > 6579dd8 libxfs: provide extern include file > > > > It looks like a nice cleanup to me from the perspective of maintaining > synchronization between kernel and userspace. I suppose it gets more > interesting if we want to consider libxfs as something potentially > externally consumable, particularly whether we have broken things out at > the right interfaces. This certainly gets the ball rolling in that > direction. I have no major objections given that this mostly looks like > a mechanical code restructure. Yes, it is a mechanical code restructure. It's pretty straight forward, the only thing that consumed any amount of time was the include file changes. > Note that the Makefile structure between the core and libxfs/ subdir > appears to be busted for module compiles. It attempts to create a > libxfs.ko and doesn't appear to create any real link dependency between > the logical modules: Ok, I hadn't tested that. I'll look into it. > ... > WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] > undefined! > WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] > undefined! > WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! > WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! > WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] > undefined! That tends to imply I didn't do the right thing with the tracing, either. > CC fs/xfs/xfs.mod.o > CC fs/xfs/libxfs/libxfs.mod.o > LD [M] fs/xfs/xfs.ko > LD [M] fs/xfs/libxfs/libxfs.ko > > I played with it a bit but didn't get anywhere without just pulling the > source file dependency up into fs/xfs/Makefile. :/ I'll see what I can dig up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Wed May 7 18:29:21 2014 Return-Path: <sandeen@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C425A7F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 18: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 54CD7AC003 for <xfs@oss.sgi.com>; Wed, 7 May 2014 16:29:18 -0700 (PDT) X-ASG-Debug-ID: 1399505356-04cb6c728f3d18b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ab8S71IuG5GO9GSL for <xfs@oss.sgi.com>; Wed, 07 May 2014 16:29:17 -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 (8.14.4/8.14.4) with ESMTP id s47NTGDo027647 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 7 May 2014 19:29:16 -0400 Received: from liberator.sandeen.net (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 s47NTEsN031711 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Wed, 7 May 2014 19:29:16 -0400 Message-ID: <536AC1CB.8060601@redhat.com> Date: Wed, 07 May 2014 18:29:15 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers Content-Type: text/plain; charset=ISO-8859-1 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: 1399505356 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 way discontiguous buffers are currently handled in prefetch is by unlocking the prefetch tree and reading them one at a time in pf_read_discontig(), inside the normal loop of searching for buffers to read in a more optimized fashion. But by unlocking the tree, we allow other threads to come in and find buffers which we've already stashed locally on our bplist[]. If 2 threads think they own the same set of buffers, they may both try to delete them from the prefetch btree, and the second one to arrive will not find it, resulting in: fatal error -- prefetch corruption Fix this by maintaining 2 lists; the original bplist, and a new one containing only discontiguous buffers. The original list can be seek-optimized as before, and the discontiguous list can be read one by one before we do the seek-optimized reads, after all of the tree manipulation has been completed. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/repair/prefetch.c b/repair/prefetch.c index 65fedf5..2a8008f 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -444,28 +444,7 @@ pf_read_inode_dirs( } /* - * Discontiguous buffers require multiple IOs to fill, so we can't use any - * linearising, hole filling algorithms on them to avoid seeks. Just remove them - * for the prefetch queue and read them straight into the cache and release - * them. - */ -static void -pf_read_discontig( - struct prefetch_args *args, - struct xfs_buf *bp) -{ - if (!btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, bp->b_bn))) - do_error(_("prefetch corruption\n")); - - pthread_mutex_unlock(&args->lock); - libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); - bp->b_flags |= LIBXFS_B_UNCHECKED; - libxfs_putbuf(bp); - pthread_mutex_lock(&args->lock); -} - -/* - * pf_batch_read must be called with the lock locked. + * pf_batch_read must be called with the args->lock mutex locked. */ static void pf_batch_read( @@ -474,7 +453,8 @@ pf_batch_read( void *buf) { xfs_buf_t *bplist[MAX_BUFS]; - unsigned int num; + xfs_buf_t *bplist_disc[MAX_BUFS]; + unsigned int num, num_disc; off64_t first_off, last_off, next_off; int len, size; int i; @@ -484,7 +464,7 @@ pf_batch_read( char *pbuf; for (;;) { - num = 0; + num = num_disc = 0; if (which == PF_SECONDARY) { bplist[0] = btree_find(args->io_queue, 0, &fsbno); max_fsbno = MIN(fsbno + pf_max_fsbs, @@ -494,18 +474,22 @@ pf_batch_read( args->last_bno_read, &fsbno); max_fsbno = fsbno + pf_max_fsbs; } + while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) { /* - * Handle discontiguous buffers outside the seek - * optimised IO loop below. + * Discontiguous buffers require multiple IOs to fill, + * so we can't use any linearising, hole filling + * algorithms on them to avoid seeks. Just move them + * to their own list and read them individually later. */ if ((bplist[num]->b_flags & LIBXFS_B_DISCONTIG)) { - pf_read_discontig(args, bplist[num]); - bplist[num] = NULL; + bplist_disc[num_disc] = bplist[num]; + num_disc++; } else if (which != PF_META_ONLY || !B_IS_INODE(XFS_BUF_PRIORITY(bplist[num]))) num++; - if (num == MAX_BUFS) + + if (num == MAX_BUFS || num_disc == MAX_BUFS) break; bplist[num] = btree_lookup_next(args->io_queue, &fsbno); } @@ -541,12 +525,19 @@ pf_batch_read( num = i; } + /* Take everything we found out of the tree */ for (i = 0; i < num; i++) { if (btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bplist[i]))) == NULL) do_error(_("prefetch corruption\n")); } + for (i = 0; i < num_disc; i++) { + if (btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, + XFS_BUF_ADDR(bplist_disc[i]))) == NULL) + do_error(_("prefetch corruption\n")); + } + if (which == PF_PRIMARY) { for (inode_bufs = 0, i = 0; i < num; i++) { if (B_IS_INODE(XFS_BUF_PRIORITY(bplist[i]))) @@ -566,6 +557,12 @@ pf_batch_read( #endif pthread_mutex_unlock(&args->lock); + /* Read discontig buffers individually, if any */ + for (i = 0; i < num_disc; i++) { + libxfs_readbufr_map(mp->m_ddev_targp, bplist_disc[i], 0); + bplist_disc[i]->b_flags |= LIBXFS_B_UNCHECKED; + libxfs_putbuf(bplist_disc[i]); + } /* * now read the data and put into the xfs_but_t's */ From david@fromorbit.com Wed May 7 20:13:29 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76A6C7F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 20:13:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E319BAC007 for <xfs@oss.sgi.com>; Wed, 7 May 2014 18:13:28 -0700 (PDT) X-ASG-Debug-ID: 1399511602-04cb6c1fcc282610001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id BdtBk9xFz4jHrXjG for <xfs@oss.sgi.com>; Wed, 07 May 2014 18:13:22 -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: AnhTAHzZalN5LL1sPGdsb2JhbABZgwaIR6NpAQEBAQEBBpQrhWMBgRcXAwEBAQE4NYIlAQEFOhwjEAgDDgcDCRoLDwUlAwcaE4hAz1MXFoVAiHwHhD8ElUCDdpRxgVErgTAk Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 08 May 2014 10:42:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiCtM-0000s6-BT; Thu, 08 May 2014 11:12:56 +1000 Date: Thu, 8 May 2014 11:12:56 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140508011256.GS5421@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140507224755.GR5421@dastard> 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: 1399511602 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.5627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 08:47:55AM +1000, Dave Chinner wrote: > On Wed, May 07, 2014 at 10:48:22AM -0400, Brian Foster wrote: > > Note that the Makefile structure between the core and libxfs/ subdir > > appears to be busted for module compiles. It attempts to create a > > libxfs.ko and doesn't appear to create any real link dependency between > > the logical modules: > > Ok, I hadn't tested that. I'll look into it. > > > ... > > WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] > > undefined! > > WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] > > undefined! > > WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! > > WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! > > WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] > > undefined! > > That tends to imply I didn't do the right thing with the tracing, > either. > > > CC fs/xfs/xfs.mod.o > > CC fs/xfs/libxfs/libxfs.mod.o > > LD [M] fs/xfs/xfs.ko > > LD [M] fs/xfs/libxfs/libxfs.ko > > > > I played with it a bit but didn't get anywhere without just pulling the > > source file dependency up into fs/xfs/Makefile. :/ > > I'll see what I can dig up. Well, I can make use of "lib-y" to get around the "libxfs is built as a module" problem: .... CC fs/xfs/libxfs/xfs_sb.o CC fs/xfs/libxfs/xfs_symlink_remote.o CC fs/xfs/libxfs/xfs_trans_resv.o AR fs/xfs/libxfs/lib.a but then there is the issue of adding it as a link flag to the xfs object itself. That involved a bit of a ld hack, but I have it compiling as a module now. Patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com libxfs: fix modular build From: Dave Chinner <dchinner@redhat.com> As reported by Brain Foster: Note that the Makefile structure between the core and libxfs/ subdir appears to be busted for module compiles. It attempts to create a libxfs.ko and doesn't appear to create any real link dependency between the logical modules: ... WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] undefined! CC fs/xfs/xfs.mod.o CC fs/xfs/libxfs/libxfs.mod.o LD [M] fs/xfs/xfs.ko LD [M] fs/xfs/libxfs/libxfs.ko Fix it by converting libxfs to be a static library, and hack the fs/xfs/xfs.o linker commands to include it directly and so completely avoid the need for a libxfs.ko module until we have sorted out all the circular dependency issues. Reported-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/Makefile | 22 +++++++++++++++++++--- fs/xfs/libxfs/Makefile | 12 +++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index c520bff..726cfaa 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -20,10 +20,26 @@ ccflags-y += -I$(src) # needed for trace events ccflags-y += -I$(src)/libxfs # XXX: temporary! ccflags-y += -I$(src)/libxfs/include # XXX: temporary! -ccflags-$(CONFIG_XFS_DEBUG) += -g +# libxfs should inheret this as well. +subdir-ccflags-$(CONFIG_XFS_DEBUG) += -g -obj-$(CONFIG_XFS_FS) += xfs.o \ - libxfs/ +# When building as a module, we don't want a separate libxfs.ko, +# so we specifically have to link the libxfs.o object into the +# xfs.ko module. Hence we need to tell LD to do this appropriately. +#ldflags-y += -L$(obj)/libxfs -l:libxfs.o +# +# The use of --start-group without --endgroup here is a bit of a hack +# to avoid needing to use symbol exports and real modules. +# This works around the fact that ldflags-y is included on the linker command +# line before all the object files built in this directory, and hence +# it drops all the unreferenced symbols from libxfs. i.e. all the ones that +# that xfs.ko module actually requires. The lack of an "--end-group" varaible +# means LD considers all object files on the command line for recursive object +# searching and hence solves the specification order problem. +ldflags-y += --start-group $(obj)/libxfs/lib.a + +obj-$(CONFIG_XFS_FS) += libxfs/ \ + xfs.o # this one should be compiled first, as the tracing macros can easily blow up xfs-y += xfs_trace.o diff --git a/fs/xfs/libxfs/Makefile b/fs/xfs/libxfs/Makefile index e3de6df..b5f443b 100644 --- a/fs/xfs/libxfs/Makefile +++ b/fs/xfs/libxfs/Makefile @@ -8,11 +8,13 @@ ccflags-y += -I$(src)/.. ccflags-y += -I$(src)/include -Werror # needed for trace events -ccflags-$(CONFIG_XFS_DEBUG) += -g +# Use the lib-X directives rather than obj-X so that this doesn't get built as a +# module itself and have unresolvable circular dependencies with the xfs module. +# This means the xfs module needs to specifically link libxfs/lib.a because we +# are not adding fs/xfs/libxfs to the libs-y built-in library search +# directories. A bit hacky, but it seems to work as desired for modular builds. -obj-$(CONFIG_XFS_FS) += libxfs.o - -libxfs-y += xfs_alloc.o \ +lib-(CONFIG_XFS_FS) += xfs_alloc.o \ xfs_alloc_btree.o \ xfs_attr.o \ xfs_attr_leaf.o \ @@ -38,4 +40,4 @@ libxfs-y += xfs_alloc.o \ xfs_symlink_remote.o \ xfs_trans_resv.o -libxfs-$(CONFIG_XFS_RT) += xfs_rtbitmap.o +lib-$(CONFIG_XFS_RT) += xfs_rtbitmap.o From david@fromorbit.com Wed May 7 20:42:48 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76D757F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 20:42:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE973AC003 for <xfs@oss.sgi.com>; Wed, 7 May 2014 18:42:47 -0700 (PDT) X-ASG-Debug-ID: 1399513365-04cbb03cc73bcb50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oJ0aoy6wafP5wpEI for <xfs@oss.sgi.com>; Wed, 07 May 2014 18:42:45 -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: AnRTAH3galN5LL1sPGdsb2JhbABZgwaIR6NpAQEBAQEBBpQrhWMBgRgXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hAz1YXFoVAiHwHhD8EjTeLf4djgx6LQSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 08 May 2014 11:12:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiDLj-0000v9-CS; Thu, 08 May 2014 11:42:15 +1000 Date: Thu, 8 May 2014 11:42:15 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@redhat.com> Cc: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers Message-ID: <20140508014215.GT5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers References: <536AC1CB.8060601@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536AC1CB.8060601@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: 1399513365 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.5627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 07, 2014 at 06:29:15PM -0500, Eric Sandeen wrote: > The way discontiguous buffers are currently handled in > prefetch is by unlocking the prefetch tree and reading > them one at a time in pf_read_discontig(), inside the > normal loop of searching for buffers to read in a more > optimized fashion. > > But by unlocking the tree, we allow other threads to come > in and find buffers which we've already stashed locally > on our bplist[]. If 2 threads think they own the same > set of buffers, they may both try to delete them from > the prefetch btree, and the second one to arrive will not > find it, resulting in: > > fatal error -- prefetch corruption > > Fix this by maintaining 2 lists; the original bplist, > and a new one containing only discontiguous buffers. > > The original list can be seek-optimized as before, > and the discontiguous list can be read one by one > before we do the seek-optimized reads, after all of the > tree manipulation has been completed. Nice job finding the problem, Eric! It looks like your patch solves the problem, but after considering this approach for a while I think it's overkill. ;) What the loop is trying to do is linearise all the IO and turn lots of small IO into a single large IO, so if we grab all the discontig buffers in the range, then do IO on them, then do the large IO, we are effectively seeking all over that range, including backwards. This is exactly the sort of problem the prefetch loop is trying to avoid. So what I think is best is that we simply abort the pulling of new buffers off the list when we hit a discontiguous buffer. Leave the discontig buffer as the last on the list, and process the list as per normal. Remove all the remaining buffers from the btree, then drop the lock and do the pread64 call. Then, check the last buffer on the bplist - if it's the discontig buffer (i.e. wasn't dropped during list processing), then issue the discontig buffer IO. It should at least start as either sequential I oor with a small forwards seek, so so shoul be as close to seek optimised as we can get for such buffers. Then it can be removed from the bplist, num decremented, the lock picked back up and the large buffer read in via pread64() can be sliced and diced appropriately... i.e. much less code, no need for a separate list, and the seeks shoul dbe minimised as much as possible.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Wed May 7 20:43:24 2014 Return-Path: <dgc@oss.sgi.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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id C525C7F56; Wed, 7 May 2014 20:43:24 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, updated. xfs-for-linus-3.15-rc2-53-g70aadae X-Git-Refname: refs/heads/xfs-libxfs-in-kernel-RFC X-Git-Reftype: branch X-Git-Oldrev: 6579dd808ddf0ddc10e59e715dc8f2eb09705203 X-Git-Newrev: 70aadae524c437b3c38969316d2dbab5c2c811f2 Message-Id: <20140508014324.C525C7F56@oss.sgi.com> Date: Wed, 7 May 2014 20:43:24 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-libxfs-in-kernel-RFC has been updated 70aadae libxfs: fix modular build from 6579dd808ddf0ddc10e59e715dc8f2eb09705203 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 70aadae524c437b3c38969316d2dbab5c2c811f2 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 8 11:12:09 2014 +1000 libxfs: fix modular build As reported by Brain Foster: Note that the Makefile structure between the core and libxfs/ subdir appears to be busted for module compiles. It attempts to create a libxfs.ko and doesn't appear to create any real link dependency between the logical modules: ... WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] undefined! CC fs/xfs/xfs.mod.o CC fs/xfs/libxfs/libxfs.mod.o LD [M] fs/xfs/xfs.ko LD [M] fs/xfs/libxfs/libxfs.ko Fix it by converting libxfs to be a static library, and hack the fs/xfs/xfs.o linker commands to include it directly and so completely avoid the need for a libxfs.ko module until we have sorted out all the circular dependency issues. Reported-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> ----------------------------------------------------------------------- Summary of changes: fs/xfs/Makefile | 22 +++++++++++++++++++--- fs/xfs/libxfs/Makefile | 12 +++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) hooks/post-receive -- XFS development tree From sandeen@redhat.com Wed May 7 20:58:45 2014 Return-Path: <sandeen@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D58B27F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 20:58:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C26F330404E for <xfs@oss.sgi.com>; Wed, 7 May 2014 18:58:42 -0700 (PDT) X-ASG-Debug-ID: 1399514321-04cbb03cc53be090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id puUriz2alqkvpDSg for <xfs@oss.sgi.com>; Wed, 07 May 2014 18:58:41 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s481wdu2018771 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 7 May 2014 21:58:40 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s481wcQI026802 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 7 May 2014 21:58:39 -0400 Message-ID: <536AE4CE.2030201@redhat.com> Date: Wed, 07 May 2014 20:58:38 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers References: <536AC1CB.8060601@redhat.com> <20140508014215.GT5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers In-Reply-To: <20140508014215.GT5421@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399514321 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 5/7/14, 8:42 PM, Dave Chinner wrote: > On Wed, May 07, 2014 at 06:29:15PM -0500, Eric Sandeen wrote: >> The way discontiguous buffers are currently handled in >> prefetch is by unlocking the prefetch tree and reading >> them one at a time in pf_read_discontig(), inside the >> normal loop of searching for buffers to read in a more >> optimized fashion. >> >> But by unlocking the tree, we allow other threads to come >> in and find buffers which we've already stashed locally >> on our bplist[]. If 2 threads think they own the same >> set of buffers, they may both try to delete them from >> the prefetch btree, and the second one to arrive will not >> find it, resulting in: >> >> fatal error -- prefetch corruption >> >> Fix this by maintaining 2 lists; the original bplist, >> and a new one containing only discontiguous buffers. >> >> The original list can be seek-optimized as before, >> and the discontiguous list can be read one by one >> before we do the seek-optimized reads, after all of the >> tree manipulation has been completed. > > Nice job finding the problem, Eric! It looks like your patch solves > the problem, but after considering this approach for a while I think > it's overkill. ;) Well, that's how it goes. :) > What the loop is trying to do is linearise all the IO and turn lots > of small IO into a single large IO, so if we grab all the discontig > buffers in the range, then do IO on them, then do the large IO, we > are effectively seeking all over that range, including backwards. > This is exactly the sort of problem the prefetch loop is trying to > avoid. mmmhm... OTOH, discontig buffers are ... fairly rare? And they do have to be read sometime. > So what I think is best is that we simply abort the pulling of new > buffers off the list when we hit a discontiguous buffer. Leave the > discontig buffer as the last on the list, and process the list as > per normal. Remove all the remaining buffers from the btree, then > drop the lock and do the pread64 call. I kind of half considered something like that, but the optimizing trims back num based on a few criteria, some involving the last buffer in the bplist. So it's going to require a bit more awareness I think. > Then, check the last buffer on the bplist - if it's the discontig > buffer (i.e. wasn't dropped during list processing), then issue the > discontig buffer IO. It should at least start as either sequential I > oor with a small forwards seek, so so shoul be as close to seek > optimised as we can get for such buffers. Then it can be removed > from the bplist, num decremented, the lock picked back up and the > large buffer read in via pread64() can be sliced and diced > appropriately... > > i.e. much less code, no need for a separate list, and the seeks > shoul dbe minimised as much as possible.... I'll give something like that a shot. Yeah, it felt a bit brute-force-y. -eric > Cheers, > > Dave. > From stan@hardwarefreak.com Wed May 7 21:28:13 2014 Return-Path: <stan@hardwarefreak.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41FA07F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 21:28:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D1FE304062 for <xfs@oss.sgi.com>; Wed, 7 May 2014 19:28:10 -0700 (PDT) X-ASG-Debug-ID: 1399516088-04cb6c1fcc2844c0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 3RoPP5X5dy9kAc3N for <xfs@oss.sgi.com>; Wed, 07 May 2014 19:28:09 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id A52D76C10A; Wed, 7 May 2014 21:28:08 -0500 (CDT) Message-ID: <536AEBB9.3020807@hardwarefreak.com> Date: Wed, 07 May 2014 21:28:09 -0500 From: Stan Hoeppner <stan@hardwarefreak.com> Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Marc Caubet <mcaubet@pic.es>, xfs@oss.sgi.com Subject: Re: Alignment: XFS + LVM2 References: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> X-ASG-Orig-Subj: Re: Alignment: XFS + LVM2 In-Reply-To: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1399516089 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 Everything begins and ends with the workload. On 5/7/2014 7:43 AM, Marc Caubet wrote: > Hi all, > > I am trying to setup a storage pool with correct disk alignment and I hope > somebody can help me to understand some unclear parts to me when > configuring XFS over LVM2. I'll try. But to be honest, after my first read of your post, a few things jump out as breaking traditional rules. The first thing you need to consider is your workload and the type of read/write patterns it will generate. This document is unfinished, and unformatted, but reading what is there should be informative: http://www.hardwarefreak.com/xfs/storage-arch.txt > Actually we have few storage pools with the following settings each: > > - LSI Controller with 3xRAID6 > - Each RAID6 is configured with 10 data disks + 2 for double-parity. > - Each disk has a capacity of 4TB, 512e and physical sector size of 4K. 512e drives may cause data loss. See: http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.html#gmlfz > - 3x(10+2) configuration was considered in order to gain best performance > and data safety (less disks per RAID less probability of data corruption) RAID6 is the worst performer of all the RAID levels but gives the best resilience to multiple drive failure. The reason for using fewer drives per array has less to do with probability of corruption, but 1. Limiting RMW operations to as few drives as possible, especially for controllers that do full stripe scrubbing on RMW 2. Lowering bandwidth and time required to rebuild a dead drive, fewer drives tied up during a rebuild > From the O.S. side we see: > > [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc ... You omitted crucial information. What is the stripe unit size of each RAID6? > The idea is to aggregate the above devices and show only 1 storage space. > We did as follows: > > vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc > lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a You've told LVM that its stripe unit is 4MB, and thus the stripe width of each RAID6 is 4MB. This is not possible with 10 data spindles. Again, show the RAID geometry from the LSI tools. When creating a nested stripe, the stripe unit of the outer stripe (LVM) must equal the stripe width of eachinner stripe (RAID6). > Hence, stripe of the 3 RAID6 in a LV. Each RAID6 has ~1.3GB/s of throughput. By striping the 3 arrays into a nested RAID60 this suggests you need single file throughput greater than 1.3GB/s and that all files are very large. If not, you'd be better off using a concatenation, and using md to accomplish that instead of LVM. > And here is my first question: How can I check if the storage and the LV > are correctly aligned? Answer is above. But the more important question is whether your workload wants a stripe or a concatenation. > On the other hand, I have formatted XFS as follows: > > mkfs.xfs -d su=256k,sw=10 -l size=128m,lazy-count=1 /dev/dcvg_a/dcpool This alignment is not correct. XFS must be aligned to the LVM stripe geometry. Here you apparently aligned XFS to the RAID6 geometry instead. Why are you manually specifying a 128M log? If you knew your workload that well, you would not have made these other mistakes. In a nutshell, you need to ditch all of this and start over. > So my second question is, are the above 'su' and 'sw' parameters correct on > the current LV configuration? If not, which values should I have and why? > AFAIK su is the stripe size configured in the controller side, but in this > case we have a LV. Also, sw is the number of data disks in a RAID, but > again, we have a LV with 3 stripes, and I am not sure if the number of data > disks should be 30 instead. Describe your workload and we can tell you how to properly set this up. Cheers, Stan From wangsl.fnst@cn.fujitsu.com Wed May 7 22:42:36 2014 Return-Path: <wangsl.fnst@cn.fujitsu.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 B9B387F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 22:42:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 999928F8037 for <xfs@oss.sgi.com>; Wed, 7 May 2014 20:42:33 -0700 (PDT) X-ASG-Debug-ID: 1399520550-04cbb03cc43c2730001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id iS59zeXbgYOn9QRt for <xfs@oss.sgi.com>; Wed, 07 May 2014 20:42:31 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,1008,1389715200"; d="scan'208";a="30233739" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 08 May 2014 11:39:34 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s483g4Rq026930; Thu, 8 May 2014 11:42:04 +0800 Received: from [10.167.226.104] (10.167.226.104) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server id 14.3.146.2; Thu, 8 May 2014 11:42:03 +0800 Message-ID: <536AFC3B.7070502@cn.fujitsu.com> Date: Thu, 8 May 2014 11:38:35 +0800 From: Wang Shilong <wangsl.fnst@cn.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130612 Thunderbird/17.0.6 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com> CC: <xfs@oss.sgi.com>, <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <536A9E73.90802@fb.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.167.226.104] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1399520551 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.5629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/08/2014 04:58 AM, Josef Bacik wrote: > On 03/09/2014 11:44 PM, Wang Shilong wrote: >> Test flow is to run fsstress after triggering quota rescan. >> the ruler is simple, we just remove all files and directories, >> sync filesystem and see if qgroup's ref and excl are nodesize. >> >> Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> >> --- >> v1->v2: >> switch into new helper _run_btrfs_util_prog() >> --- >> tests/btrfs/041 | 76 >> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >> tests/btrfs/041.out | 3 +++ >> tests/btrfs/group | 1 + >> 3 files changed, 80 insertions(+) >> create mode 100644 tests/btrfs/041 >> create mode 100644 tests/btrfs/041.out >> >> diff --git a/tests/btrfs/041 b/tests/btrfs/041 >> new file mode 100644 >> index 0000000..92bd080 >> --- /dev/null >> +++ b/tests/btrfs/041 >> @@ -0,0 +1,76 @@ >> +#! /bin/bash >> +# FSQA Test No. btrfs/041 >> +# >> +# Quota rescan stress test, we run fsstress and quota rescan >> concurrently >> +# >> +#----------------------------------------------------------------------- >> >> +# Copyright (C) 2014 Fujitsu. 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 >> + >> +_cleanup() >> +{ >> + cd / >> + rm -f $tmp.* >> +} >> +trap "_cleanup; exit \$status" 0 1 2 3 15 >> + >> +# get standard environment, filters and checks >> +. ./common/rc >> +. ./common/filter >> + >> +# real QA test starts here >> +_need_to_be_root >> +_supported_fs btrfs >> +_supported_os Linux >> +_require_scratch >> + >> +rm -f $seqres.full >> + >> +run_check _scratch_mkfs "-b 1g --nodesize 4096" >> +run_check _scratch_mount >> + > > Add "-o nospace_cache" here please, otherwise I don't get the same > output. I am little confused why we need specify this mount option explicitly? As far as i know, space cache is not included into qgroup accounting space. Thanks, Wang > >> +# -w ensures that the only ops are ones which cause write I/O >> +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ >> + $FSSTRESS_AVOID >&/dev/null >> + >> +_run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT \ >> + $SCRATCH_MNT/snap1 >>$seqres.full 2>&1 > > _run_btrfs_util_prog will already redirect to $seqres.full, you don't > need this part. > >> + >> +run_check $FSSTRESS_PROG -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000 \ >> + $FSSTRESS_AVOID >&/dev/null >> + >> +_run_btrfs_util_prog quota enable $SCRATCH_MNT >> +_run_btrfs_util_prog quota rescan -w $SCRATCH_MNT >> + >> +#ignore removing subvolume errors >> +rm -rf $SCRATCH_MNT/* >& /dev/null >> + >> +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT >> $seqres.full 2>&1 > > Same here. > >> +_run_btrfs_util_prog qgroup show $SCRATCH_MNT | $SED_PROG -n >> '/[0-9]/p' \ >> + | $AWK_PROG '{print $1" "$2" "$3 }' >> + > > You can't use _run_btrfs_util_prog here, it will eat the output. You > need to use $BTRFS_UTIL_PROG instead. Fix these up and resend, this > is a really important test and I needed it to make sure my qgroups > patch was right (which it is now.) Thanks, > > Josef > . > From bo.li.liu@oracle.com Wed May 7 23:11:38 2014 Return-Path: <bo.li.liu@oracle.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=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 2ACEC7F52 for <xfs@oss.sgi.com>; Wed, 7 May 2014 23:11:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF3478F8039 for <xfs@oss.sgi.com>; Wed, 7 May 2014 21:11:34 -0700 (PDT) X-ASG-Debug-ID: 1399522292-04bdf02b8a3e9390001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VKay7Nu8plQQcItM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 07 May 2014 21:11:32 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s484BUok023535 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 8 May 2014 04:11:31 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s484BSXp017215 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 8 May 2014 04:11:29 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s484BSD7017840; Thu, 8 May 2014 04:11:28 GMT Received: from localhost.localdomain (/10.182.228.124) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 07 May 2014 21:11:28 -0700 Date: Thu, 8 May 2014 12:11:24 +0800 From: Liu Bo <bo.li.liu@oracle.com> To: David Disseldorp <ddiss@suse.de> Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Message-ID: <20140508041123.GB3407@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Reply-To: bo.li.liu@oracle.com References: <1399465998-26545-1-git-send-email-ddiss@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399465998-26545-1-git-send-email-ddiss@suse.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399522292 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.5630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, May 07, 2014 at 02:33:18PM +0200, David Disseldorp wrote: > With kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, the first > clone-range overwrite attempt now fails with EOPNOTSUPP, rather than > tripping a Btrfs BUG_ON(). > > This test now trips a new Btrfs bug, in which EIO is returned for > subsequent reads following the second clone range ioctl. > Hi David, Something different here, I didn't get EI on 3.15.0-rc4. thanks, -liubo > Signed-off-by: David Disseldorp <ddiss@suse.de> > --- > tests/btrfs/035 | 11 +++++++++++ > tests/btrfs/035.out | 5 +++++ > 2 files changed, 16 insertions(+) > > diff --git a/tests/btrfs/035 b/tests/btrfs/035 > index 6808179..c9530f6 100755 > --- a/tests/btrfs/035 > +++ b/tests/btrfs/035 > @@ -57,21 +57,32 @@ src_str="aaaaaaaaaa" > echo -n "$src_str" > $SCRATCH_MNT/src > > $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone1 > +cat $SCRATCH_MNT/src.clone1 > +echo > > src_str="bbbbbbbbbbcccccccccc" > > echo -n "$src_str" > $SCRATCH_MNT/src > > $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone2 > +cat $SCRATCH_MNT/src.clone2 > +echo > > +# Prior to kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, this clone > +# resulted in a BUG_ON in __btrfs_drop_extents(). The kernel now returns > +# EOPNOTSUPP up to userspace. > snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone1 | awk '{print $5}'` > echo "attempting ioctl (src.clone1 src)" > $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ > $SCRATCH_MNT/src.clone1 $SCRATCH_MNT/src > +cat $SCRATCH_MNT/src > +echo > > snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone2 | awk '{print $5}'` > echo "attempting ioctl (src.clone2 src)" > $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ > $SCRATCH_MNT/src.clone2 $SCRATCH_MNT/src > +# BUG: subsequent access attempts currently result in EIO... > +cat $SCRATCH_MNT/src > > status=0 ; exit > diff --git a/tests/btrfs/035.out b/tests/btrfs/035.out > index f86cadf..0ea2c4f 100644 > --- a/tests/btrfs/035.out > +++ b/tests/btrfs/035.out > @@ -1,3 +1,8 @@ > QA output created by 035 > +aaaaaaaaaa > +bbbbbbbbbbcccccccccc > attempting ioctl (src.clone1 src) > +clone failed: Operation not supported > +bbbbbbbbbbcccccccccc > attempting ioctl (src.clone2 src) > +bbbbbbbbbbcccccccccc > -- > 1.8.4.5 > From sandeen@sandeen.net Wed May 7 23:16:33 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8D5F17F54 for <xfs@oss.sgi.com>; Wed, 7 May 2014 23:16:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1792EAC006 for <xfs@oss.sgi.com>; Wed, 7 May 2014 21:16:32 -0700 (PDT) X-ASG-Debug-ID: 1399522588-04cbb03cc43c3ba0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id R4VWX0rFCfPnPKN5 for <xfs@oss.sgi.com>; Wed, 07 May 2014 21:16: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AA2C463C5FF2; Wed, 7 May 2014 23:16:27 -0500 (CDT) Message-ID: <536B051B.20400@sandeen.net> Date: Wed, 07 May 2014 23:16:27 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix flink test References: <1399496087-20431-1-git-send-email-jbacik@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix flink test In-Reply-To: <1399496087-20431-1-git-send-email-jbacik@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399522588 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.5630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/7/14, 3:54 PM, Josef Bacik wrote: > I don't have flink support in my xfsprogs, but it doesn't fail with "command not > found" or whatever, it fails because I don't have the -T option. So fix > _require_xfs_io_command to check for an invalid option and not run. This way I > get notrun instead of a failure. Thanks, This actually doesn't work for me on an old kernel, if that matters; it fails with: /mnt/test: Is a directory and nothing catches that. Old xfsprogs tries to open the file in question RDWR even before it gets to the -T option (which would fail, I guess), and you can't do that for directories. So I suppose we could explicitly test for that when checking flink: [ $command = "flink" ] && echo $testio | grep -q "Is a directory" && \ _notrun "xfs_io flink support is missing" or alternately, first just run xfs_io w/ the command but no file; today, at least, that works: [root@bp-05 xfstests]# xfs_io -c flink command "flink" not found [root@bp-05 xfstests]# xfs_io -c pread [root@bp-05 xfstests]# so could do this before the case statement: $XFS_IO_PROG -c $command 2>&1 | grep -q "not found" && \ _notrun "xfs_io $command support is missing" but that might be subject to future changes in xfs_io command parsing... -Eric > Signed-off-by: Josef Bacik <jbacik@fb.com> > --- > common/rc | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/common/rc b/common/rc > index 5c13db5..4fa7e63 100644 > --- a/common/rc > +++ b/common/rc > @@ -1258,6 +1258,8 @@ _require_xfs_io_command() > _notrun "xfs_io $command support is missing" > echo $testio | grep -q "Operation not supported" && \ > _notrun "xfs_io $command failed (old kernel/wrong fs?)" > + echo $testio | grep -q "invalid option" && \ > + _notrun "xfs_io $command support is missing" > } > > # Check that a fs has enough free space (in 1024b blocks) > -- 1.8.3.1 _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Thu May 8 00:43:44 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B397B7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 00:43:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1D70304051 for <xfs@oss.sgi.com>; Wed, 7 May 2014 22:43:41 -0700 (PDT) X-ASG-Debug-ID: 1399527814-04cb6c72913dc550001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Fy8FHOVAuXLGEBpE for <xfs@oss.sgi.com>; Wed, 07 May 2014 22:43:36 -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: AnRTAHoYa1N5LL1sPGdsb2JhbABZgwaIR6NwAQEBAQEBBpQrhWMBgRgXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hAz2MXFoVAiHwHhD8EmTaLAYtBKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 15:12:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiH6V-0001Na-FA; Thu, 08 May 2014 15:42:47 +1000 Date: Thu, 8 May 2014 15:42:47 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@redhat.com> Cc: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers Message-ID: <20140508054247.GU5421@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: don't unlock prefetch tree to read discontig buffers References: <536AC1CB.8060601@redhat.com> <20140508014215.GT5421@dastard> <536AE4CE.2030201@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536AE4CE.2030201@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: 1399527815 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.5631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 07, 2014 at 08:58:38PM -0500, Eric Sandeen wrote: > On 5/7/14, 8:42 PM, Dave Chinner wrote: > > On Wed, May 07, 2014 at 06:29:15PM -0500, Eric Sandeen wrote: > >> The way discontiguous buffers are currently handled in > >> prefetch is by unlocking the prefetch tree and reading > >> them one at a time in pf_read_discontig(), inside the > >> normal loop of searching for buffers to read in a more > >> optimized fashion. > >> > >> But by unlocking the tree, we allow other threads to come > >> in and find buffers which we've already stashed locally > >> on our bplist[]. If 2 threads think they own the same > >> set of buffers, they may both try to delete them from > >> the prefetch btree, and the second one to arrive will not > >> find it, resulting in: > >> > >> fatal error -- prefetch corruption > >> > >> Fix this by maintaining 2 lists; the original bplist, > >> and a new one containing only discontiguous buffers. > >> > >> The original list can be seek-optimized as before, > >> and the discontiguous list can be read one by one > >> before we do the seek-optimized reads, after all of the > >> tree manipulation has been completed. > > > > Nice job finding the problem, Eric! It looks like your patch solves > > the problem, but after considering this approach for a while I think > > it's overkill. ;) > > Well, that's how it goes. :) > > > What the loop is trying to do is linearise all the IO and turn lots > > of small IO into a single large IO, so if we grab all the discontig > > buffers in the range, then do IO on them, then do the large IO, we > > are effectively seeking all over that range, including backwards. > > This is exactly the sort of problem the prefetch loop is trying to > > avoid. > > mmmhm... OTOH, discontig buffers are ... fairly rare? And they do > have to be read sometime. > > > So what I think is best is that we simply abort the pulling of new > > buffers off the list when we hit a discontiguous buffer. Leave the > > discontig buffer as the last on the list, and process the list as > > per normal. Remove all the remaining buffers from the btree, then > > drop the lock and do the pread64 call. > > I kind of half considered something like that, but the optimizing > trims back num based on a few criteria, some involving the last > buffer in the bplist. So it's going to require a bit more awareness > I think. You can ignore it, though, because if we trim the discontig buffer out, we don't read it in that loop, and another prefetch thread will deal with it. If we don't trim it out, it makes no difference to the large read... i.e. you can completely ignore the discontig buffer until after te pread64... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bo.li.liu@oracle.com Thu May 8 01:31:54 2014 Return-Path: <bo.li.liu@oracle.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=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 4F2E37F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:31:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54A70304053 for <xfs@oss.sgi.com>; Wed, 7 May 2014 23:31:51 -0700 (PDT) X-ASG-Debug-ID: 1399530706-04cb6c72903ddd70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id qFftWyFHt1W7ciln (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 07 May 2014 23:31:46 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s486VixG004984 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 8 May 2014 06:31:45 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s486VhQM021264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 8 May 2014 06:31:43 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s486VhFX021258; Thu, 8 May 2014 06:31:43 GMT Received: from localhost.localdomain (/10.182.228.124) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 07 May 2014 23:31:42 -0700 Date: Thu, 8 May 2014 14:31:38 +0800 From: Liu Bo <bo.li.liu@oracle.com> To: David Disseldorp <ddiss@suse.de> Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Message-ID: <20140508063136.GC3407@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Reply-To: bo.li.liu@oracle.com References: <1399465998-26545-1-git-send-email-ddiss@suse.de> <20140508041123.GB3407@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508041123.GB3407@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399530706 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.5632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 08, 2014 at 12:11:24PM +0800, Liu Bo wrote: > On Wed, May 07, 2014 at 02:33:18PM +0200, David Disseldorp wrote: > > With kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, the first > > clone-range overwrite attempt now fails with EOPNOTSUPP, rather than > > tripping a Btrfs BUG_ON(). > > > > This test now trips a new Btrfs bug, in which EIO is returned for > > subsequent reads following the second clone range ioctl. > > > > Hi David, > > Something different here, I didn't get EI on 3.15.0-rc4. s/EI/EIO/g -liubo > > thanks, > -liubo > > > Signed-off-by: David Disseldorp <ddiss@suse.de> > > --- > > tests/btrfs/035 | 11 +++++++++++ > > tests/btrfs/035.out | 5 +++++ > > 2 files changed, 16 insertions(+) > > > > diff --git a/tests/btrfs/035 b/tests/btrfs/035 > > index 6808179..c9530f6 100755 > > --- a/tests/btrfs/035 > > +++ b/tests/btrfs/035 > > @@ -57,21 +57,32 @@ src_str="aaaaaaaaaa" > > echo -n "$src_str" > $SCRATCH_MNT/src > > > > $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone1 > > +cat $SCRATCH_MNT/src.clone1 > > +echo > > > > src_str="bbbbbbbbbbcccccccccc" > > > > echo -n "$src_str" > $SCRATCH_MNT/src > > > > $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone2 > > +cat $SCRATCH_MNT/src.clone2 > > +echo > > > > +# Prior to kernel commit 00fdf13a2e9f313a044288aa59d3b8ec29ff904a, this clone > > +# resulted in a BUG_ON in __btrfs_drop_extents(). The kernel now returns > > +# EOPNOTSUPP up to userspace. > > snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone1 | awk '{print $5}'` > > echo "attempting ioctl (src.clone1 src)" > > $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ > > $SCRATCH_MNT/src.clone1 $SCRATCH_MNT/src > > +cat $SCRATCH_MNT/src > > +echo > > > > snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone2 | awk '{print $5}'` > > echo "attempting ioctl (src.clone2 src)" > > $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ > > $SCRATCH_MNT/src.clone2 $SCRATCH_MNT/src > > +# BUG: subsequent access attempts currently result in EIO... > > +cat $SCRATCH_MNT/src > > > > status=0 ; exit > > diff --git a/tests/btrfs/035.out b/tests/btrfs/035.out > > index f86cadf..0ea2c4f 100644 > > --- a/tests/btrfs/035.out > > +++ b/tests/btrfs/035.out > > @@ -1,3 +1,8 @@ > > QA output created by 035 > > +aaaaaaaaaa > > +bbbbbbbbbbcccccccccc > > attempting ioctl (src.clone1 src) > > +clone failed: Operation not supported > > +bbbbbbbbbbcccccccccc > > attempting ioctl (src.clone2 src) > > +bbbbbbbbbbcccccccccc > > -- > > 1.8.4.5 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From dave@fromorbit.com Thu May 8 03:19:57 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 58C3B7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3727C304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:57 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id c3NRsy4QybGCyHOZ for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:55 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaJGYQpBKQ3i0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001it-4k for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006w1-3v for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 01/18] xfs: remove redundant checks from xfs_da_read_buf Date: Thu, 8 May 2014 18:19:31 +1000 X-ASG-Orig-Subj: [PATCH 01/18] xfs: remove redundant checks from xfs_da_read_buf Message-Id: <1399537188-26509-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537195 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> All of the verification checks of magic numbers are now done by verifiers, so ther eis no need to check them again once the buffer has been successfully read. If the magic number is bad, it won't even get to that code to verify it so it really serves no purpose at all anymore. Remove it. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 9eec594..4db5102 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2624,47 +2624,6 @@ xfs_da_read_buf( xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF); else xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF); - - /* - * This verification code will be moved to a CRC verification callback - * function so just leave it here unchanged until then. - */ - { - xfs_dir2_data_hdr_t *hdr = bp->b_addr; - xfs_dir2_free_t *free = bp->b_addr; - xfs_da_blkinfo_t *info = bp->b_addr; - uint magic, magic1; - struct xfs_mount *mp = dp->i_mount; - - magic = be16_to_cpu(info->magic); - magic1 = be32_to_cpu(hdr->magic); - if (unlikely( - XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && - (magic != XFS_DA3_NODE_MAGIC) && - (magic != XFS_ATTR_LEAF_MAGIC) && - (magic != XFS_ATTR3_LEAF_MAGIC) && - (magic != XFS_DIR2_LEAF1_MAGIC) && - (magic != XFS_DIR3_LEAF1_MAGIC) && - (magic != XFS_DIR2_LEAFN_MAGIC) && - (magic != XFS_DIR3_LEAFN_MAGIC) && - (magic1 != XFS_DIR2_BLOCK_MAGIC) && - (magic1 != XFS_DIR3_BLOCK_MAGIC) && - (magic1 != XFS_DIR2_DATA_MAGIC) && - (magic1 != XFS_DIR3_DATA_MAGIC) && - (free->hdr.magic != - cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && - (free->hdr.magic != - cpu_to_be32(XFS_DIR3_FREE_MAGIC)), - mp, XFS_ERRTAG_DA_READ_BUF, - XFS_RANDOM_DA_READ_BUF))) { - trace_xfs_da_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", - XFS_ERRLEVEL_LOW, mp, info); - error = XFS_ERROR(EFSCORRUPTED); - xfs_trans_brelse(trans, bp); - goto out_free; - } - } *bpp = bp; out_free: if (mapp != &map) -- 1.9.0 From dave@fromorbit.com Thu May 8 03:19:58 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0F79F7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:19:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F10A8304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:57 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ABie9jEmpeEC1Qps for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:56 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001iw-6R for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wG-5e for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 04/18] xfs: kill XFS_DIR2...FIRSTDB macros Date: Thu, 8 May 2014 18:19:34 +1000 X-ASG-Orig-Subj: [PATCH 04/18] xfs: kill XFS_DIR2...FIRSTDB macros Message-Id: <1399537188-26509-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537195 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> They are just simple wrappers around xfs_dir2_byte_to_db(), and we've already removed one usage earlier in the patch set. Kill the reset before we start removing the xfs_mount from conversion functions. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_format.c | 6 ++++-- fs/xfs/xfs_da_format.h | 6 ------ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 9 +++++---- fs/xfs/xfs_dir2_node.c | 11 +++++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 22bbc79..313eea3 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -610,7 +610,8 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(mp)); } /* @@ -641,7 +642,8 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(mp)); } /* diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 32b415c..44d7fac 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -330,8 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_DATA_SPACE 0 #define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) /* * Describe a free area in the data block. @@ -456,8 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) */ #define XFS_DIR2_LEAF_SPACE 1 #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) /* * Leaf block header. @@ -531,8 +527,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) */ #define XFS_DIR2_FREE_SPACE 2 #define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) typedef struct xfs_dir2_free_hdr { __be32 magic; /* XFS_DIR2_FREE_MAGIC */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 8b41f78..a6e2476 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -725,7 +725,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= XFS_DIR2_LEAF_FIRSTDB(mp)) + if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index f571723..dc4ef19 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(mp, blkno); - ASSERT(ldb == XFS_DIR2_LEAF_FIRSTDB(mp)); + ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -1798,7 +1798,8 @@ xfs_dir2_node_to_leaf( /* * Get rid of the freespace block. */ - error = xfs_dir2_shrink_inode(args, XFS_DIR2_FREE_FIRSTDB(mp), fbp); + error = xfs_dir2_shrink_inode(args, + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 9cb91ee..1bcaaa0 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -315,7 +315,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -1256,7 +1256,7 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1747,7 +1747,8 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = XFS_DIR2_FREE_FIRSTDB(mp); + fbno = xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. */ @@ -1887,7 +1888,9 @@ xfs_dir2_node_addname_int( /* * Remember the first slot as our empty slot. */ - freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * + freehdr.firstdb = + (fbno - xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { free = fbp->b_addr; -- 1.9.0 From dave@fromorbit.com Thu May 8 03:19:58 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA4EA7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:19:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79723304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:58 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id C59ceglawVbBcoCP for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:56 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001ix-6w for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wL-6D for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 05/18] xfs: convert dir byte/off conversion to xfs_da_geometry Date: Thu, 8 May 2014 18:19:35 +1000 X-ASG-Orig-Subj: [PATCH 05/18] xfs: convert dir byte/off conversion to xfs_da_geometry Message-Id: <1399537188-26509-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537196 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 18 +++++++++--------- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 7 ++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6d13fd6..e9496a9 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -204,10 +204,9 @@ xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) * Convert byte in space to offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); + return (xfs_dir2_data_aoff_t)(by & (geo->blksize - 1)); } /* @@ -216,18 +215,17 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) static inline xfs_dir2_data_aoff_t xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); } /* * Convert block and offset to byte in space */ static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; + return ((xfs_dir2_off_t)db << geo->blklog) + o; } /* @@ -255,7 +253,8 @@ static inline xfs_dir2_dataptr_t xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); + return xfs_dir2_byte_to_dataptr( + xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); } /* @@ -273,7 +272,8 @@ xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) static inline xfs_dir2_off_t xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(mp->m_dir_geo, + xfs_dir2_da_to_db(mp, da), 0); } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index a6e2476..06507f2 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -730,7 +730,7 @@ xfs_dir2_shrink_inode( /* * If the block isn't the last one in the directory, we're done. */ - if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(mp, db + 1, 0)) + if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0)) return 0; bno = da; if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) { diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index bf7a5ce..ec912c8 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -560,7 +560,8 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp, map_info->curdb, 0); + newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + map_info->curdb, 0); /* * Start of the current block. */ @@ -578,7 +579,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp, curoff); + byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); /* * Skip past the header. */ @@ -607,7 +608,7 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp, + xfs_dir2_db_off_to_byte(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { -- 1.9.0 From dave@fromorbit.com Thu May 8 03:19:59 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 29EFA7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03: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 079CA304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:58 -0700 (PDT) X-ASG-Debug-ID: 1399537196-04bdf02b8d3f5e50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id G7BNHsIcYiwUmGrF for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:56 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001iv-5z for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wB-5E for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 03/18] xfs: move directory block translatiosn to xfs_da_btree.h Date: Thu, 8 May 2014 18:19:33 +1000 X-ASG-Orig-Subj: [PATCH 03/18] xfs: move directory block translatiosn to xfs_da_btree.h Message-Id: <1399537188-26509-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537196 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Because they aren't actually part of the on-disk format, and so shouldn't be in xfs_da_format.h. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.c | 1 + fs/xfs/xfs_da_format.h | 138 ------------------------------------------------- 3 files changed, 138 insertions(+), 138 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0ac63ad..6d13fd6 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -157,6 +157,143 @@ struct xfs_nameops { }; +/* + * Directory offset/block conversion functions. + * + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Directory tail pointer accessor functions. Based on block geometry. + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + /*======================================================================== * Function prototypes. *========================================================================*/ diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index e6c83e1..22bbc79 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -26,6 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 1432b57..32b415c 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -514,17 +514,6 @@ struct xfs_dir3_leaf { #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) /* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* * Get address of the bests array in the single-leaf block. */ static inline __be16 * @@ -534,123 +523,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } /* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* * Free space block defintions for the node format. */ @@ -736,16 +608,6 @@ typedef struct xfs_dir2_block_tail { } xfs_dir2_block_tail_t; /* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* * Pointer to the leaf entries embedded in a data block (1-block format) */ static inline struct xfs_dir2_leaf_entry * -- 1.9.0 From dave@fromorbit.com Thu May 8 03:19:59 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BA0D27F5D for <xfs@oss.sgi.com>; Thu, 8 May 2014 03: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 B53A7304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:56 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AUdsw9CPvVj7q2BM for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:54 -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: AltKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYMCO4ECAweIbZtptBGFVokZhCkErXOCBys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001is-4B for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006vy-3C for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [RFC PATCH 00/18] xfs: directory/attribute geometry abstraction Date: Thu, 8 May 2014 18:19:30 +1000 X-ASG-Orig-Subj: [RFC PATCH 00/18] xfs: directory/attribute geometry abstraction Message-Id: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537194 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, As I mentioned in the in-kernel libxfs reowrk thread, there's a problem with the libxfs code being dependent on the struct xfs_mount, which is defined externally to libxfs. The series stemmed from that as a way of working out the issues with untangling the circular dependency mess. Essentially all the da code is dependent on the struct xfs-mount for directory and attribute tree configuration - block sizes, merge thresholds, etc. These all need to be defined and managed by the libxfs code itself, and the external code should just manage it. So, this patchset removes one of the dependencies from the da code by adding a geometry structure to the xfs_da_args that contains all the necessary information from the struct xfs_mount. In doing this abstraction, I realised that this is exactly the abstraction needed to do per-inode directory block size configuration rather than have it be fixed for the entire filesystem by the superblock. So the patch set also sets the ground work for that. It also opens some other interesting avenues - the directory geometry is really just a specialised data fork allocation policy structure. I'll leave the reader to follow that to it's logical conclusion.... Now, this patchset is currently only compile tested - if you try to run it, it will eat all your Precious' and then ask "Please, Sir, can I have some more?". There are things that I've noticed in later patches that need fixing in earlier patches and I've just left them with an XXX in place, so there's no need to tell me that work needs to be done to fix this ;) I am posting it, however, to demonstrate the process which I think we need to take to properly abstract the core XFS code from both the kernel glue layer and the userspace layer. I'm looking for early feedback for this in the context of the libxfs-in-kernel branch I posted a couple of days ago. I don't want to get 90% into a restructure and then have people say "No, this is wrong!". Eventually, I'd like to have the libxfs code be completely indepenent of the struct xfs_mount, and the external struct xfs_mount just hold a bunch of structures it passes to the libxfs code. It'll take quite a bit of work to get there, but if I'm going to be using libxfs as the core infrastructure of a smart block device, I don't want to carry an xfs_mount around at all.... So, flames, comments, deep thoughts, ponderings, straight jackets, and so on are all welcome! just don't try to run the code ;) Cheers, Dave. From dave@fromorbit.com Thu May 8 03:20:00 2014 Return-Path: <dave@fromorbit.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 2339E7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2B288F804B for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:59 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vww0nL7dcqaoWCja for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:57 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001iy-7V for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wQ-6i for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 06/18] xfs: convert directory dablk conversion to xfs_da_geometry Date: Thu, 8 May 2014 18:19:36 +1000 X-ASG-Orig-Subj: [PATCH 06/18] xfs: convert directory dablk conversion to xfs_da_geometry Message-Id: <1399537188-26509-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537197 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 15 +++++++-------- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_data.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ fs/xfs/xfs_dir2_readdir.c | 6 +++--- 6 files changed, 48 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index e9496a9..0c625f6 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -232,9 +232,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, * Convert block (DB) to block (dablk) */ static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); + return (xfs_dablk_t)(db << geo->fsbcount); } /* @@ -243,7 +243,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) static inline xfs_dablk_t xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); } /* @@ -261,19 +261,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, * Convert block (dablk) to block (DB) */ static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_db(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); + return (xfs_dir2_db_t)(da >> geo->fsbcount); } /* * Convert block (dablk) to byte offset in space */ static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(geo, xfs_dir2_da_to_db(geo, da), 0); } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 06507f2..725c95d 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -613,7 +613,7 @@ xfs_dir2_grow_inode( if (error) return error; - *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); + *dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno); /* * Update file's size if this is the data space and it grew. @@ -694,7 +694,7 @@ xfs_dir2_shrink_inode( dp = args->dp; mp = dp->i_mount; tp = args->trans; - da = xfs_dir2_db_to_da(mp, db); + da = xfs_dir2_db_to_da(args->geo, db); /* * Unmap the fsblock(s). */ diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index bae8b5b..890c940 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -584,8 +584,8 @@ xfs_dir3_data_init( /* * Get the buffer set up for the block. */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, blkno), + -1, &bp, XFS_DATA_FORK); if (error) return error; bp->b_ops = &xfs_dir3_data_buf_ops; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index dc4ef19..046ba4a 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -350,8 +350,8 @@ xfs_dir3_leaf_get_buf( ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), + -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -403,7 +403,7 @@ xfs_dir2_block_to_leaf( if ((error = xfs_da_grow_inode(args, &blkno))) { return error; } - ldb = xfs_dir2_da_to_db(mp, blkno); + ldb = xfs_dir2_da_to_db(args->geo, blkno); ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. @@ -828,8 +828,8 @@ xfs_dir2_leaf_addname( * Just read that one in. */ error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, use_block), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, use_block), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1269,8 +1269,8 @@ xfs_dir2_leaf_lookup_int( if (dbp) xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, newdb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1310,8 +1310,8 @@ xfs_dir2_leaf_lookup_int( if (cidb != curdb) { xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, cidb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, cidb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1609,7 +1609,8 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(args->geo, db), + -1, &dbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 1bcaaa0..3b70d56 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -195,17 +195,18 @@ xfs_dir2_free_try_read( static int xfs_dir3_free_get_buf( - struct xfs_trans *tp, - struct xfs_inode *dp, + xfs_da_args_t *args, xfs_dir2_db_t fbno, struct xfs_buf **bpp) { + struct xfs_trans *tp = args->trans; + struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; struct xfs_buf *bp; int error; struct xfs_dir3_icfree_hdr hdr; - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -319,7 +320,7 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - error = xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); + error = xfs_dir3_free_get_buf(args, fdb, &fbp); if (error) return error; @@ -605,7 +606,8 @@ xfs_dir2_leafn_lookup_for_addname( xfs_trans_brelse(tp, curbp); error = xfs_dir2_free_read(tp, dp, - xfs_dir2_db_to_da(mp, newfdb), + xfs_dir2_db_to_da(args->geo, + newfdb), &curbp); if (error) return error; @@ -746,7 +748,8 @@ xfs_dir2_leafn_lookup_for_entry( curbp = state->extrablk.bp; } else { error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), + xfs_dir2_db_to_da(args->geo, + newdb), -1, &curbp); if (error) return error; @@ -1246,7 +1249,8 @@ xfs_dir2_leafn_remove( * read in the free block. */ fdb = dp->d_ops->db_to_fdb(mp, db); - error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), + error = xfs_dir2_free_read(tp, dp, + xfs_dir2_db_to_da(args->geo, fdb), &fbp); if (error) return error; @@ -1336,7 +1340,7 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(args->geo, blkno), &newblk->bp, XFS_DIR2_LEAFN_MAGIC); if (error) return error; @@ -1729,7 +1733,7 @@ xfs_dir2_node_addname_int( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) return error; - lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); + lastfbno = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo); fbno = ifbno; } /* @@ -1766,8 +1770,8 @@ xfs_dir2_node_addname_int( * to avoid it. */ error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; if (!fbp) @@ -1837,8 +1841,8 @@ xfs_dir2_node_addname_int( */ fbno = dp->d_ops->db_to_fdb(mp, dbno); error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; @@ -1878,7 +1882,7 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - error = xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); + error = xfs_dir3_free_get_buf(args, fbno, &fbp); if (error) return error; free = fbp->b_addr; @@ -1946,7 +1950,8 @@ xfs_dir2_node_addname_int( /* * Read the data block in. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + error = xfs_dir3_data_read(tp, dp, + xfs_dir2_db_to_da(args->geo, dbno), -1, &dbp); if (error) return error; @@ -2265,9 +2270,9 @@ xfs_dir2_node_trim_free( /* * Blow the block away. */ - if ((error = - xfs_dir2_shrink_inode(args, xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo), - bp))) { + error = xfs_dir2_shrink_inode(args, + xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo), bp); + if (error) { /* * Can't fail with ENOSPC since that only happens with no * space reservation, when breaking up an extent into two diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index ec912c8..57e9247 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -396,14 +396,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp, mip->map_off); + *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -536,7 +536,7 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp, + map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff)); /* -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:00 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F78E7F5D for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C991304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:00 -0700 (PDT) X-ASG-Debug-ID: 1399537196-04bdf02b8d3f5e50002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id A8FL65hkE3JGoFm5 for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:58 -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: AmdKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEBBCcvMwgYMTkDBxQZiEDPYxeFVokZhCkEpDeLQys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001j6-AV for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wp-9X for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 11/18] xfs: convert dir/attr btree threshold to xfs_da_geometry Date: Thu, 8 May 2014 18:19:41 +1000 X-ASG-Orig-Subj: [PATCH 11/18] xfs: convert dir/attr btree threshold to xfs_da_geometry Message-Id: <1399537188-26509-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537197 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_mount.h | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index c662aaf..d1e800d 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1948,7 +1948,7 @@ xfs_attr3_leaf_remove( tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + ichdr.count * sizeof(xfs_attr_leaf_entry_t); - return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ + return tmp < args->geo->magicpct; /* leaf is < 37% full */ } /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index ef34c19..de5b2996 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1312,7 +1312,7 @@ xfs_dir2_leafn_remove( */ *rval = (dp->d_ops->leaf_hdr_size + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < - mp->m_dir_magicpct; + args->geo->magicpct; return 0; } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 4e3f6ce..78ae7e4 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -148,8 +148,6 @@ typedef struct xfs_mount { int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:00 2014 Return-Path: <dave@fromorbit.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 417727F5E for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EBC438F804C for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:19:59 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vuS9no2uxRkXWn6l for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:57 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001j1-9S for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wf-8i for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 09/18] xfs: convert m_dirblkfsbs to xfs_da_geometry Date: Thu, 8 May 2014 18:19:39 +1000 X-ASG-Orig-Subj: [PATCH 09/18] xfs: convert m_dirblkfsbs to xfs_da_geometry Message-Id: <1399537188-26509-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537197 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.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJECT_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.13 SUBJECT_NOVOWEL Subject: has long non-vowel letter sequence From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_bmap.c | 3 ++- fs/xfs/xfs_da_btree.c | 24 ++++++++---------------- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 16 ++++++++-------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_symlink.c | 1 + fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_trans_space.h | 5 +++-- 9 files changed, 27 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..96175df 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1098,10 +1098,11 @@ xfs_bmap_add_attrfork_local( if (S_ISDIR(ip->i_d.di_mode)) { memset(&dargs, 0, sizeof(dargs)); + dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip; dargs.firstblock = firstblock; dargs.flist = flist; - dargs.total = ip->i_mount->m_dirblkfsbs; + dargs.total = dargs.geo->fsbcount; dargs.whichfork = XFS_DATA_FORK; dargs.trans = tp; return xfs_dir2_sf_to_block(&dargs); diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 8621202..4d0a1e8 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2090,20 +2090,12 @@ xfs_da_grow_inode( xfs_dablk_t *new_blkno) { xfs_fileoff_t bno; - int count; int error; trace_xfs_da_grow_inode(args); - if (args->whichfork == XFS_DATA_FORK) { - bno = args->geo->leafblk; - count = args->dp->i_mount->m_dirblkfsbs; - } else { - bno = 0; - count = 1; - } - - error = xfs_da_grow_inode_int(args, &bno, count); + bno = args->geo->leafblk; + error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount); if (!error) *new_blkno = (xfs_dablk_t)bno; return error; @@ -2170,7 +2162,7 @@ xfs_da3_swap_lastblock( /* * Read the last block in the btree space. */ - last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; + last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount; error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); if (error) return error; @@ -2357,10 +2349,7 @@ xfs_da_shrink_inode( w = args->whichfork; tp = args->trans; mp = dp->i_mount; - if (w == XFS_DATA_FORK) - count = mp->m_dirblkfsbs; - else - count = 1; + count = args->geo->fsbcount; for (;;) { /* * Remove extents. If we get ENOSPC for a dir we have to move @@ -2479,7 +2468,10 @@ xfs_dabuf_map( ASSERT(map && *map); ASSERT(*nmaps == 1); - nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; + if (whichfork == XFS_DATA_FORK) + nfsb = mp->m_dir_geo->fsbcount; + else + nfsb = mp->m_attr_geo->fsbcount; /* * Caller doesn't have a mapping. -2 means don't complain diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index d8f4d43..d74c292 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -612,7 +612,7 @@ xfs_dir2_grow_inode( * Set lowest possible block in the space requested. */ bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); - count = mp->m_dirblkfsbs; + count = args->geo->fsbcount; error = xfs_da_grow_inode_int(args, &bno, count); if (error) @@ -703,7 +703,7 @@ xfs_dir2_shrink_inode( /* * Unmap the fsblock(s). */ - if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, + if ((error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, &done))) { /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 3eb8b24..a1f1310 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1715,7 +1715,7 @@ xfs_dir2_node_to_leaf( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { return error; } - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; /* * If there are freespace blocks other than the first one, * take this opportunity to remove trailing empty freespace blocks @@ -1727,7 +1727,7 @@ xfs_dir2_node_to_leaf( return error; } if (rval) - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; else return 0; } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 0c8c09c..8cb5340 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -314,12 +314,12 @@ xfs_dir2_leaf_readbuf( if (bp) { xfs_trans_brelse(NULL, bp); bp = NULL; - mip->map_blocks -= mp->m_dirblkfsbs; + mip->map_blocks -= geo->fsbcount; /* * Loop to get rid of the extents for the * directory block. */ - for (i = mp->m_dirblkfsbs; i > 0; ) { + for (i = geo->fsbcount; i > 0; ) { j = min_t(int, map->br_blockcount, i); map->br_blockcount -= j; map->br_startblock += j; @@ -410,7 +410,7 @@ xfs_dir2_leaf_readbuf( */ mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, - map->br_blockcount >= mp->m_dirblkfsbs ? + map->br_blockcount >= geo->fsbcount ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); /* @@ -424,7 +424,7 @@ xfs_dir2_leaf_readbuf( * was previously ra. */ if (mip->ra_current) - mip->ra_current -= mp->m_dirblkfsbs; + mip->ra_current -= geo->fsbcount; /* * Do we need more readahead? @@ -432,13 +432,13 @@ xfs_dir2_leaf_readbuf( blk_start_plug(&plug); for (mip->ra_index = mip->ra_offset = i = 0; mip->ra_want > mip->ra_current && i < mip->map_blocks; - i += mp->m_dirblkfsbs) { + i += geo->fsbcount) { ASSERT(mip->ra_index < mip->map_valid); /* * Read-ahead a contiguous directory block. */ if (i > mip->ra_current && - map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { + map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, XFS_FSB_TO_DADDR(mp, @@ -461,12 +461,12 @@ xfs_dir2_leaf_readbuf( /* * Advance offset through the mapping table. */ - for (j = 0; j < mp->m_dirblkfsbs; j += length ) { + for (j = 0; j < geo->fsbcount; j += length ) { /* * The rest of this extent but not more than a dir * block. */ - length = min_t(int, mp->m_dirblkfsbs, + length = min_t(int, geo->fsbcount, map[mip->ra_index].br_blockcount - mip->ra_offset); mip->ra_offset += length; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 0a32de0..a23e7b6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -155,7 +155,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 0816b40..d69363c 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -27,6 +27,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_dir2.h" #include "xfs_inode.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 52b6c3e..63a42a1 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -26,6 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index df4c1f8..bf9c457 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -28,7 +28,8 @@ (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ XFS_EXTENTADD_SPACE_RES(mp,w)) -#define XFS_DAENTER_1B(mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) +#define XFS_DAENTER_1B(mp,w) \ + ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) #define XFS_DAENTER_DBS(mp,w) \ (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) #define XFS_DAENTER_BLOCKS(mp,w) \ @@ -55,7 +56,7 @@ * Space reservation values for various transactions. */ #define XFS_ADDAFORK_SPACE_RES(mp) \ - ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) + ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) #define XFS_ATTRRM_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) /* This macro is not used - see inline code in xfs_attr_set */ -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:01 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 732BB7F5D for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 507BB304064 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:01 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Zl8umhyEqy0B3TI9 for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:59 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jI-Cq for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006x9-Bc for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 15/18] xfs: use xfs_da_geometry for block size in attr code Date: Thu, 8 May 2014 18:19:45 +1000 X-ASG-Orig-Subj: [PATCH 15/18] xfs: use xfs_da_geometry for block size in attr code Message-Id: <1399537188-26509-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537198 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Rather than using the superblock value obtained through the xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 24 +++++++++++------------- fs/xfs/xfs_attr_leaf.c | 6 +++--- fs/xfs/xfs_log_rlimit.c | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 28b6bb3..ab2679a 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -187,12 +187,10 @@ xfs_attr_get( */ STATIC int xfs_attr_calc_size( - struct xfs_inode *ip, - int namelen, - int valuelen, + struct xfs_da_args *args, int *local) { - struct xfs_mount *mp = ip->i_mount; + struct xfs_mount *mp = args->dp->i_mount; int size; int nblks; @@ -200,12 +198,12 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(namelen, valuelen, - mp->m_sb.sb_blocksize, local); + size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, + args->geo->blksize, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { - if (size > (mp->m_sb.sb_blocksize >> 1)) { + if (size > (args->geo->blksize / 2)) { /* Double split possible */ nblks *= 2; } @@ -214,7 +212,7 @@ xfs_attr_calc_size( * Out of line attribute, cannot double split, but * make room for the attribute value itself. */ - uint dblocks = xfs_attr3_rmt_blocks(mp, valuelen); + uint dblocks = xfs_attr3_rmt_blocks(mp, args->valuelen); nblks += dblocks; nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); } @@ -276,7 +274,7 @@ xfs_attr_set_int( args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; /* Size is now blocks for attribute data */ - args.total = xfs_attr_calc_size(dp, name->len, valuelen, &local); + args.total = xfs_attr_calc_size(&args, &local); /* * Start our first transaction of the day. @@ -994,7 +992,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1173,7 +1171,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); @@ -1265,7 +1263,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1528,7 +1526,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index d1e800d..ab652e9 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1076,7 +1076,7 @@ xfs_attr3_leaf_add( xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->trans->t_mountp->m_sb.sb_blocksize, NULL); + args->geo->blksize, NULL); /* * Search through freemap for first-fit on new name length. @@ -1179,13 +1179,13 @@ xfs_attr3_leaf_add_work( ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, NULL)); + args->geo->blksize, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp); + args->geo->blksize, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index 2af1a0a..ee7e0e8 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -42,7 +42,7 @@ xfs_log_calc_max_attrsetm_res( int size; int nblks; - size = xfs_attr_leaf_entsize_local_max(mp->m_sb.sb_blocksize) - + size = xfs_attr_leaf_entsize_local_max(mp->m_attr_geo->blksize) - MAXNAMELEN - 1; nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); nblks += XFS_B_TO_FSB(mp, size); -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:01 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C55A07F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C17B7304064 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:01 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id C7kFzHpYLacNqEGB for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:59 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jK-Ct for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006xE-Bu for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 16/18] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Date: Thu, 8 May 2014 18:19:46 +1000 X-ASG-Orig-Subj: [PATCH 16/18] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Message-Id: <1399537188-26509-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537199 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> As it's only ever called from contexts where the xfs_da_args is present and contains all the information needed inside the args structure. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 4 +--- fs/xfs/xfs_attr_leaf.c | 47 +++++++++++++++++------------------------------ fs/xfs/xfs_attr_leaf.h | 3 +-- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ab2679a..39fad96 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -198,9 +198,7 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, local); - + size = xfs_attr_leaf_newentsize(args, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { if (size > (args->geo->blksize / 2)) { diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index ab652e9..c0c6132 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1075,8 +1075,7 @@ xfs_attr3_leaf_add( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); - entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL); + entsize = xfs_attr_leaf_newentsize(args, NULL); /* * Search through freemap for first-fit on new name length. @@ -1178,14 +1177,11 @@ xfs_attr3_leaf_add_work( ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL)); + xfs_attr_leaf_newentsize(args, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); - ichdr->freemap[mapindex].size -= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, &tmp); + ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); @@ -1593,9 +1589,7 @@ xfs_attr3_leaf_figure_balance( max = ichdr1->count + ichdr2->count; half = (max + 1) * sizeof(*entry); half += ichdr1->usedbytes + ichdr2->usedbytes + - xfs_attr_leaf_newentsize(state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); half /= 2; lastdelta = state->blocksize; entry = xfs_attr3_leaf_entryp(leaf1); @@ -1607,10 +1601,7 @@ xfs_attr3_leaf_figure_balance( */ if (count == blk1->index) { tmp = totallen + sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); if (XFS_ATTR_ABS(half - tmp) > lastdelta) break; lastdelta = XFS_ATTR_ABS(half - tmp); @@ -1646,10 +1637,7 @@ xfs_attr3_leaf_figure_balance( totallen -= count * sizeof(*entry); if (foundit) { totallen -= sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); } *countarg = count; @@ -2440,22 +2428,21 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) * a "local" or a "remote" attribute. */ int -xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) +xfs_attr_leaf_newentsize( + struct xfs_da_args *args, + int *local) { - int size; + int size; - size = xfs_attr_leaf_entsize_local(namelen, valuelen); - if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { - if (local) { + size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen); + if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) { + if (local) *local = 1; - } - } else { - size = xfs_attr_leaf_entsize_remote(namelen); - if (local) { - *local = 0; - } + return size; } - return size; + if (local) + *local = 0; + return xfs_attr_leaf_entsize_remote(args->namelen); } diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index 3ec5ec0..e2929da 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -96,8 +96,7 @@ int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); -int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, - int *local); +int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:03 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 682FA7F82 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47BBA304064 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:03 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40005-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 43CeRHmR3qxObEi5 for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:00 -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: AodKAN48a1N5LL1sPGdsb2JhbABZgwZPh3ijbg8BAQabHhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhAz3qFVo1CBJpziUSLQys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jS-Dz for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006xO-Cw for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks Date: Thu, 8 May 2014 18:19:48 +1000 X-ASG-Orig-Subj: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks Message-Id: <1399537188-26509-19-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537200 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Right now the geometry source for directory and attributes is the struct xfs_mount - it's global. There's nothing stopping use from having per-inode directory geometry or (in future) attribute geometry. To move the dependency on the struct xfs_mount out from the da_args setup code, add a geometry pointer to the struct xfs_inode_fork. This can be set up for directories when the inode is instantiated, either from the xfs_mount or from the on-disk inode configuration (think extent size hints for directories). While this might seem wasteful to burn a pointer in the data fork for all files, consider that the geometry information for data allocation can be abstracted from the xfs_mount in exactly the same way as has been done for the directory geometry. Effectively it's a hook to carry allocation policy around in.... So, add the geometry pointer to the inode fork, and initialise is appropriately and use it for all the directory and attribute operation setup instead ofthe xfs_mount version. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 6 +++--- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_attr_list.c | 2 +- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_dir2.c | 12 ++++++------ fs/xfs/xfs_dir2_block.c | 4 ++-- fs/xfs/xfs_dir2_data.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 5 ++++- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_inode_fork.c | 1 + fs/xfs/xfs_inode_fork.h | 2 ++ fs/xfs/xfs_iops.c | 1 + 15 files changed, 29 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 86d75ad..086225a 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -124,7 +124,7 @@ xfs_attr_get_int( * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); - args.geo = ip->i_mount->m_attr_geo; + args.geo = ip->i_afp->if_geo; args.name = name->name; args.namelen = name->len; args.value = value; @@ -258,7 +258,7 @@ xfs_attr_set_int( * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); - args.geo = dp->i_mount->m_attr_geo; + args.geo = dp->i_afp->if_geo; args.name = name->name; args.namelen = name->len; args.value = value; @@ -474,7 +474,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); - args.geo = dp->i_mount->m_attr_geo; + args.geo = dp->i_afp->if_geo; args.name = name->name; args.namelen = name->len; args.flags = flags; diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 78f47af..d3ef7a8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -839,7 +839,7 @@ xfs_attr3_leaf_to_shortform( * Copy the attributes */ memset((char *)&nargs, 0, sizeof(nargs)); - nargs.geo = dp->i_mount->m_attr_geo; + nargs.geo = dp->i_afp->if_geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 90e2eeb..62366f9 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -444,7 +444,7 @@ xfs_attr3_leaf_list_int( xfs_da_args_t args; memset((char *)&args, 0, sizeof(args)); - args.geo = context->dp->i_mount->m_attr_geo; + args.geo = context->dp->i_afp->if_geo; args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 96175df..f87fc63 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1098,7 +1098,7 @@ xfs_bmap_add_attrfork_local( if (S_ISDIR(ip->i_d.di_mode)) { memset(&dargs, 0, sizeof(dargs)); - dargs.geo = ip->i_mount->m_dir_geo; + dargs.geo = ip->i_df.if_geo; dargs.dp = ip; dargs.firstblock = firstblock; dargs.flist = flist; diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index f935370..408ad73 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2469,9 +2469,9 @@ xfs_dabuf_map( ASSERT(*nmaps == 1); if (whichfork == XFS_DATA_FORK) - nfsb = mp->m_dir_geo->fsbcount; + nfsb = dp->i_df.if_geo->fsbcount; else - nfsb = mp->m_attr_geo->fsbcount; + nfsb = dp->i_afp->if_geo->fsbcount; /* * Caller doesn't have a mapping. -2 means don't complain diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 5a45681..7b678e7 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -219,7 +219,7 @@ xfs_dir_init( if (!args) return ENOMEM; - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->dp = dp; args->trans = tp; error = xfs_dir2_sf_create(args, pdp->i_ino); @@ -254,7 +254,7 @@ xfs_dir_createname( if (!args) return ENOMEM; - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -349,7 +349,7 @@ xfs_dir_lookup( * annotations into the reclaim path for the ilock. */ args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -421,7 +421,7 @@ xfs_dir_removename( if (!args) return ENOMEM; - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -486,7 +486,7 @@ xfs_dir_replace( if (!args) return ENOMEM; - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -548,7 +548,7 @@ xfs_dir_canenter( if (!args) return ENOMEM; - args->geo = dp->i_mount->m_dir_geo; + args->geo = dp->i_df.if_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index c7cd315..d13e1cc 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -133,10 +133,9 @@ xfs_dir3_block_read( struct xfs_inode *dp, struct xfs_buf **bpp) { - struct xfs_mount *mp = dp->i_mount; int err; - err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, + err = xfs_da_read_buf(tp, dp, dp->i_df.if_geo->datablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); @@ -580,6 +579,7 @@ xfs_dir2_block_log_leaf( xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; + /* XXX pass args for geo! */ btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); blp = xfs_dir2_block_leaf_p(btp); xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 8c2f642..2b35929 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -66,7 +66,7 @@ __xfs_dir3_data_check( struct xfs_da_geometry *geo; mp = bp->b_target->bt_mount; - geo = mp->m_dir_geo; + geo = dp->i_df.if_geo; /* * We can be passed a null dp here from a verifier, so we need to go the @@ -511,7 +511,7 @@ xfs_dir2_data_freescan( struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ - struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; + struct xfs_da_geometry *geo = dp->i_df.if_geo; /* XXX: pass args! */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index fb0aad4..dd3f268 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -93,7 +93,7 @@ xfs_dir3_leaf_check_int( int i; const struct xfs_dir_ops *ops; struct xfs_dir3_icleaf_hdr leafhdr; - struct xfs_da_geometry *geo = mp->m_dir_geo; + struct xfs_da_geometry *geo = dp->i_df.if_geo; /* * we can be passed a null dp here from a verifier, so we need to go the @@ -289,6 +289,8 @@ xfs_dir3_leafn_read( /* * Initialize a new leaf block, leaf1 or leafn magic accepted. + * + * XXX: pass args for geo! */ static void xfs_dir3_leaf_init( @@ -325,6 +327,7 @@ xfs_dir3_leaf_init( if (type == XFS_DIR2_LEAF1_MAGIC) { struct xfs_dir2_leaf_tail *ltp; + /* XXX: pass args for geo! */ ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 65df8cb..52d7027 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -472,7 +472,7 @@ xfs_dir2_free_hdr_check( dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); ASSERT((hdr.firstdb % - dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0); + dp->d_ops->free_max_bests(dp->i_df.if_geo)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 6a120ca..e444b4c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -681,7 +681,7 @@ xfs_readdir( XFS_STATS_INC(xs_dir_getdents); args.dp = dp; - args.geo = dp->i_mount->m_dir_geo; + args.geo = dp->i_df.if_geo; lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 53c3be6..2574d20 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -85,7 +85,7 @@ xfs_dir2_block_sfsize( struct xfs_da_geometry *geo; mp = dp->i_mount; - geo = mp->m_dir_geo; + geo = dp->i_df.if_geo; /* * if there is a filetype field, add the extra byte to the namelen diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index b031e8d..ea28c52 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -197,6 +197,7 @@ xfs_iformat_fork( ASSERT(ip->i_afp == NULL); ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); + ip->i_afp->if_geo = ip->i_mount->m_attr_geo; switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: diff --git a/fs/xfs/xfs_inode_fork.h b/fs/xfs/xfs_inode_fork.h index 7d3b1ed..ecfd756 100644 --- a/fs/xfs/xfs_inode_fork.h +++ b/fs/xfs/xfs_inode_fork.h @@ -20,6 +20,7 @@ struct xfs_inode_log_item; struct xfs_dinode; +struct xfs_da_geometry; /* * The following xfs_ext_irec_t struct introduces a second (top) level @@ -59,6 +60,7 @@ typedef struct xfs_ifork { struct xfs_btree_block *if_broot; /* file's incore btree root */ short if_broot_bytes; /* bytes allocated for root */ unsigned char if_flags; /* per-fork flags */ + struct xfs_da_geometry *if_geo; /* allocation geometry */ union { xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 699d5a1..ec63b3c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1263,6 +1263,7 @@ xfs_setup_inode( inode->i_op = &xfs_dir_inode_operations; inode->i_fop = &xfs_dir_file_operations; ip->d_ops = ip->i_mount->m_dir_inode_ops; + ip->i_df.if_geo = ip->i_mount->m_dir_geo; break; case S_IFLNK: inode->i_op = &xfs_symlink_inode_operations; -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:03 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7524E7F83 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45529304062 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:03 -0700 (PDT) X-ASG-Debug-ID: 1399537196-04bdf02b8d3f5e50003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id FKd4atQRfzQ0FpNY for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:19:59 -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: AodKAN48a1N5LL1sPGdsb2JhbABZgwZPh3ijbg8BAQabHhcDAQEBATg1giUBAQUaDS8zCBgxOQMHFBmIQM96hVaNQgSac4lEi0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001iz-8J for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wV-7G for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 07/18] xfs: convert directory db conversion to xfs_da_geometry Date: Thu, 8 May 2014 18:19:37 +1000 X-ASG-Orig-Subj: [PATCH 07/18] xfs: convert directory db conversion to xfs_da_geometry Message-Id: <1399537188-26509-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537199 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 22 ++++++++++------------ fs/xfs/xfs_da_format.c | 4 ++-- fs/xfs/xfs_dir2.c | 13 +++++++++---- fs/xfs/xfs_dir2_block.c | 15 +++++++++------ fs/xfs/xfs_dir2_data.c | 3 ++- fs/xfs/xfs_dir2_leaf.c | 30 +++++++++++++++++------------- fs/xfs/xfs_dir2_node.c | 27 ++++++++++++++++----------- fs/xfs/xfs_dir2_readdir.c | 45 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_dir2_sf.c | 4 ++-- 9 files changed, 93 insertions(+), 70 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0c625f6..ce2580c 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -185,19 +185,18 @@ xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) * Convert byte in space to (DB) block */ static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_db(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); + return (xfs_dir2_db_t)(by >> geo->blklog); } /* * Convert dataptr to a block number */ static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_db(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_db(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -213,9 +212,9 @@ xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) * Convert dataptr to a byte offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_off(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -241,20 +240,19 @@ xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) * Convert byte in space to (DA) block */ static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_da(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(geo, xfs_dir2_byte_to_db(geo, by)); } /* * Convert block and offset to dataptr */ static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_dataptr(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr( - xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(geo, db, o)); } /* diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 313eea3..c782f2c 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -610,7 +610,7 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir2_free_max_bests(mp)); } @@ -642,7 +642,7 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir3_free_max_bests(mp)); } diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 725c95d..61011b7 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -117,9 +117,14 @@ xfs_da_mount( dageo->fsblog = mp->m_sb.sb_blocklog; dageo->blksize = 1 << dageo->blklog; dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; - dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); - dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); - dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + + /* + * Now we've set up the block conversion variables, we can calculate the + * segment block constants using the geometry structure. + */ + dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET); dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); dageo->magicpct = (dageo->blksize * 37) / 100; @@ -725,7 +730,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) + if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index dd9d005..bc08216 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -639,7 +639,8 @@ xfs_dir2_block_lookup( * Get the offset from the leaf entry, to point to the data. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Fill in inode number, CI name if appropriate, release the block. */ @@ -723,7 +724,7 @@ xfs_dir2_block_lookup_int( * Get pointer to the entry from the leaf. */ dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr)); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -795,8 +796,9 @@ xfs_dir2_block_removename( /* * Point to the data entry using the leaf entry. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Mark the data entry's space free. */ @@ -870,8 +872,9 @@ xfs_dir2_block_replace( /* * Point to the data entry we need to change. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); ASSERT(be64_to_cpu(dep->inumber) != args->inumber); /* * Change the inode number to the new value. diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 890c940..d355ec7 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -172,7 +172,8 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, + mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); name.name = dep->name; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 046ba4a..2b3ddd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && - bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(args->geo, blkno); - ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); + ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -670,7 +670,7 @@ xfs_dir2_leaf_addname( index++, lep++) { if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) continue; - i = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(i < be32_to_cpu(ltp->bestcount)); ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF)); if (be16_to_cpu(bestsp[i]) >= length) { @@ -889,7 +889,8 @@ xfs_dir2_leaf_addname( * Fill in the new leaf entry. */ lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, use_block, + lep->address = cpu_to_be32( + xfs_dir2_db_off_to_dataptr(args->geo, use_block, be16_to_cpu(*tagp))); /* * Log the leaf fields and give up the buffers. @@ -1185,7 +1186,7 @@ xfs_dir2_leaf_lookup( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); /* * Return the found inode number & CI name if appropriate */ @@ -1260,7 +1261,8 @@ xfs_dir2_leaf_lookup_int( /* * Get the new data block number. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * If it's not the same as the old data block number, * need to pitch the old one and read the new one. @@ -1281,7 +1283,8 @@ xfs_dir2_leaf_lookup_int( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -1380,9 +1383,9 @@ xfs_dir2_leaf_removename( * Point to the leaf entry, use that to point to the data entry. */ lep = &ents[index]; - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); ltp = xfs_dir2_leaf_tail_p(mp, leaf); @@ -1515,7 +1518,7 @@ xfs_dir2_leaf_replace( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); ASSERT(args->inumber != be64_to_cpu(dep->inumber)); /* * Put the new inode number in, log it. @@ -1800,7 +1803,8 @@ xfs_dir2_node_to_leaf( * Get rid of the freespace block. */ error = xfs_dir2_shrink_inode(args, - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); + xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET), + fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 3b70d56..89777bf 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -316,7 +316,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(fdb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -451,7 +451,7 @@ xfs_dir2_leafn_add( highstale, &lfloglow, &lfloghigh); lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, + lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo, args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); @@ -577,7 +577,8 @@ xfs_dir2_leafn_lookup_for_addname( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * For addname, we're looking for a place to put the new entry. * We want to use a data block with an entry of equal @@ -723,7 +724,8 @@ xfs_dir2_leafn_lookup_for_entry( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * Not adding a new entry, so we really want to find * the name given to us. @@ -761,7 +763,8 @@ xfs_dir2_leafn_lookup_for_entry( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare the entry and if it's an exact match, return * EEXIST immediately. If it's the first case-insensitive @@ -1196,9 +1199,9 @@ xfs_dir2_leafn_remove( /* * Extract the data block and offset from the entry. */ - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->blkno == db); - off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); + off = xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->index == off); /* @@ -1260,7 +1263,8 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); + (fdb - xfs_dir2_byte_to_db(args->geo, + XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1751,7 +1755,7 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = xfs_dir2_byte_to_db(mp, + fbno = xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. @@ -1893,7 +1897,7 @@ xfs_dir2_node_addname_int( * Remember the first slot as our empty slot. */ freehdr.firstdb = - (fbno - xfs_dir2_byte_to_db(mp, + (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { @@ -2194,7 +2198,8 @@ xfs_dir2_node_replace( hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + - xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); ASSERT(inum != be64_to_cpu(dep->inumber)); /* * Fill in the new inode number and log the entry. diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 57e9247..c2a6387 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -87,8 +87,10 @@ xfs_dir2_sf_getdents( xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* @@ -109,7 +111,7 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; /* @@ -118,9 +120,9 @@ xfs_dir2_sf_getdents( * XXX(hch): the second argument is sometimes 0 and sometimes * mp->m_dirdatablk. */ - dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dotdot_offset); /* @@ -149,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -166,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; return 0; } @@ -190,12 +192,14 @@ xfs_dir2_block_getdents( char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -206,7 +210,7 @@ xfs_dir2_block_getdents( * Extract the byte offset we start at from the seek pointer. * We'll skip entries before this. */ - wantoff = xfs_dir2_dataptr_to_off(mp, ctx->pos); + wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); /* @@ -244,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -264,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; @@ -300,6 +304,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * If we have a buffer, we need to release it and @@ -342,14 +347,14 @@ xfs_dir2_leaf_readbuf( * run out of data blocks, get some more mappings. */ if (1 + mip->ra_want > mip->map_blocks && - mip->map_off < xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET)) { + mip->map_off < xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET)) { /* * Get more bmaps, fill in after the ones * we already have in the table. */ mip->nmap = mip->map_size - mip->map_valid; error = xfs_bmapi_read(dp, mip->map_off, - xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) - + xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET) - mip->map_off, &map[mip->map_valid], &mip->nmap, 0); @@ -370,7 +375,7 @@ xfs_dir2_leaf_readbuf( i = mip->map_valid + mip->nmap - 1; mip->map_off = map[i].br_startoff + map[i].br_blockcount; } else - mip->map_off = xfs_dir2_byte_to_da(mp, + mip->map_off = xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET); /* @@ -396,14 +401,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); + *curoff = xfs_dir2_da_to_byte(geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -504,6 +509,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; + struct xfs_da_geometry *geo; /* * If the offset is at or past the largest allowed value, @@ -513,6 +519,7 @@ xfs_dir2_leaf_getdents( return 0; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * Set up to bmap a number of blocks based on the caller's @@ -536,8 +543,8 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff)); + map_info->map_off = xfs_dir2_db_to_da(geo, + xfs_dir2_byte_to_db(geo, curoff)); /* * Loop over directory entries until we reach the end offset. @@ -571,7 +578,7 @@ xfs_dir2_leaf_getdents( * Make sure we're in the right block. */ else if (curoff > newoff) - ASSERT(xfs_dir2_byte_to_db(mp, curoff) == + ASSERT(xfs_dir2_byte_to_db(geo, curoff) == map_info->curdb); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); @@ -608,8 +615,8 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff), + xfs_dir2_db_off_to_byte(geo, + xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { continue; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 7aab8ec..4dc4193 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -104,8 +104,8 @@ xfs_dir2_block_sfsize( /* * Calculate the pointer to the entry at hand. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:04 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DB09D7F84 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6127304062 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:03 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110005-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id g8kJavBgQWctEzAv for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:01 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSkN4tDK4EwJA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001j8-As for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wu-9x for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 12/18] xfs: reduce direct usage of mp->m_dir_geo Date: Thu, 8 May 2014 18:19:42 +1000 X-ASG-Orig-Subj: [PATCH 12/18] xfs: reduce direct usage of mp->m_dir_geo Message-Id: <1399537188-26509-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537200 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> There are many places in the directory code were we don't pass the args into and so have to extract the geometry direct from the mount structure. Push the args or the geometry into these leaf functions so that we don't need to grab it from the struct xfs_mount. This, in turn, brings use to the point where directory geometry is no longer a property of the struct xfs_mount; it is not a global property anymore, and hence we can start to consider per-directory configuration of physical geometries. Start by converting the xfs_dir_isblock/leaf code - pass in the xfs_da_args and convert the readdir code to use xfs_da_args like the rest of the directory code to pass information around. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_dir2.c | 50 ++++++++++------------ fs/xfs/xfs_dir2.h | 4 +- fs/xfs/xfs_dir2_readdir.c | 105 ++++++++++++++++++++++------------------------ 3 files changed, 74 insertions(+), 85 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 6e8107c..5a45681 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -273,7 +273,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -281,7 +281,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -366,7 +366,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -374,7 +374,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -439,7 +439,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -447,7 +447,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -504,7 +504,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -512,7 +512,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -564,7 +564,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -572,7 +572,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -640,18 +640,16 @@ xfs_dir2_grow_inode( */ int xfs_dir2_isblock( - xfs_inode_t *dp, - int *vp) /* out: 1 is block, 0 is not block */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); + rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; + ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); *vp = rval; return 0; } @@ -661,17 +659,15 @@ xfs_dir2_isblock( */ int xfs_dir2_isleaf( - xfs_inode_t *dp, - int *vp) /* out: 1 is leaf, 0 is not leaf */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dir_geo->leafblk + mp->m_dir_geo->blksize; + *vp = last == args->geo->leafblk + args->geo->fsbcount; /* XXX */ return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 85f6be6..f2f6bb8 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -144,8 +144,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); +extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); +extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index fa393d5..6a120ca 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -76,28 +76,24 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { STATIC int xfs_dir2_sf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx) { int i; /* shortform entry number */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_dataptr_t off; /* current entry's offset */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; - struct xfs_da_geometry *geo; - - mp = dp->i_mount; - geo = mp->m_dir_geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* * Give up if the directory is way too short. */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); + ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); return XFS_ERROR(EIO); } @@ -111,7 +107,7 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) return 0; /* @@ -120,9 +116,9 @@ xfs_dir2_sf_getdents( * XXX(hch): the second argument is sometimes 0 and sometimes * geo->datablk */ - dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + dot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, dp->d_ops->data_dotdot_offset); /* @@ -151,7 +147,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + off = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -163,13 +159,13 @@ xfs_dir2_sf_getdents( filetype = dp->d_ops->sf_get_ftype(sfep); ctx->pos = off & 0x7fffffff; if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) return 0; sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, + args->geo->datablk + 1, 0) & 0x7fffffff; return 0; } @@ -178,9 +174,10 @@ xfs_dir2_sf_getdents( */ STATIC int xfs_dir2_block_getdents( - xfs_inode_t *dp, /* incore inode */ + struct xfs_da_args *args, struct dir_context *ctx) { + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_data_hdr_t *hdr; /* block header */ struct xfs_buf *bp; /* buffer for block */ xfs_dir2_block_tail_t *btp; /* block tail */ @@ -188,18 +185,14 @@ xfs_dir2_block_getdents( xfs_dir2_data_unused_t *dup; /* block unused entry */ char *endptr; /* end of the data entries */ int error; /* error return value */ - xfs_mount_t *mp; /* filesystem mount point */ char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; - struct xfs_da_geometry *geo; - mp = dp->i_mount; - geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -210,13 +203,13 @@ xfs_dir2_block_getdents( * Extract the byte offset we start at from the seek pointer. * We'll skip entries before this. */ - wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); + wantoff = xfs_dir2_dataptr_to_off(args->geo, ctx->pos); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); /* * Set up values for the loop. */ - btp = xfs_dir2_block_tail_p(geo, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); @@ -248,7 +241,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + cook = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -258,7 +251,7 @@ xfs_dir2_block_getdents( */ if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) { + xfs_dir3_get_dtype(dp->i_mount, filetype))) { xfs_trans_brelse(NULL, bp); return 0; } @@ -268,8 +261,8 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, + args->geo->datablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; } @@ -290,13 +283,13 @@ struct xfs_dir2_leaf_map_info { STATIC int xfs_dir2_leaf_readbuf( - struct xfs_inode *dp, + struct xfs_da_args *args, size_t bufsize, struct xfs_dir2_leaf_map_info *mip, xfs_dir2_off_t *curoff, struct xfs_buf **bpp) { - struct xfs_mount *mp = dp->i_mount; + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = *bpp; struct xfs_bmbt_irec *map = mip->map; struct blk_plug plug; @@ -304,7 +297,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; - struct xfs_da_geometry *geo = mp->m_dir_geo; + struct xfs_da_geometry *geo = args->geo; /* * If we have a buffer, we need to release it and @@ -314,7 +307,7 @@ xfs_dir2_leaf_readbuf( if (bp) { xfs_trans_brelse(NULL, bp); bp = NULL; - mip->map_blocks -= geo->fsbcount; + mip->map_blocks -= args->geo->fsbcount; /* * Loop to get rid of the extents for the * directory block. @@ -338,8 +331,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + geo->blksize, - mp->m_sb.sb_blocksize) - 1; + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; ASSERT(mip->ra_want >= 0); /* @@ -411,8 +403,8 @@ xfs_dir2_leaf_readbuf( mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= geo->fsbcount ? - XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); - + XFS_FSB_TO_DADDR(dp->i_mount, map->br_startblock) : + -1, &bp); /* * Should just skip over the data block instead of giving up. */ @@ -441,7 +433,7 @@ xfs_dir2_leaf_readbuf( map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, - XFS_FSB_TO_DADDR(mp, + XFS_FSB_TO_DADDR(dp->i_mount, map[mip->ra_index].br_startblock + mip->ra_offset)); mip->ra_current = i; @@ -493,23 +485,23 @@ out: */ STATIC int xfs_dir2_leaf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx, size_t bufsize) { + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = NULL; /* data block buffer */ xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_dir2_data_unused_t *dup; /* unused entry */ int error = 0; /* error return value */ int length; /* temporary length value */ - xfs_mount_t *mp; /* filesystem mount point */ int byteoff; /* offset in current block */ xfs_dir2_off_t curoff; /* current overall offset */ xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; - struct xfs_da_geometry *geo; + struct xfs_da_geometry *geo = args->geo; /* * If the offset is at or past the largest allowed value, @@ -518,15 +510,12 @@ xfs_dir2_leaf_getdents( if (ctx->pos >= XFS_DIR2_MAX_DATAPTR) return 0; - mp = dp->i_mount; - geo = mp->m_dir_geo; - /* * Set up to bmap a number of blocks based on the caller's * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, (1 << geo->fsblog)); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -558,7 +547,7 @@ xfs_dir2_leaf_getdents( */ if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { - error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, + error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, &curoff, &bp); if (error || !map_info->map_valid) break; @@ -566,7 +555,7 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + newoff = xfs_dir2_db_off_to_byte(geo, map_info->curdb, 0); /* * Start of the current block. @@ -585,7 +574,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); + byteoff = xfs_dir2_byte_to_off(geo, curoff); /* * Skip past the header. */ @@ -644,7 +633,7 @@ xfs_dir2_leaf_getdents( ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) break; /* @@ -674,13 +663,14 @@ xfs_dir2_leaf_getdents( */ int xfs_readdir( - xfs_inode_t *dp, - struct dir_context *ctx, - size_t bufsize) + struct xfs_inode *dp, + struct dir_context *ctx, + size_t bufsize) { - int rval; /* return value */ - int v; /* type-checking value */ - uint lock_mode; + struct xfs_da_args args = {0}; + int rval; + int v; + uint lock_mode; trace_xfs_readdir(dp); @@ -690,15 +680,18 @@ xfs_readdir( ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_getdents); + args.dp = dp; + args.geo = dp->i_mount->m_dir_geo; + lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) - rval = xfs_dir2_sf_getdents(dp, ctx); - else if ((rval = xfs_dir2_isblock(dp, &v))) + rval = xfs_dir2_sf_getdents(&args, ctx); + else if ((rval = xfs_dir2_isblock(&args, &v))) ; else if (v) - rval = xfs_dir2_block_getdents(dp, ctx); + rval = xfs_dir2_block_getdents(&args, ctx); else - rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); + rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); xfs_iunlock(dp, lock_mode); return rval; -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:05 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18A9B7F83 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA2F4304062 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:04 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40006-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id DN4VyyDhRZKCBtcm for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:02 -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: AmZKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQM96hVaNQgSVQI53i0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jO-DT for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006xJ-CE for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 17/18] xfs: repalce attr LBSIZE with xfs_da_geometry Date: Thu, 8 May 2014 18:19:47 +1000 X-ASG-Orig-Subj: [PATCH 17/18] xfs: repalce attr LBSIZE with xfs_da_geometry Message-Id: <1399537188-26509-18-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537201 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 2 +- fs/xfs/xfs_attr_leaf.c | 114 ++++++++++++++++++++++++----------------------- fs/xfs/xfs_attr_remote.c | 55 ++++++++++++----------- fs/xfs/xfs_da_format.h | 10 ----- 4 files changed, 89 insertions(+), 92 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 39fad96..86d75ad 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -957,7 +957,7 @@ xfs_attr_leaf_get(xfs_da_args_t *args) } /*======================================================================== - * External routines when attribute list size > XFS_LBSIZE(mp). + * External routines when attribute list size > geo->blksize *========================================================================*/ /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index c0c6132..78f47af 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -80,11 +80,12 @@ STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, /* * Utility routines. */ -STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, +STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args, + struct xfs_attr_leafblock *src_leaf, struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, struct xfs_attr_leafblock *dst_leaf, struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, - int move_count, struct xfs_mount *mp); + int move_count); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); void @@ -805,18 +806,18 @@ xfs_attr3_leaf_to_shortform( trace_xfs_attr_leaf_to_sf(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); if (!tmpbuffer) return ENOMEM; - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); leaf = (xfs_attr_leafblock_t *)tmpbuffer; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entry = xfs_attr3_leaf_entryp(leaf); /* XXX (dgc): buffer is about to be marked stale - why zero it? */ - memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); + memset(bp->b_addr, 0, args->geo->blksize); /* * Clean out the prior contents of the attribute list. @@ -905,12 +906,12 @@ xfs_attr3_leaf_to_node( /* copy leaf to new buffer, update identifiers */ xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; hdr3->blkno = cpu_to_be64(bp2->b_bn); } - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); /* * Set up the new root node. @@ -931,7 +932,7 @@ xfs_attr3_leaf_to_node( btree[0].before = cpu_to_be32(blkno); icnodehdr.count = 1; dp->d_ops->node_hdr_to_disk(node, &icnodehdr); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1); error = 0; out: return error; @@ -967,10 +968,10 @@ xfs_attr3_leaf_create( bp->b_ops = &xfs_attr3_leaf_buf_ops; xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); leaf = bp->b_addr; - memset(leaf, 0, XFS_LBSIZE(mp)); + memset(leaf, 0, args->geo->blksize); memset(&ichdr, 0, sizeof(ichdr)); - ichdr.firstused = XFS_LBSIZE(mp); + ichdr.firstused = args->geo->blksize; if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp->b_addr; @@ -989,7 +990,7 @@ xfs_attr3_leaf_create( ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); *bpp = bp; return 0; @@ -1174,11 +1175,11 @@ xfs_attr3_leaf_add_work( * Allocate space for the new string (at the end of the run). */ mp = args->trans->t_mountp; - ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args, NULL)); - ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); @@ -1266,14 +1267,13 @@ xfs_attr3_leaf_compact( struct xfs_attr_leafblock *leaf_dst; struct xfs_attr3_icleaf_hdr ichdr_src; struct xfs_trans *trans = args->trans; - struct xfs_mount *mp = trans->t_mountp; char *tmpbuffer; trace_xfs_attr_leaf_compact(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); - memset(bp->b_addr, 0, XFS_LBSIZE(mp)); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); + memset(bp->b_addr, 0, args->geo->blksize); leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; leaf_dst = bp->b_addr; @@ -1286,7 +1286,7 @@ xfs_attr3_leaf_compact( /* Initialise the incore headers */ ichdr_src = *ichdr_dst; /* struct copy */ - ichdr_dst->firstused = XFS_LBSIZE(mp); + ichdr_dst->firstused = args->geo->blksize; ichdr_dst->usedbytes = 0; ichdr_dst->count = 0; ichdr_dst->holes = 0; @@ -1301,13 +1301,13 @@ xfs_attr3_leaf_compact( * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr3_leaf_moveents(leaf_src, &ichdr_src, 0, leaf_dst, ichdr_dst, 0, - ichdr_src.count, mp); + xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0, + leaf_dst, ichdr_dst, 0, ichdr_src.count); /* * this logs the entire buffer, but the caller must write the header * back to the buffer when it is finished modifying it. */ - xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1); kmem_free(tmpbuffer); } @@ -1458,8 +1458,8 @@ xfs_attr3_leaf_rebalance( /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, - leaf2, &ichdr2, 0, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf1, &ichdr1, + ichdr1.count - count, leaf2, &ichdr2, 0, count); } else if (count > ichdr1.count) { /* @@ -1487,8 +1487,8 @@ xfs_attr3_leaf_rebalance( /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, - ichdr1.count, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count); } xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); @@ -1794,7 +1794,6 @@ xfs_attr3_leaf_remove( struct xfs_attr_leafblock *leaf; struct xfs_attr3_icleaf_hdr ichdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = args->trans->t_mountp; int before; int after; int smallest; @@ -1808,7 +1807,7 @@ xfs_attr3_leaf_remove( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); ASSERT(args->index >= 0 && args->index < ichdr.count); ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + xfs_attr3_leaf_hdr_size(leaf)); @@ -1816,7 +1815,7 @@ xfs_attr3_leaf_remove( entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); /* * Scan through free region table: @@ -1831,8 +1830,8 @@ xfs_attr3_leaf_remove( smallest = XFS_ATTR_LEAF_MAPSIZE - 1; entsize = xfs_attr_leaf_entsize(leaf, args->index); for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { - ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); - ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].base < args->geo->blksize); + ASSERT(ichdr.freemap[i].size < args->geo->blksize); if (ichdr.freemap[i].base == tablesize) { ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); @@ -1909,11 +1908,11 @@ xfs_attr3_leaf_remove( * removing the name. */ if (smallest) { - tmp = XFS_LBSIZE(mp); + tmp = args->geo->blksize; entry = xfs_attr3_leaf_entryp(leaf); for (i = ichdr.count - 1; i >= 0; entry++, i--) { ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); if (be16_to_cpu(entry->nameidx) < tmp) tmp = be16_to_cpu(entry->nameidx); @@ -1953,7 +1952,6 @@ xfs_attr3_leaf_unbalance( struct xfs_attr3_icleaf_hdr drophdr; struct xfs_attr3_icleaf_hdr savehdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = state->mp; trace_xfs_attr_leaf_unbalance(state->args); @@ -1980,13 +1978,15 @@ xfs_attr3_leaf_unbalance( */ if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, 0, - drophdr.count, mp); + drophdr.count); } else { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, - savehdr.count, drophdr.count, mp); + savehdr.count, drophdr.count); } } else { /* @@ -2016,19 +2016,23 @@ xfs_attr3_leaf_unbalance( if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, 0, - drophdr.count, mp); - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + drophdr.count); + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - savehdr.count, mp); + savehdr.count); } else { - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, 0, - savehdr.count, mp); - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + savehdr.count); + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - drophdr.count, mp); + drophdr.count); } memcpy(save_leaf, tmp_leaf, state->blocksize); savehdr = tmphdr; /* struct copy */ @@ -2083,7 +2087,7 @@ xfs_attr3_leaf_lookup_int( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); /* * Binary search. (note: small blocks will skip this loop) @@ -2187,7 +2191,7 @@ xfs_attr3_leaf_getvalue( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); ASSERT(args->index < ichdr.count); entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; @@ -2238,14 +2242,14 @@ xfs_attr3_leaf_getvalue( /*ARGSUSED*/ STATIC void xfs_attr3_leaf_moveents( + struct xfs_da_args *args, struct xfs_attr_leafblock *leaf_s, struct xfs_attr3_icleaf_hdr *ichdr_s, int start_s, struct xfs_attr_leafblock *leaf_d, struct xfs_attr3_icleaf_hdr *ichdr_d, int start_d, - int count, - struct xfs_mount *mp) + int count) { struct xfs_attr_leaf_entry *entry_s; struct xfs_attr_leaf_entry *entry_d; @@ -2265,10 +2269,10 @@ xfs_attr3_leaf_moveents( ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); ASSERT(ichdr_s->magic == ichdr_d->magic); - ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8); ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) + xfs_attr3_leaf_hdr_size(leaf_s)); - ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->count < args->geo->blksize / 8); ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) + xfs_attr3_leaf_hdr_size(leaf_d)); @@ -2320,11 +2324,11 @@ xfs_attr3_leaf_moveents( entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memmove(xfs_attr3_leaf_name(leaf_d, desti), xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); ichdr_s->usedbytes -= tmp; ichdr_d->usedbytes += tmp; @@ -2345,7 +2349,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } else { /* @@ -2360,7 +2364,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 0f0679a..b5adfec 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -125,6 +125,7 @@ xfs_attr3_rmt_read_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -133,21 +134,20 @@ xfs_attr3_rmt_read_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), - XFS_ATTR3_RMT_CRC_OFF)) { + if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) { xfs_buf_ioerror(bp, EFSBADCRC); break; } - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); break; } - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } if (bp->b_error) @@ -165,6 +165,7 @@ xfs_attr3_rmt_write_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -173,10 +174,10 @@ xfs_attr3_rmt_write_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); xfs_verifier_error(bp); return; @@ -187,11 +188,11 @@ xfs_attr3_rmt_write_verify( rmt = (struct xfs_attr3_rmt_hdr *)ptr; rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); } - xfs_update_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF); + xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF); - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } ASSERT(len == 0); } @@ -240,12 +241,13 @@ xfs_attr_rmtval_copyout( char *src = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size = 0; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); @@ -263,9 +265,9 @@ xfs_attr_rmtval_copyout( memcpy(*dst, src + hdr_size, byte_cnt); /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - src += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + src += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; @@ -287,12 +289,13 @@ xfs_attr_rmtval_copyin( char *dst = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, @@ -304,17 +307,17 @@ xfs_attr_rmtval_copyin( * If this is the last block, zero the remainder of it. * Check that we are actually the last block, too. */ - if (byte_cnt + hdr_size < XFS_LBSIZE(mp)) { + if (byte_cnt + hdr_size < blksize) { ASSERT(*valuelen - byte_cnt == 0); - ASSERT(len == XFS_LBSIZE(mp)); + ASSERT(len == blksize); memset(dst + hdr_size + byte_cnt, 0, - XFS_LBSIZE(mp) - hdr_size - byte_cnt); + blksize - hdr_size - byte_cnt); } /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - dst += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + dst += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 44d7fac..0a49b02 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -19,10 +19,6 @@ #ifndef __XFS_DA_FORMAT_H__ #define __XFS_DA_FORMAT_H__ -/*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - /* * This structure is common to both leaf nodes and non-leaf nodes in the Btree. * @@ -122,8 +118,6 @@ struct xfs_da3_icnode_hdr { __uint16_t level; }; -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - /* * Directory version 2. * @@ -620,10 +614,6 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) * of an attribute name may not be unique, we may have duplicate keys. The * internal links in the Btree are logical block offsets into the file. * - *======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *======================================================================== - * * Struct leaf_entry's are packed from the top. Name/values grow from the * bottom but are not packed. The freemap contains run-length-encoded entries * for the free bytes after the leaf_entry's, but only the N largest such, -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:06 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B637C7F83 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A359D304062 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:06 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110007-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id D6zBE865eEsd9E1l for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:04 -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: ApFKAN48a1N5LL1sPGdsb2JhbABZgwZPh3ijbg8BAQaaDoEQFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDPeoVWiHeESwSac5UHKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:55 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001iu-5S for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006w6-4S for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 02/18] xfs: introduce directory geometry structure Date: Thu, 8 May 2014 18:19:32 +1000 X-ASG-Orig-Subj: [PATCH 02/18] xfs: introduce directory geometry structure Message-Id: <1399537188-26509-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537204 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The directory code has a dependency on the struct xfs_mount to supply the directory block geometry. Block size, block log size, and other parameters are pre-caclulated in the struct xfs_mount or access directly from the superblock embedded in the struct xfs_mount. Extract all of this geometry information out of the struct xfs_mount and superblock and place it into a new struct xfs_da_geometry defined by the directory code. Allocate and initialise it at mount time, and attach it to the struct xfs_mount so it canbe passed back into the directory code appropriately rather than using the struct xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 3 +++ fs/xfs/xfs_attr_leaf.c | 1 + fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_da_btree.h | 18 +++++++++++++++++ fs/xfs/xfs_dir2.c | 54 ++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_dir2.h | 2 +- fs/xfs/xfs_mount.c | 18 ++++++++++------- fs/xfs/xfs_mount.h | 3 +++ 8 files changed, 79 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index abda112..50159d3 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -124,6 +124,7 @@ xfs_attr_get_int( * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); + args.geo = ip->i_mount->m_attr_geo; args.name = name->name; args.namelen = name->len; args.value = value; @@ -261,6 +262,7 @@ xfs_attr_set_int( * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); + args.geo = dp->i_mount->m_attr_geo; args.name = name->name; args.namelen = name->len; args.value = value; @@ -476,6 +478,7 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) * Fill in the arg structure for this request. */ memset((char *)&args, 0, sizeof(args)); + args.geo = dp->i_mount->m_attr_geo; args.name = name->name; args.namelen = name->len; args.flags = flags; diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 511c283..c662aaf 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -838,6 +838,7 @@ xfs_attr3_leaf_to_shortform( * Copy the attributes */ memset((char *)&nargs, 0, sizeof(nargs)); + nargs.geo = dp->i_mount->m_attr_geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 833fe5d..90e2eeb 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int( xfs_da_args_t args; memset((char *)&args, 0, sizeof(args)); + args.geo = context->dp->i_mount->m_attr_geo; args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index c824a0a..0ac63ad 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -25,6 +25,23 @@ struct xfs_trans; struct zone; struct xfs_dir_ops; +/* + * Directory/attribute geometry information. There will be one of these for each + * data fork type, and it will be passed around via the xfs_da_args. Global + * structures will be attached to the xfs_mount. + */ +struct xfs_da_geometry { + int blksize; /* da block size in bytes */ + int fsbcount; /* da block size in filesystem blocks */ + uint8_t fsblog; /* log2 of _filesystem_ block size */ + uint8_t blklog; /* log2 of da block size */ + uint node_ents; /* # of entries in a danode */ + int magicpct; /* 37% of block size in bytes */ + xfs_dablk_t datablk; /* blockno of dir data v2 */ + xfs_dablk_t leafblk; /* blockno of leaf data v2 */ + xfs_dablk_t freeblk; /* blockno of free data v2 */ +}; + /*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ @@ -42,6 +59,7 @@ enum xfs_dacmp { * Structure to ease passing around component names. */ typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ __uint8_t filetype; /* filetype of inode for directories */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 93fcebd..8b41f78 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { .compname = xfs_ascii_ci_compname, }; -void -xfs_dir_mount( +int +xfs_da_mount( xfs_mount_t *mp) { - int nodehdr_size; + struct xfs_da_geometry *dageo; + int nodehdr_size; ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); @@ -99,24 +100,45 @@ xfs_dir_mount( mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + if (!mp->m_dir_geo || !mp->m_attr_geo) { + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); + return ENOMEM; + } + + /* set up directory geometry */ + dageo = mp->m_dir_geo; + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; + dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / + dageo->magicpct = (dageo->blksize * 37) / 100; + + /* set up attribute geometry - single fsb only */ + dageo = mp->m_attr_geo; + dageo->blklog = mp->m_sb.sb_blocklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1; + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); + dageo->magicpct = (dageo->blksize * 37) / 100; - mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; if (xfs_sb_version_hasasciici(&mp->m_sb)) mp->m_dirnameops = &xfs_ascii_ci_nameops; else mp->m_dirnameops = &xfs_default_nameops; - + return 0; } /* @@ -192,6 +214,7 @@ xfs_dir_init( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->dp = dp; args->trans = tp; error = xfs_dir2_sf_create(args, pdp->i_ino); @@ -226,6 +249,7 @@ xfs_dir_createname( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -320,6 +344,7 @@ xfs_dir_lookup( * annotations into the reclaim path for the ilock. */ args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -391,6 +416,7 @@ xfs_dir_removename( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -455,6 +481,7 @@ xfs_dir_replace( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -516,6 +543,7 @@ xfs_dir_canenter( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 64a6b19..7b09ef0 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -112,7 +112,7 @@ extern const struct xfs_dir_ops * * Generic directory interface routines */ extern void xfs_dir_startup(void); -extern void xfs_dir_mount(struct xfs_mount *mp); +extern int xfs_da_mount(struct xfs_mount *mp); extern int xfs_dir_isempty(struct xfs_inode *dp); extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_inode *pdp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3f09782..8a0d196 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -780,12 +780,11 @@ xfs_mountfs( mp->m_dmevmask = 0; /* not persistent; set after each mount */ - xfs_dir_mount(mp); - - /* - * Initialize the attribute manager's entries. - */ - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize * 37) / 100; + error = xfs_da_mount(mp); + if (error) { + xfs_warn(mp, "Failed dir/attr init: %d", error); + goto out_remove_uuid; + } /* * Initialize the precomputed transaction reservations values. @@ -800,7 +799,7 @@ xfs_mountfs( error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { xfs_warn(mp, "Failed per-ag init: %d", error); - goto out_remove_uuid; + goto out_free_dir; } if (!sbp->sb_logblocks) { @@ -975,6 +974,9 @@ xfs_mountfs( xfs_wait_buftarg(mp->m_ddev_targp); out_free_perag: xfs_free_perag(mp); + out_free_dir: + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); out_remove_uuid: xfs_uuid_unmount(mp); out: @@ -1057,6 +1059,8 @@ xfs_unmountfs( #if defined(DEBUG) xfs_errortag_clearall(mp, 0); #endif + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); xfs_free_perag(mp); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a466c5e..27cce7b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -27,6 +27,7 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; struct xfs_dir_ops; +struct xfs_da_geometry; #ifdef HAVE_PERCPU_SB @@ -96,6 +97,8 @@ typedef struct xfs_mount { uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ uint m_writeio_blocks; /* min write size blocks */ + struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ + struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ struct xlog *m_log; /* log specific stuff */ int m_logbufs; /* number of log buffers */ int m_logbsize; /* size of each log buffer */ -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:05 2014 Return-Path: <dave@fromorbit.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 D8F317F96 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 729D18F804B for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:05 -0700 (PDT) X-ASG-Debug-ID: 1399537196-04bdf02b8d3f5e50004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id IfG3qO7KbhZxf7KA for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:01 -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: AolKAN48a1N5LL1sPGdsb2JhbABZgwZPh3ijbg8BAQabHhcDAQEBATg1giUBAQUaAQwvMwgYMTkDBxQZiEDPeoVWjUIEmnOJRItDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jE-Bc for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wz-AH for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 13/18] xfs: remove mp->m_dir_geo from directory logging Date: Thu, 8 May 2014 18:19:43 +1000 X-ASG-Orig-Subj: [PATCH 13/18] xfs: remove mp->m_dir_geo from directory logging Message-Id: <1399537188-26509-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537201 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> We don't pass the xfs_da_args or the geometry all the way down to the directory buffer logging code, hence we have to use mp->m_dir_geo here. Fix this to use the geometry passed via the xfs_da_args, and convert all the directory logging functions for consistency. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_dir2.h | 12 +++--- fs/xfs/xfs_dir2_block.c | 39 +++++++++--------- fs/xfs/xfs_dir2_data.c | 59 ++++++++++++--------------- fs/xfs/xfs_dir2_leaf.c | 103 +++++++++++++++++++++++++----------------------- fs/xfs/xfs_dir2_node.c | 68 +++++++++++++++----------------- fs/xfs/xfs_dir2_priv.h | 4 +- 6 files changed, 137 insertions(+), 148 deletions(-) diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index f2f6bb8..608f5b8 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -151,16 +151,16 @@ extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, extern void xfs_dir2_data_freescan(struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_entry(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_header(struct xfs_da_args *args, struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_unused(struct xfs_da_args *args, + struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_use_free(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 4204df9..c7cd315 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -281,8 +281,7 @@ out: */ static void xfs_dir2_block_compact( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp, @@ -315,7 +314,7 @@ xfs_dir2_block_compact( *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); *lfloghigh -= be32_to_cpu(btp->stale) - 1; be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), needlog, &needscan); @@ -325,7 +324,7 @@ xfs_dir2_block_compact( * This needs to happen before the next call to use_free. */ if (needscan) - xfs_dir2_data_freescan(dp, hdr, needlog); + xfs_dir2_data_freescan(args->dp, hdr, needlog); } /* @@ -420,7 +419,7 @@ xfs_dir2_block_addname( * If need to compact the leaf entries, do it now. */ if (compact) { - xfs_dir2_block_compact(tp, dp, bp, hdr, btp, blp, &needlog, + xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); /* recalculate blp post-compaction */ blp = xfs_dir2_block_leaf_p(btp); @@ -455,7 +454,7 @@ xfs_dir2_block_addname( /* * Mark the space needed for the new leaf entry, now in use. */ - xfs_dir2_data_use_free(tp, dp, bp, enddup, + xfs_dir2_data_use_free(args, bp, enddup, (xfs_dir2_data_aoff_t) ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), @@ -542,7 +541,7 @@ xfs_dir2_block_addname( /* * Mark space for the data entry used. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* @@ -560,9 +559,9 @@ xfs_dir2_block_addname( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -803,7 +802,7 @@ xfs_dir2_block_removename( * Mark the data entry's space free. */ needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -822,7 +821,7 @@ xfs_dir2_block_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. @@ -881,7 +880,7 @@ xfs_dir2_block_replace( */ dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -1004,7 +1003,7 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, + xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. @@ -1030,7 +1029,7 @@ xfs_dir2_leaf_to_block( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * Pitch the old leaf block. */ @@ -1143,7 +1142,7 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, i, &needlog, &needscan); ASSERT(needscan == 0); /* @@ -1157,7 +1156,7 @@ xfs_dir2_sf_to_block( /* * Remove the freespace, we'll manage it. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* @@ -1170,7 +1169,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1184,7 +1183,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1218,7 +1217,7 @@ xfs_dir2_sf_to_block( dup->length = cpu_to_be16(newoffset - offset); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( ((char *)dup - (char *)hdr)); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_unused(args, bp, dup); xfs_dir2_data_freeinsert(hdr, dp->d_ops->data_bestfree_p(hdr), dup, &dummy); @@ -1235,7 +1234,7 @@ xfs_dir2_sf_to_block( memcpy(dep->name, sfep->name, dep->namelen); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index b73d61a..8c2f642 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -630,8 +630,8 @@ xfs_dir3_data_init( /* * Log it and return it. */ - xfs_dir2_data_log_header(tp, dp, bp); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_header(args, bp); + xfs_dir2_data_log_unused(args, bp, dup); *bpp = bp; return 0; } @@ -641,8 +641,7 @@ xfs_dir3_data_init( */ void xfs_dir2_data_log_entry( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { @@ -653,8 +652,8 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(dp->d_ops->data_entry_tag_p(dep) + 1) - + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dep - (char *)hdr), + (uint)((char *)(args->dp->d_ops->data_entry_tag_p(dep) + 1) - (char *)hdr - 1)); } @@ -663,8 +662,7 @@ xfs_dir2_data_log_entry( */ void xfs_dir2_data_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -676,7 +674,8 @@ xfs_dir2_data_log_header( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->data_entry_offset - 1); } /* @@ -684,7 +683,7 @@ xfs_dir2_data_log_header( */ void xfs_dir2_data_log_unused( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup) /* data unused pointer */ { @@ -698,13 +697,13 @@ xfs_dir2_data_log_unused( /* * Log the first part of the unused entry. */ - xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dup - (char *)hdr), (uint)((char *)&dup->length + sizeof(dup->length) - 1 - (char *)hdr)); /* * Log the end (tag) of the unused entry. */ - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + sizeof(xfs_dir2_data_off_t) - 1)); @@ -716,8 +715,7 @@ xfs_dir2_data_log_unused( */ void xfs_dir2_data_make_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ @@ -727,37 +725,33 @@ xfs_dir2_data_make_free( xfs_dir2_data_hdr_t *hdr; /* data block pointer */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ char *endptr; /* end of data area */ - xfs_mount_t *mp; /* filesystem mount point */ int needscan; /* need to regen bestfree */ xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; - struct xfs_da_geometry *geo; - mp = tp->t_mountp; hdr = bp->b_addr; - geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + geo->blksize; + endptr = (char *)hdr + args->geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(geo, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > dp->d_ops->data_entry_offset) { + if (offset > args->dp->d_ops->data_entry_offset) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; @@ -783,7 +777,7 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ @@ -805,7 +799,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); if (!needscan) { /* * Has to be the case that entries 0 and 1 are @@ -840,7 +834,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); /* * If the previous entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -868,7 +862,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If the following entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -895,7 +889,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); } *needscanp = needscan; @@ -906,8 +900,7 @@ xfs_dir2_data_make_free( */ void xfs_dir2_data_use_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ @@ -938,7 +931,7 @@ xfs_dir2_data_use_free( * Look up the entry in the bestfree table. */ oldlen = be16_to_cpu(dup->length); - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); dfp = xfs_dir2_data_freefind(hdr, bf, dup); ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); /* @@ -970,7 +963,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(oldlen - len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -998,7 +991,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -1026,13 +1019,13 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); newdup2 = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup2->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup2->length = cpu_to_be16(oldlen - len - be16_to_cpu(newdup->length)); *xfs_dir2_data_unused_tag_p(newdup2) = cpu_to_be16((char *)newdup2 - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup2); + xfs_dir2_data_log_unused(args, bp, newdup2); /* * If the old entry was in the table, we need to scan * if the 3rd entry was valid, since these entries diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index e517bd0..fb0aad4 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -41,9 +41,10 @@ */ static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, - int first, int last); -static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args, + struct xfs_buf *bp, int first, int last); +static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args, + struct xfs_buf *bp); /* * Check the internal consistency of a leaf1 block. @@ -357,9 +358,9 @@ xfs_dir3_leaf_get_buf( return error; xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (magic == XFS_DIR2_LEAF1_MAGIC) - xfs_dir3_leaf_log_tail(tp, bp); + xfs_dir3_leaf_log_tail(args, bp); *bpp = bp; return 0; } @@ -428,21 +429,21 @@ xfs_dir2_block_to_leaf( leafhdr.count = be32_to_cpu(btp->count); leafhdr.stale = be32_to_cpu(btp->stale); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1); + xfs_dir3_leaf_log_ents(args, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* * Make the space formerly occupied by the leaf entries and block * tail be free. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), @@ -470,10 +471,10 @@ xfs_dir2_block_to_leaf( * Log the data header and leaf bests table. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(args, lbp, 0, 0); return 0; } @@ -811,14 +812,15 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); hdr = dbp->b_addr; bf = dp->d_ops->data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; @@ -849,7 +851,7 @@ xfs_dir2_leaf_addname( /* * Mark the initial part of our freespace in use for the new entry. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -871,8 +873,8 @@ xfs_dir2_leaf_addname( * Need to log the data block's header. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_header(args, dbp); + xfs_dir2_data_log_entry(args, dbp, dep); /* * If the bests table needs to be changed, do it. * Log the change unless we've already done that. @@ -880,7 +882,7 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { bestsp[use_block] = bf[0].length; if (!grown) - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); } lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, @@ -897,8 +899,8 @@ xfs_dir2_leaf_addname( * Log the leaf fields and give up the buffers. */ dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_ents(args, lbp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); return 0; @@ -950,9 +952,9 @@ xfs_dir3_leaf_compact( leafhdr->stale = 0; dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); - xfs_dir3_leaf_log_header(args->trans, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (loglow != -1) - xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args, bp, loglow, to - 1); } /* @@ -1054,7 +1056,7 @@ xfs_dir3_leaf_compact_x1( */ static void xfs_dir3_leaf_log_bests( - xfs_trans_t *tp, /* transaction pointer */ + struct xfs_da_args *args, struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ @@ -1067,10 +1069,11 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstb - (char *)leaf), (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); } @@ -1079,8 +1082,7 @@ xfs_dir3_leaf_log_bests( */ void xfs_dir3_leaf_log_ents( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, int last) @@ -1095,10 +1097,11 @@ xfs_dir3_leaf_log_ents( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ents = dp->d_ops->leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); firstlep = &ents[first]; lastlep = &ents[last]; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -1107,8 +1110,7 @@ xfs_dir3_leaf_log_ents( */ void xfs_dir3_leaf_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -1118,8 +1120,9 @@ xfs_dir3_leaf_log_header( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - dp->d_ops->leaf_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)&leaf->hdr - (char *)leaf), + args->dp->d_ops->leaf_hdr_size - 1); } /* @@ -1127,21 +1130,20 @@ xfs_dir3_leaf_log_header( */ STATIC void xfs_dir3_leaf_log_tail( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - struct xfs_mount *mp = tp->t_mountp; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); - xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dir_geo->blksize - 1)); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); + xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf), + (uint)(args->geo->blksize - 1)); } /* @@ -1395,7 +1397,7 @@ xfs_dir2_leaf_removename( /* * Mark the former data entry unused. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -1403,10 +1405,10 @@ xfs_dir2_leaf_removename( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index); + xfs_dir3_leaf_log_ents(args, lbp, index, index); /* * Scan the freespace in the data block again if necessary, @@ -1415,14 +1417,14 @@ xfs_dir2_leaf_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ if (be16_to_cpu(bf[0].length) != oldbest) { bestsp[db] = bf[0].length; - xfs_dir3_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(args, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1463,8 +1465,9 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] = cpu_to_be16(NULLDATAOFF); } @@ -1527,7 +1530,7 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); tp = args->trans; - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); xfs_dir3_leaf_check(dp, lbp); xfs_trans_brelse(tp, lbp); return 0; @@ -1648,8 +1651,8 @@ xfs_dir2_leaf_trim_data( bestsp = xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } @@ -1795,9 +1798,9 @@ xfs_dir2_node_to_leaf( freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); xfs_dir3_leaf_check(dp, lbp); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index de5b2996..cd0bb58 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -241,8 +241,7 @@ xfs_dir3_free_get_buf( */ STATIC void xfs_dir2_free_log_bests( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ @@ -251,10 +250,10 @@ xfs_dir2_free_log_bests( __be16 *bests; free = bp->b_addr; - bests = dp->d_ops->free_bests_p(free); + bests = args->dp->d_ops->free_bests_p(free); ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)&bests[first] - (char *)free), (uint)((char *)&bests[last] - (char *)free + sizeof(bests[0]) - 1)); @@ -265,8 +264,7 @@ xfs_dir2_free_log_bests( */ static void xfs_dir2_free_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -276,7 +274,8 @@ xfs_dir2_free_log_header( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->free_hdr_size - 1); } /* @@ -350,8 +349,8 @@ xfs_dir2_leaf_to_node( freehdr.nvalid = be32_to_cpu(ltp->bestcount); dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_bests(args, fbp, 0, freehdr.nvalid - 1); + xfs_dir2_free_log_header(args, fbp); /* * Converting the leaf to a leafnode is just a matter of changing the @@ -365,7 +364,7 @@ xfs_dir2_leaf_to_node( leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); xfs_dir3_leaf_check(dp, lbp); return 0; } @@ -455,8 +454,8 @@ xfs_dir2_leafn_add( args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); - xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, bp); + xfs_dir3_leaf_log_ents(args, bp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, bp); return 0; } @@ -851,7 +850,6 @@ xfs_dir3_leafn_moveents( int start_d,/* destination leaf index */ int count) /* count of leaves to copy */ { - struct xfs_trans *tp = args->trans; int stale; /* count stale leaves copied */ trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); @@ -870,7 +868,7 @@ xfs_dir3_leafn_moveents( if (start_d < dhdr->count) { memmove(&dents[start_d + count], &dents[start_d], (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count, + xfs_dir3_leaf_log_ents(args, bp_d, start_d + count, count + dhdr->count - 1); } /* @@ -892,8 +890,7 @@ xfs_dir3_leafn_moveents( */ memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, - start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(args, bp_d, start_d, start_d + count - 1); /* * If there are source entries after the ones we copied, @@ -902,8 +899,7 @@ xfs_dir3_leafn_moveents( if (start_s + count < shdr->count) { memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_s, - start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(args, bp_s, start_s, start_s + count - 1); } /* @@ -1039,8 +1035,8 @@ xfs_dir2_leafn_rebalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); - xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); - xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); + xfs_dir3_leaf_log_header(args, blk1->bp); + xfs_dir3_leaf_log_header(args, blk2->bp); xfs_dir3_leaf_check(dp, blk1->bp); xfs_dir3_leaf_check(dp, blk2->bp); @@ -1083,7 +1079,6 @@ xfs_dir3_data_block_free( struct xfs_buf *fbp, int longest) { - struct xfs_trans *tp = args->trans; int logfree = 0; __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; @@ -1097,7 +1092,7 @@ xfs_dir3_data_block_free( * value. */ bests[findex] = cpu_to_be16(longest); - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1125,7 +1120,7 @@ xfs_dir3_data_block_free( } dp->d_ops->free_hdr_to_disk(free, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); /* * If there are no useful entries left in the block, get rid of the @@ -1149,7 +1144,7 @@ xfs_dir3_data_block_free( /* Log the free entry that changed, unless we got rid of it. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1211,10 +1206,10 @@ xfs_dir2_leafn_remove( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, bp, index, index); + xfs_dir3_leaf_log_ents(args, bp, index, index); /* * Make the data entry free. Keep track of the longest freespace @@ -1226,7 +1221,7 @@ xfs_dir2_leafn_remove( bf = dp->d_ops->data_bestfree_p(hdr); longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, dbp, off, + xfs_dir2_data_make_free(args, dbp, off, dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. @@ -1235,7 +1230,7 @@ xfs_dir2_leafn_remove( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update @@ -1569,8 +1564,8 @@ xfs_dir2_leafn_unbalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); - xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); - xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); + xfs_dir3_leaf_log_header(args, save_blk->bp); + xfs_dir3_leaf_log_header(args, drop_blk->bp); xfs_dir3_leaf_check(dp, save_blk->bp); xfs_dir3_leaf_check(dp, drop_blk->bp); @@ -1931,7 +1926,7 @@ xfs_dir2_node_addname_int( if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { freehdr.nused++; dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); } /* * Update the real value in the table. @@ -1975,7 +1970,7 @@ xfs_dir2_node_addname_int( /* * Mark the first part of the unused space, inuse for us. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -1988,7 +1983,7 @@ xfs_dir2_node_addname_int( dp->d_ops->data_put_ftype(dep, args->filetype); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); /* * Rescan the block for bestfree if needed. */ @@ -1998,7 +1993,7 @@ xfs_dir2_node_addname_int( * Log the data block header if needed. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the freespace entry is now wrong, update it. */ @@ -2011,7 +2006,7 @@ xfs_dir2_node_addname_int( * Log the freespace entry if needed. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); /* * Return the data block and offset in args, then drop the data block. */ @@ -2208,8 +2203,7 @@ xfs_dir2_node_replace( */ dep->inumber = cpu_to_be64(inum); args->dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, args->dp, - state->extrablk.bp, dep); + xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); rval = 0; } /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 2429960..07bfb4b 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -77,9 +77,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); -extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_ents(struct xfs_da_args *args, struct xfs_buf *bp, int first, int last); -extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_header(struct xfs_da_args *args, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:07 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE2DA7F9A for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50500AC009 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:06 -0700 (PDT) X-ASG-Debug-ID: 1399537196-04bdf02b8d3f5e50005-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 6sNjKWShWA6lz7KX for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:04 -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: AodKAN48a1N5LL1sPGdsb2JhbABZgwZPh3ijbg8BAQabHhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhAz3qFVo1CBJpziUSLQys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001j0-8r for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wa-86 for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 08/18] xfs: convert directory segment limits to xfs_da_geometry Date: Thu, 8 May 2014 18:19:38 +1000 X-ASG-Orig-Subj: [PATCH 08/18] xfs: convert directory segment limits to xfs_da_geometry Message-Id: <1399537188-26509-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537203 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 22 +++++++++++----------- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_data.c | 9 +++++---- fs/xfs/xfs_dir2_leaf.c | 12 ++++++------ fs/xfs/xfs_dir2_readdir.c | 18 +++++++++--------- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_mount.h | 3 --- 8 files changed, 37 insertions(+), 39 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4db5102..8621202 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -598,7 +598,7 @@ xfs_da3_root_split( * Set up the new root node. */ error = xfs_da3_node_create(args, - (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, + (args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0, level + 1, &bp, args->whichfork); if (error) return error; @@ -616,10 +616,10 @@ xfs_da3_root_split( #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - ASSERT(blk1->blkno >= mp->m_dirleafblk && - blk1->blkno < mp->m_dirfreeblk); - ASSERT(blk2->blkno >= mp->m_dirleafblk && - blk2->blkno < mp->m_dirfreeblk); + ASSERT(blk1->blkno >= args->geo->leafblk && + blk1->blkno < args->geo->freeblk); + ASSERT(blk2->blkno >= args->geo->leafblk && + blk2->blkno < args->geo->freeblk); } #endif @@ -894,8 +894,8 @@ xfs_da3_node_add( ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= state->mp->m_dirleafblk && - newblk->blkno < state->mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->args->geo->leafblk && + newblk->blkno < state->args->geo->freeblk); /* * We may need to make some room before we insert the new node. @@ -1472,7 +1472,7 @@ xfs_da3_node_lookup_int( * Descend thru the B-tree searching each level for the right * node to use, until the right hashval is found. */ - blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0; + blkno = (args->whichfork == XFS_DATA_FORK)? args->geo->leafblk : 0; for (blk = &state->path.blk[0], state->path.active = 1; state->path.active <= XFS_DA_NODE_MAXDEPTH; blk++, state->path.active++) { @@ -2096,7 +2096,7 @@ xfs_da_grow_inode( trace_xfs_da_grow_inode(args); if (args->whichfork == XFS_DATA_FORK) { - bno = args->dp->i_mount->m_dirleafblk; + bno = args->geo->leafblk; count = args->dp->i_mount->m_dirblkfsbs; } else { bno = 0; @@ -2158,7 +2158,7 @@ xfs_da3_swap_lastblock( w = args->whichfork; ASSERT(w == XFS_DATA_FORK); mp = dp->i_mount; - lastoff = mp->m_dirfreeblk; + lastoff = args->geo->freeblk; error = xfs_bmap_last_before(tp, dp, &lastoff, w); if (error) return error; @@ -2247,7 +2247,7 @@ xfs_da3_swap_lastblock( sizeof(sib_info->back))); sib_buf = NULL; } - par_blkno = mp->m_dirleafblk; + par_blkno = args->geo->leafblk; level = -1; /* * Walk down the tree looking for the parent of the moved block. diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 61011b7..d8f4d43 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -671,7 +671,7 @@ xfs_dir2_isleaf( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); return 0; } @@ -744,7 +744,7 @@ xfs_dir2_shrink_inode( */ return error; } - if (db == mp->m_dirdatablk) + if (db == args->geo->datablk) ASSERT(bno == 0); else ASSERT(bno > 0); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index bc08216..d950cde 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -136,7 +136,7 @@ xfs_dir3_block_read( struct xfs_mount *mp = dp->i_mount; int err; - err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); @@ -969,7 +969,7 @@ xfs_dir2_leaf_to_block( * Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp); if (error) return error; } @@ -1034,7 +1034,7 @@ xfs_dir2_leaf_to_block( /* * Pitch the old leaf block. */ - error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); + error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index d355ec7..6c23f86 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -63,8 +63,10 @@ __xfs_dir3_data_check( int stale; /* count of stale leaves */ struct xfs_name name; const struct xfs_dir_ops *ops; + struct xfs_da_geometry *geo; mp = bp->b_target->bt_mount; + geo = mp->m_dir_geo; /* * We can be passed a null dp here from a verifier, so we need to go the @@ -172,10 +174,9 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, - mp->m_dirdatablk, - (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)hdr)); + addr = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + (xfs_dir2_data_aoff_t) + ((char *)dep - (char *)hdr)); name.name = dep->name; name.len = dep->namelen; hash = mp->m_dirnameops->hashname(&name); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 2b3ddd0..3eb8b24 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -641,7 +641,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1232,7 +1232,7 @@ xfs_dir2_leaf_lookup_int( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1429,7 +1429,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) == mp->m_dirblksize - dp->d_ops->data_entry_offset) { - ASSERT(db != mp->m_dirdatablk); + ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* * Nope, can't get rid of it because it caused @@ -1470,7 +1470,7 @@ xfs_dir2_leaf_removename( /* * If the data block was not the first one, drop it. */ - else if (db != mp->m_dirdatablk) + else if (db != args->geo->datablk) dbp = NULL; xfs_dir3_leaf_check(dp, lbp); @@ -1722,7 +1722,7 @@ xfs_dir2_node_to_leaf( * that may have been left behind during no-space-reservation * operations. */ - while (fo > mp->m_dirfreeblk) { + while (fo > args->geo->freeblk) { if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) { return error; } @@ -1752,7 +1752,7 @@ xfs_dir2_node_to_leaf( /* * Read the freespace block. */ - error = xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); + error = xfs_dir2_free_read(tp, dp, args->geo->freeblk, &fbp); if (error) return error; free = fbp->b_addr; diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index c2a6387..0c8c09c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -111,18 +111,18 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; /* * Precalculate offsets for . and .. as we will always need them. * * XXX(hch): the second argument is sometimes 0 and sometimes - * mp->m_dirdatablk. + * geo->datablk */ - dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dotdot_offset); /* @@ -151,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -168,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; return 0; } @@ -199,7 +199,7 @@ xfs_dir2_block_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -248,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -268,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 4dc4193..10f4c2a 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -247,7 +247,7 @@ xfs_dir2_block_to_sf( /* now we are done with the block, we can shrink the inode */ logflags = XFS_ILOG_CORE; - error = xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp); + error = xfs_dir2_shrink_inode(args, args->geo->datablk, bp); if (error) { ASSERT(error != ENOSPC); goto out; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 27cce7b..0a32de0 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -156,9 +156,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:07 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 85F037F7E for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B1368F804B for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:07 -0700 (PDT) X-ASG-Debug-ID: 1399537195-04bdf02b8b3f5e40007-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 8VKQsnYPSKzf3jvA for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:03 -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: AmhKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFGgEMLzMIGDE5AwcUGYhAz3qFVo1CBKQ3i0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:54 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001j3-9y for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006wk-99 for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 10/18] xfs: convert m_dirblksize to xfs_da_geometry Date: Thu, 8 May 2014 18:19:40 +1000 X-ASG-Orig-Subj: [PATCH 10/18] xfs: convert m_dirblksize to xfs_da_geometry Message-Id: <1399537188-26509-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537203 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_da_btree.h | 8 ++++---- fs/xfs/xfs_da_format.c | 36 ++++++++++++++++++------------------ fs/xfs/xfs_dir2.c | 6 +++--- fs/xfs/xfs_dir2.h | 10 ++++++---- fs/xfs/xfs_dir2_block.c | 32 ++++++++++++++++---------------- fs/xfs/xfs_dir2_data.c | 17 ++++++++++------- fs/xfs/xfs_dir2_leaf.c | 35 ++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 42 ++++++++++++++++++++++-------------------- fs/xfs/xfs_dir2_readdir.c | 11 +++++------ fs/xfs/xfs_dir2_sf.c | 14 ++++++++------ fs/xfs/xfs_fsops.c | 4 +++- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_trans_resv.c | 2 +- 14 files changed, 116 insertions(+), 106 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4d0a1e8..b9b007d 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2169,8 +2169,8 @@ xfs_da3_swap_lastblock( /* * Copy the last block into the dead buffer and log it. */ - memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); - xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); + memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); + xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); dead_info = dead_buf->b_addr; /* * Get values from the moved block. diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index ce2580c..55417be 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -277,17 +277,17 @@ xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) * Directory tail pointer accessor functions. Based on block geometry. */ static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +xfs_dir2_block_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_data_hdr *hdr) { return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; + ((char *)hdr + geo->blksize)) - 1; } static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp) { return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - + ((char *)lp + geo->blksize - sizeof(struct xfs_dir2_leaf_tail)); } diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index c782f2c..d70c05b 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -426,9 +426,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * Directory Leaf block operations */ static int -xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +xfs_dir2_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -439,9 +439,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) } static int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp) +xfs_dir3_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -592,9 +592,9 @@ xfs_da3_node_hdr_to_disk( * Directory free space block operations */ static int -xfs_dir2_free_max_bests(struct xfs_mount *mp) +xfs_dir2_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -608,25 +608,25 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir2_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir2_free_max_bests(mp); + return db % xfs_dir2_free_max_bests(geo); } static int -xfs_dir3_free_max_bests(struct xfs_mount *mp) +xfs_dir3_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -640,19 +640,19 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir3_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir3_free_max_bests(mp); + return db % xfs_dir3_free_max_bests(geo); } static void diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index d74c292..6e8107c 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -650,8 +650,8 @@ xfs_dir2_isblock( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); + rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; + ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); *vp = rval; return 0; } @@ -671,7 +671,7 @@ xfs_dir2_isleaf( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == mp->m_dir_geo->leafblk + mp->m_dir_geo->blksize; return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 7b09ef0..85f6be6 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -80,7 +80,7 @@ struct xfs_dir_ops { struct xfs_dir3_icleaf_hdr *from); void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, struct xfs_dir2_leaf *from); - int (*leaf_max_ents)(struct xfs_mount *mp); + int (*leaf_max_ents)(struct xfs_da_geometry *geo); struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); @@ -97,10 +97,12 @@ struct xfs_dir_ops { struct xfs_dir3_icfree_hdr *from); void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, struct xfs_dir2_free *from); - int (*free_max_bests)(struct xfs_mount *mp); + int (*free_max_bests)(struct xfs_da_geometry *geo); __be16 * (*free_bests_p)(struct xfs_dir2_free *free); - xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db); - int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db); + xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); + int (*db_to_fdindex)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); }; extern const struct xfs_dir_ops * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index d950cde..4204df9 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -377,7 +377,7 @@ xfs_dir2_block_addname( * Set up pointers to parts of the block. */ hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -581,7 +581,7 @@ xfs_dir2_block_log_leaf( xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); blp = xfs_dir2_block_leaf_p(btp); xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); @@ -598,7 +598,7 @@ xfs_dir2_block_log_tail( xfs_dir2_data_hdr_t *hdr = bp->b_addr; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), (uint)((char *)(btp + 1) - (char *)hdr - 1)); } @@ -633,7 +633,7 @@ xfs_dir2_block_lookup( mp = dp->i_mount; hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Get the offset from the leaf entry, to point to the data. @@ -686,7 +686,7 @@ xfs_dir2_block_lookup_int( hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Loop doing a binary search for our hash value. @@ -791,7 +791,7 @@ xfs_dir2_block_removename( tp = args->trans; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry using the leaf entry. @@ -867,7 +867,7 @@ xfs_dir2_block_replace( dp = args->dp; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry we need to change. @@ -941,7 +941,7 @@ xfs_dir2_leaf_to_block( leaf = lbp->b_addr; dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); @@ -951,13 +951,13 @@ xfs_dir2_leaf_to_block( * been left behind during no-space-reservation operations. * These will show up in the leaf bests table. */ - while (dp->i_d.di_size > mp->m_dirblksize) { + while (dp->i_d.di_size > args->geo->blksize) { int hdrsz; hdrsz = dp->d_ops->data_entry_offset; bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == - mp->m_dirblksize - hdrsz) { + args->geo->blksize - hdrsz) { if ((error = xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -985,7 +985,7 @@ xfs_dir2_leaf_to_block( /* * Look at the last data entry. */ - tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; + tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1; dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); /* * If it's not free or is too short we can't do it. @@ -1004,12 +1004,12 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, mp->m_dirblksize - size, size, + xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); @@ -1143,13 +1143,13 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, - &needscan); + xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + i, &needlog, &needscan); ASSERT(needscan == 0); /* * Fill in the tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ btp->stale = 0; blp = xfs_dir2_block_leaf_p(btp); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 6c23f86..b73d61a 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -80,7 +80,7 @@ __xfs_dir3_data_check( switch (hdr->magic) { case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; @@ -96,7 +96,7 @@ __xfs_dir3_data_check( break; case cpu_to_be32(XFS_DIR3_DATA_MAGIC): case cpu_to_be32(XFS_DIR2_DATA_MAGIC): - endp = (char *)hdr + mp->m_dirblksize; + endp = (char *)hdr + geo->blksize; break; default: XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); @@ -511,6 +511,7 @@ xfs_dir2_data_freescan( struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ + struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -529,10 +530,10 @@ xfs_dir2_data_freescan( p = (char *)dp->d_ops->data_entry_p(hdr); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else - endp = (char *)hdr + dp->i_mount->m_dirblksize; + endp = (char *)hdr + geo->blksize; /* * Loop over the block's entries. */ @@ -622,7 +623,7 @@ xfs_dir3_data_init( dup = dp->d_ops->data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset; + t = args->geo->blksize - (uint)dp->d_ops->data_entry_offset; bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); @@ -732,22 +733,24 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; + struct xfs_da_geometry *geo; mp = tp->t_mountp; hdr = bp->b_addr; + geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + mp->m_dirblksize; + endptr = (char *)hdr + geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index a1f1310..e517bd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -92,6 +92,7 @@ xfs_dir3_leaf_check_int( int i; const struct xfs_dir_ops *ops; struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * we can be passed a null dp here from a verifier, so we need to go the @@ -105,14 +106,14 @@ xfs_dir3_leaf_check_int( } ents = ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(geo, leaf); /* * XXX (dgc): This value is not restrictive enough. * Should factor in the size of the bests table as well. * We can deduce a value for that from di_size. */ - if (hdr->count > ops->leaf_max_ents(mp)) + if (hdr->count > ops->leaf_max_ents(geo)) return false; /* Leaves and bests don't overlap in leaf format. */ @@ -323,7 +324,7 @@ xfs_dir3_leaf_init( if (type == XFS_DIR2_LEAF1_MAGIC) { struct xfs_dir2_leaf_tail *ltp; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); @@ -415,7 +416,7 @@ xfs_dir2_block_to_leaf( leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = dp->d_ops->data_bestfree_p(hdr); ents = dp->d_ops->leaf_ents_p(leaf); @@ -443,7 +444,7 @@ xfs_dir2_block_to_leaf( */ xfs_dir2_data_make_free(tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), - (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), &needlog, &needscan); /* @@ -461,7 +462,7 @@ xfs_dir2_block_to_leaf( /* * Set up leaf tail and bests table. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(1); bestsp = xfs_dir2_leaf_bests_p(ltp); bestsp[0] = bf[0].length; @@ -653,7 +654,7 @@ xfs_dir2_leaf_addname( */ index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ents = dp->d_ops->leaf_ents_p(leaf); dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); @@ -1066,7 +1067,7 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), @@ -1138,9 +1139,9 @@ xfs_dir3_leaf_log_tail( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dirblksize - 1)); + (uint)(mp->m_dir_geo->blksize - 1)); } /* @@ -1388,7 +1389,7 @@ xfs_dir2_leaf_removename( xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) == oldbest); /* @@ -1428,7 +1429,7 @@ xfs_dir2_leaf_removename( * If the data block is now empty then get rid of the data block. */ if (be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset) { + args->geo->blksize - dp->d_ops->data_entry_offset) { ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1618,7 +1619,7 @@ xfs_dir2_leaf_trim_data( return error; leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); #ifdef DEBUG { @@ -1628,7 +1629,7 @@ xfs_dir2_leaf_trim_data( ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); ASSERT(be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset); + args->geo->blksize - dp->d_ops->data_entry_offset); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif @@ -1740,7 +1741,7 @@ xfs_dir2_node_to_leaf( /* * If it's not the single leaf block, give up. */ - if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) + if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize) return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; @@ -1764,7 +1765,7 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) { xfs_trans_brelse(tp, fbp); return 0; } @@ -1784,7 +1785,7 @@ xfs_dir2_node_to_leaf( /* * Set up the leaf tail from the freespace block. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(freehdr.nvalid); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 89777bf..ef34c19 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -327,9 +327,9 @@ xfs_dir2_leaf_to_node( free = fbp->b_addr; dp->d_ops->free_hdr_from_disk(&freehdr, free); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(be32_to_cpu(ltp->bestcount) <= - (uint)dp->i_d.di_size / mp->m_dirblksize); + (uint)dp->i_d.di_size / args->geo->blksize); /* * Copy freespace entries from the leaf block to the new block. @@ -416,7 +416,7 @@ xfs_dir2_leafn_add( * a compact. */ - if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { + if (leafhdr.count == dp->d_ops->leaf_max_ents(args->geo)) { if (!leafhdr.stale) return XFS_ERROR(ENOSPC); compact = leafhdr.stale > 1; @@ -472,7 +472,8 @@ xfs_dir2_free_hdr_check( dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); - ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0); + ASSERT((hdr.firstdb % + dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } @@ -595,7 +596,7 @@ xfs_dir2_leafn_lookup_for_addname( * Convert the data block to the free block * holding its freespace information. */ - newfdb = dp->d_ops->db_to_fdb(mp, newdb); + newfdb = dp->d_ops->db_to_fdb(args->geo, newdb); /* * If it's not the one we have in hand, read it in. */ @@ -619,7 +620,7 @@ xfs_dir2_leafn_lookup_for_addname( /* * Get the index for our entry. */ - fi = dp->d_ops->db_to_fdindex(mp, curdb); + fi = dp->d_ops->db_to_fdindex(args->geo, curdb); /* * If it has room, return it. */ @@ -1251,7 +1252,7 @@ xfs_dir2_leafn_remove( * Convert the data block number to a free block, * read in the free block. */ - fdb = dp->d_ops->db_to_fdb(mp, db); + fdb = dp->d_ops->db_to_fdb(args->geo, db); error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(args->geo, fdb), &fbp); @@ -1262,7 +1263,7 @@ xfs_dir2_leafn_remove( { struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); - ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * + ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(args->geo) * (fdb - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET))); } @@ -1270,13 +1271,13 @@ xfs_dir2_leafn_remove( /* * Calculate which entry we need to fix. */ - findex = dp->d_ops->db_to_fdindex(mp, db); + findex = dp->d_ops->db_to_fdindex(args->geo, db); longest = be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest == mp->m_dirblksize - + if (longest == args->geo->blksize - dp->d_ops->data_entry_offset) { /* * Try to punch out the data block. @@ -1595,7 +1596,7 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = state->args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Look up the name. We're not supposed to find it, but @@ -1843,7 +1844,7 @@ xfs_dir2_node_addname_int( * Get the freespace block corresponding to the data block * that was just allocated. */ - fbno = dp->d_ops->db_to_fdb(mp, dbno); + fbno = dp->d_ops->db_to_fdb(args->geo, dbno); error = xfs_dir2_free_try_read(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), &fbp); @@ -1860,12 +1861,13 @@ xfs_dir2_node_addname_int( if (error) return error; - if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) { + if (dp->d_ops->db_to_fdb(args->geo, dbno) != fbno) { xfs_alert(mp, "%s: dir ino %llu needed freesp block %lld for\n" " data block %lld, got %lld ifbno %llu lastfbno %d", __func__, (unsigned long long)dp->i_ino, - (long long)dp->d_ops->db_to_fdb(mp, dbno), + (long long)dp->d_ops->db_to_fdb( + args->geo, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { @@ -1899,7 +1901,7 @@ xfs_dir2_node_addname_int( freehdr.firstdb = (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * - dp->d_ops->free_max_bests(mp); + dp->d_ops->free_max_bests(args->geo); } else { free = fbp->b_addr; bests = dp->d_ops->free_bests_p(free); @@ -1909,13 +1911,13 @@ xfs_dir2_node_addname_int( /* * Set the freespace block index from the data block number. */ - findex = dp->d_ops->db_to_fdindex(mp, dbno); + findex = dp->d_ops->db_to_fdindex(args->geo, dbno); /* * If it's after the end of the current entries in the * freespace block, extend that table. */ if (findex >= freehdr.nvalid) { - ASSERT(findex < dp->d_ops->free_max_bests(mp)); + ASSERT(findex < dp->d_ops->free_max_bests(args->geo)); freehdr.nvalid = findex + 1; /* * Tag new entry so nused will go up. @@ -2040,7 +2042,7 @@ xfs_dir2_node_lookup( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Fill in the path to the entry in the cursor. @@ -2095,7 +2097,7 @@ xfs_dir2_node_removename( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* Look up the entry we're deleting, set up the cursor. */ @@ -2165,7 +2167,7 @@ xfs_dir2_node_replace( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; inum = args->inumber; /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8cb5340..fa393d5 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -216,7 +216,7 @@ xfs_dir2_block_getdents( /* * Set up values for the loop. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); @@ -338,7 +338,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + mp->m_dirblksize, + mip->ra_want = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize) - 1; ASSERT(mip->ra_want >= 0); @@ -526,8 +526,7 @@ xfs_dir2_leaf_getdents( * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + mp->m_dirblksize, - mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -557,7 +556,7 @@ xfs_dir2_leaf_getdents( * If we have no buffer, or we're off the end of the * current buffer, need to get another one. */ - if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { + if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, &curoff, &bp); @@ -618,7 +617,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_db_off_to_byte(geo, xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); - if (ptr >= (char *)hdr + mp->m_dirblksize) { + if (ptr >= (char *)hdr + geo->blksize) { continue; } } diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 10f4c2a..53c3be6 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -82,8 +82,10 @@ xfs_dir2_block_sfsize( xfs_ino_t parent = 0; /* parent inode number */ int size=0; /* total computed size */ int has_ftype; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * if there is a filetype field, add the extra byte to the namelen @@ -92,7 +94,7 @@ xfs_dir2_block_sfsize( has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; count = i8count = namelen = 0; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -105,7 +107,7 @@ xfs_dir2_block_sfsize( * Calculate the pointer to the entry at hand. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); + xfs_dir2_dataptr_to_off(geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. @@ -195,7 +197,7 @@ xfs_dir2_block_to_sf( /* * Set up to loop over the block's entries. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); @@ -586,7 +588,7 @@ xfs_dir2_sf_addname_pick( * we'll go back, convert to block, then try the insert and convert * to leaf. */ - if (used + (holefit ? 0 : size) > mp->m_dirblksize) + if (used + (holefit ? 0 : size) > args->geo->blksize) return 0; /* * If changing the inode number size, do it the hard way. @@ -601,7 +603,7 @@ xfs_dir2_sf_addname_pick( /* * If it won't fit at the end then do it the hard way (use the hole). */ - if (used + size > mp->m_dirblksize) + if (used + size > args->geo->blksize) return 2; /* * Do it the easy way. @@ -652,7 +654,7 @@ xfs_dir2_sf_check( ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); } #endif /* DEBUG */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 97886a7..d229556 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -24,6 +24,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -105,7 +107,7 @@ xfs_fs_geometry( geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; - geo->dirblocksize = mp->m_dirblksize; + geo->dirblocksize = mp->m_dir_geo->blksize; } if (new_version >= 4) { geo->flags |= diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a23e7b6..4e3f6ce 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -154,7 +154,6 @@ typedef struct xfs_mount { const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ - int m_dirblksize; /* directory block sz--bytes */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 63a42a1..f2bda7c 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -610,7 +610,7 @@ xfs_calc_addafork_reservation( return XFS_DQUOT_LOGRES(mp) + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), -- 1.9.0 From dave@fromorbit.com Thu May 8 03:20:08 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A9F567FB2 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:20:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2AAA6AC007 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:20:05 -0700 (PDT) X-ASG-Debug-ID: 1399537194-04cb6c728f3e1110006-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1HC0B4SMMz3Zt0WC for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:20:03 -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: AmdKAN48a1N5LL1sPGdsb2JhbABZgwaIR6N9AQEGmx4XAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBkZiCfPeoVWjUIElUCOd4tDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 08 May 2014 17:49:55 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiJYV-0001jG-C6 for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiJYV-0006x4-BI for xfs@oss.sgi.com; Thu, 08 May 2014 18:19:51 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 14/18] xfs: move node entry counts to xfs_da_geometry Date: Thu, 8 May 2014 18:19:44 +1000 X-ASG-Orig-Subj: [PATCH 14/18] xfs: move node entry counts to xfs_da_geometry Message-Id: <1399537188-26509-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399537188-26509-1-git-send-email-david@fromorbit.com> References: <1399537188-26509-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399537202 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.5634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 8 ++++---- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_dir2_node.c | 10 +++++----- fs/xfs/xfs_mount.h | 2 -- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 50159d3..28b6bb3 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -995,7 +995,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name already exists, and get back a pointer @@ -1174,7 +1174,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); if (error) @@ -1266,7 +1266,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state->args = args; state->mp = dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. @@ -1529,7 +1529,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state->args = args; state->mp = args->dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index b9b007d..f935370 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -167,8 +167,8 @@ xfs_da3_node_verify( * we don't know if the node is for and attribute or directory tree, * so only fail if the count is outside both bounds */ - if (ichdr.count > mp->m_dir_node_ents && - ichdr.count > mp->m_attr_node_ents) + if (ichdr.count > mp->m_dir_geo->node_ents && + ichdr.count > mp->m_attr_geo->node_ents) return false; /* XXX: hash order check? */ diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index cd0bb58..65df8cb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1591,8 +1591,8 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->blocksize = args->geo->blksize; + state->node_ents = args->geo->node_ents; /* * Look up the name. We're not supposed to find it, but * this gives us the insertion point. @@ -2038,7 +2038,7 @@ xfs_dir2_node_lookup( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* * Fill in the path to the entry in the cursor. */ @@ -2093,7 +2093,7 @@ xfs_dir2_node_removename( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* Look up the entry we're deleting, set up the cursor. */ error = xfs_da3_node_lookup_int(state, &rval); @@ -2163,7 +2163,7 @@ xfs_dir2_node_replace( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; inum = args->inumber; /* * Lookup the entry to change in the btree. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 78ae7e4..7295a0b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -134,8 +134,6 @@ typedef struct xfs_mount { int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ -- 1.9.0 From vietnamrecruit007@gmail.com Thu May 8 03:31:44 2014 Return-Path: <vietnamrecruit007@gmail.com> 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 2D6677F5E for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:31:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D0B6304053 for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:31:44 -0700 (PDT) X-ASG-Debug-ID: 1399537900-04cbb03cc63cb5d0001-NocioJ Received: from mail-lb0-f194.google.com (mail-lb0-f194.google.com [209.85.217.194]) by cuda.sgi.com with ESMTP id 24YpiroSHDQLJHeb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:31:41 -0700 (PDT) X-Barracuda-Envelope-From: vietnamrecruit007@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.194] Received: by mail-lb0-f194.google.com with SMTP id 10so832522lbg.9 for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:31:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.194] 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=uM9MX14iQW+z2YC+DzSmOQ5oNPN5sSUsjPEoXzCj558=; b=EeyOBt2Rz7DcUO5aMlXx1oIVjGviG0Vh8rA/B1U9N0NXUdm28d4kMCBzuuOOEqKw+e us67Sa1yF2p37RyegYx11S4dF43wseJ/HyX4d/rsHqM1gcPYAZ2bhnqLiAxAqdf3QN9b 1SFZUifv2Xqy+vaC3PTts7M0H1J0HwbkCXjy1AerCBBO4EENsApppnypsJncO/XTtEGu KewAPM03Yk5a8WCE35kdv6UgUUyuh/e1GMErQTOgdSvSkYypYxk/ogDk8IXGzwnoOQOw v2x2s/e/iUtZe1w+TVVOurJkLshQRyUUPrio685fwpNja3aWG3h/yg6PU6ewOGk1Fuyn x8vQ== MIME-Version: 1.0 X-Received: by 10.112.128.131 with SMTP id no3mr882998lbb.57.1399537899638; Thu, 08 May 2014 01:31:39 -0700 (PDT) Received: by 10.114.97.163 with HTTP; Thu, 8 May 2014 01:31:39 -0700 (PDT) Date: Thu, 8 May 2014 15:01:39 +0630 Message-ID: <CANcOUkZ6PdU0ZsmkNZSJqhZn2NqzkF0AquQ3W9AqO0x=tjNWTw@mail.gmail.com> Subject: Manpower Recruitment from Vietnam From: VTC International <vietnamrecruit007@gmail.com> X-ASG-Orig-Subj: Manpower Recruitment from Vietnam To: undisclosed-recipients:; Content-Type: multipart/mixed; boundary=047d7b3a7f0c5eb6c204f8df4f45 X-Barracuda-Connect: mail-lb0-f194.google.com[209.85.217.194] X-Barracuda-Start-Time: 1399537901 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: -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 --047d7b3a7f0c5eb6c204f8df4f45 Content-Type: multipart/alternative; boundary=047d7b3a7f0c5eb6be04f8df4f43 --047d7b3a7f0c5eb6be04f8df4f43 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Attn : General Manager Cc : Human Resources Manager Dear Sir / Ma=E2=80=99am, Greetings from Hanoi, Vietnam!!! We, warmly welcome you to Future Placement Services Co., Ltd. the most professional and reliable manpower recruitment agency based in Hanoi, the commercial capital of Vietnam, and is a wholly owned subsidiary of Viet Thang International Development Corporation registered under the Ministry of Labor War Invalid and Social Affairs. The principle objectives of our company are to facilitate the services of Vietnamese work force worldwide by accessing employment opportunities for them. We have a nation wide recruitment network and in-house testing facilities with all modern equipments where at one time can check around 200 construction workers and 60 welders. Having trusted reputation and extensive experience in recruitment for the last many years, we have the expertise to source what ever positions required. Our specialization is in supplying professionals, skilled, semi =E2=80=93 s= killed and unskilled workers. We have a separate division to source personals to work for oil, gas & petrochemical industry. Our success is based solidly on the ability to understand your manpower needs, and together with our highly qualified staff, comprising of high ranking engineers and technicians we out perform in sourcing the best quality of personnel's required to meet and exceed the clients highest expectation. We would like to be of service to you and will take pride in adding your name to the long list of our prestigious client's. We are just a click away from you, email to us your manpower needs and we will be more than pleased to assist you in your recruitment. Best Regards, Nguyen Van Thanh *Managing Partner* Mob: +84 1233 266 959 *Future Placement Svc's Co., Ltd.* * (Subsidiary of VTC Corp)* *P.O. Box: 406, Hanoi, Vietnam* *Tel : + 84 4 6295 1451* *Fax : + 84 4 6295 1452* *Email : vietnamrecruit786@gmail.com <vietnamrecruit786@gmail.com>* --047d7b3a7f0c5eb6be04f8df4f43 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Attn<span style>=C2=A0=C2=A0=C2= =A0=C2=A0 </span>: General Manager</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Cc<span style>=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 </span>: Human Resources Manager</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Dear Sir / Ma=E2=80=99am,</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Greetings from Hanoi, Vietnam!!!</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">We, warmly welcome you to Future Placement Services Co., Ltd. the most professi= onal and reliable manpower recruitment agency based in Hanoi, the commercial cap= ital of Vietnam, and is a wholly owned subsidiary of Viet Thang International Development Corporation registered under the Ministry of Labor War Invalid = and Social Affairs.</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">The principle objectives of our company are to facilitate the services of Vietnamese work force worldwide by accessing employment opportunities for t= hem.</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">We have a nation wide recruitment network and in-house testing facilities with= all modern equipments where at one time can check around 200 construction worke= rs and 60 welders.</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Having trusted reputation and e= xtensive experience in recruitment for the last many years, we have the expertise to source what ever positions required. </span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Our specialization is in supply= ing professionals, skilled, semi =E2=80=93 skilled and unskilled workers. </spa= n></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">We have a separate division to = source personals to work for oil, gas & petrochemical industry. </span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif""><span style>=C2=A0</span></span= ></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Our success is based solidly on= the ability to understand your manpower needs, and together with our highly qualified staff, comprising of high ranking engineers and technicians we ou= t perform in sourcing the best quality of personnel's required to meet an= d exceed the clients highest expectation.<span style>=C2=A0 </span></span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif""><span style>=C2=A0</span></span= ></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">We would like to be of service = to you and will take pride in adding your name to the long list of our prestigious client's.<span style>=C2=A0 </span></span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif""><span style>=C2=A0=C2=A0=C2=A0= =C2=A0 </span></span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">We are just a click away from y= ou, email to us your manpower needs and we will be more than pleased to assist = you in your recruitment.</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">Best Regards,</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-fam= ily:"Rockwell","serif"">=C2=A0</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-siz= e:12.5pt;font-family:"Rockwell","serif"">Nguyen Van Tha= nh</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-size:12.5pt;font-family:"Rockwell","serif"">Manag= ing Partner</span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><span style=3D"font-siz= e:12.5pt;font-family:"Rockwell","serif"">Mob: +84 1233 = 266 959</span></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-size:13pt;font-family:"Rockwell","serif";color:rg= b(63,129,94)">=C2=A0</span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><b style><span style=3D= "font-size:14pt;font-family:"Rockwell","serif"">Future = Placement Svc's Co., Ltd.</span></b></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-family:"Rockwell","serif""><span style>=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </span><b s= tyle>(Subsidiary of VTC Corp)</b></span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-family:"Rockwell","serif"">P.O. Box: 406, Hanoi, Vietnam</span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-family:"Rockwell","serif"">Tel<span style>=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 </span>: + 84 4 6295 1451</span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-family:"Rockwell","serif"">Fax<span style>=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 </span>: + 84 4 6295 1452</span></i></p> <p class=3D"MsoNormal" style=3D"text-align:justify"><i style><span style=3D= "font-family:"Rockwell","serif"">Email<span style>=C2= =A0 </span>: <a href=3D"mailto:vietnamrecruit786@gmail.com">vietnamrecruit7= 86@gmail.com</a></span></i></p> </div> --047d7b3a7f0c5eb6be04f8df4f43-- --047d7b3a7f0c5eb6c204f8df4f45 Content-Type: image/jpeg; name="image.jpg" Content-Disposition: attachment; filename="image.jpg" Content-Transfer-Encoding: base64 X-Attachment-Id: f_huxrtgbc0 /9j/4AAQSkZJRgABAgEBLAEsAAD/4QycRXhpZgAATU0AKgAAAAgACAESAAMAAAABAAEAAAEaAAUA AAABAAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAExAAIAAAAcAAAAfgEyAAIAAAAUAAAAmgE7 AAIAAAAFAAAArodpAAQAAAABAAAAtAAAAOAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9w IENTMyBXaW5kb3dzADIwMTE6MTI6MTMgMTE6MTQ6NTYAVXNlcgAAAAOgAQADAAAAAQABAACgAgAE AAAAAQAAAQygAwAEAAAAAQAAADEAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABLgEbAAUA AAABAAABNgEoAAMAAAABAAIAAAIBAAQAAAABAAABPgICAAQAAAABAAALVgAAAAAAAABIAAAAAQAA AEgAAAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/ 2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAB0AoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEB AQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIE AgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRai soMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dn d4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi 4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl 9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/AOr+sl+FltdW7LZjjG3eo6121oO4 And/Jc301gZGN1FuHlYm19eJcWXMeaLHOc9uxjGst9RlP2d79n6d6wPrB1G3M6j1Cix59GnMsNbX wdpFj6LHezZ7HtbsZV+Yoftr7N0yrGqhjq4LbAJc2Hb9jHbvo/uV/mJpA62kRVl4V1Vr2ZAdTYyC WmdJ9zf89vuUcjByMNza8jaLHNFga2xr4a7jd6L37H/yXKWXnWXVszH2eptY2Rq4GOBtduds3f4P 6C178TG6h0gury8cZPTa3WPOxlVtwI3Nx6qseyxvpuedldn+k/wabXQfRddOEZGgJDu2v46LT6dl 3Y3Ud4O3a9rXRpw1o/s/SWx036hjN6Zj5P20tyLWCwsDWPqaSJdTurd7vTd7H2Vv9NU39Fy8DJGL msDX7y9padzXM+hXY0/u7G/nfzaIgbFjdbKQovX/ALUoZjfaLnQ0DgauJ/drr/Ocs9xy+p+/qFzM HCe9raMB79hsdwz7Vaxu5zbXWN/Vv9IqzWMYBAJ28cLP6ve4Mr9Z5bVTfVfUxgDnu2b/AFa2sP8A Neo70/09jlJk5EQ9Ql6Td/1ewWjmCdCNdPqrqdnXOp3uw8St9PT6S5lgw7KrbS5vs9Nn2ayxrb2f 6K308bF/wqoWXt6c37O2jdY3cwYzmuGPS2z2OpNlgbd1HMsf78nL/wANb/hfQ9ihWG51u3JLMfEL y99NbSe+97HX1s3u3bt93+ifZ9otWj1TrOF0qo14uTkuuLg+qbYG386vY79E1n7l2z6CiEccfSAa /wAb/GXes6kj8nOfVcwPyOo3w6sBpDnDa0fmtd6c11M1/RY9H8+gNuzOpWtay1+N0zdsdc8/pL3N 932bEYx3u2t+kz+Zp/7Vf4OlDz2PzMinK6j6luO4A4PTmMrosuJ925zcJz2U4vu/SZzv1q6v9FV/ wdwv+yOa7O213uYGVitoZVTX+bi47P8AAVN+l/wn+E/SKSMSdz9StlIVp+DvVV32tf6Nb7BUBv2A v2j+WWINuSK27iSRE6Tx4qx0nAyn9MuyMduO+pzT6ZtNoe4j3O9L0HNb9H+b9vqPsQs/GxKaD6tl zGiA+uyoNv2bN+6um0+u73+zeyv0PzP55W5cz80RpIfL/WYvZlQlXFHrw68P9/8AdcLM65ZB2PO0 naGztcT/AORVA9VzT9F58I38E+f5y0eq9Bpx8Wu7CvfmPyQ1zaQ0utbU4c3emxrqN3/CV/8ABrAv 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 ADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gA AAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAA AAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgAAOEJJTQQCAAAAAAACAAA4 QklNBDAAAAAAAAEBADhCSU0ELQAAAAAABgABAAAAAjhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAA AAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAAM3AAAABgAAAAAAAAAAAAAAMQAAAQwAAAABADIA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQwAAAAxAAAAAAAAAAAAAAAAAAAAAAEA AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAA AAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcA AAAxAAAAAFJnaHRsb25nAAABDAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UA AAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAA AAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBl AAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAA AAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAAMQAAAABSZ2h0bG9uZwAAAQwAAAADdXJsVEVY VAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhU AAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhv cnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51 bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNs aWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0 bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4 QklNBCgAAAAAAAwAAAABP/AAAAAAAAA4QklNBBQAAAAAAAQAAAACOEJJTQQMAAAAAAtyAAAAAQAA AKAAAAAdAAAB4AAANmAAAAtWABgAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFkb2JlX0NNAAH/ 7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBER DAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAdAKADASIAAhEBAxEB/90A BAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAID BAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0 coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl 9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSIT BTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj 80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDq/rJf hZbXVuy2Y4xt3qOtdtaDuAJ3fyXN9NYGRjdRbh5WJtfXiXFlzHmixznPbsYxrLfUZT9ne/Z+nesD 6wdRtzOo9QosefRpzLDW18HaRY+ix3s2ex7W7GVfmKH7a+zdMqxqoY6uC2wCXNh2/Yx276P7lf5i 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 9+/1f3FCCLs3xVrp+n/d9K8j00O/f9Hvf73+C0cuk17LMbqvoveP0THZDKS4GLBVdW8+s6v3t/Vr PZ+k+h+kWVc/HsZuyqm3NprI/V21kl5dtda69m2+233Pc/8AnKrf0f0FvZDvqwMW79tV4Lr97d+y xwvNvs9f1NlLstuTu2ev9l/M+h+eq+W7oZ6gfsVb23yZNNlrqxZPv2erUyp1W76aAI4tq+iaIjvb n9JfgU2PycGh+LlOc7Fw7XEsHq2t/R7HW+o6u36Nf6L37Lv8GjZP1f8AqpQHi7qd9mcXlrOnY9Lv UDj73V/ZbgzIb9L+fvfjUKdowfs9XqGv0Nv6HcNNv/Ba7t3/AE0TqAt/ZlX212ScHX0tzYdtgc+o 82/Zv9F636spZwiDpKJ/uojI9RL6uB9gxWkXYxNV1RDg2w7mafS/S1y1/wDYetLNta/FrqNL3mzY WuaRq0Bz4v8A0b/0rd/6LZ7/APSfzaO37F9kZvA9PcNuvv8Ao+fu2f1fz/5tGb+z4H2ciNdsDT+V t1UcMYkfVOMfMplMjaJL/9k4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8A dABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADMAAAAB ADhCSU0EBgAAAAAABwABAAAAAQEA/+EQQGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94 cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1w bWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4x LWMwMzYgNDYuMjc2NzIwLCBNb24gRmViIDE5IDIwMDcgMjI6NDA6MDggICAgICAgICI+IDxyZGY6 UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5z IyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnBkZj0iaHR0cDovL25zLmFk b2JlLmNvbS9wZGYvMS4zLyIgeG1sbnM6eGFwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv IiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhhcE1N PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6 Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9i ZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4w LyIgcGRmOlByb2R1Y2VyPSJBY3JvYmF0IERpc3RpbGxlciA1LjAgKFdpbmRvd3MpIiB4YXA6Q3Jl YXRlRGF0ZT0iMjAxMS0xMi0xM1QxMToxNDo1NiswNjozMCIgeGFwOk1vZGlmeURhdGU9IjIwMTEt MTItMTNUMTE6MTQ6NTYrMDY6MzAiIHhhcDpNZXRhZGF0YURhdGU9IjIwMTEtMTItMTNUMTE6MTQ6 NTYrMDY6MzAiIHhhcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzIiBk Yzpmb3JtYXQ9ImltYWdlL2pwZWciIHhhcE1NOkluc3RhbmNlSUQ9InV1aWQ6QjM1REFBRTI0NDI1 RTExMUEwNEFCMzQwNkFCRDQ1MTciIHhhcE1NOkRvY3VtZW50SUQ9InV1aWQ6QjI1REFBRTI0NDI1 RTExMUEwNEFCMzQwNkFCRDQ1MTciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJ Q0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgcGhvdG9zaG9wOkhpc3Rvcnk9IiIgdGlmZjpP cmllbnRhdGlvbj0iMSIgdGlmZjpYUmVzb2x1dGlvbj0iMzAwMDAwMC8xMDAwMCIgdGlmZjpZUmVz b2x1dGlvbj0iMzAwMDAwMC8xMDAwMCIgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIgdGlmZjpOYXRp dmVEaWdlc3Q9IjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgz LDI5NiwzMDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyOzE3 REE4QUMwRDc2NDE4OURFOEFGODFDNkQ1QjJGMjQ0IiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjY4 IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDkiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpOYXRp dmVEaWdlc3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEw LDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3 Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2 LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQx NzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkx LDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwx MSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDs2MkIxMjE1 MDc3QUM2MkI2QjU5N0MwQUJFNjJBRTk4MCI+IDxkYzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJkZjps aT5Vc2VyPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC9kYzpjcmVhdG9yPiA8ZGM6dGl0bGU+IDxyZGY6 QWx0PiA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPk1pY3Jvc29mdCBXb3JkIC0gMi5kb2M8 L3JkZjpsaT4gPC9yZGY6QWx0PiA8L2RjOnRpdGxlPiA8eGFwTU06RGVyaXZlZEZyb20gcmRmOnBh cnNlVHlwZT0iUmVzb3VyY2UiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94Onht cG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJS R0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gAB AAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQA AANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJU UkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAx OTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu MQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAk oAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVD IGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl IC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl IC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2lu ZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAA AAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAF AAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQEr ATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoC AwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMW AyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEE fgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYn BjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqB CpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYN QA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBD EGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJ F64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib 2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBs IJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgl lyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysC KzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsx EjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+ YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWa Rd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXC Vg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxe vV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx 8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwh fIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteH O4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCe rp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sC q3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4 WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XI xkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bU SdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb 42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9i ZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwR DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIADEBDAMBIgACEQEDEQH/3QAEABH/xAE/ AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkK CxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWS U/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpam 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 --047d7b3a7f0c5eb6c204f8df4f45 Content-Type: image/jpeg; name="FPS logo.jpg" Content-Disposition: attachment; filename="FPS logo.jpg" Content-Transfer-Encoding: base64 X-Attachment-Id: f_huxrtgbx1 /9j/4AAQSkZJRgABAgEAZABkAAD/4QfdRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dz ADIwMTE6MTI6MTMgMTE6MTc6MDMAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAAZKADAAQAAAAB AAAAIQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAAAanAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAABIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAIQBkAwEiAAIRAQMRAf/dAAQAB//EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A9QQ7ciqlpfa4VsH5zyGj8Vz/ANb/AK0u6NVXTjAOyrxuaTw1 kxvXnd/UOo9UuLsh9uVY78wHT/MCYZgMWTOIHhHql2D6blfXHoGKYdlttd+7UC4/9Hcs23/GLgDT Fxbrz4mAFy2L9WvrFcP0WAKB+9YA0/8AgxegW4llF9mPm9TbjvrMOA9U6+XpMamcUmM5slXw8I7y 9P8A0npbPr31mz+jdKc0eNhJ/wC+MVd31w+tln0KMer4vZ/3+1YJ6f0Nxm/rIPkKbnf9WVcu+rnQ MeqmzI6ttZezfW5tD3AjjWCjZ7rOPLK6lt/Wj/3reP1n+tzj/SMSv+3R/wB+eU37d+trj/ynhs/t Uf8AkVmDpf1XLf8Algie5x3QtCv6mdHuw3ZdfV2Ox2/Ss9OIP7rhuSF9z9qQch2JPX56ZjqP1wsG vV8X/t2kf98Uhb9dnfR6pSfhbV/5FZL+k/VvdDesn+ucZ+z/ADwVb6b9S8PqjHu6f1NtoYdrv0Lm mfvSs9/xUPcsAcR7frHbwsj6wYbHvzM1luQWh7WSzYGuPp17XNb7nucrVXVeri0D12We4sIsNTWy 0b/pVe5Rxfq11TFwPQ9au6ysBrSBqWB3qM+n+cx6JV0vrDrSXMFTd5sLrTW8biAzdtY0fm70vUO7 OBLTf7Xc/aNP7O+36+ns9RJP9gq+w/YYPp7PT+SSk1/D8V+v4P8A/9Db/wAYHRL8ptfUKW+oaG7L Wj93kPW59XOk9Lwen0PwmAmxgLsjXc4nkz9Jv9lbBY1whwkGZHbVV6MKvFJbSdlTjuFY4B/k/upo jqt4IiZnWpbG0d9fivOf8ZAr+3Y20RNZL45mfzl2Jv6422wClj6zZtZ7gCGf6QrDyvqw7OyH5GXg k22EOeRke2T+42U2XgFuWJnAxA3c3p2H1HP6tRi9TqacOzG19Nv6OC2Wu3sH89uWj9aumY3S/qv9 mxt0NsaWOe6XQT79v7rVo4PTupdPxqqcCkVtO6y1trzZDjoxjTuaq/Vek39Wc12bhEuqZtbtvDQ7 Td9Fu1v0kq021Rw1Ajcnq8z0PB631DodmPg4+PZTY4tN1hHqA/2ireV9Xh0T6uZB6ja578mysAUe 5rSPo7p2/SW10vomR0e578LA1c2NciR/mv3NV7Nxc7qrPsOditGLYRve1+oABcHe2Eq0WwxVEX8/ Dw/1XjsHE+sFXTyem2UZuE4SaoY6P67bosV//F/lY/27JxxQ6q97PUcWuJbofohjlZ/5nNjXDgiQ TVeWz+59Mu+ktbp3SndLqP2LCZTY60B1m4vcav8ASbnu+l/JQESDZVDGRIEaCO96/wCK9AAAI7Jb W+AnxWa3K6pNjH43H808Ea/10B2T9YPTAbjVl5YzXcPp/wCF/OUls1u0kobnenv2O3fuaSkil//R 9QPKR4Xy0kkNld36cs+m74Ix+mfgF8upIDdf1fqCr+5TbzWvlxJHp9i3oH6j7p3/AOv3FfLaSH8V dPq/Ug+ihj6Pyavl9JFA2D9S1cFRHb+uvlxJBT9Sf4ZJfLaSKn//2f/tDNhQaG90b3Nob3AgMy4w ADhCSU0EBAAAAAAABxwCAAACV+gAOEJJTQQlAAAAAAAQmXX9Bgi1lLqGEg8uBwssbThCSU0ELwAA AAAASjADAQBYAgAAWAIAAAAAAAAAAAAAABkAAMASAACc////av///2QZAABWEwAAAAEoBQAA/AMA AAEADycBAGxsdW4AAAAAAAAAAAAAOEJJTQPtAAAAAAAQAGQAAAABAAEAZAAAAAEAAThCSU0EJgAA AAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MA AAAAAAkAAAAAAAAAAAEAOEJJTQQKAAAAAAABAAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1 AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAA AAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD///////////////////////////// A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D 6AAAAAD/////////////////////////////A+gAADhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAA AAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAAM7AAAABgAAAAAAAAAAAAAAIQAAAGQAAAADAEYA UABTAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAABkAAAAIQAAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAA AAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21s b25nAAAAIQAAAABSZ2h0bG9uZwAAAGQAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNs aWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVu dW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNl VHlwZQAAAABJbWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAACEAAAAAUmdodGxvbmcAAABkAAAAA3Vy bFRFWFQAAAABAAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFn VEVYVAAAAAEAAAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAA AAlob3J6QWxpZ25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGln bmVudW0AAAAPRVNsaWNlVmVydEFsaWduAAAAB2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAA EUVTbGljZUJHQ29sb3JUeXBlAAAAAE5vbmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91 dHNldGxvbmcAAAAAAAAADGJvdHRvbU91dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAA AAAAOEJJTQQoAAAAAAAMAAAAAT/wAAAAAAAAOEJJTQQUAAAAAAAEAAAABThCSU0EDAAAAAAGwwAA AAEAAABkAAAAIQAAASwAACasAAAGpwAYAAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9D TQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwM DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwM DAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAIQBkAwEiAAIRAQMR Af/dAAQAB//EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVS wWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSl tcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFR YXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOE w9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A 9QQ7ciqlpfa4VsH5zyGj8Vz/ANb/AK0u6NVXTjAOyrxuaTw1kxvXnd/UOo9UuLsh9uVY78wHT/MC YZgMWTOIHhHql2D6blfXHoGKYdlttd+7UC4/9Hcs23/GLgDTFxbrz4mAFy2L9WvrFcP0WAKB+9YA 0/8AgxegW4llF9mPm9TbjvrMOA9U6+XpMamcUmM5slXw8I7y9P8A0npbPr31mz+jdKc0eNhJ/wC+ MVd31w+tln0KMer4vZ/3+1YJ6f0Nxm/rIPkKbnf9WVcu+rnQMeqmzI6ttZezfW5tD3AjjWCjZ7rO PLK6lt/Wj/3reP1n+tzj/SMSv+3R/wB+eU37d+trj/ynhs/tUf8AkVmDpf1XLf8Algie5x3QtCv6 mdHuw3ZdfV2Ox2/Ss9OIP7rhuSF9z9qQch2JPX56ZjqP1wsGvV8X/t2kf98Uhb9dnfR6pSfhbV/5 FZL+k/VvdDesn+ucZ+z/ADwVb6b9S8PqjHu6f1NtoYdrv0LmmfvSs9/xUPcsAcR7frHbwsj6wYbH vzM1luQWh7WSzYGuPp17XNb7nucrVXVeri0D12We4sIsNTWy0b/pVe5Rxfq11TFwPQ9au6ysBrSB qWB3qM+n+cx6JV0vrDrSXMFTd5sLrTW8biAzdtY0fm70vUO7OBLTf7Xc/aNP7O+36+ns9RJP9gq+ w/YYPp7PT+SSk1/D8V+v4P8A/9Db/wAYHRL8ptfUKW+oaG7LWj93kPW59XOk9Lwen0PwmAmxgLsj Xc4nkz9Jv9lbBY1whwkGZHbVV6MKvFJbSdlTjuFY4B/k/upojqt4IiZnWpbG0d9fivOf8ZAr+3Y2 0RNZL45mfzl2Jv6422wClj6zZtZ7gCGf6QrDyvqw7OyH5GXgk22EOeRke2T+42U2XgFuWJnAxA3c 3p2H1HP6tRi9TqacOzG19Nv6OC2Wu3sH89uWj9aumY3S/qv9mxt0NsaWOe6XQT79v7rVo4PTupdP xqqcCkVtO6y1trzZDjoxjTuaq/Vek39Wc12bhEuqZtbtvDQ7Td9Fu1v0kq021Rw1Ajcnq8z0PB63 1DodmPg4+PZTY4tN1hHqA/2ireV9Xh0T6uZB6ja578mysAUe5rSPo7p2/SW10vomR0e578LA1c2N ciR/mv3NV7Nxc7qrPsOditGLYRve1+oABcHe2Eq0WwxVEX8/Dw/1XjsHE+sFXTyem2UZuE4SaoY6 P67bosV//F/lY/27JxxQ6q97PUcWuJbofohjlZ/5nNjXDgiQTVeWz+59Mu+ktbp3SndLqP2LCZTY 60B1m4vcav8ASbnu+l/JQESDZVDGRIEaCO96/wCK9AAAI7JbW+AnxWa3K6pNjH43H808Ea/10B2T 9YPTAbjVl5YzXcPp/wCF/OUls1u0kobnenv2O3fuaSkil//R9QPKR4Xy0kkNld36cs+m74Ix+mfg F8upIDdf1fqCr+5TbzWvlxJHp9i3oH6j7p3/AOv3FfLaSH8VdPq/Ug+ihj6Pyavl9JFA2D9S1cFR Hb+uvlxJBT9Sf4ZJfLaSKn//2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABo AG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADMA AAABADhCSU0EBgAAAAAAB///AAAAAQEA/+EP2Gh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8A PD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6 eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUg NC4xLWMwMzYgNDYuMjc2NzIwLCBNb24gRmViIDE5IDIwMDcgMjI6NDA6MDggICAgICAgICI+IDxy ZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4 LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmRjPSJodHRwOi8vcHVy bC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eGFwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh cC8xLjAvIiB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1s bnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMi IHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1s bnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iIHhtbG5zOmV4aWY9Imh0dHA6 Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhhcDpDcmVh dG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzIiB4YXA6Q3JlYXRlRGF0ZT0iMjAx MS0xMi0xM1QxMToxMTowMiswNjozMCIgeGFwOk1vZGlmeURhdGU9IjIwMTEtMTItMTNUMTE6MTc6 MDMrMDY6MzAiIHhhcDpNZXRhZGF0YURhdGU9IjIwMTEtMTItMTNUMTE6MTc6MDMrMDY6MzAiIHhh cE1NOkRvY3VtZW50SUQ9InV1aWQ6RkE5OTRGOEU0NDI1RTExMUEwNEFCMzQwNkFCRDQ1MTciIHhh cE1NOkluc3RhbmNlSUQ9InV1aWQ6NTczQzQxNjc0NTI1RTExMUEwNEFCMzQwNkFCRDQ1MTciIHBo b3Rvc2hvcDpDb2xvck1vZGU9IjQiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJVLlMuIFdlYiBDb2F0 ZWQgKFNXT1ApIHYyIiBwaG90b3Nob3A6SGlzdG9yeT0iIiB0aWZmOk9yaWVudGF0aW9uPSIxIiB0 aWZmOlhSZXNvbHV0aW9uPSIxMDAwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9uPSIxMDAwMDAw LzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiB0aWZmOk5hdGl2ZURpZ2VzdD0iMjU2LDI1 NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5 LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QkI4NEIzMTNERkJEMjg4QjlF NjJDMTNDRDRFNkE2NDUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIxMDAiIGV4aWY6UGl4ZWxZRGlt ZW5zaW9uPSIzMyIgZXhpZjpDb2xvclNwYWNlPSItMSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0 LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2 ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5 LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQx NDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMw LDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQx OTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwx NiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDs1RUFCQjFEMjZEQjFCNkUwMEJEQjVC RTk2OEFDNThBQSI+IDx4YXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOkYx NUZBM0U3NDMyNUUxMTFBMDRBQjM0MDZBQkQ0NTE3IiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOkYx NUZBM0U3NDMyNUUxMTFBMDRBQjM0MDZBQkQ0NTE3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3Jk ZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/4v/iSUNDX1BST0ZJTEUAAQkACIBw QURCRQIQAABwcnRyQ01ZS0xhYiAH0AAHABoABQApADVhY3NwQVBQTAAAAABBREJFAAAAAAAAAAAA AAAAAAAAAQAA9tYAAQAAAADTLUFEQkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAHRjcHJ0AAABcAAAACt3dHB0AAABnAAAABRBMkIwAAAB sAAAogZBMkIyAAABsAAAogZBMkIxAACjuAAAogZCMkEwAAFFwAACOLRCMkExAAN+dAACOLRCMkEy AAW3KAACOLRnYW10AAfv3AAAkJFkZXNjAAAAAAAAABpVLlMuIFdlYiBDb2F0ZWQgKFNXT1ApIHYy AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IDIwMDAgQWRvYmUgU3lzdGVt cywgSW5jLgAAWFlaIAAAAAAAALVaAAC8ZwAAkjBtZnQyAAAAAAQDCQAAAQAAAAAAAAAAAAAAAAAA AAEAAAAAAAAAAAAAAAAAAAABAAABAAACAAACJAQdBdoHaQjZCjYLhQzHDf8PMRBeEYsStxPiFQsW MhdXGHkZmBq1G9Ic7x4lH1kghyGyItoj/yUjJkQnZiiGKacqxyvoLQguKC9IMGkxiTKmM8I03jX7 Nxg4NTlROm07iTylPcI+3j/4QRFCKUNCRFxFdUaPR6lIw0ndSvdMEk0sTkNPWVBvUYZSnFOyVMlV 31b2WA1ZI1o6W1FcZl14Xopfm2CtYb5iz2PgZPFmAmcSaCNpM2pCa1JsXm1nbnFvenCDcYxylHOc dKN1qnaxd7d4vXnDesh7zXzOfc1+zH/LgMmBx4LFg8KEv4W7hreHs4iuiamKpIuejJiNkY6Gj3uQ cJFkkliTTJRAlTOWJpcZmAyY/5nymuSb1pzInbuerZ+foI6hfKJqo1ekRaUzpiCnDqf8qOqp16rF q7Osoa2Prn2va7BZsUeyNrMktBK1ALXtttq3yLi1uaO6kLt+vGu9Wb5HvzXAIsEQwf7C7MPaxMfF tcajx5HIfslsylnLRMwuzRjOAc7rz9XQvtGn0pDTedRh1UnWMdcY2ADY5tnN2rLbmNx93WLeR98s 4BDg9OHY4rvjnuR75VfmM+cO5+jowema6nHrSOwd7PDtw+6W73bwVfEz8g/y6vPD9Jz1c/ZJ9x73 8/jG+ZX6Yfsp++v8p/1c/gv+tP9a//8AAAHoA6cFLAaEB78I5woECxYMHA0eDhwPGRAXERQSEBML FAQU/BXzFuYX2BjMGdYa3hvhHOEd3x7bH9Yg0SHLIsQjviS4JbMmrieqKKYpoiqgK54snS2aLpUv kTCNMYkyhjODNIE1fzZ/N384gDmCOn87fjx8PXw+fD99QH9BgkKFQ4lEjUWSRphHmkibSZ1Kn0uj TKZNqk6vT7RQulHAUsdTzlTVVddW2VfbWN5Z4FrjW+dc6l3tXvFf9WD4YfxjAGQDZQFl/2b8Z/po +Gn1avNr8Gzubetu6G/lcOFx3nLac9Z0zXXDdrl3r3ileZt6kHuFfHp9b35kf1iATYFBgjWDKYQc hRCF/obth9uIyom4iqaLlYyDjXGOYI9OkD2RLJIbkwqT+pTpldmWyZe6mKeZk5qAm22cWp1Injaf JaAUoQSh9aLmo9ikyqW9prGnpqibqZGqh6t/rHetb65nr2CwWrFUsk+zTLRJtUa2RbdEuEW5RrpI u0q8Tr1Svle/XcBjwWrCcsN7xITFisaQx5bIncmlyq3Ltsy/zcjO0s/c0ObR8dL71AbVEtYe1yrY N9lE2lHbXtxr3Xneht+U4JzhouKo463ksuW25rrnvejA6cPq1Ovl7PXuBO8S8CDxLPI480P0TvVZ 9mP3avhu+W/6bPtk/Fb9RP4v/xf//wAAAgUD2AVoBsYIBgkyClILZQxyDXgOeg96EHoReRJ1E3AU aBVeFlIXRRg3GSkaNBs9HEAdPx46HzQgLCEjIhkjDyQEJPkl7ibjJ9gozCnBKrYrqyyfLZMuhy98 MHAxZDJZM000QTU2Nis3ITgWOQs6ADr2O+084z3bPtM/y0DEQb1Ct0OyRKxFpkahR5xIl0mUSpBL jkyLTYpOiU+IUIhRiVKIU4hUiFWIVolXiliLWY1aj1uRXJNdll6YX5tgnWGfYqBjoWSjZaRmpmen aKhpqWqqa6psq22rbqtvq3CpcahypXOjdKB1nXaZd5V4kXmMeod7gnx8fXZ+b39pgGGBWoJRg0iE PoU1hiuHIYgXiQyKAor3i+2M4o3Yjs2Pw5C5ka+SpZOclJKViZaAl3iYcJlqmmObXpxZnVWeUp9Q oE+hT6JQo1KkVaVZpl+nZqhuqXiqgquOrJytq667r8yw37Hzswm0ILU4tlG3bLiHuaS6wrvhvQG+ Ib9DwGXBh8Kqw87E8cYVxznIXsmCyqbLysztzhDPMtBU0XTSlNOy1M/V69cG2B7ZNtpM22HcdN2H 3pjfp+Cz4b7ix+PN5NHl0ubQ58zoxOm66qzrm+yH7W/uWO9c8FvxVvJM8z30KvUS9fb21vez+I35 Yvov+vT7sfxm/RH9s/5N/uH/cf//AAAB2QONBQkGVAd/CJYJoQqkC58Mkw2CDnAPXxBMETcSIRMJ E/AU1hW7Fp8XgxiBGX0adBtmHFUdQR4sHxcgACDqIdMivSOmJJAleiZkJ04oOSklKhAq/SvqLNct xC6xL54wjDF5MmczVTRENTI2IjcROAE48TniOtM7xDy1PaY+mD+KQH1Bb0JiQ1VESUU8RjBHI0gX SQtJ/0rzS+hM3E3QTsVPuVCtUaFSlVOIVHpVbVZfV1FYQ1k1WiZbGFwJXPpd617cX8xgvWGsYptj iWR4ZWZmVGdCaDBpHmoLavhr5WzSbb5uqm+WcIJxbHJWc0B0KXUSdft25HfNeLZ5nnqGe258Vn0+ fiV/DX/0gNuBwoKog42EcoVXhjuHIIgFiOqJz4qzi5iMfY1ijkePLZASkPiR3pLEk6qUkZV4lmCX R5gvmRiaAZrqm9Scv52qnpafg6BxoV+iT6M/pDClIqYVpwin/ajzqeqq4qvbrNWt0K7Lr8ewxLHC ssGzwbTCtcW2yLfNuNO527rju+28+L4EvxHAIMEwwkDDUsRmxXrGj8emyL7J1srxzAzNKs5Hz2PQ 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 AIAAgAAAAIAAgAA7y4fyaV0ypoiHaoEokIjla2sdBolCa/EPP4mka9YCpocDbjAAAIAAeTsAAIAA gAAAAIAAgAA7FYUpcCkx9IX+cO8n+IZ3cXkcjYa/cbQO54aucYYCloTFdFMAAIAAfZgAAIAAgAAA AIAAgAA6fIK7dwoxXYPPd3wndoRld64cLoSXd6gOo4RJd5ICboMCeisAAIAAgAAAAIAAgAAAAIAA gAA6DYCqficw54H2fk8nC4KsfjEb44LMfgEOkYJcfi4CiYGIfv8AAIAAgAAAAIAAgAAAAIAAgAAA AP//AAD//wAA//8AAG1mdDIAAAAABAMJAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA AAEAAAEAAAIAAAIkBB0F2gdpCNkKNguFDMcN/w8xEF4RixK3E+IVCxYyF1cYeRmYGrUb0hzvHiUf WSCHIbIi2iP/JSMmRCdmKIYppyrHK+gtCC4oL0gwaTGJMqYzwjTeNfs3GDg1OVE6bTuJPKU9wj7e P/hBEUIpQ0JEXEV1Ro9HqUjDSd1K90wSTSxOQ09ZUG9RhlKcU7JUyVXfVvZYDVkjWjpbUVxmXXhe il+bYK1hvmLPY+Bk8WYCZxJoI2kzakJrUmxebWducW96cINxjHKUc5x0o3WqdrF3t3i9ecN6yHvN fM59zX7Mf8uAyYHHgsWDwoS/hbuGt4eziK6JqYqki56MmI2RjoaPe5BwkWSSWJNMlECVM5YmlxmY DJj/mfKa5JvWnMidu56tn5+gjqF8omqjV6RFpTOmIKcOp/yo6qnXqsWrs6yhrY+ufa9rsFmxR7I2 syS0ErUAte222rfIuLW5o7qQu368a71Zvke/NcAiwRDB/sLsw9rEx8W1xqPHkch+yWzKWctEzC7N GM4BzuvP1dC+0afSkNN51GHVSdYx1xjYANjm2c3astuY3H3dYt5H3yzgEOD04djiu+Oe5HvlV+Yz 5w7n6OjB6ZrqcetI7B3s8O3D7pbvdvBV8TPyD/Lq88P0nPVz9kn3Hvfz+Mb5lfph+yn76/yn/Vz+ C/60/1r//wAAAegDpwUsBoQHvwjnCgQLFgwcDR4OHA8ZEBcRFBIQEwsUBBT8FfMW5hfYGMwZ1hre G+Ec4R3fHtsf1iDRIcsixCO+JLglsyauJ6oopimiKqArniydLZoulS+RMI0xiTKGM4M0gTV/Nn83 fziAOYI6fzt+PHw9fD58P31Af0GCQoVDiUSNRZJGmEeaSJtJnUqfS6NMpk2qTq9PtFC6UcBSx1PO VNVV11bZV9tY3lngWuNb51zqXe1e8V/1YPhh/GMAZANlAWX/Zvxn+mj4afVq82vwbO5t627ob+Vw 4XHectpz1nTNdcN2uXeveKV5m3qQe4V8en1vfmR/WIBNgUGCNYMphByFEIX+hu2H24jKibiKpouV jIONcY5gj06QPZEskhuTCpP6lOmV2ZbJl7qYp5mTmoCbbZxanUieNp8loBShBKH1ouaj2KTKpb2m saemqJupkaqHq3+sd61vrmevYLBasVSyT7NMtEm1RrZFt0S4RblGuki7SrxOvVK+V79dwGPBasJy w3vEhMWKxpDHlsidyaXKrcu2zL/NyM7Sz9zQ5tHx0vvUBtUS1h7XKtg32UTaUdte3Gvded6G35Tg nOGi4qjjreSy5bbmuue96MDpw+rU6+Xs9e4E7xLwIPEs8jjzQ/RO9Vn2Y/dq+G75b/ps+2T8Vv1E /i//F///AAACBQPYBWgGxggGCTIKUgtlDHINeA56D3oQehF5EnUTcBRoFV4WUhdFGDcZKRo0Gz0c QB0/HjofNCAsISMiGSMPJAQk+SXuJuMn2CjMKcEqtiurLJ8tky6HL3wwcDFkMlkzTTRBNTY2Kzch OBY5CzoAOvY77TzjPds+0z/LQMRBvUK3Q7JErEWmRqFHnEiXSZRKkEuOTItNik6JT4hQiFGJUohT iFSIVYhWiVeKWItZjVqPW5Fck12WXphfm2CdYZ9ioGOhZKNlpGamZ6doqGmpaqprqmyrbatuq2+r cKlxqHKlc6N0oHWddpl3lXiReYx6h3uCfHx9dn5vf2mAYYFaglGDSIQ+hTWGK4chiBeJDIoCiveL 7YzijdiOzY/DkLmRr5Klk5yUkpWJloCXeJhwmWqaY5tenFmdVZ5Sn1CgT6FPolCjUqRVpVmmX6dm qG6peKqCq46snK2rrruvzLDfsfOzCbQgtTi2UbdsuIe5pLrCu+G9Ab4hv0PAZcGHwqrDzsTxxhXH OcheyYLKpsvKzO3OEM8y0FTRdNKU07LUz9Xr1wbYHtk22kzbYdx03YfemN+n4LPhvuLH483k0eXS 5tDnzOjE6brqrOub7Iftb+5Y71zwW/FW8kzzPfQq9RL19vbW97P4jfli+i/69Pux/Gb9Ef2z/k3+ 4f9x//8AAAHZA40FCQZUB38IlgmhCqQLnwyTDYIOcA9fEEwRNxIhEwkT8BTWFbsWnxeDGIEZfRp0 G2YcVR1BHiwfFyAAIOoh0yK9I6YkkCV6JmQnTig5KSUqECr9K+os1y3ELrEvnjCMMXkyZzNVNEQ1 MjYiNxE4ATjxOeI60zvEPLU9pj6YP4pAfUFvQmJDVURJRTxGMEcjSBdJC0n/SvNL6EzcTdBOxU+5 UK1RoVKVU4hUelVtVl9XUVhDWTVaJlsYXAlc+l3rXtxfzGC9Yaxim2OJZHhlZmZUZ0JoMGkeagtq +GvlbNJtvm6qb5ZwgnFsclZzQHQpdRJ1+3bkd814tnmeeoZ7bnxWfT5+JX8Nf/SA24HCgqiDjYRy hVeGO4cgiAWI6onPirOLmIx9jWKOR48tkBKQ+JHeksSTqpSRlXiWYJdHmC+ZGJoBmuqb1Jy/naqe lp+DoHGhX6JPoz+kMKUiphWnCKf9qPOp6qriq9us1a3Qrsuvx7DEscKywbPBtMK1xbbIt82407nb uuO77bz4vgS/EcAgwTDCQMNSxGbFesaPx6bIvsnWyvHMDM0qzkfPY9CA0Z/Sv9Pg1QPWJ9dM2HPZ m9rE2+/dGt5G33PgoeHP4wLkTeWZ5ufoNumG6tjsK+2A7tfwMfGQ8u/0TfWq9wT4Wvmr+vb8Ov17 /rv///8AgACAAOZPf85/WM2Zf6h+zbTaf5l+eZwUf6N+ZYNMf8Z+hWqFf/5+wFG/gGN/PTkAgRKA D/zFfnyLNOS1fmOJbMxAfl2HzLOafm6GZprYfpiFQ4IYftmET2lafy+DZ1Cuf6+CoTgUgHaB5vq8 fTaWceL7fTCTksrLfT6Qz7I6fWmOXpmTfayMLIDvfgeKImhOfnWIE0/BfwyGADdBf+iDrPjjfC6h t+FBfDOdv8kzfE2Z8LDCfIWWV5hFfN+TGn/LfU+P82dWfdGMtU7vfnyJTTaHf2eFXPc3e2OtA9+l e2an68eqe4ejCq9ge8meaZb4fCuZ+H6yfK+Vt2ZufUORQU4uff2MezXlfvSG7/W8esq4Vd4vesey FMZDeuSsFK4ZeyymYZXce5mg2n2kfCSbWWWVfMiVqE2CfZGPgTVbfpGIX/R3elLDqtzseka8MsUJ el21Cqz5eqeuO5Tpex+nm3zZe7ag6GTYfGCZ3UztfTWSUDTofj2Jp/NjeffPAdvYeePGQMP6efK9 5Kv3ejq17JQCeriuJHwge1umQGRIfBCd5UxvfOqU4zSJffeKxfJ1ebTaWtrreZfQMsMPeZ/GlKsY eeO9apM7emS0ant3ew2rQGPCe8yhlkwJfK+XMzQ9fb6Ltu5TiNt+NteGh8R9wsCfhsN9cKmMheZ9 VZJShSp9dXsHhIZ9xmPEg/F+NUyPg3h+6TWSgyiAAOw9h32Iy9YUhnCHQL9rhYOF46hjhLuEwZEe hBuD33nUg5SDLWKcgx2CjUuSgsOCFjTYgpCBwep6hkeTZdR0hU2Q2r38hG+Oc6cLg8SMWI/tgzmK d3jKgsqIvWG2gmmHA0rNgiaFTDQzggeDb+jbhU+d/tLghF+adLx6g46XFKWrgueT6I60gnKRC3e7 ghWOQWDWgceLZEoYgZeIaDOigYuFBOdchIuooNFsg52kFbsQgtSfuqRbgjeblI2AgcKXlXa6gXiT u2AIgTmPskl1gRqLZTMkgR+Ge+YAg/GzS9AbgwSturnNgjqoWKMygaOjLYx7gTaeIHXIgO6ZFF9K gL6T20jkgK+OOjK5gMGHz+TVg3O9+M76goe3Vri1gbyw4qIvgSaqqIufgMSkinURgIOeVV6ngFSX 0UhpgFOQ2TJggHKI++PWgw7Ipc4FgiTA4rfGgVe5U6FKgL+x+orQgGGqu3RrgC6jXF4pgAeblUgC gAeTOzIXgDCJ/uMAgr3TVM03gdbKWbb6gQfBmqCIgG65E4ojgBGwonPaf+KoBl23f8ae/Uerf9CV VjHcf/uK194SkeJ8sMjuj/F8Y7Oxjhh8Op47jGh8R4iNit58j3LFiWl9Cl0Rh/x9qEd7hpl+kzJR hTl/8dwqkLSGl8eUjsGFUrKSjPSEPJ02i1eDW4eOieSCtnHSiIiCPVwrhzOB2Ea5hemBojHLhKKB ndqjj46QlcY5jaiOV7Fyi92MPpwVileKcIZ4iPiI2XDQh7WHaFtIhneF/EYFhUaEnzFUhBmDNNlC jpual8TYjL+XbLAHiweUa5rIiYKRpIVSiDmPHW/ZhwWMqFqDhdiKJkVvhLqHjzDsg6CEr9fujeGk lMOHjAmgga66ilucm5mPiN6Y5IQ6h42VT27whmuR1VnOhUqONETohD2KWzCRgzWGC9a1jUuunMJc i3epna2ZicqkxJiCiFKgF4NMhwibfm4aheGW4lkrhM6SHURzg9CM/zBFgtqHRNWnjNC4o8Fciv+y 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 UUDZkiF+cTjfjwx+qTFCi/p++ypciPh/YCQihj5/wh8mg9mAFli1mS+DelDnlueDW0jelDiC7kDF kT2CZTjQjjGB9TEwiziBnipfiEuBXyRKhaWBGh9bg2OA0ViLmG+I9VDNlimIYUjJk36HU0C5kIWG GTjWjXqE/DFFio2D/Sp0h7aDFSRjhSyCNB+FgwSBaax/XONVK50yX/1ZJo2FYxFdFX1MZjBg+2yf aXRk51vEbOpo70s7cJVtKDsQdJlxuywHePp25aqLWO1fYZuwXG9iYIwzX99lV3wnY1doTGucZvRr SVroasZuYUqMbtBxojqlczR1NCv3d/J5Pqi9VWdpgJn9WT5rgIrEXP9tfnrRYMNvg2p4ZK9xlln8 aNVzwUnebTd2DDpAcfV4livqdwd7dqbyUj1zc5hLVmN0gokmWmR1lHmAXmx2q2lTYqZ30lkUZxt5 DUk6a856XTnlcN572Svedjd9iKVCT3d9QpbLU+B9bofFWCJ9mXg0XGR9xGhbYNx9+FhJZZt+Pkir apZ+jjmWb+x+9CvTdYN/bqPUTSCG8ZWLUcKGPYavVjiFf3c9WrGEu2d9X12D+1eoZFGDRUg4aY2C kjlUbyCB3SvKdOmBIqKpSymQc5SJT/uO14XPVJuNKnZ6WUCLdWbNXh6JxFcaY0OIEUfeaK2GVjki bnSEhyvDdGmCoaHESZeZsJPCTo6XJIUhU02UgnXiWBCR2mZEXROPN1afYmWMjUeEZ/uJzzj5beaG 6yu9dACD6aErSHCigZM3TXue94SgUkubXHVwVyGXxWXnXDuUOFZYYaqQnUdEZ2KM5DjKbXKI+iu5 c6uE+6DVY/NVNZLUZmlZOoRJaOddJ3UZa3hhBmVxbixk7lWicRBo+UYvdChtNzcrd5Vx1ilbe1h3 Cp8rYDBe5ZGjYw9h+4NFZeBlAnQ8aLxoAmS0a71rClUKbvVuMUXDcmVxgjbzdi91Kiljekt5SZ2K XM5oeZABYABqpYHbYxtsx3LuZkFu52ObaY9xE1QqbRlzWkUhcN11wjaedPh4aylqeVt7ZZvqWcRx 5Y5vXT1zNIBdYJd0enHAY/11u2KWZ5h3B1Nfa214aESXb3554TZYc+V7hilveIl9W5poVxt7NY0P WtB7r38XXmd8GXCNYgV8eWG4Zdt831Kqafh9WEQdbk593DYdcvZ+dil0d9N/JZkoVN+EaovtWMSE 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 ej4tfnx1FTa+ftx2zS+If014pyjzf9J6iyMcgHR8dB5zgRd+O1PFerN2eUyUe7h3gEVCfHt4dD3Z fQx5bjZ7fZd6gy9rfjJ7sikIftZ87iNEf6p+IR6wgHt/M1NBeOd8WUwWei981kTVeyZ9LT2Ge+B9 gjZAfIx98i86fVJ+eCkDfg9/DiNvfv9/lh7hf/2AA1Lgd3GCHkvMePaCF0Sgeh+Bvz1xeu2BWDZV e6OBGi9ofHyA+CknfWOA6COKfn6Azh8If5iArE7Yk/1Po0hKkoRT0kFxkRFYHTo9j4VcpDLhjdlh diu7jCNmkyVBinpr5B+UiPZxbxsZh7R2503MkPpVuUdSj+1ZfUCAjq9dXzl9jT9hcTJsi61lwSuW ih1qTyVsiJ9vAyAAh1Jz5Ru1hkd4p00Ujfhby0aMjSxfHD/VjClihDjqiuhmHDIRiYlp4yt5iDFt 4CWQhu1x9yBbhd12Lxw7hQl6Pkx4ixFh0EXqinxkpD8xia9njzh7iKxqnzHJh4lt4Ctlhm9xRiWv hWp0wCCohJd4TRyvg/h7qkvaiF5nzkVTiBBqIT6uh3tsiDgQhqhvCDGihb9xuStchOJ0iiXPhBd3 YiDsg316QR0QgxB87EtBhe9tx0TGhfFvlT5AhZlxbjfEhPZzXjFzhDl1cCtjg4l3pCXwgvF52iEm gox8CR1hgk5+A0q8g9Bzk0RMhCB03D3khAJ2IjeGg4t3ezFMgvV48itagm16giYSgfd8FyFbgcB9 nB2kga5+70pMggB5L0Pngpd58j2Vgq96nzdWgl57WDEtgep8MitFgYt9ICYagTJ+FiGEgRl++R3a gSx/tEn7gHx+pUOXgVJ+2z1VgZ1+5jcxgWx++TEkgQ9/MCtUgMp/fCYogJZ/0SGagJ6AGx4FgMSA VAAA//8AAP//AAD//wAAbWZ0MQAAAAADBCEAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA AAAAAQAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEy MzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWpr bG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOk paanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd 3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAQICAwMEBAUGBgcHCAgJCQoLCwwM DQ0ODw8QEBEREhMTFBQVFhYXFxgZGRoaGxwcHR4eHyAgISIiIyQkJSYmJygpKSorLC0tLi8wMTIy MzQ1Njc4OTo7PD0+P0BCQ0RFRkhJSkxNT1BSU1VXWFpcXmBiZGZoam1vcXR2eXx+gYOGiYuOkJKV l5mbnZ+ho6WnqKqsra+wsrO1tre5uru8vb/AwcLDxMXGx8jJysvMzc3Oz9DR0tLT1NXW1tfY2dna 29vc3d3e39/g4eHi4+Pk5eXm5ufo6Onp6uvr7Ozt7u7v7/Dw8fLy8/P09PX29vf3+Pj5+fr7+/z8 /f3+/v8AAQECAgMDBAQFBgYHBwgICQkKCwsMDA0NDg8PEBARERITExQUFRYWFxcYGRkaGhscHB0e Hh8gICEiIiMkJCUmJicoKSkqKywtLS4vMDEyMjM0NTY3ODk6Ozw9Pj9AQkNERUZISUpMTU9QUlNV V1haXF5gYmRmaGptb3F0dnl8foGDhomLjpCSlZeZm52foaOlp6iqrK2vsLKztba3ubq7vL2/wMHC w8TFxsfIycrLzM3Nzs/Q0dLS09TV1tbX2NnZ2tvb3N3d3t/f4OHh4uPj5OXl5ubn6Ojp6err6+zs 7e7u7+/w8PHy8vPz9PT19vb39/j4+fn6+/v8/P39/v7//6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCW z6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+i Rkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL 3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6 pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZ pselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9 oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfG tqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpsel ZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g 8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOH y7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHE p2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRM cuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleal l5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Og h9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2 wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuan TITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm /6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9Cv nYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITaqFCWz6ZZpselZLHEp2+2wad4 u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5Mv+iRkr9oE1g8aRMcuanTITa qFCWz6ZZpselZLHEp2+2wad4u72ngcC6pYfGtqOHy7Ogh9CvnYjWq5qL3aWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm/6Y5 Mv+iRUr9oUxg8qVLceapSoPaqk2Vz6lWpcioYbDFqmu1wqx1ur6rfb+6qoPFtqiHyrKmh9CroofW pJ6J3Jqaj+Gamo/hmpqP4Zqaj+Gamo/hmpqP4Zqaj+Gamo/hmpqP4Zqaj+Gamo/hmpqP4Zqaj+Ga mo/hmpqP4Zqaj+Gamo/h/6Y4Mv+jRUr9oktg8qZJceaqSILbrUqT0KxSo8msXa/Gr2ezw7FxuL+z eb24r4HEsqqHy6ymhtClo4bVnZ+G2pOdi96TnYvek52L3pOdi96TnYvek52L3pOdi96TnYvek52L 3pOdi96TnYvek52L3pOdi96TnYvek52L3pOdi96TnYve/6c4Mv+jRUr9okpf8qdIcOesRoHcr0eS 0rBOocqxV63ItmKwxbpstbqzeL6yroHFraqHy6enhc+gpITTmKGF14+fiNqPn4jaj5+I2o+fiNqP n4jaj5+I2o+fiNqPn4jaj5+I2o+fiNqPn4jaj5+I2o+fiNqPn4jaj5+I2o+fiNqPn4ja/6c4Mv+j REv+o0lf86lGb+iuRIDds0OQ07ZIn8y3UarKwFysvbhst7OyeMCtroHGqaqGyqKohM6bpYTRlKOE 1Iyhh9eMoYfXjKGH14yhh9eMoYfXjKGH14yhh9eMoYfXjKGH14yhh9eMoYfXjKGH14yhh9eMoYfX jKGH14yhh9eMoYfX/6c3Mv+jREv+pUde86pEbumxQX/fuD6O1r1Cm8/DSqTCvlyvtrdsua6xeMGp roHGpauFyZ6phMyYp4PPkaWE0oqjhtSKo4bUiqOG1IqjhtSKo4bUiqOG1IqjhtSKo4bUiqOG1Iqj htSKo4bUiqOG1IqjhtSKo4bUiqOG1IqjhtSKo4bU/6g3Mv+kREv+pkZe9K1Cbeq0Pn3hvTuL2sY8 lsrGSKS5vFyyr7Ztu6mxecGlroLFoayEyJuqg8uVqYPNj6eEz4mmhtGJpobRiaaG0YmmhtGJpobR iaaG0YmmhtGJpobRiaaG0YmmhtGJpobRiaaG0YmmhtGJpobRiaaG0YmmhtGJpobR/6g3Mv+kQ0v/ qENd9a8/bOy4OnrkwzeH3dM1kMHESaexul61qbVuvKSxesCir4LEna2Ex5ishMmSqoTLjamFzYio hs6IqIbOiKiGzoiohs6IqIbOiKiGzoiohs6IqIbOiKiGzoiohs6IqIbOiKiGzoiohs6IqIbOiKiG zoiohs6IqIbO/6k2Mv+lQkv/qkFc9rI7au69NnfoyzOA0NIzk7jDS6iquWC2pLVwvKGye8CesIPD mq6ExZWthMeQrITJi6uFyoeqhsyHqobMh6qGzIeqhsyHqobMh6qGzIeqhsyHqobMh6qGzIeqhsyH qobMh6qGzIeqhsyHqobMh6qGzIeqhsyHqobM/6k1Mv+lQkv/rD1a+Lc3Z/HEMXHf1yx7xdA1lbDC TqmkuGO3n7VyvJ2zfL+bsYPBl6+Ew5KuhMWOrYXGiqyGyIesh8mHrIfJh6yHyYesh8mHrIfJh6yH yYesh8mHrIfJh6yHyYesh8mHrIfJh6yHyYesh8mHrIfJh6yHyYesh8mHrIfJ/6o0Mv+mQEv/sDlY +b0xYufOLWnQ4CR/uc83l6fCUqmeuma1mrVzu5izfb6XsoPAlLGFwZCwhcONr4XEia6GxYauh8aG rofGhq6Hxoauh8aGrofGhq6Hxoauh8aGrofGhq6Hxoauh8aGrofGhq6Hxoauh8aGrofGhq6Hxoau h8aGrofG/6szMv+qO0n/tjJT8McqWtjeIWbC3ySCrc48mJ/DVqeZvGiylrd1uJS0fb2Ts4O+kbKF v46yhsCLsYbBiLCHwoawiMOGsIjDhrCIw4awiMOGsIjDhrCIw4awiMOGsIjDhrCIw4awiMOGsIjD hrCIw4awiMOGsIjDhrCIw4awiMOGsIjD/60xMv+wM0X4wClM39YjTcfoIGqz3iaEoc9BlpfGWaST wGqskLx1so+5fbaPt4O4jLaEuoq1hbyItIa9hrOHvoSziL+Es4i/hLOIv4SziL+Es4i/hLOIv4Sz iL+Es4i/hLOIv4SziL+Es4i/hLOIv4SziL+Es4i/hLOIv4SziL+Es4i//68vMv+5KT/ozh4/zOYb UrfuIW2l3iyDl9JFkpDLW52MxWuli8J1qoq/fK2Hvn+whLyAsYO8grKBu4Ozf7qEtH66hrV+uoa1 frqGtX66hrV+uoa1frqGtX66hrV+uoa1frqGtX66hrV+uoa1frqGtX66hrV+uoa1frqGtX66hrV+ uoa1/7IqMvHGHDPR4hQ6vPMbVqjuJm2Y4TV/jthKjIjQXZWGzGubhMl0oIHHeKN+xXulfMR9pnvE fqd5w4CoeMKCqXfCg6p3woOqd8KDqnfCg6p3woOqd8KDqnfCg6p3woOqd8KDqnfCg6p3woOqd8KD qnfCg6p3woOqd8KDqnfCg6p3woOq+r4cKNbdDiPA8BQ/rP0eV5zwLWqP5T55ht5Og4HYX4t/1GuQ etFwlHfPdJd1zneYc815mnLNe5txzH2bcMt/nG/LgJ1vy4Cdb8uAnW/LgJ1vy4Cdb8uAnW/LgJ1v y4Cdb8uAnW/LgJ1vy4Cdb8uAnW/LgJ1vy4Cdb8uAnW/LgJ1vy4Cd2dILGMTtDimw/RZBn/8kVZH0 NWWH60Zwf+VUeXvhYX923WiEcttuh2/ZcYlt2HSLa9h3jGrWeY1p1nqOaNV8jmfVfo9n1X6PZ9V+ j2fVfo9n1X6PZ9V+j2fVfo9n1X6PZ9V+j2fVfo9n1X6PZ9V+j2fVfo9n1X6PZ9V+j2fVfo9n1X6P /6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4 jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/ otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7 tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LT rX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXk pFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/ otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5 Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/J toiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOt f6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKc g7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i 061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG 2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOt f6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+f RkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiS zLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT rX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/ mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/ otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJb ltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LT rX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/ nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOE l8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i 061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+ vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOt f6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV+qBQZe+jUXXkpFOG2qJbltCg ZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+ygZ/SrX+i061/otOtf6LTrX+i 061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LT/6M5Kv+fRkD/nVBV +qBQZe+jUXXkpFOG2qJbltCgZaTInXCwxZx7tcKcg7m/mom+vJWLwrqQjMW4jI/JtoiSzLOEl8+y gZ/SrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/otOtf6LTrX+i061/ otOtf6LT/6M5Kv+fRkD/nk9U+qFOZO+kT3XlplGF2qVYldGiYqPJn22vxZ93tcKegLm/nYi+vJmJ w7mUi8e2j43Ls4qQz7GGltSug6DXp4Gh1aeBodWngaHVp4Gh1aeBodWngaHVp4Gh1aeBodWngaHV p4Gh1aeBodWngaHVp4Gh1aeBodWngaHV/6M5Kv+gRkD/nk5U+qJNZPClTnTlqE+E26dVlNKlX6HK o2mtxaJ0tMKhfbm/oIW+u52Iw7iYici1k4vNsY6O066JltinhZ3aoYWg1qGFoNahhaDWoYWg1qGF oNahhaDWoYWg1qGFoNahhaDWoYWg1qGFoNahhaDWoYWg1qGFoNahhaDW/6M5Kv+gRkD/n01U+6NM ZPCnTHTmqU6D3KpTktKpW6DLpmarxqVws8Oleri/pIK9u6KHw7idh8mzmInPsJSO1auSl9qgipzc m4mf2JuJn9ibiZ/Ym4mf2JuJn9ibiZ/Ym4mf2JuJn9ibiZ/Ym4mf2JuJn9ibiZ/Ym4mf2JuJn9ib iZ/Y/6M4Kv+gRUD/oExU+6RLY/GoS3Pmq0yD3a1QkdSsWJ7MqmKpx6psscSqdrbAqn68vKiEwrik hsmzoYjPrJyN1aOWlNqakZzclo6e2JaOntiWjp7Ylo6e2JaOntiWjp7Ylo6e2JaOntiWjp7Ylo6e 2JaOntiWjp7Ylo6e2JaOntiWjp7Y/6Q4Kv+gRUD/oEtT+6VKY/GpSXLnrUqB3rBNkNWwVZzOsF6n ybBor8ayc7PDsny4vbCAwbasgsmup4XPpaGK1ZyckdqVmZzckZSe2ZGUntmRlJ7ZkZSe2ZGUntmR lJ7ZkZSe2ZGUntmRlJ7ZkZSe2ZGUntmRlJ7ZkZSe2ZGUntmRlJ7Z/6Q4Kv+gRUD/oUpT+6ZIYvKr SHHor0iA37NKjta1UZrQtlqkzLhlq8q9ca7BuXu2t7KAwK6shMimqIXOnaSH1JSgjtiOn5nbjJue 2YybntmMm57ZjJue2YybntmMm57ZjJue2YybntmMm57ZjJue2YybntmMm57ZjJue2YybntmMm57Z /6Q4Kv+hRUD/oklT/KdHYfKtRnDpskZ/4LdHjNm7TpfTv1ef0MVjpMXAcK26uHm3sLKAwKmthceg qITNl6WF0o6hideHoJLZh6Gc2IehnNiHoZzYh6Gc2IehnNiHoZzYh6Gc2IehnNiHoZzYh6Gc2Ieh nNiHoZzYh6Gc2IehnNiHoZzY/6Q3Kv+hRED/o0hS/KlFYfOuRG/qtUN94rxEidzCSpPYylSZysZi pLy9brCytni5qrGAwaSthcebqYTMk6aE0Iqjh9SDoo7WgqKW1oKiltaCopbWgqKW1oKiltaCopbW gqKW1oKiltaCopbWgqKW1oKiltaCopbWgqKW1oKiltaCopbW/6U3Kv+hREH/pEZS/apEYPSxQm7r uEF75MFCht/MRo3Tz1KXwcRhp7O7bbOrtXi7pbGAwZ+uhMaYq4TKkKiEzoimhtGCpIzTgKSS04Ck ktOApJLTgKSS04CkktOApJLTgKSS04CkktOApJLTgKSS04CkktOApJLTgKSS04CkktOApJLT/6U3 Kv+hREH/pUVR/qxCX/W0P2ztvD5458dAgeDWRofJzVGauMJgqqy6bbWltXi8oLGAwZuuhMWVrITI jqqEy4eohs6Cp4vPf6aP0H+mj9B/po/Qf6aP0H+mj9B/po/Qf6aP0H+mj9B/po/Qf6aP0H+mj9B/ po/Qf6aP0H+mj9B/po/Q/6U2Kv+iQ0H/p0NQ/64/Xfe3PGnwwjtz5tA/edPZP4q+y1Gdr8BhrKW5 bragtXm8nLKBwJivhMOSroTGjKyFyIeqh8qCqYrMf6mOzX+pjs1/qY7Nf6mOzX+pjs1/qY7Nf6mO zX+pjs1/qY7Nf6mOzX+pjs1/qY7Nf6mOzX+pjs1/qY7N/6Y2Kv+iQkH/qUBP/7I7W/m9OGXsyzht 3Nw1eMfWPo6zyVKgp8BjrZ+5cLaatXq8mLKBv5SxhcKPr4XEi66GxYath8eCrIrIf6uNyX+rjcl/ q43Jf6uNyX+rjcl/q43Jf6uNyX+rjcl/q43Jf6uNyX+rjcl/q43Jf6uNyX+rjcl/q43J/6c1Kv+j QkH/rDxN/7c2V/LFM1/h1jZjzeMxfLrTP5GpyFShn8BlrZm6crWWtnu6lLOCvpKyhcCNsYbBibCH w4aviMSCrorFgK6MxYCujMWArozFgK6MxYCujMWArozFgK6MxYCujMWArozFgK6MxYCujMWArozF gK6MxYCujMWArozF/6g0Kv+mPj//sTdK+b4wUufPL1XR4ixowOEwf63SQpOgyFehmMFnq5S8c7KS uHy3kLaCuo60hbyLs4a+iLKHwIWxicGDsYrBgbCMwoGwjMKBsIzCgbCMwoGwjMKBsIzCgbCMwoGw jMKBsIzCgbCMwoGwjMKBsIzCgbCMwoGwjMKBsIzC/6kyKv+rOD3/uC9F7sgpSNbfJVLD7Clssd8x gqHSRZKXylqfkcNpp46/dK2NvHyxi7qBtIi5g7aFuIS4g7eGuYG2h7p/tYm7frWLvH61i7x+tYu8 frWLvH61i7x+tYu8frWLvH61i7x+tYu8frWLvH61i7x+tYu8frWLvH61i7x+tYu8/6swKv+xLzj2 wiY83NofO8brI1ez7Cpvo981gpbUSpCPzV2ai8hroYnEdaaGwnuqg8B+rIG/gK5/voKwfb2DsXu8 hbJ6u4ezebuIs3m7iLN5u4izebuIs3m7iLN5u4izebuIs3m7iLN5u4izebuIs3m7iLN5u4izebuI s3m7iLN5u4iz/60uKv67JTDj0hotyegbQbb3I1ql7C5vluE8f4zYT4uH0l+ThM1smYHKdJ5+yHih e8d7o3nGfaR4xX+ldsSBpnXDg6d0w4Soc8KGqXPChqlzwoapc8KGqXPChqlzwoapc8KGqXPChqlz woapc8KGqXPChqlzwoapc8KGqXPChqlzwoap/7QkJezKFiPN5RMsufYbRqf6JluY7jVsjOVEeoTe U4OA2WKKfNVsj3jScZN10HWVc894l3HOephwzXyZb81+mm7MgJttzIKcbMuEnGzLhJxsy4ScbMuE nGzLhJxsy4ScbMuEnGzLhJxsy4ScbMuEnGzLhJxsy4ScbMuEnGzLhJxsy4Sc9cEVGdHfDBi88xMx qv8eR5r8LFmO8jxnhOpLcn3lWHp54GOAdN5qhHDbb4dt2nOJa9l2imrYeItp13qMaNZ8jWfWfo5m 1YCOZdWBj2XVgY9l1YGPZdWBj2XVgY9l1YGPZdWBj2XVgY9l1YGPZdWBj2XVgY9l1YGPZdWBj2XV gY9l1YGP0tIKCb/oDR2t/xUznf8jRZD/M1SF90NffvFRaHfsXG9w6WJ0a+dnd2jlbXlm5HB7ZeNz fWPidn1i4Xh+YuF5f2Hhe39g4H2AX+B/gV/gf4Ff4H+BX+B/gV/gf4Ff4H+BX+B/gV/gf4Ff4H+B X+B/gV/gf4Ff4H+BX+B/gV/gf4Ff4H+B/6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XS mXChzJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6 rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51S WfefVGntoFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDE unymxrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1 eqzG/6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCL kry+h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqs xrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXCh zJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1 eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51SWfef VGntoFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunym xrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG /6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCLkry+ h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6 rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXChzJZ7 q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1eqzG tXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51SWfefVGnt oFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunymxrd6 rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5 If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXChzJZ7q8aUhLPEk4u2wo+PusCLkry+h5W/ vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1 eqzGtXqsxrV6rMa1eqzG/6A5If+cRjb/mlFK/51SWfefVGntoFd4459ch9qcZ5XSmXChzJZ7q8aU hLPEk4u2wo+PusCLkry+h5W/vYOYwbyBm8O7fqDEunymxrd6rMa1eqzGtXqsxrV6rMa1eqzGtXqs xrV6rMa1eqzGtXqsxrV6rMa1eqzGtXqsxrV6rMa1eqzG/6A5If+dRjb/mlBK/55RWfegUmjtoVZ4 5KFahtueZJTSm26gzJh4qsaVgbLElYm2wZGOur+MkL29iJPAvISXw7qBm8W5fqDHuHynyLJ7qsiw e6rIsHuqyLB7qsiwe6rIsHuqyLB7qsiwe6rIsHuqyLB7qsiwe6rIsHuqyLB7qsiwe6rI/6A4Iv+d Rjf/m09K/59PWfiiUGjuo1N35aRXhdyiYJPTnmqfzZt0qceYfbHEl4a2wZSMur+Pjr68ipLCuoaV xbiCmsi3f6DLtHynzKx8qcqqfanKqn2pyqp9qcqqfanKqn2pyqp9qcqqfanKqn2pyqp9qcqqfanK qn2pyqp9qcqqfanK/6A4Iv+dRTf/nE5K/6BOWPijT2fvpVF25aZVhN2lXZHUomadzZ9wqMicerDE moK2wZiKur6SjL+7jY/EuIiTyLaDmcy0gKHPrH2lz6Z+p8ykf6jLpH+oy6R/qMukf6jLpH+oy6R/ qMukf6jLpH+oy6R/qMukf6jLpH+oy6R/qMukf6jL/6E4Iv+dRTf/nU1J/6FMWPmlTWbvp0915qlT g96oWpDVpmKcz6Nspsmgdq7Fnn+1wZyHur6XisC6kI3GtouSy7SIms6yhqTRpoCk0aCBp82fgafM n4GnzJ+Bp8yfgafMn4GnzJ+Bp8yfgafMn4GnzJ+Bp8yfgafMn4GnzJ+Bp8yfgafM/6E4Iv+eRTf/ nkxJ/6JLV/mmTGbwqU5056tRgt+rV47Xql+a0KhppMulc6zGo3yzwqCEub6ciMC5lozGtZGSy6+N mM+qiqHSoISj05uEps6ahKfNmoSnzZqEp82ahKfNmoSnzZqEp82ahKfNmoSnzZqEp82ahKfNmoSn zZqEp82ahKfN/6E4Iv+eRTf/nktJ/6NKV/qnS2Xwq0xz6K1PgOCvVI3ZrlyY0q1moc2rcKnIqnmw w6eBt76hhMC1m4nGrpWPzKiRlc+ijp7Smomi05aHpc+Vh6bOlYemzpWHps6Vh6bOlYemzpWHps6V h6bOlYemzpWHps6Vh6bOlYemzpWHps6Vh6bO/6E3Iv+eRDf/n0pJ/6RJVvqoSWTxrEty6bBNf+Gz UYvas1qV1LNjns+zbqXLs3irw6x8t7ilgb+vnobGqJmMy6GVktCbkpvTlY6i1JGMpdCRi6bOkYum zpGLps6Ri6bOkYumzpGLps6Ri6bOkYumzpGLps6Ri6bOkYumzpGLps6Ri6bO/6E3Iv+eRDf/oElI /6VIVvuqSGTyrklx6rJMfeK2T4ncuFeS1rphmtO9baDJuHWrvrB6trOpf7+qooTGop2Ky5uakM+V l5nSkJWi1I2QpdCMkKbPjJCmz4yQps+MkKbPjJCmz4yQps+MkKbPjJCmz4yQps+MkKbPjJCmz4yQ ps+MkKbP/6E3Iv+eRDf/oElI/6ZHVfurR2PzsEhw67VKfOS6Tobev1WP2sNgldLEbZzFu3OqubN4 tq6tfb+lp4LFnaKIy5afjs+PnJbSi5yi04iVpNCJlKXPiZSlz4mUpc+JlKXPiZSlz4mUpc+JlKXP iZSlz4mUpc+JlKXPiZSlz4mUpc+JlKXP/6I3Iv+fRDf/oUhI/6dGVfysRWL0skZu7LhIeua/TIPh x1OK3M1ijs7IbJvAv3GqtLd3tamxfL6frIHFl6eGypCkjM6KopXRhqKh0oSbpdCFmqXPhZqlz4Wa pc+FmqXPhZqlz4Wapc+FmqXPhZqlz4Wapc+FmqXPhZqlz4Wapc+FmqXP/6I2Iv+fQzf/okZH/6hE VP2uQ2H1tURs7rxGd+nES3/jz1SE2dRliMjLa5q6wnCprrp3tKO0fL2ar4HDkqyFyIupisyEp5LP gKac0ICjpc+AoabOgKGmzoChps6AoabOgKGmzoChps6AoabOgKGmzoChps6AoabOgKGmzoChps6A oabO/6I2Iv+fQzf/o0VH/6pCU/6xQV/2uEFq8cFEc+rMS3ng2lZ8z9VejcDMaZuzw3Kop7t5s561 f7uXsYPCjq2FxoeriMqBqY3NfKiWznuoos17qabNe6mmzXupps17qabNe6mmzXupps17qabNe6mm zXupps17qabNe6mmzXupps17qabN/6M2Iv+fQzf/pUNG/6xAUv+0Pl35vT9m7shDbePWTW/V3U6B xNNZkbXJZp+pwXGroLt5s5m2gLqUsoXAjK+GxIatiMeAq4zJfKqSynqrnMp5q5/Keaufynmrn8p5 q5/Keaufynmrn8p5q5/Keaufynmrn8p5q5/Keaufynmrn8p5q5/K/6M1Iv+gQjf/pkFF/689UP64 O1nzxDxh5tFDZNnfQ3PI3EqFt9BXlarHZaKgwHCsmbp5tJS2gLqRs4W+i7GGwYWwiMOBrovFfa2Q xnqtl8Z6rZrGeq2axnqtmsZ6rZrGeq2axnqtmsZ6rZrGeq2axnqtmsZ6rZrGeq2axnqtmsZ6rZrG /6Q0Iv+hQTf/qT1D/7M5Tfm+N1XqzDpZ2907YsvlP3e72UiJq85XmKDGZaSYwHGsk7t6s5C4gbiM tYS7iLOGvoWyicCBsYvBfrCPwnuwlMN6sJbDerCWw3qwlsN6sJbDerCWw3qwlsN6sJbDerCWw3qw lsN6sJbDerCWw3qwlsN6sJbD/6Q0Iv+jPjb/rTlB/7g0SPDGM03f2TZQzeU2Z77kO3ut10iMoM1Y mZfGZ6SSwXKrjr17sIy6gbSIuIO3hLeFuYK1iLt/tIq9fLONvnqzkb96s5O/erOTv3qzk796s5O/ erOTv3qzk796s5O/erOTv3qzk796s5O/erOTv3qzk796s5O//6YyIv+mOjT/sjM998AuQuTSL0HP 5C5Vv+8za6/hO36g1kqNls5bmZDIaaGMw3OoicB7rIa+f6+CvIGygLuEs326hrV7uYi2ebiLt3e3 j7h3t5C5d7eQuXe3kLl3t5C5d7eQuXe3kLl3t5C5d7eQuXe3kLl3t5C5d7eQuXe3kLl3t5C5/6cx Iv+sMzH/uSs26swmNtLhJkHB7yxasO0zbqHhPX+V102MjdBelonLa52Gx3Sig8R6pn/Dfal8wYCr esCCrHm/hK13voavdb6JsHO9jLFzvY2xc72NsXO9jbFzvY2xc72NsXO9jbFzvY2xc72NsXO9jbFz vY2xc72NsXO9jbFzvY2x/6kuIf+zKivyxSIs1t4cLcPtI0ey+Stdouw2b5XiQn2L2lKIhdRgkILQ bJZ+zHObe8p3nnjJe6B2yH6idMeAo3PGgqRxxYSlcMSHpm7Eiqduw4unbsOLp27Di6duw4unbsOL p27Di6duw4unbsOLp27Di6duw4unbsOLp27Di6duw4un/6wqIPq9HyLc2RIbxesaM7T6I0qj+S5e le48bYrlSXmD31aCftpkiXrWbI5203GRc9J1lHHQeZVvz3uXbc5+mGzOgJlrzYKaas2Em2nMh5xo zIicaMyInGjMiJxozIicaMyInGjMiJxozIicaMyInGjMiJxozIicaMyInGjMiJxozIic/7YeGOTQ DhPI6REgtfkbN6X/JkuX+jRci/FCaILqT3J85Vt6d+Fkf3LeaoNu3HCGbNt0iGrZd4lo2XmLZ9h8 i2bXfoxl1oCNZNaCjmPVhY9i1YWPYtWFj2LVhY9i1YWPYtWFj2LVhY9i1YWPYtWFj2LVhY9i1YWP YtWFj2LVhY9i1YWP6ccNDMraCw+39xIkp/8dOZj/K0mM/jpXg/ZJYXzwVWl17F5vbuljdGrnaXdn 5W55ZeRye2PjdXxi4nd9YeJ5fmDhe39f4X1/X+B/gF7ggoFd34OBXd+DgV3fg4Fd34OBXd+DgV3f g4Fd34OBXd+DgV3fg4Fd34OBXd+DgV3fg4Fd34OBy9AJA7riCxOo/xQmmv8hN43/MUWE/0BQfPxO WHT4V19t9F1kZ/JiZ2PwaGph7mxsX+1wbV3tcm9c7HVvW+x3cFrreXFa63pxWep8cljqf3JY6n9z WOp/c1jqf3NY6n9zWOp/c1jqf3NY6n9zWOp/c1jqf3NY6n9zWOp/c1jqf3NY6n9z/5w4Gv+aRi3/ l1FB/5pTT/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyryIqQsMWHlLTDhJi3woGbucF/ nrrBfaK7wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9u3iz vbt4s727eLO9/5w4Gv+aRi3/l1FB/5pTT/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyr yIqQsMWHlLTDhJi3woGbucF/nrrBfaK7wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727 eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9/5w4Gv+aRi3/l1FB/5pTT/6cVV71nFps7JtfeuSZ Z4fclnGS1ZN7nM+QhKTLjoyryIqQsMWHlLTDhJi3woGbucF/nrrBfaK7wHumvMB5q72/eLK9u3iz vbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9/5w4Gv+aRi3/l1FB /5pTT/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyryIqQsMWHlLTDhJi3woGbucF/nrrB faK7wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4 s727eLO9/5w4Gv+aRi3/l1FB/5pTT/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyryIqQ sMWHlLTDhJi3woGbucF/nrrBfaK7wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727eLO9 u3izvbt4s727eLO9u3izvbt4s727eLO9/5w4Gv+aRi3/l1FB/5pTT/6cVV71nFps7JtfeuSZZ4fc lnGS1ZN7nM+QhKTLjoyryIqQsMWHlLTDhJi3woGbucF/nrrBfaK7wHumvMB5q72/eLK9u3izvbt4 s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9/5w4Gv+aRi3/l1FB/5pT T/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyryIqQsMWHlLTDhJi3woGbucF/nrrBfaK7 wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727eLO9u3izvbt4s727 eLO9/5w4Gv+aRi3/l1FB/5pTT/6cVV71nFps7JtfeuSZZ4fclnGS1ZN7nM+QhKTLjoyryIqQsMWH lLTDhJi3woGbucF/nrrBfaK7wHumvMB5q72/eLK9u3izvbt4s727eLO9u3izvbt4s727eLO9u3iz vbt4s727eLO9u3izvbt4s727eLO9/504Gv+aRS7/l1BB/5tRT/+dVF31nlhr7J1deeSbZIbcmG6S 1ZV4nNCSgaTLj4mrx42PscWJk7XDhZe4woKausF/nrvAfaK9v3unvr95rb67eLG+tnmyvrZ5sr62 ebK+tnmyvrZ5sr62ebK+tnmyvrZ5sr62ebK+tnmyvrZ5sr62ebK+/504Gv+aRS7/mE9A/51QTv+f Ulz2oFVq7aBaeOWfYIXdnGqR1phzm9CVfaTLkoWrx4+NscSMkbbCh5W5wYOZu79/nb6+faK/vXqo wLx5r8G0ebDBsHqwwLB6sMCwerDAsHqwwLB6sMCwerDAsHqwwLB6sMCwerDAsHqwwLB6sMCwerDA /503Gv+bRS7/mU5A/55OTv+hUFv3olNp7qNXd+aiXYPen2aP15xvmtGYeaPLlYKrx5KJscSOj7bC iZO6v4SYvb2AncC8faPCu3uqxLR6rcSte67Dqnuvwap7r8Gqe6/Bqnuvwap7r8Gqe6/Bqnuvwap7 r8Gqe6/Bqnuvwap7r8Gqe6/B/543Gv+bRC7/mk1A/59NTf+iTlv3pFFo76VVdeelWoLfo2KN2KBr mNKcdaHMmX6pyJWGsMSSjbbBjJG7voaWv7yBnMO6fqTFt3yrx617q8anfK3EpH2uw6R9rsOkfa7D pH2uw6R9rsOkfa7DpH2uw6R9rsOkfa7DpH2uw6R9rsOkfa7D/543Gv+bRC7/m0xA/6BMTf+kTVr4 pk9n8KhTdOioV4Dgp16M2qRoltOhcZ/OnXqnyZmDr8WVirXBj4+7vYmVwbqFncS2gqTHsICqyKd9 qsiifqzFn3+uw59/rsOff67Dn3+uw59/rsOff67Dn3+uw59/rsOff67Dn3+uw59/rsOff67D/543 Gv+bRC7/nEs//6FKTP+lS1n5qE5m8apRc+mrVX/iq1uK26lllNWmbp3Po3elyp+ArMWZhrS/k4y8 uI2TwbKJmcWuhqHIqoSpyaGAqcqcgazGm4GtxJuBrcSbga3Em4GtxJuBrcSbga3Em4GtxJuBrcSb ga3Em4GtxJuBrcSbga3E/542Gv+cRC7/nEo//6JJTP+mSln5qUxl8axPcequVH3jr1mI3a5ikdat a5rRqnWiy6V9q8Gdg7S5lom8spGQwayMlsaniZ3Io4emypuDqMuYg6vHloStxZaErcWWhK3FloSt xZaErcWWhK3FloStxZaErcWWhK3FloStxZaErcWWhK3F/542Gv+cQy7/nUk//6NIS/+nSVj6q0tk 8q5OcOuxUnvks1eF37RgjtmzapbRsXWexqh7q7yggbSzmoe8rJSNwqaQlMagjZvJnIuky5aHqMuT h6vIkoesxZKHrMWSh6zFkoesxZKHrMWSh6zFkoesxZKHrMWSh6zFkoesxZKHrMWSh6zF/582Gv+c Qy7/nkg//6NHS/+oSFf7rUlj87BMb+y0UHnmuFaD4btei9q7apLNtHOewat5qrekf7SunYS8ppiK waCUkcaakZjJlo+hy5GMqMyPiqrIjoqsxo6KrMaOiqzGjoqsxo6KrMaOiqzGjoqsxo6KrMaOiqzG joqsxo6KrMaOiqzG/582Gv+cQy7/nkc+/6RGSv+qRlb8rkhi9LNLbe64T3fovVV/4cFehtbAbI7I t3Gdva53qrKnfbSpoYK7oZyIwZqYj8aUlpbJkJSfy4ySqMyKj6rJio6sxoqOrMaKjqzGio6sxoqO rMaKjqzGio6sxoqOrMaKjqzGio6sxoqOrMaKjqzG/582Gv+cQy7/n0Y+/6VFSv+rRVX8sEZh9rZJ a/C8TnTnwlV738hhgNHDao3EunCduLJ1qa2re7OjpYC7m6GGwZSdjcWOm5TIipmdyoaZqMuGlKrJ hpKrxoaSq8aGkqvGhpKrxoaSq8aGkqvGhpKrxoaSq8aGkqvGhpKrxoaSq8aGkqvG/581Gv+dQi7/ oEU9/6dESf+tQ1T+s0Rf97pHaO/BTXDlyVZ13M5keszGaY2+vm6csrZ0qKewebKeq366laaEwI6j i8SIoZLHhJ+ayYCfp8qBmqrIgpirxoKYq8aCmKvGgpirxoKYq8aCmKvGgpirxoKYq8aCmKvGgpir xoKYq8aCmKvG/6A1Gv+dQi7/oUQ9/6hCSP+vQVP/tkJd975GZezHTWvj0lht1tNhesfKZ4y5wm2b rLxyp6G2d7GYsX25j62CvoiqicOCqJDGfaeZyHqnpcl7oqvIfZ6sxn2erMZ9nqzGfZ6sxn2erMZ9 nqzGfZ6sxn2erMZ9nqzGfZ6sxn2erMZ9nqzG/6A1Gv+dQi7/okI8/6pAR/+yPlH9ukBZ88NEYOjP TmPf3Flnz9hgecDPZoqyyGuapsJwppu8dq+RuHu3ibWBvIKyh8B9sI7DeK6WxXatocZ1rKzGd6at xXemrcV3pq3Fd6atxXemrcV3pq3Fd6atxXemrcV3pq3Fd6atxXemrcV3pq3F/6A0Gv+eQS7/pEA7 /6w9Rf+1O073vz5V7MtEWeHaT1rU31FsxtpafbjTYourzmmYn8ZxpJXAd62Ou360h7eDuYG0h718 soy/ebGTwXawm8J0sKbCcrCtwnKwrcJysK3CcrCtwnKwrcJysK3CcrCtwnKwrcJysK3CcrCtwnKw rcJysK3C/6EzGv+eQS//pz06/7A6Q/26OErwxjtP49VFTtXhRl/I4ktxut1SgazVW4+fzGablsZw pI/AeKuKvH+xhLmDtYC3h7h8tou7ebSQvHe0l712tKG9dLOlvnSzpb50s6W+dLOlvnSzpb50s6W+ dLOlvnSzpb50s6W+dLOlvnSzpb50s6W+/6IzGv+gPi7/qjk3/7Q1P/bANUTnzzlF1988UMnnQWS7 5UZ2rNxOhZ/TWpKVzGecjsZxpIrCeaqFv36ugLyCsn26hrR6uYq2d7iOuHW3k7lzt5q5c7eguXO3 oLlzt6C5c7eguXO3oLlzt6C5c7eguXO3oLlzt6C5c7eguXO3oLlzt6C5/6MyGv+jOiz/rjQ0/rox Ou3KMDva3TI/yuc4VbzsPWmt5UR5n9tOh5TTXJKNzGibiMhyoYTEeaaAwn2qfMCBrXm+ha93vYiw dLyLsnK7kLNwu5W0b7qatG+6mrRvupq0b7qatG+6mrRvupq0b7qatG+6mrRvupq0b7qatG+6mrRv upq0/6QwGv+nNSr/tC8w9MMqMd7YKy3M5i5FvfI1Wq3uO2yf5ER7k9tRh4vUXpCGz2qYgstznX7I eKF6xnykd8SApnXDg6hzwoapccGJq2/AjaxtwJKtbL+VrWy/la1sv5WtbL+VrWy/la1sv5WtbL+V rWy/la1sv5WtbL+VrWy/la1sv5Wt/6UvGv+tLSX8vCco5dAhJM7kJDO+8SxKrvgzXaDtPW2T5Ed6 it1UhYPXYYx/0mySe89yl3fNd5p0y3uccsp+nnDJgaBuyIShbceHomvGiqNpxo6kaMWRpWjFkaVo xZGlaMWRpWjFkaVoxZGlaMWRpWjFkaVoxZGlaMWRpWjFkaVoxZGl/6csGv+1JR/syRoc0OIZIb/w Ijiv/StNoPg1XpPuQWyJ5k13geBYgH3cZIZ42GuLc9VxjnDTdZFu0nmTbNF8lGrQf5Zpz4KXaM+F mGbOiJllzYyaZM2OmmTNjppkzY6aZM2OmmTNjppkzY6aZM2OmmTNjppkzY6aZM2OmmTNjppkzY6a /64kFvXBFxTU3w4QwO8YJrD9Izyh/y1OlPk6XYnxR2iB61JxeuZdeHTiZH1w32uBbd1whGrcdIZo 23iIZtp7iWXZfYpk2ICLYtiDjGHWhY1g1omOX9WLjl/Vi45f1YuOX9WLjl/Vi45f1YuOX9WLjl/V i45f1YuOX9WLjl/Vi45f1YuO/rkWDdTSCwbC7g4WsfwZKqL/JT2U/zJMifxAWYH2TWJ68Fhpc+xf b2zpZHNo52p2ZuVveWTkc3pi43Z8YeN5fWDie35f4X5+XuGAf13gg4Bc4IWBW9+IgVvfiIFb34iB W9+IgVvfiIFb34iBW9+IgVvfiIFb34iBW9+IgVvfiIFb34iB1MgJA8TXCgey+xAZo/8cK5X/KDuK /zhIgf9FUnr8Ulpy91lga/ReZGbyZGhi8GlqYO5tbF7tcW1c7XRuW+x2b1rseXBZ63txWOt9cVjq f3JX6oJzVumEc1bphHNW6YRzVumEc1bphHNW6YRzVumEc1bphHNW6YRzVumEc1bphHNW6YRzxM0I AbTdCAuk/xIal/8fKov/LjaB/z1Bef9KSXH/UlBp/1hVY/1dWF/7Y1tc+WddWvhrX1j3bmBX93Fh VvZ0YVX2dmJU9XdjU/V5Y1P0fGRS9H5kUfSAZVH0gGVR9IBlUfSAZVH0gGVR9IBlUfSAZVH0gGVR 9IBlUfSAZVH0gGVR9IBl/5YzFP+VQyX/klE3/5dTRf+ZV1P9mVtg9Zhhbe2VaHnlknKE3498jtqM hZbVh4uc0YOQoc+AlabNfZqpy3ueq8p5oa3Jd6WvyHWpsMd0rrHHc7OyxnO6ssF1u7LBdbuywXW7 ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuy/5YzFP+VQyX/klE3/5dTRf+ZV1P9mVtg 9Zhhbe2VaHnlknKE3498jtqMhZbVh4uc0YOQoc+AlabNfZqpy3ueq8p5oa3Jd6WvyHWpsMd0rrHH c7OyxnO6ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuy/5YzFP+V QyX/klE3/5dTRf+ZV1P9mVtg9Zhhbe2VaHnlknKE3498jtqMhZbVh4uc0YOQoc+AlabNfZqpy3ue q8p5oa3Jd6WvyHWpsMd0rrHHc7OyxnO6ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuy wXW7ssF1u7LBdbuy/5YzFP+VQyX/klE3/5dTRf+ZV1P9mVtg9Zhhbe2VaHnlknKE3498jtqMhZbV h4uc0YOQoc+AlabNfZqpy3ueq8p5oa3Jd6WvyHWpsMd0rrHHc7OyxnO6ssF1u7LBdbuywXW7ssF1 u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuy/5YzFP+VQyX/klE3/5dTRf+ZV1P9mVtg9Zhh be2VaHnlknKE3498jtqMhZbVh4uc0YOQoc+AlabNfZqpy3ueq8p5oa3Jd6WvyHWpsMd0rrHHc7Oy xnO6ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuy/5YzFP+VQyX/ klE3/5dTRf+ZV1P9mVtg9Zhhbe2VaHnlknKE3498jtqMhZbVh4uc0YOQoc+AlabNfZqpy3ueq8p5 oa3Jd6WvyHWpsMd0rrHHc7OyxnO6ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7ssF1u7LBdbuywXW7 ssF1u7LBdbuy/5YzFP+VQyX/k1E3/5dTRf+ZVlL9mVtg9Zhgbe2WZ3nlk3GE35B7jtqNhJbViIqc 0YSQos+AlabMfZmpy3udrMl5oa7Id6WvyHaqscd0rrLHc7SyxHS6sr91urK/dbqyv3W6sr91urK/ dbqyv3W6sr91urK/dbqyv3W6sr91urK/dbqy/5YzFP+WQyX/lVA3/5lRRP+bVFL+nFhf9ZtdbO2Z ZHjmlmyD35N2jdqPgJbUjIid0YeOo82Dk6jLgJiryX2crsh6obHGeKWyxneqtMV1sLXFdLi1vXe4 tbh3uLW4d7i1uHe4tbh3uLW4d7i1uHe4tbh3uLW4d7i1uHe4tbh3uLW4d7i1/5czFP+WQyX/lk43 /5pPRP+dUlH+nlVe9p5aau6cYHbnmmeC4JZyjNqSe5XUjoSd0IqLo82GkanKgpatyH6bsMZ7oLPF eaa1xHestsN2s7e+d7e3t3i2uLJ5triyeba4snm2uLJ5triyeba4snm2uLJ5triyeba4snm2uLJ5 triyeba4/5gzFP+XQyX/l003/5tNQ/+fUFD/oFNd96BYae+fXXXonWSA4Zpui9uWd5TVkYCc0I6J o8yJj6nJhJWux4CassV9oLXDeqe3wniuucB3tbm4eLW5sXm1uax6tbmserW5rHq1uax6tbmserW5 rHq1uax6tbmserW5rHq1uax6tbmserW5/5gzFP+YQyX/mEw2/5xMQ/+gTk//olFc+KNVaPCiW3Tp oWF/4p5qidyac5PWlXyb0ZGFo8yMjKnJh5OvxoKZs8N+oLfCeqi5wXixu7l4s7yxebO7q3q0u6d7 tbqne7W6p3u1uqd7tbqne7W6p3u1uqd7tbqne7W6p3u1uqd7tbqne7W6/5kzFP+YQyX/mUs2/55L Qv+hTE7/pE9b+aVTZvGlWHLqpF5946Jmh92ecJHXmXiZ0pWBoc2PianJipGvxYOYtMJ/n7i9fKe7 unqwvbJ6sr6re7K9pnyzvKN9tLqjfbS6o320uqN9tLqjfbS6o320uqN9tLqjfbS6o320uqN9tLqj fbS6/5kzFP+YQyb/mUo2/59KQv+jS07/pk5Z+qhRZfKoVnDrqFx75adihd+jbI7Zn3WX05p+n82T hqjFjY2vv4eUtbmDnLm1f6O8sX2svqx8sb+lfLG/oX6zvZ5+tLuefrS7nn60u55+tLuefrS7nn60 u55+tLuefrS7nn60u55+tLuefrS7/5kzFP+ZQyb/mkk1/6BIQf+kSU3/p0xY+qpQZPOrVG7trFp5 5qxgguCqaYvapnOUz598ncaXg6i+kIqwuIuRtrKGmLqtg6C9qYGov6WAsMCff7DAnICyvZqBs7ua gbO7moGzu5qBs7uagbO7moGzu5qBs7uagbO7moGzu5qBs7uagbO7/5ozFP+ZQyb/m0g1/6FHQf+l SEz/qUpX+6xOYvWvUmzusFh26LFef9+waIjVrHSQyqN6ncCbgai4lIewsY+OtquKlbumh52+ooWl wJ+Er8GZga/Bl4KyvpWDs7yVg7O8lYOzvJWDs7yVg7O8lYOzvJWDs7yVg7O8lYOzvJWDs7yVg7O8 /5ozFP+ZQyb/nEc1/6JGQP+nR0v/q0lW/a9MYPayUWrutFdz5bdefN22aoPPr3KQxaZ4nbuefqey mIWwq5OLtqWOk7ufi5q+m4miwZiIrMKTha/Ckoaxv5GGs7yRhrO8kYazvJGGs7yRhrO8kYazvJGG s7yRhrO8kYazvJGGs7yRhrO8/5ozFP+ZQib/nEY0/6NFQP+oRUr/rUdV/rFKX/W1UGjruVZw471e d9m7aoDLsnCQwKl2nbaifKetnIKvpZeJtp6TkLuZj5i+lI2gwZGMqcKNiq7CjYmxv42Jsr2NibK9 jYmyvY2Jsr2NibK9jYmyvY2Jsr2NibK9jYmyvY2Jsr2NibK9/5szFP+aQib/nUU0/6REP/+qREn/ r0VT/LRJXfK5T2XpvlZs4cNgctO+aYDGtW6Pu610nLCmeqenoICvn5uGtZiXjruTlZW+jpKdwYqS p8KIkK7CiI6wwIiNsr2IjbK9iI2yvYiNsr2IjbK9iI2yvYiNsr2IjbK9iI2yvYiNsr2IjbK9/5sz FP+aQib/nkQz/6VCPv+rQkj/sURS+rdIWvC9TmHmxFZn3slibc7BZ3/BuW2OtrFym6uqeKaipX6u maCEtZKdi7qMmpO+h5ibwISXpMKClq/Cg5OwwISRsr6EkbK+hJGyvoSRsr6EkbK+hJGyvoSRsr6E kbK+hJGyvoSRsr6EkbK+/5szFP+aQSb/n0Iz/6ZAPf+tQEf/tEJP97tHV+3DTV3kzFhg2c1gbMnF Zn68vWuNsLVxmqWvdqWcqnytk6aCtIyiibmGoJC9gZ6Zv32eosF7nq/BfZmwwH+Wsr5/lrK+f5ay vn+Wsr5/lrK+f5ayvn+Wsr5/lrK+f5ayvn+Wsr5/lrK+/5wzFP+aQSb/oEEy/6g/PP+wPkX/t0FN 9MBFU+rJTlbi1VpX0tFea8TJZH22wWqMqrtvmZ+1dKSWsHqsjayAsoaph7d/p467eqaWvneloL90 pq2/d6Gxv3qdsr56nbK+ep2yvnqdsr56nbK+ep2yvnqdsr56nbK+ep2yvnqdsr56nbK+/50zFP+b QSb/oj8x/6o8Ov+zPEL7uz5J8MZETebST03c3FdWzNVdar7NY3uwx2iLpMFtl5m8c6KPuHiqhrR+ sH+yhbV5sIy4dK+Vu3Gun7xur6u9caqzvHSls7x0pbO8dKWzvHSls7x0pbO8dKWzvHSls7x0pbO8 dKWzvHSls7x0pbO8/50zFP+bQCb/pDww/605OP+2OT/1wTxD6c5ERN7dTUfS4FNYxdtcaLfTYXqp zWaJnMhrlZHEcZ+IwHanf719rXi7hLFzuou0b7iUt2y3nbhqt6i5aba2uG2vtbltr7W5ba+1uW2v tbltr7W5ba+1uW2vtbltr7W5ba+1uW2vtbltr7W5/54yFP+dPiX/pzku/7E2Nfu8NjrtyTo84NpE OtLiR0zH4k1eud5UbqzZW3yf1GKIlNBok4rMb5uCx3eifMN+qHbAhKxyvoqvb7yRsW28mLJru6Gz arutsme6trRnura0Z7q2tGe6trRnura0Z7q2tGe6trRnura0Z7q2tGe6trRnura0/58yFP+gOiT/ qjQs/7UyMfPDMjPj1Dgw0+E8P8boQlK55UhjrOJNcp/fVH+T2V2KidJnk4PNcJp9yXefeMZ9pHTE g6dwwoipbsGOq2zAlKxqv5utab+lrWi/rq1ov66taL+urWi/rq1ov66taL+urWi/rq1ov66taL+u rWi/rq1ov66t/6AwFP+jNiL/rzAo+7wtK+jNLCjV4DAwx+k4RLnsPles6UVnnudLdZLgU4CJ2V6J gtRokXzQcZZ4zHebdMp9nnDIgqFux4eja8WLpWnEkKZoxJanZsOeqGXDpahlw6WoZcOlqGXDpahl w6WoZcOlqGXDpahlw6WoZcOlqGXDpahlw6Wo/6EvFP+oLx//tSoi8MYkIdjdIyDI6S01uvI1Sazx PFqe8ENpkuhMdYjhVX+B22GHe9dqjXbTcZFy0XeVb898l2zNgJpqzIWbaMuJnWbKjZ5lyZKfY8mY oGLInqFiyJ6hYsieoWLInqFiyJ6hYsieoWLInqFiyJ6hYsieoWLInqFiyJ6h/6MtFP+uKRr4vyAa 3tYYE8noIiW69Cs6rPg0TZ73PFyS8UZpiOlQc3/jWXt632SCdNxrhnDZcYpt1naNatV7j2jTf5Fm 0oOSZNGHlGPRipVh0I+WYM+Ul17PmZhez5mYXs+ZmF7PmZhez5mYXs+ZmF7PmZhez5mYXs+ZmF7P mZhez5mY/6coEv+3HxLmzhENy+YVFrv0ISqs/is+nv80TpL6P1yI8kpmf+xVb3noXnVy5GR7buFr fmrfcIFo3nWEZdx5hWPbfYdi2oGIYNqEiV/Zh4pd2IuLXNeQjFvWlI1b1pSNW9aUjVvWlI1b1pSN W9aUjVvWlI1b1pSNW9aUjVvWlI1b1pSN/7AeC+3GDgjN2wsIu/MVGqz/IS6e/yw/kv83TYf9RFh/ 9k9hePFZaHHtX21q62RxZ+hqdGTnb3di5XR5YOR4el/je3td4358XOKBfVvhhH5a4Yh/WeCMgFjg j4FY4I+BWOCPgVjgj4FY4I+BWOCPgVjgj4FY4I+BWOCPgVjgj4FY4I+B870NBMzPCQG95QwMrP8X Hp7/JC+S/y89h/89SX//SVJ4/FRacPhaX2n0X2Rk8mVnYfBqaV7vbmtc7nJtW+12blrseW9Y7Hxw V+t+cFbrgXFV6oRyVOqIc1Ppi3RT6Yt0U+mLdFPpi3RT6Yt0U+mLdFPpi3RT6Yt0U+mLdFPpi3RT 6Yt0zMYIAL3UCAOt9Q4Pn/8aH5P/Jy2I/zQ5fv9CQ3f/TUpu/1NQZ/9ZVWL8Xlhe+2RbW/loXVn4 bF5X93BgVvdzYVX2dmJU9XhiU/V7Y1L0fWRR9IBkUPODZU/zhmZP84ZmT/OGZk/zhmZP84ZmT/OG Zk/zhmZP84ZmT/OGZk/zhmZP84ZmvcsGAK7bBgSf/xAQk/8dHYj/Kih+/zgydv9EOm3/S0Fl/1FG X/9XSVv/XUxY/2JOVf9mUFP/alFS/21SUP9wU0//clRO/3VUTf93VU3/eVVM/ntWS/5+V0r9gVdK /YFXSv2BV0r9gVdK/YFXSv2BV0r9gVdK/YFXSv2BV0r9gVdK/YFX/40tDv+MPh3/ikwu/5JTO/+U V0j/lVxU/ZNiYPWRamvvjXJ26Yl8f+SFhIbggIuN3HyRktp5l5bYdpyZ1XOgm9RxpZ3Tb6mf0m6u oNJts6HRbLmi0WvAo81sxaPIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLIbsai /40tDv+MPh3/ikwu/5JTO/+UV0j/lVxU/ZNiYPWRamvvjXJ26Yl8f+SFhIbggIuN3HyRktp5l5bY dpyZ1XOgm9RxpZ3Tb6mf0m6uoNJts6HRbLmi0WvAo81sxaPIbsaiyG7GoshuxqLIbsaiyG7Goshu xqLIbsaiyG7GoshuxqLIbsai/40tDv+MPh3/ikwu/5JTO/+UV0j/lVxU/ZNiYPWRamvvjXJ26Yl8 f+SFhIbggIuN3HyRktp5l5bYdpyZ1XOgm9RxpZ3Tb6mf0m6uoNJts6HRbLmi0WvAo81sxaPIbsai yG7GoshuxqLIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLIbsai/40tDv+MPh3/ikwu/5JTO/+UV0j/ lVxU/ZNiYPWRamvvjXJ26Yl8f+SFhIbggIuN3HyRktp5l5bYdpyZ1XOgm9RxpZ3Tb6mf0m6uoNJt s6HRbLmi0WvAo81sxaPIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLIbsai/40t Dv+MPh3/ikwu/5JTO/+UV0j/lVxU/ZNiYPWRamvvjXJ26Yl8f+SFhIbggIuN3HyRktp5l5bYdpyZ 1XOgm9RxpZ3Tb6mf0m6uoNJts6HRbLmi0WvAo81sxaPIbsaiyG7GoshuxqLIbsaiyG7GoshuxqLI bsaiyG7GoshuxqLIbsai/40tDv+NPh3/jEwu/5RTO/+VVkf/lltU/ZVhYPaSaGvvj3B16Yt6f+SH g4ffgoqN3H6Qktl6lpfWd5ua1XSgndNypZ/ScKmh0W6uotBttKPQbLqk0GzCpMpuxKTEb8SkxG/E pMRvxKTEb8SkxG/EpMRvxKTEb8SkxG/EpMRvxKTEb8Sk/44tDv+OPh3/jksu/5VROv+YVEf/mFhT /pheX/aVZGrvkmx16Y52fuSKgIffhYeO24COlNh8lJjVeZqc03afn9FzpKLQcaqkz2+vpc5utqbO bb2nym7Cp8Nwwqe9ccKnvXHCp71xwqe9ccKnvXHCp71xwqe9ccKnvXHCp71xwqe9ccKn/48tDv+O Ph7/kEot/5dPOv+ZUUb/m1ZS/ppbXveYYWnwlWh06pFxfuSOfIbfiYSO24OLlNd/kprUe5ie0nee odB0pKTOcqqmzXCxqM1vuanLb8Gpw3HBqbxywKq3c8Cqt3PAqrdzwKq3c8Cqt3PAqrdzwKq3c8Cq t3PAqrdzwKq3c8Cq/48tDv+PPh7/kkot/5hNOf+bT0X/nVNR/51YXPibXmjxmWVy6pVtfOSRd4bf jIGO24eJldaBkJrTfZaf0Hmdo851o6bNcqupzHCzqstvvavFcr+rvXO/rLZ0vqyxdb6tsXW+rbF1 vq2xdb6tsXW+rbF1vq2xdb6tsXW+rbF1vq2xdb6t/5AtDv+QPh7/k0kt/5lMOf+dTkT/n1FQ/59W W/meXGbynGJx65hpe+WUc4Tgj32N24qGlNaEjZvSf5Wgz3qcpc12o6jLc6urynG1rcZxvq2+dL2u tnW9rrB2va6sd72urHe9rqx3va6sd72urHe9rqx3va6sd72urHe9rqx3va6sd72u/5AtDv+QPh7/ lUks/5tKOP+eTEP/oU9P/6JUWvqhWWXzoF9v7J1meeaYb4Pgk3mM246Ck9aHipvSgZKhz3yapsp4 oqrHdautw3O0r79zvLC3dbywsHe7sKp4u7Cnebywp3m8sKd5vLCnebywp3m8sKd5vLCnebywp3m8 sKd5vLCnebyw/5EtDv+RPh7/lkgs/5xIN/+gSkL/o01N/6RSWPulV2P0pF1t7qFjd+iea4DimHWJ 3JJ+ktOMh5rMho+hxoCXp8F8nqy9eaavuXavsbd2urKvd7qyqnm6sqV6urKie7uxonu7saJ7u7Gi e7uxonu7saJ7u7Gie7uxonu7saJ7u7Gie7ux/5EtDv+RPh7/mEcs/51HN/+hSEH/pUtM/6dQVvyo VWH1qFtr7adhdOWkaX7en3OH1Jh9kMuRhJrEioyivoSTqLiAmq20fKKwsHqrs615tbSoerm0pHu5 tKB9ubOdfbqznX26s519urOdfbqznX26s519urOdfbqznX26s519urOdfbqz/5ItDv+SPh7/mEYr /55GNv+jR0H/p0lL/6pOVfqrU17yrFlo6axgceKpaHrZpXODzZx6j8WVgZq9joiit4iQqbGEl66s gJ+xqH6ntKV9sbWhfbi2nX64tZp/ubSZgLqzmYC6s5mAurOZgLqzmYC6s5mAurOZgLqzmYC6s5mA urOZgLqz/5ItDv+SPh7/mUUr/59ENf+kRUD/qUhJ/6xMU/iuUlzvsFhl5rFfbd6waXbSqXGCyKB4 j7+Yfpq3koWisIyMqaqIlK6khZyyoIKktZ2BrraagLe3l4G3tpWCubSUgrmzlIK5s5SCubOUgrmz lIK5s5SCubOUgrmzlIK5s5SCubOUgrmz/5MtDv+SPR7/mkQq/6BDNf+mRD7/q0ZI/65LUfWyUFns tVdh5Ldeadq0aXPNrG+CwqR2j7mcfJmxloOiqpGKqaOMka6eiZmymYehtZaFq7eThba3kYS3t5CF uLWQhbm0kIW5tJCFubSQhbm0kIW5tJCFubSQhbm0kIW5tJCFubSQhbm0/5MtDv+TPR7/m0Mq/6JC NP+oQj3/rUVG/LFKT/K1T1bpulZd4b1gZNS4Z3LIr22Bvad0jrSgepmrmoCipJWHqZ2Rjq6Xjpay kouftY+KqLeMirO4i4m3t4uIuLWLiLm0i4i5tIuIubSLiLm0i4i5tIuIubSLiLm0i4i5tIuIubSL iLm0/5MtDv+TPR7/nEEq/6NAM/+pQTz/r0RF+rRITPC6TlPnv1ZZ3sJgYM+7ZnHDs2yBuKtyjq6k eJilnn6hnpqEqJeWjK6Rk5SyjJGctYiPpreFj7G4hY62t4aNuLaHjLi1h4y4tYeMuLWHjLi1h4y4 tYeMuLWHjLi1h4y4tYeMuLWHjLi1/5QsDv+UPR7/nUAp/6Q+Mv+rPzv/sUJC+LhHSe2+Tk/lxldT 2sZeX8u+ZHG+tmqAs69wjampdpigo3yhmJ+CqJGbia2KmZKyhZaatYGVpLd/la63fpS3t4GRt7aC kLi1gpC4tYKQuLWCkLi1gpC4tYKQuLWCkLi1gpC4tYKQuLWCkLi1/5QsDv+UPR7/nj8o/6Y9Mf+t Pjn/tEFA9LxGRevETUnizlhL08pcXsbCY3C5umh/rrRujKOudJeaqXqfkqWAp4qhh6yEn4+xf52X tHucobZ4m6y3d5u3tnqXuLV8lbm0fJW5tHyVubR8lbm0fJW5tHyVubR8lbm0fJW5tHyVubR8lbm0 /5UsDv+VPR7/oD0n/6g7MP+wPDf9uD888cFEQOjLTkLe01VKzs1bXcDGYW60v2d+qLltip20cpWU r3iei6t+pYSohap9poyveKSVsnSjn7Rxo6q1cKO4tXOeubR2m7mzdpu5s3abubN2m7mzdpu5s3ab ubN2m7mzdpu5s3abubN2m7mz/5YsDv+XPB7/ojom/6o5Lv+zOjT5vTw47shDOePVUDfX2lJIyNJZ XLrLX22txWV8ocBriZe6cJONtnachLN8on2wg6h3roqscq2Tr26snbFrrKiyaa22smyou7Fvo7ux b6O7sW+ju7Fvo7uxb6O7sW+ju7Fvo7uxb6O7sW+ju7Fvo7ux/5csDv+aOx3/pDcl/602K/+3NzDz wzox5tBDMNzfSjXP31JHwdhYWrPRXmumy2N6msdpho/CbpCGv3SYfbx6n3a6gaRwuImoa7eSq2i3 nK1lt6euZLe0rmWzva5orb2uaK29rmitva5orb2uaK29rmitva5orb2uaK29rmitva5orb2u/5gs Dv+dORz/pzQj/7EzKPm9Mirqyzcp3N0+KdDjRjrF4k1LuN5VWqzZXGie02J3ks9ngojLbYx+yXOU dsd5mnDFgZ9qxImiZsOSpWLDnKdgw6aoX8O0qF/BwqhhusGpYbrBqWG6walhusGpYbrBqWG6walh usGpYbrBqWG6walhusGp/5ksDv+gNRr/qjEg/7YuI/DFLSLf2DMc0OM6LsToQkC45UlQq+FOX57e VWyS21x3h9hjgX7Vaol21HGPb9F5lGvOgJhnzIibZMqQnWLJmJ9gyaGgX8mroF/JuZ9cyMOiXMjD olzIw6JcyMOiXMjDolzIw6JcyMOiXMjDolzIw6JcyMOi/5ssDv+kMBj/rywb+L4nG+TRJhfR4i0g xOs3M7frPkWq6UVUnudMYpLlUm6G41h4feBgf3bcaYZw2HGLa9V4j2jTf5Jl0YaUYs+NlmDOlJhe zpuZXc2jmlzNrZpbzbeaW823mlvNt5pbzbeaW823mlvNt5pbzbeaW823mlvNt5pbzbea/50sDv+o KxT/tyQV68ocEdPgHhPE6ysmt/E0OKrwPEmd70RXke5LY4btUm196Ft1deNifHDga4Fr3XKFaNp4 iGTZfoti14SNX9WKjl7UkJBc05WRWtOcklnSpJNY0qyTWNKsk1jSrJNY0qyTWNKsk1jSrJNY0qyT WNKsk1jSrJNY0qyT/6ErDf+vIw/0whcM1t0QB8XrHhi39ikrqfczPJ32PEuR90RYhvZNYn3wVmp2 615xbudkdmrka3pm4nJ9ZOB3gGHffYJf3oKEXd2HhVvcjIZa25GHWNqWiFfZnYlW2aOKVtmjilbZ o4pW2aOKVtmjilbZo4pW2aOKVtmjilbZo4pW2aOK/6gjCf25FgfW0QsDxuoQC7b3Hh2p/SkunP40 PpD/PkuG/kdWffhRXnbzWWVu8F9qaO1lbmTqa3Jh6XF0X+d2dl3me3hb5X95WeSEeljjiHxX44x9 VuKRflThl39T4Zx/U+Gcf1PhnH9T4Zx/U+Gcf1PhnH9T4Zx/U+Gcf1PhnH9T4Zx//7EVA9THCQHG 1goDtvcSD6j/HyCb/yswkP82PYX/QEh9/0tRdf1UWG35Wl1n9mBiY/NmZV/ya2dc8HBpWu90a1ju eGxX7XxuVeyAb1TshHBT64hxUuuMcVHqkXJQ6ZVzUOmVc1DplXNQ6ZVzUOmVc1DplXNQ6ZVzUOmV c1DplXNQ6ZVz1r4HAMXLCAC32wkFqP8UEpv/IiGQ/y4uhf85Onz/REN0/05KbP9UUGX/WlRg/V9Y XftlWlr6alxX+W5eVfhyX1T3dmBS9nlhUfZ9YlD1gGNP9IRkTvSHZE3zjGVM85BmTPOQZkzzkGZM 85BmTPOQZkzzkGZM85BmTPOQZkzzkGZM85BmxMIGALbRBwCo7QsGm/8XE5D/JR+F/zEqfP88NHP/ Rjtq/0xBY/9TRl7/WUla/15MVv9jTlT/aFBS/2xRUP9vUk//clNO/3ZUTP95VUv/fFVK/n9WSf6C V0j9hlhH/YpYR/2KWEf9ilhH/YpYR/2KWEf9ilhH/YpYR/2KWEf9ilhH/YpYtskEAKjZBAGb/w4H j/8aEYX/Jxt7/zMkcf88LGj/QzJh/0o3W/9QO1b/Vj1T/1xAUP9gQU7/ZENM/2hESv9rRUn/bkZI /3FGR/90R0b/dkhF/3lIRP98SUP/gElC/4NKQv+DSkL/g0pC/4NKQv+DSkL/g0pC/4NKQv+DSkL/ g0pC/4NK/4IoCf+CORb/gUgl/4pPMf+OVj3/j1xJ/45jVP6Kal74hXFo8oB6cO58g3fqeIt953SS guRxmIXib52I4W2ii+Brp43faayO3mixkN1nt5HdZr2R3GXFktxlzZLUZtGSz2jSks9o0pLPaNKS z2jSks9o0pLPaNKSz2jSks9o0pLPaNKS/4IoCf+CORb/gUgl/4pPMf+OVj3/j1xJ/45jVP6Kal74 hXFo8oB6cO58g3fqeIt953SSguRxmIXib52I4W2ii+Brp43faayO3mixkN1nt5HdZr2R3GXFktxl zZLUZtGSz2jSks9o0pLPaNKSz2jSks9o0pLPaNKSz2jSks9o0pLPaNKS/4IoCf+CORb/gUgl/4pP Mf+OVj3/j1xJ/45jVP6Kal74hXFo8oB6cO58g3fqeIt953SSguRxmIXib52I4W2ii+Brp43faayO 3mixkN1nt5HdZr2R3GXFktxlzZLUZtGSz2jSks9o0pLPaNKSz2jSks9o0pLPaNKSz2jSks9o0pLP aNKS/4IoCf+CORb/gUgl/4pPMf+OVj3/j1xJ/45jVP6Kal74hXFo8oB6cO58g3fqeIt953SSguRx mIXib52I4W2ii+Brp43faayO3mixkN1nt5HdZr2R3GXFktxlzZLUZtGSz2jSks9o0pLPaNKSz2jS ks9o0pLPaNKSz2jSks9o0pLPaNKS/4IoCf+DORb/g0cl/4xOMf+QVT3/kVtI/5BhU/6NaF74iG9o 8oN4cO1+gnjpeop+5naRg+Rzl4ficJ2K4G6ijN9rp47daqyQ3WiykdxnuJPbZr+T22bHlNlm0JTP aNCTy2nQlMtp0JTLadCUy2nQlMtp0JTLadCUy2nQlMtp0JTLadCU/4MoCf+DORf/hkYk/45NMP+T VDz/lFhH/5JeU/+QZV34jG1n8oZ1cO2Bf3jpfYd+5XmPhOJ1lYjgcpuM3m+hj91sp5Hca6yT22mz lNpoupbZZ8OW2WbNl9BpzpbIas6XxGvNl8RrzZfEa82XxGvNl8RrzZfEa82XxGvNl8RrzZfEa82X /4QoCf+EORf/iEUk/5FMMP+VUTv/llZH/5VcUv+TYlz5j2pm84pycO2Fe3jpgIR/5XuMheJ3k4rf c5qO3XCgkdttppTaa62W2Wm0l9hovZjYZ8iZ0WnMmclrzJnCbMyavW3Lmr1ty5q9bcuavW3Lmr1t y5q9bcuavW3Lmr1ty5q9bcua/4UoCf+FORf/ikQk/5NLL/+XTzr/mFRG/5dZUP+WYFv5kmdl845v b+6JeHfpg4F/5H6KheF5kYvedZiP3HGfk9puppbYbK6Y12q2mtZowZvTacubymvLm8Jtypy7bsqd uG/Knbhvyp24b8qduG/Knbhvyp24b8qduG/Knbhvyp24b8qd/4UoCf+GORf/jEQj/5VKL/+ZTTr/ mlFE/5pWT/+ZXVr6lmRk9JJrbu6NdHbph35+5IGHheB8j4vdd5eQ23OeldhvppjWbK+a1Wq5nNRp xp3LbMmdw23JnrxvyJ+1cMifsnHIn7JxyJ+yccifsnHIn7JxyJ+yccifsnHIn7JxyJ+yccif/4Yn Cf+GORf/jkMj/5dJLv+aSzn/nE9D/51UTv+cWlj7mmBi9ZZobO+Rb3Xqi3l+5YWDheB/jIzdeZWR 2XSdltRwpZrQbq6dzWy3n8trw6DDbsegu2/HobVxxqGvcsahrHPGoaxzxqGsc8ahrHPGoaxzxqGs c8ahrHPGoaxzxqGsc8ah/4cnCf+HORf/kEIj/5hHLf+cSTj/n0xC/6BRTP+gV1b7nl5g9Jtlau2W bHPnkHZ84YqAhNuEiYvTfpGSzniZmMl0oZzGcamfwnCyosBvvaO6cMWjs3LFpK5zxaSpdMWjpnXF o6Z1xaOmdcWjpnXFo6Z1xaOmdcWjpnXFo6Z1xaOmdcWj/4cnCf+IOBf/kUEi/5pFLP+eRzb/oUpA /6NQSv6jVVT2olxd76BiZ+icaXDhlnR52pB9gtGJhovKgo2TxX2VmcB5nZ68dqWhuHOtpLVyuKWy csOmrHTDpqd2w6ajd8SloXjEpaF4xKWheMSloXjEpaF4xKWheMSloXjEpaF4xKWheMSl/4gnCf+I OBf/k0Ei/5tELP+gRTX/o0k//6VOSPunVFHzplpb66VgZOOiaG3cnXN20ZV6gsmNgovCh4qTvIKR mrd9mZ+yeqGjr3eppqt2s6epdsCopHfCqKF5wqedesOnm3rDppt6w6abesOmm3rDppt6w6abesOm m3rDppt6w6abesOm/4gnCf+JOBf/lUAh/51CK/+iRDT/pUg9/6hMRviqUk/vq1hX56tfYOCoaWnU oXB1y5l4gcKSf4u7i4aUtYaOmq+ClaCqfp2kpnump6N6sKmgebyqnXrBqZp8wamYfcKoln3Cp5Z9 wqeWfcKnln3Cp5Z9wqeWfcKnln3Cp5Z9wqeWfcKn/4knCf+JOBf/lj8h/55BKv+jQjP/p0Y7/qtL RPWuUUzssFdU5LFeXNutaGbPpW51xZ11gbyWfIu1kIOUroqLm6iGkqCjgpqlnoCiqJt+rKqYfrir ln7Aq5R/wKqTgMGokoDCqJKAwqiSgMKokoDCqJKAwqiSgMKokoDCqJKAwqiSgMKo/4knCf+KOBf/ mD8g/58/Kf+lQTL/qkU6/K5JQfKxT0nptVZQ4bdfV9WxZWXKqGx0wKFzgLeaeouvlIGUqI+Im6KK j6Cch5ell4SgqJSCqaqRgrWrj4K/q46DwKqNg8GpjYPBqI2DwaiNg8GojYPBqI2DwaiNg8GojYPB qI2DwaiNg8Go/4onCf+LOBf/mT4g/6E+KP+mQDD/rEM4+bFIP/C1TkXnulVL3rteVNC0ZGXFrGtz u6RxgLGeeIqpmH6TopOFmpuPjaCWjJWlkYmdqI2Hp6uKh7KsiIe/rIiHwKuIhsCpiIbBqIiGwaiI hsGoiIbBqIiGwaiIhsGoiIbBqIiGwaiIhsGo/4onCf+MNxf/mz0f/6I9J/+oPy//rkI297RHPO26 TUHkwFZG2b9cU8u3Y2TAr2lztqhvf6yidYqknHyTnJiDmpWUiqCPkZKlio6bqIaNpKuDjK+sgY29 rIKMv6uDisCpg4rBqYOKwamDisGpg4rBqYOKwamDisGpg4rBqYOKwamDisGp/4snCf+ONxf/nDwf /6M7Jv+qPS3/sUAz9LhFOOq/TDzix1VA08JaUse6YWO7s2dysK1tfqenc4meoXqSlp2AmY+aiJ+J l5CkhJSYqH+Toqp8kq2repK6rHuRwKt9j8Gpfo7BqH6Owah+jsGofo7BqH6Owah+jsGofo7BqH6O wah+jsGo/4wnCf+PNhb/nToe/6U6Jf+tOyv8tD4w8bxDNOfFTDbey1I/zsZZUcK+YGK2uGZwq7Fs faGscoiYp3iRkKN+mImghZ6CnY2jfZuWp3iZn6l1mKqqc5m3q3SYwKp3lMGpeJPCqHiTwqh4k8Ko eJPCqHiTwqh4k8KoeJPCqHiTwqh4k8Ko/4wnCf+RNRb/nzgd/6c4I/+vOSj5uDws7sJCLuXNTC3Y 0E89yclXULzDXmCwvGRvpbdqfJuycIaSrXaPiql8loKmg5x8pIuhdqKTpXKhnadvoKipbaC1qW2g wahwm8KncpnCp3KZwqdymcKncpnCp3KZwqdymcKncpnCp3KZwqdymcKn/40mCf+UNBX/oTYb/6o2 If+zNiX1vjkn6slAJuDWSSjR1U48w85WTrbIXF+qwmNtn71oepS4boSLtHSNg7F6lHyugZp1rIie cKuRomupm6RoqaamZqmzpmaqw6VppMSla6HEpWuhxKVrocSla6HEpWuhxKVrocSla6HEpWuhxKVr ocSl/44mCf+XMxT/ozQa/60zHv64MiDwxTUg49M/HNjeRSbK2006vdNUTLDOW12jyWFrmMRnd43A bIGEvXKJfLp4kHW4f5ZvtoeaarWQnWW0mqBis6WhYbSxomC1wqFir8aiZKvGomSrxqJkq8aiZKvG omSrxqJkq8aiZKvGomSrxqJkq8ai/5AmCf+bMRL/pjEX/7EuGve+LRrnzjEX2d45Gc3jRCjC4E04 tdtTSqjVWVqc0F9okMxlc4bJa319xnGFdcR3i27DfpBpwYaUZMCPl2DAmppdwKWbW8Cxm1rBwZtb vMqcXbfKnV23yp1dt8qdXbfKnV23yp1dt8qdXbfKnV23yp1dt8qd/5EmCf+fLxH/qi0U/7coFe3I JhLa3CkOzOQ2HcHmQC6240g+quBOTJ7dVlmS2l1liNZjb37Uanh20nB/btB3hWjPf4ljzoeNX86Q kFvNmpJZzaWTV86yk1bPwpNWy9CUV8XPlVfFz5VXxc+VV8XPlVfFz5VXxc+VV8XPlVfFz5VXxc+V /5MmCf+jLA7/sCYP9cAfDd/VGwfN5CcTwes0I7XqPTOp50VCneVLUJHjUlyG4lhmfOBfbnTfZnVs 3m16Zt51f2HdfYJd3IaFWtuPiFjZmIpW2KGLVNisi1TYt4xT2MmLU9bWi1PW1otT1taLU9bWi1PW 1otT1taLU9bWi1PW1otT1taL/5ckCf+pJgr+uBwJ5s4RBc7jFwjA7iYXtPAyKKjuOzic7UNGkexL UobsUlx861lkc+tea2rqZHBl6Gx1YeZ0eF7kfHtb4oN9WeCLf1bfkoFV3pqDU96ig1LdqoRR3baE Ud2/hFHdv4RR3b+EUd2/hFHdv4RR3b+EUd2/hFHdv4RR3b+E/58hBv+wGwXpxQ0D0NkLAsDuGAyz 9iYcp/UxLJv1OzqQ9URHhfVMUXz1U1pz9Vlga/NfZmXwZmph7W1tXet0cFrqenNY6IF0VueHdlTm jXhT5ZR5UeSbelDkoXtP46p8TuOwfE7jsHxO47B8TuOwfE7jsHxO47B8TuOwfE7jsHxO47B8/6gc Auu8DAHNzAkAweAMBLL6GRCl/Ccgmv0yLo/9PTuF/kVFe/9NTnL/VFVr+1paZPhgX2D2Z2Jc9G1l WfJyZ1fxeGlV8H5qU++DbFHuiW1Q7Y9uTuyUb03rmnBM66FxS+qmckvqpnJL6qZyS+qmckvqpnJL 6qZyS+qmckvqpnJL6qZy97MNAMzDCAC/0QgAse8OBqT/GxOZ/ykhjv80LoT/Pzl7/0dBcf9OSGr/ VE5j/1pSXv5gVlr8ZlhX+2xaVfpxXFP5dl5R+HpfT/d/YE72hGFM9YliS/WOY0r0lGRJ85plSPOe ZkjznmZI855mSPOeZkjznmZI855mSPOeZkjznmZI855mzbsFAL3HBgCx2AcBo/8QCJj/HxSN/ywg g/83K3r/QTRw/0c7aP9NQWH/VEVc/1pJWP9fS1X/ZU1S/2pPUP9uUU7/clJM/3dTS/97VEn/f1VI /oRWR/6IV0b9jVdE/ZNYRPyWWUT8lllE/JZZRPyWWUT8lllE/JZZRPyWWUT8lllE/JZZvb8EALDO BACi4AYCl/8TCIz/IhOD/y4def84JW7/Pi1m/0UyX/9MN1n/UjtV/1g+Uf9dQE//YkJM/2ZDSv9q REn/bkVH/3JGRv92R0X/ekhD/35IQv+CSUH/hkpA/4tLP/+PSz//j0s//49LP/+PSz//j0s//49L P/+PSz//j0s//49Lr8YCAKLWAgCW9woCi/8WB4L/JA93/y0XbP8zHmP/OiRc/0IoVv9JLFH/Ty9O /1UxS/9aM0j/XjVG/2I2RP9mN0P/aThB/2w4QP9wOT//czo+/3c6Pf97Ozz/fjw6/4M8Ov+GPTr/ hj06/4Y9Ov+GPTr/hj06/4Y9Ov+GPTr/hj06/4Y9/3UkBv92NRD/d0Mc/4BKJ/+FUjP/hlk+/4Vg SP+BaFL/fG9a/Hd5Yvdzg2j0b4xu8WyTcu9qmnXtZ6B47GWleutkqnzqYq996WG1fuhgu3/oX8OA 51/LgeZe1YHgYNuB12LegdRj34HUY9+B1GPfgdRj34HUY9+B1GPfgdRj34HUY9+B/3UkBv92NRD/ d0Mc/4BKJ/+FUjP/hlk+/4VgSP+BaFL/fG9a/Hd5Yvdzg2j0b4xu8WyTcu9qmnXtZ6B47GWleutk qnzqYq996WG1fuhgu3/oX8OA51/LgeZe1YHgYNuB12LegdRj34HUY9+B1GPfgdRj34HUY9+B1GPf gdRj34HUY9+B/3UkBv92NRD/d0Mc/4BKJ/+FUjP/hlk+/4VgSP+BaFL/fG9a/Hd5Yvdzg2j0b4xu 8WyTcu9qmnXtZ6B47GWleutkqnzqYq996WG1fuhgu3/oX8OA51/LgeZe1YHgYNuB12LegdRj34HU Y9+B1GPfgdRj34HUY9+B1GPfgdRj34HUY9+B/3YkBv93NRD/eUIc/4JJJ/+HUTL/iFg9/4dfSP+D ZlH/fm5a+3l3Yvd1gmn0cYpu8W2Sc+5rmXbsaJ9562ake+pkqn3pY69/6GK1gOdhvIHnYMSC5l/O guNf14PcYduD0mPdg89k3YPPZN2Dz2Tdg89k3YPPZN2Dz2Tdg89k3YPPZN2D/3ckBv94NRD/fEEc /4VIJ/+KTzL/jFY9/4tdR/+HZFH/gmxa+3x0Yvd4f2nzdIhv8HCQdO1sl3jrap576WekfuhmqoDn ZLCC5mK2g+VhvoTlYMeF5WDThd1i2YXTZNyFzGXbhsll24bJZduGyWXbhsll24bJZduGyWXbhsll 24bJZduG/3gkBv94NRD/fkAb/4hHJv+NTjH/j1U8/45bRv+LYlD/hmlZ/IBxYvd7e2nzdoVw73KO dexulXnqa5x96GmjgOdmqYLlZbCE5GO3heRiwIfjYcuH32LVh9Vk2ofNZdmIxmfZicRn2InEZ9iJ xGfYicRn2InEZ9iJxGfYicRn2InEZ9iJ/3kjBv95NBD/gD8b/4pGJv+QTTD/klM7/5FaRf+PYE// imdZ/IRuYfd+eGnyeYJw73SLdutwk3vpbZt/52qiguVnqYTkZbCG42S5iOJiw4niYtCK2GTYis5m 2IrHZ9eLwGjWjL5p1oy+adaMvmnWjL5p1oy+adaMvmnWjL5p1oy+adaM/3kjBv96NBD/gz4b/41F Jf+TTC//lVE6/5RXRP+SXU7/jmVY/IhrYfeCdGnyfH9w7neIdutzkXzob5mA5muhhORoqYfiZrGJ 4WS7i+Bjx4zcY9SMz2bWjMdo1Y3AadSOumrUjrhr1I64a9SOuGvUjrhr1I64a9SOuGvUjrhr1I64 a9SO/3ojBv97NBD/hT0a/49EJP+WSi7/l044/5dUQv+VWkz/kmFW/I5pX/aHcGjygXpw7XuFd+p2 jnzmcZeB422fhuBqqIndZ7CM2ma7jdZlx47RZtSPx2jTj79q05C5a9KRs2zSkbJt0pGybdKRsm3S kbJt0pGybdKRsm3SkbJt0pGybdKR/3sjBv98NBH/iDwa/5JDJP+YSC3/mkw3/5pSQf+ZWEr8l19U 9pNmXfCNbmbrh3dv5oCBduF7i33cdZOD13Gch9JupIvPa6yOzGm1kclowJLHaM+Tv2vRk7hs0JOy bdCUrW/Qk6tv0ZOrb9GTq2/Rk6tv0ZOrb9GTq2/Rk6tv0ZOrb9GT/3wjBv99NBH/ijsZ/5RBI/+a Riz/nEs1/51QP/+dVkj4m11R8ZhjW+uTa2TkjXVt3oZ+ddiAh3zReo+DzHaXicdyn43Eb6eRwG2w k75su5W7a8iWtm3PlrBvzparcM+WpnHPlaVyz5Wlcs+VpXLPlaVyz5Wlcs+VpXLPlaVyz5Wlcs+V /3wjBv99NBH/jDoZ/5dAIv+cRSv/n0k0/6BOPPuhVEX0oFpO7J1hWOWZaWHek3Nq1Yx7dM6Fg33I f4uEwnqTir52m4+6c6OTtnGrlrNvtpixb8KYrXDNmKhyzZikc82YoHTOl590zpefdM6Xn3TOl590 zpefdM6Xn3TOl590zpefdM6X/30jBv9/MxH/jjkY/5k/If+eQyn/oUcy/6NMOvilUkPwpFhL6KNf VOGfaF3XmHBozpF4dMaKgH3AhIiFun+Pi7V7l5Cxd5+UrXWnl6pzsZmnc72bpXPLm6B1y5qddsya mnfNmZl3zZiZd82YmXfNmJl3zZiZd82YmXfNmJl3zZiZd82Y/34iBv+AMhD/kDgY/5s/IP+gQij/ pEYw/qZLOPSoUEDsqVdH5KldUNylZlrQnW5ox5V1c7+OfX25iYSFs4OMjK1/k5GpfJuVpHmkmaF3 rZued7mcnHfInJl4ypyXecublXrMmpR6zJmUesyZlHrMmZR6zJmUesyZlHrMmZR6zJmUesyZ/34i Bv+CMhD/kjcX/5w9H/+hQCf/pkQu+6lJNfGsTzzprlVD4a9dS9WoZFnLoWtnwplzc7mTen2yjYGF rIiJjKaEkJGhgJiWnX2gmpl8qpyWe7adlHvEnpJ8yp2Rfcqcj33Lm499zJqPfcyaj33Mmo99zJqP fcyaj33Mmo99zJqPfcya/38iBv+EMRD/kzYX/548Hv+jPyX/qEIs+K1HMu+wTTnmtFQ/3bNbSdCs YlnGpGpmvJ1xcrSXd3yskX6FpoyGjKCIjZGahZWWloKempKAp52Pf7KejYDBnoyAyZ6LgMqdioDL m4qAy5uKgMubioDLm4qAy5uKgMubioDLm4qAy5uKgMub/38iBv+FMA//lTYW/587Hf+lPST/q0Eq 9bBFL+y1TDTjulQ52LdZSMuvYVjBqGhmt6Fvcq+bdXynlXyEoJGDi5qNi5GUipOWj4ebmouFpZ2I hLCfhoS+n4WFyZ6FhMmdhYTKnIWEy5uFhMubhYTLm4WEy5uFhMubhYTLm4WEy5uFhMub/4AiBv+H Lw//lzUW/6A6HP+nPCL+rT8n87NELOm6SzDhv1I107pYR8ezX1e8rGZlsqVtcamfc3uhmnqEmpaB i5SSiJGOj5CWiYyZmoSKop2Biq2ff4q7n36KyJ5/icmdgIjKnICIy5uAiMubgIjLm4CIy5uAiMub gIjLm4CIy5uAiMub/4EiBv+JLg//mTUV/6I4G/+pOiD7sD0k8LhCKOa/Sirdw080zr1WRsK2Xla3 sGVkralrcKSkcXqcn3iDlJt+io6XhpCIlY6VgpKWmX6QoJx6j6ueeI+4n3eQyZ55jsqdeozLm3uM y5t7jMube4zLm3uMy5t7jMube4zLm3uMy5t7jMub/4EiBv+LLQ7/mzQU/6Q3Gf+sOB74tDoh7b1A I+TGSSPXx0wzycFVRb26XFWytGNjqK5pb5+pb3mWpXaCjqF8iYedg4+Bm4uUfJiUmHeXnZtzlqid cZa1nnCWxp1ylMqcdJLLm3WRy5p1kcuadZHLmnWRy5p1kcuadZHLmnWRy5p1kcua/4IiBv+NLA3/ nTQT/6Y0GP+vNRv0uDcc6cM+HODNRR/Ry0syxMVUQ7i/W1OtuWFhorRobZmvbneQq3SAiKd6h4Gk gY17oomSdaCRlnCem5ltnaabap2znGmew5xrnMubbpjMmm+XzJlvl8yZb5fMmW+XzJlvl8yZb5fM mW+XzJlvl8yZ/4MhBv+QKw3/oDMR/6kyFf2zMRfwvjQX5cs7FdrUPx3Lz0kwvslSQrLEWVGnv2Bf nLpma5K2bHWJsnJ+ga94hXqsf4t0qoeQb6iPk2qnmZZnpqSYZKaxmWOnwZlkpc2YZ6DNmGifzZdo n82XaJ/Nl2ifzZdon82XaJ/Nl2ifzZdon82X/4QhBv+TKQv/ojAP/60uEvi4LBLrxi8Q4NU4C9La PRzF1EguuM9QQKzKWE+gxV5dlcFkaIu9anKDunB6e7d2gXS1fYdus4WLaLKOj2SxmJJhsKOUXrCw lV2xv5VdsdCUYKrQlGGo0JRhqNCUYajQlGGo0JRhqNCUYajQlGGo0JRhqNCU/4YhBv+XKAr/piwN /7EoDvLAJgzj0CgH1N8yC8nfPhm920cssdZPPaTRVkyZzVxZjsliZYTGaG57xG92dMF1fG3AfIJo voSGY72NiV+8l4xbvKKOWbyvj1i9vo5XvtSOWbbTj1q005BatNOQWrTTkFq005BatNOQWrTTkFq0 05BatNOQ/4ghBv+cJwj/qicK/LghCenKGwXV3iAEyeUwD77jPR204UYsqN5OOpzaVUiR1ltVhtNh YHzQZ2l0zm5wbc11dmfLfHtiy4R+XsqNglrKl4RXyqOGVcqvhlTLvoZTzNWGVMTZiFXB2YlVwdmJ VcHZiVXB2YlVwdmJVcHZiVXB2YlVwdmJ/40dBf+iJQb/sB8F8sIUA9nbDgHJ5iAHvegvFLLnOiKn 5UMxm+NKPpDhUEqG31dUfN5eXXTdZWRs22xqZtt0b2HafHNc2YR2WdmOeVXZmHtT2qN8UdqwfVDb vn1Q3NN8UNTgflHQ4H9R0OB/UdDgf1HQ4H9R0OB/UdDgf1HQ4H9R0OB//5UaA/+pHwP7uhIC1M0L AMnmDwK87SALsO0uGaXsOSea60I1j+pJQYXpUEt76FdTcuhdWmrnY2Bk52plX+dyaVvnemxX54Ju U+eLcVDnlXJO6J90TOiqdUvotXZK58N2Sujddkvk4HVL5OB1S+TgdUvk4HVL5OB1S+TgdUvk4HVL 5OB1/50WAf+xEgHTwwkAx9EKALvyEQSv8yEPo/MuHZnzOSqO80I2hPNKQXvzUkly81dQafNcVmPz Y1pd82leWfNwYVXzd2NS839mT/KHZ03wj2lL75hrSu+gbEnuqW1I7rNtR+3Abkbtx25G7cduRu3H bkbtx25G7cduRu3Hbkbtx25G7cdu/6cPANO6BwDFxwcAutYJAK36Ewai+iISl/ovH437OiuD/EM1 ev1MPnH9UUVo/VZLYf5bT1z+YlNX/mhWVP1vWFH7dVpO+nxcTPmDXUr4il9I95FgR/aZYUb2oGJF 9adjRPSxZEP0tWRD9LVkQ/S1ZEP0tWRD9LVkQ/S1ZEP0tWRD9LVk1rIEAMS+BgC3zAYArNwJAaD/ FgiV/yUUi/8yH4L/PCl5/0Uyb/9KOWf/Tz9f/1VDWv9bR1X/YUpS/2dMT/9sTk3/ck9L/3hRSf9+ Ukf/hFNF/4tUQ/+RVUL+mFZB/Z5XQP2mWED8qVhA/KlYQPypWED8qVhA/KlYQPypWED8qVhA/KlY xrgEALbEBACq0wUAnvINApT/GgmK/ygTgf80HXf/PCVt/0IsZf9HMl3/TTZX/1M6U/9ZPU//Xz9M /2RBSv9pQ0j/bkRG/3NFRP95RkL/fkdB/4RIP/+KST7/kEo9/5VLPP+cTDz/n0w8/59MPP+fTDz/ n0w8/59MPP+fTDz/n0w8/59Mt7wDAKnLAgCc2wMAkv8QAon/HQiA/yoQdf8xGGv/OB9i/z4kW/9E KVT/SixQ/1EvTP9XMkn/XDNG/2A1RP9lNkL/aTdB/244P/9zOT3/dzo8/3w7O/+CPDn/hz04/4w9 N/+TPjb/lT42/5U+Nv+VPjb/lT42/5U+Nv+VPjb/lT42/5U+qsQAAJzSAACP5wIAhv8RAnz/GwVx /yQLaP8rEV//MhdX/zkbUf8/Hkz/RiFI/00jRf9SJUL/VydA/1soPv9fKTz/Yyo6/2crOf9rLDf/ byw2/3QtNf94LjT/fS4y/4IvMf+IMDH/ijAx/4owMf+KMDH/ijAx/4owMf+KMDH/ijAx/4ow/2ok BP9pMgr/bD4U/3ZGHv97TSn/fFUz/3pdPf92Zkb/cW5N/215VP9qhFr+Zo1f+2OVYvlhnGX4X6Jo 916oavZcrWv1W7Ns9Fq5bvNZwW7zWMlv8ljUcO9Y4HDpWeRw41rmcNxd6HDcXehw3F3ocNxd6HDc Xehw3F3ocNxd6HDcXehw/2okBP9pMgr/bD4U/3ZGHv97TSn/fFUz/3pdPf92Zkb/cW5N/215VP9q hFr+Zo1f+2OVYvlhnGX4X6Jo916oavZcrWv1W7Ns9Fq5bvNZwW7zWMlv8ljUcO9Y4HDpWeRw41rm cNxd6HDcXehw3F3ocNxd6HDcXehw3F3ocNxd6HDcXehw/2ojBP9pMQr/bj4U/3dFHv98TSj/flQz /3xcPP95ZEX/c21O/294Vf9rglr9aItf+2WUY/lim2b3YKFp9l6na/VdrWz0XLNu81q6b/JZwXDy Wcpx8VjYcexZ4XHmWuRx4Fzncdhd6HHYXuhx2F7ocdhe6HHYXuhx2F7ocdhe6HHYXuhx/2sjBP9q MQr/cTwU/3pDHf+ASyj/gVMy/4BaPP98YkX/d2pO/3F0Vf9uf1v9aolg+maSZPhkmWj2YaBr9V+n bfNerW/yXLNw8lu6cfFaw3LwWc1z7lndc+ha4nThXOVz2V7mc9Bf53TQX+d00F/ndNBf53TQX+d0 0F/ndNBf53TQX+d0/2wjBP9rMQr/czsU/31CHf+CSif/hFEy/4NZO/+AYEX/e2hN/3RxVf9wfFv8 bIdh+WiQZvdlmGn1Y59s82Gmb/JfrHHxXbNy8Fy7dO9bxXXvWtB16lrfduJc4nbbX+V10WDmdsph 5XfKYeV3ymHld8ph5XfKYeV3ymHld8ph5XfKYeV3/20iBP9sMQv/djoU/4BBHf+FSCf/iE8x/4dX O/+EXkT/f2ZN/3huVf9zeVz8boRi+WqNZ/Znlmv0ZJ5u8mKlcfFgrHPvXrR17l28du5bx3ftW9Z4 5VzgeNxf43jSYOR4y2HkecRj43rEY+N6xGPjesRj43rEY+N6xGPjesRj43rEY+N6/24iBP9tMQv/ eDgT/4M/HP+JRyb/i04w/4tVOf+IXEP/g2NM/31rVP92dVz8coBi+G2KZ/VplGzzZpxw8WOkc+9h rHXuX7R37V2+eexcy3roXNx63l/hetJh43vKYuJ8xGPifb5l4X29ZeF9vWXhfb1l4X29ZeF9vWXh fb1l4X29ZeF9/24iBP9uMAv/ezcT/4Y+HP+MRSX/j0wu/49TOP+NWkH/iGFL/4NpU/p8cVv3dnxi 83GHaPBtkG3taZlx6mahdehjqXjmYbJ65GC7e+Jfx3zgX9p91GLhfcpj4H7DZOB/vWbfgLdn34C3 Z9+At2ffgLdn34C3Z9+At2ffgLdn34C3Z9+A/28hBP9vMAv/fjYS/4k8G/+QRCT/k0wt/5NSNv+S WUD/jmBJ+YhmUvSCblrvfHlh63eDaOdyjG7kbZVz4Gqdd91npnraZa581mO4ftNiw4DRYtOBymTf gcFl3oK7Z92CtWjdg7Bp3YOwad2DsGndg7Bp3YOwad2DsGndg7Bp3YOwad2D/3AhBP9yLwv/gTQS /4w7Gv+TQyL/l0sr/5dRNP+WVz36k11G845kT+6Ia1jognVg43x/aN53iW7ZcpF0026ZedBroX3M aKmAyWaygsdlvYPFZcuEwWbchLlo24WzaduFrmvbhals24WpbNuFqWzbhals24WpbNuFqWzbhals 24WpbNuF/3EhBP90Lgr/hDMR/486Gf+WQyH/mkkp/5pOMvyaVDv1mFtE7pRiTeePaVXhiXNe24J8 ZtN8hW/Nd411yXKVesVvnX/BbKWCvmqthbtpuIe5acSIt2nYiLBr2YirbNmIp23ZiKNv2oejb9qH o2/ah6Nv2oejb9qHo2/ah6Nv2oejb9qH/3EgBP92LAr/hjIR/5I6GP+ZQiD/nEcn/55ML/ieUjjw nVhA6ZpfSeKVZ1Laj3Bc0Yd4ZsqBgW/FfIl2wHeQfLt0mIC3caCEtG+ph7Fts4mubL+KrGzPi6hu 14ukb9iKoHDYip1x2YmdcdmJnXHZiZ1x2YmdcdmJnXHZiZ1x2YmdcdmJ/3IgBP94Kwr/iDAQ/5Q5 F/+bQR7/n0Ul/aFKLfSiUDTsolY85KBcRdybZU/Sk21cyox1ZsOGfW+9gYV2t3yNfbN4lIGudZyG q3OliadxroulcLqNo3DJjaBx1Y2cc9aMmnTWi5d02IqXdNiKl3TYipd02IqXdNiKl3TYipd02IqX dNiK/3MgBP96Kgn/iy8P/5Y5Fv+dPxz/oUMj+qRIKvGmTjHop1Q44adcQNWfYk7LmGtbw5FyZryL em+2hYJ3sIGJfat9kYKmeZmGonehip91q42cdLaOmnTFj5h11I6VdtWNk3fVjZJ31ouSd9aLknfW i5J31ouSd9aLknfWi5J31ouSd9aL/3MgBP98KQn/jS8P/5g4Ff+fPRv/pEEh96hGJ+2rTC3lrVIz 3KpZP9CjYU3GnGlavpVwZbaPd2+vin92qYWGfaSBjoKffpaHm3uei5d5qI6UeLOPknjBkJB505CP etSPjnrVjYx71oyMe9aMjHvWjIx71oyMe9aMjHvWjIx71oyMe9aM/3QfBP9+KAn/ji4O/5s4FP+h PBn/pz8f9KtEJOqvSinis1Eu1q5XPsunX03BoGdauZluZbGTdW6qjnx2o4qDfZ6Gi4KZg5OHlICb i5B+pY6NfbCQin29kYl+0JGIftOPiH7Ujod+1Y2HftWNh37VjYd+1Y2HftWNh37VjYd+1Y2HftWN /3QfBP+AJwj/kC4O/503E/+jOhj8qT0c8a9CIOe0SCTft04s0bFVPceqXky9o2VZtJ1sZKuXc26k k3p2no6BfJiLiIKSh5CHjoWZi4mDoo6Ggq2Qg4K7kYKCzJGCgtOQgoLUj4KB1Y2CgdWNgoHVjYKB 1Y2CgdWNgoHVjYKB1Y2CgdWN/3UfBP+CJgj/ki0N/582Ev+lOBb5rDsa7rM/HeW5Rh/au0srzbRU PMKuXEu4p2NYr6FqY6accW2fl3d1mJN+fJKQhoKMjY6Hh4qWi4OIoI5/h6uQfYe4kXuHyZF8h9OQ fIbUj32F1Y19hdWNfYXVjX2F1Y19hdWNfYXVjX2F1Y19hdWN/3UfBP+EJQj/lC0M/6A1EP+oNhT2 rzgX67c9GOK/RRnVvkkqyLhTO72xW0qzq2JXqqZoYqGhb2yZnHV0kph8e4yVg4GGkouGgZCUi3yO no55jaiQdoy1kXSNxpF1jdOQdovUj3iJ1Y14idWNeInVjXiJ1Y14idWNeInVjXiJ1Y14idWN/3Ye A/+GJAf/lywL/6IyD/+rMxHyszUT6Lw6E97FPxfQwUgpxLtRObm1WUiusGBVpapnYZymbWuUonRz jZ56eoabgYCAmImFe5aSiXaUm41yk6aPb5OzkG6Tw5Buk9OPcJHUjnKO1Y1yjtWNco7VjXKO1Y1y jtWNco7VjXKO1Y1yjtWN/3ceA/+JIgf/mSwK/6UwDfyuLw7vuDEO5MM3DdnKOxbLxUYnv79QOLO6 WEeptV9Un7BlX5asa2mOqHJxhqV4eICif356n4eDdJ2PiG+bmYtsmqSNaZqwjmebwI5nm9WOaZjV jWyU1oxslNaMbJTWjGyU1oxslNaMbJTWjGyU1oxslNaM/3geA/+MIQb/nSsI/6gsCvizKgvqvysJ 4MwyBtHOORXFyUUlucRONq6/VkWju11SmbZjXZCyaWeHr3BvgKx2dnmpfXxzp4SBbqWNhWmkl4hl o6KKY6OujGGjvoxgpNKLY6DXi2Wc2IplnNiKZZzYimWc2IplnNiKZZzYimWc2IplnNiK/3odA/+P IAX/oCkH/6wnB/K4JAblxyQE2dUnBcvTNxO/zkMjs8pMNKfFVEKcwVtPkr1iWom6aGSBt25sebR0 cnOye3htsIN9aK+LgWOulYRfraCGXa2th1utvIdartCHXKrah1+l2odfpdqHX6Xah1+l2odfpdqH X6Xah1+l2odfpdqH/34aA/+UHwT/pSYF/bEgBOzBGgPf0xcB0NwlBMTZNRC41UEhrNBLMaDMUj+V yVlMi8VgV4LDZmB6wGxnc75zbWy8enNnu4J3YrqKe165lH5auJ+AWLisgVa5u4FVus+BVrbegliw 3YJYr92CWK/dgliv3YJYr92CWK/dgliv3YJYr92C/4QXAv+ZHAL/qh8D9bkVAt7NDADQ3xIAxeAm BbvfNg6w3UAdpNlJLZjVUTuN0VhIg89eUnvMZVpzy2thbMlyZ2bIeWxhx4FwXcaKdFnGlHZWxZ94 U8aseVLGu3pRx895UcTjelO84nxTvOJ8U7zifFO84nxTvOJ8U7zifFO84nxTvOJ8/4oUAf+fGAH/ sBQB2MMKAM7RCgDE5RQBueQmCK7kNBOk4j8gmeBHLY/eTzmF3FZEe9pdTHPZZFRs12taZtZyX2HV eWRc1IJnWNSLalXUlW1S1KBuUNStb07VvHBN1tBvTdXocE7M6XJOzOlyTszpck7M6XJOzOlyTszp ck7M6XJOzOly/5IRAf+nEQDYuQkAy8YIAMLVCgC36hYDrOonDKLpNBiY6D4kjedHMIPmTjp65VRD ceRaSmnkYVBk42hVX+NwWVrjeFxW44BfU+OJYlDjk2RN5J1lS+SpZ0rltmdJ5cZnSObfZ0rg7GdK 3+xnSt/sZ0rf7GdK3+xnSt/sZ0rf7GdK3+xn/5wNANuxBgDKvQcAv8oHALXaCgCq7xkFoPAoD5bw NRuM8D8mgvBHMXnwTjlw71RAaO9aRmHvYEtd72dPWO9uUlTvdVVR8H1XTvCFWUvwj1tI8ZlcRvGj XkTyr19D8rtfQvPMYEHz52BB8+hgQfPoYEHz6GBB8+hgQfPoYEHz6GBB8+hg3qcCAMu2BQC9wQUA ss8HAKfqDQGd9xwHlPgrEor4NhyB+UAmePpIL2/6TTZn+lM8YPpYQFv7X0RW+2VHUvtsSU/8cktL /HlNSPyBT0X9ilFD/ZNSQf6cUz/+plQ9/7FVPf68Vjz+zVY8/s5WPP7OVjz+zlY8/s5WPP7OVjz+ zlY8/s5WzrACAL26BACxxwQApdYHAJv9EAKR/yAJiP8tEoD/ORt2/z8jbf9FKmX/SzBe/1E1WP9X OFP/XTtP/2M+TP9oQEn/bkFG/3VDQ/98RED/hEY9/4xHPP+USDv/nUk6/6VKOf+tSzj/uUs4/7lL OP+5Szj/uUs4/7lLOP+5Szj/uUs4/7lLvrUCALDAAgCkzgMAl94FAI//FAKG/yMIff8uEHP/NRhq /zweYv9CJFv/SChV/04sUP9UL0z/WjFI/18zRf9kNUL/ajY//3A3Pf92OTv/fDo5/4M7OP+LPDb/ kz01/5o+NP+hPjP/qj8z/6o/M/+qPzP/qj8z/6o/M/+qPzP/qj8z/6o/sboBAKPIAACW1gAAi/QJ AYP/FgJ5/yAGb/8oDGf/MBJf/zcXWP8+G1L/RB9M/0oiSP9QJET/VSZB/1onPv9fKTv/ZCo6/2kr OP9uLDb/dC00/3ouM/+BLzH/iDAw/48wLv+WMS3/njIt/54yLf+eMi3/njIt/54yLf+eMi3/njIt /54ypMIAAJbPAACI3wAAgP8MAXX/EgJq/xgDYv8hB1r/KQtT/zEPTf84Ekj/PhVD/0QXP/9KGTz/ Txo5/1MbN/9YHDX/XB0z/2EeMf9lHzD/aiAu/3AgLf92ISv/fCIq/4IjKP+IIyf/kCQn/5AkJ/+Q JCf/kCQn/5AkJ/+QJCf/kCQn/5Ak/2AlBP9bMAb/YToN/2pBFv9vSh//cVIp/29bMv9rZDr/Z25B /2R6R/9ghEz/XY5Q/1qWU/9Ynlb/V6VY/1WrWv9UsVv/U7dc/1K+Xf5Rx178UdFf+1DgX/hQ6V/z Ue1f7lPwX+hU8V/kVvJf5FbyX+RW8l/kVvJf5FbyX+RW8l/kVvJf/2AlBP9bMAb/YjkN/2xAFv9x SR//clEp/3FaMv9tYzr/aG1B/2V4R/9hg03/Xo1R/1uWVP9ZnVf/V6RZ/1aqW/9VsVz/VLdd/lO/ Xv1Sx1/8UdNg+lDiYPZR6WDxUu5g61TvYOVW8WDhV/Jg4VfyYOFX8mDhV/Jg4VfyYOFX8mDhV/Jg /2ElBP9cMAb/ZTgN/24/Ff90Rx//dVAo/3RYMf9wYTr/a2pB/2d2SP9jgU3/YItS/12UVf9anFj/ WKNa/1eqXP5WsF79VLdf/VO/YPxTyWH6UtZi+FHkYvNS6mLtVO5i5lbvYuBY8GLbWPFj21jxY9tY 8WPbWPFj21jxY9tY8WPbWPFj/2IlBP9dLwb/ZzYN/3E+Ff93Rh7/eE4o/3dWMf90Xzr/bmhB/2pz SP9mfk7/YolT/1+SVv9cm1r/WqJc/lipXv1XsGD8Vbdh+1TAYvtTymP5U9pk9VLmZO9U62ToVu5k 4VjvZNlZ8GXTWvBm01rwZtNa8GbTWvBm01rwZtNa8GbTWvBm/2IkBP9eLwb/ajUN/3Q8Ff96RB7/ fEwn/3tUMP93XDn/cmVB/2xvSP9oe07/ZIZT/2CQWP9dmVv+W6Fe/VmoYPxYsGL7Vrhj+lXBZPlU zWX3U95m8lTnZupW62biWe5m2lruZ9Fb72jMXPBozFzwaMxc8GjMXPBozFzwaMxc8GjMXPBo/2Mk BP9fLgb/bTMM/3c6FP99Qh3/gEom/39SMP98Wzj/d2NB/3BsSP9sd0//Z4JU/2ONWf1gllz8XZ9f +lunYvhZrmT3WLZm9VfAZ/RWy2jxVd1o7VbpaeNZ7GjaW+1p0Fzuasld7mvFXu5rxV7ua8Ve7mvF Xu5rxV7ua8Ve7mvFXu5r/2QjBP9hLQb/cDIM/3s4FP+BQBz/hEkl/4RRLv+BWTf/fGFA/3ZpSP9w c0/7bH9V+GiJWvZkkl7zYZth8V+jZPBdq2buW7No7Fq8aupZx2voWdhr5Fnoa9pb62zPXe1tyF7s bsJf7G6+YOxvvmDsb75g7G++YOxvvmDsb75g7G++YOxv/2UjBP9kKwb/czAM/342E/+FPxv/iUgk /4lPLf+GVzb/gl4+/HxmRvh2cE70cXtV8G2FWu1pjl/qZZdj6GKfZuZgp2njXq9r4V25bOBcxG3e XNNu2V3mbs5e62/GX+pxv2Hqcbpi6XK2Y+lytmPpcrZj6XK2Y+lytmPpcrZj6XK2Y+ly/2YjBP9n KQb/dy4L/4I1Ev+JPhr/jUci/41OK/+MVTP8iFw89oNkRfF8bE3sd3dU6HKBWuRuimDhapNk3Wab aNpko2vWYqxu02C1cNBfv3HOX81yy1/ic8Rh6HO9Yuh0t2TndLJl53SvZud0r2bndK9m53SvZud0 r2bndK9m53SvZud0/2ciBP9qJwX/eiwK/4Y0Ef+NPRn/kUUg/5JNKP2RUzH2jlo68IlhQuqDaUvl fnRT4Hh9WtpzhmDUbo9m0GuXasxon27JZqdxx2Svc8RjuXXCYsZ2wGLad7pk5nezZeV3rmbld6po 5XeoaOZ3qGjmd6ho5neoaOZ3qGjmd6ho5neoaOZ3/2ciBP9tJgX/fSoK/4k0EP+RPBf/lUQe/5dL JviWUi7xlFg26pBeP+SKZ0jdhHFQ1X15Ws94gmHKc4pnxm+SbMJsmnC/aqJzvGiqdrlntHi2ZsB5 tGbQerFn43qraON6p2rjeqNr5Hmha+R5oWvkeaFr5Hmha+R5oWvkeaFr5Hmha+R5/2ghBP9vJAX/ gCkJ/4wzD/+UOxb/mUMc/ZtJI/SbTyrsmVUz5ZZcO96RZUXUiW1QzIN2Wsd9fmHBeIZovXSObbhx lnK1bp11sWymeK5rr3usart8qmnKfahq4X2jbOJ8n23ifJxu4nuabuN7mm7je5pu43uabuN7mm7j e5pu43uabuN7/2khA/9xIwX/gigJ/48yDv+XOxT/nEIa+Z5GIPCfTCfon1Iu4J1aNtaVYUTNjmpP xohyWb+CemK5fYJotHmKbrB2knOsc5p3qHCieqVvq32ibrZ+oG3Ff55u23+bb+B+mHDhfpZx4X2U ceJ8lHHifJRx4nyUceJ8lHHifJRx4nyUceJ8/2khA/90IgT/hSgI/5ExDf+aOhL/nz8X9aJEHeyk SiPkpFAp26FXNc+aX0PHk2hPv4xwWbiHd2Gygn9orX6Gbql6jnOkd5Z4oHWee51zqH6acrOAl3HA gZZy04GTc9+AkXTgf5B04H6PdOF9j3ThfY904X2PdOF9j3ThfY904X2PdOF9/2ohA/92IAT/hycH /5QwDP+dORH9oj0V8qVBGumoRx/gqk0l1KRUNMqdXULBl2VOupFtWLKLdWGshnxop4KDbqJ/i3Sd fJN4mXmbfJV3pX+Sdq+BkHa9go52zoKNd96Bi3ffgIp44H+KeOB+injgfop44H6KeOB+injgfop4 4H6KeOB+/2ogA/94HwT/iSYH/5YwC/+fNw/6pDoT76k/F+atRRrcrkokz6hTM8ahXEG9m2RNtJVr WK2PcmCni3looYeBbpuDiHSXgJB4kn6ZfI58on+Leq2CiHq6g4d6y4OGe96ChXvegYV734CFe+B/ hXvgf4V74H+Fe+B/hXvgf4V74H+Fe+B//2sgA/96HgT/iyYG/5gvCv+hNQ33pzgQ7K08E+OyQhbX sUcjy6tSMsGlWkC4n2JMsJlpV6iUcGChj3dnm4t+bpaIhnORhY54jIKWfIiAn4CEf6qCgX+3g4B/ yIR/gN2Df3/egX9/34CAfuB/gH7gf4B+4H+AfuB/gH7gf4B+4H+AfuB//2wgA/98HAP/jSUG/5ou Cf+jMwv0qjQN6bE5D9+3PxLStEYix65QMb2oWT+zomBLq51nVqOYbl+clHVnlpB8bZCNg3OLiot4 hoiUfIGGnYB+hKiCe4S1g3mExYR4hd2DeYTegXqD34B6guB/eoLgf3qC4H96guB/eoLgf3qC4H96 guB//20fA/9+GwP/jyQF/50sB/6mMAnwrjEL5bY1C9u8ORHOt0Ugw7JPMLisVz6vp19KpqFlVZ6d bF6XmXNmkJV6bIqSgXKFkIl3gI2RfHuLm393iqWCdImyg3KJwoNyitqDc4negXSH34B1huB/dYbg f3WG4H91huB/dYbgf3WG4H91huB//28eA/+AGwP/kiME/6ArBvqpLAftsiwH4rwxB9XANhDJu0Mf vrZNLrSwVjyqq11JoaZkVJmial2RnnFlipt4a4SYf3F/loZ2eZOPenWRmH5xkKOBbpCvgmyQv4Nr kdWCbY/egW+N34Bwi+B/cIvgf3CL4H9wi+B/cIvgf3CL4H9wi+B//3EcA/+DGQL/lSED/6MpBfat JwXotyYE3sMqA9DDNQ7Ev0EdubpMLa61VDulsFtHm6xiUpOoaVuLpW9jhaJ2an6ffG94nIR0c5qM eW+Zlnxrl6F/aJetgGaXvIFlmNGAZpbff2iT4H5qkeF+apHhfmqR4X5qkeF+apHhfmqR4X5qkeF+ /3UaAv+HGAL/mCAD/6YlA/KyIAPkvh4C18kiAsrHMw2+w0Acs79KK6m6UzmftlpFlrJhUI2vZ1mF rG1gfql0Z3imem1ypIJybaKKdmihlHlkoJ98YZ+rfl+gun5foM5+X5/hfWKb4X1jmOJ8Y5jifGOY 4nxjmOJ8Y5jifGOY4nxjmOJ8/3gYAv+LFwH/nR0C/aseAuy4FwHeyBEAz80fAsTMMAu4yD4ZrcVI KKPBUTaYvVhCj7lfTYa2ZVZ/s2tdeLFyZHKveWlsrYBuZ6yJcmKqknVfqZ14XKmqelqpuXpZqsx6 WKnkeluk5HpdoeR5XaHkeV2h5HldoeR5XaHkeV2h5HldoeR5/30VAv+QFAH/oRgB9rEUANnBCwDS zwsAyNIcAbzRLgmxzjsXpstGJZzITzORxFY/iMFdSYC/Y1J4vGpZcbpwX2u5d2Rmt39pYbaHbV21 kXBZtZxyVrSpdFS0uHRTtct0U7XkdFSw53VWrOd1VqzndVas53VWrOd1VqzndVas53VWrOd1/4MS Af+WEQD/qBEA2bgKAM7ECQDH0goAv9kZAbTYKwep1jkUn9NEIpTQTS+KzVQ7gcpbRHjIYk1xx2lT a8VvWWXEdl5gw35iXMKHZljBkWhVwZxrUsGobFDBt21PwsptT8LkbE+97G5QuexvULnsb1C57G9Q uexvULnsb1C57G9Quexv/4kQAf+dDgDarwgAzbsIAMTHBwC81gsAs98aAarfKweg3jkSlt1DHoza SyqC2FM1edVaP3HTYUZq0mhMZdFvUmDQdlZb0H5aV8+HXVPPkV9Qz5xhTs+pY0zPuGNL0MtjTNDl YkrO8mVLyPJmS8jyZkvI8mZLyPJmS8jyZkvI8mZLyPJm/5INAN6mBADOtAYAwr8GALnMCACw3QwA p+UdA57lLQuU5TkWiuRCIIHjSip34lAzb+FYO2ngX0Fj4GZGXt9uSlrfdU5W331RUt+GU0/fkFZN 35tXS+CnWEngtVlI4cZZSOHfWUff8FlG3PVbRtz1W0bc9VtG3PVbRtz1W0bc9VtG3PVb7ZwEANGt BADCuAUAt8MFAK3RCACk7RABm+0gBZLtLg6J7DoYgOxDIXbsSipu7FAxZutWN2DrXDxb62RAV+tr Q1PrckZQ63pJTeyDS0rsjE1I7JZORe2hUEPtrlFC7rxRQe/MUkHv5VJA7fFRQO3xUUDt8VFA7fFR QO3xUUDt8VFA7fFR1KUAAMSyAwC2vAMAq8kFAKDYCACX9BMBj/UkB4f1MQ9+9jsYdPZCIGz2SCdl 9k8tXvdVMVn3WzVV92I4UfdoO034bz1K+HY/R/h+QUT5h0NC+ZFFQPqbRj76pkc8+7FIO/u+STr8 z0k5/ONJOfzjSTn840k5/ONJOfzjSTn840k5/ONJx60AALe3AgCqwwIAntAEAJPjCQCM/RgChP4n B3v/MQ9y/zgWaf9AHGL/RiJc/00mVv9TKlL/WS1O/18wSv9lMkf/azRE/3E1Qf95Nz//gTg8/4o6 Ov+TOzj/nTw2/6c9Nf+xPjT/vj4z/8o/M//KPzP/yj8z/8o/M//KPzP/yj8z/8o/uLIAAKq9AACd ygAAkdgCAIj7DQF//xkCdv8kBm7/LQxm/zUSX/88F1j/QxtT/0keTv9PIUr/VSRG/1smQ/9gJ0D/ Zik+/2sqO/9yKzn/eS02/4EuNP+KLzH/lDAw/5wxLv+lMi3/rzMs/7czLP+3Myz/tzMs/7czLP+3 Myz/tzMs/7czq7gAAJ7FAACQ0gAAg+AAAH3/DwFy/xYCaP8eBGH/Jwha/y8MVP83EE7/PhNJ/0QW Rf9KGEH/Txk+/1UbO/9ZHDn/Xx02/2QeNP9pHzL/cCAv/3chLf9/Iiv/hyMo/5AkJ/+ZJSb/oSYl /6cmJf+nJiX/pyYl/6cmJf+nJiX/pyYl/6cmn8AAAJHNAACD2wAAePYCAG//DQFk/xICXP8ZA1T/ IARO/ycGSP8vCEP/Ngo//zwMPP9CDjj/Rw81/0wQM/9RETD/VhIu/1oTLP9fFCr/ZRQo/2sVJv9x FiP/eRci/4EYIP+JGB7/kRkd/5cZHf+XGR3/lxkd/5cZHf+XGR3/lxkd/5cZ/1YnBP9RMgX/VjUH /189Dv9kRRb/Zk4f/2RYJ/9hYi//Xm41/1p5O/9XhD//VI9D/1GYRv9PoEj/TqdK/02uS/9MtUz/ S7xN/0rETv9Jzk//Sd5P/0jpUP9I8lD8SfZQ90v5UPFM+k/rTvtQ6k/7UOpP+1DqT/tQ6k/7UOpP +1DqT/tQ/1YnBP9RMgX/WDQH/2I7Dv9nRBb/aU0f/2dWJ/9jYC//YGs1/1x3O/9YgkD/VY1E/1OW R/9Qn0n/T6ZL/06tTf9NtE7/TLxP/0vFUP9Kz1H/SeBR/0nrUf5J8lL5S/dS8035Ue1P+lHmUPpS 5VD6UuVQ+lLlUPpS5VD6UuVQ+lLlUPpS/1cnA/9SMQX/WjIH/2Q6Dv9qQhb/bEsf/2pUJ/9nXi// Ymg2/150PP9agEH/V4tF/1SVSP9SnUr/UKVM/0+tTv9OtE//TbxR/0zFUf9L0VL/SuJT/0ntU/tL 81P1TPdT7k/4U+hQ+VPhUvpU4FL6VeBS+lXgUvpV4FL6VeBS+lXgUvpV/1gmA/9UMAX/XTEH/2c4 Dv9tQBb/b0ke/25SJ/9qXC//ZWY2/2FxPP9dfUH/WYhG/1aSSf9UnEz/UqRO/1CrUP9Ps1H/TrtS /03EU/9Nz1T+TOBV+0zrVfhM9FXwT/dV6VH4VeJS+FbbVPlX2VT5V9lU+VfZVPlX2VT5V9lU+VfZ VPlX/1kmA/9XLgX/YC8H/2o2Df9xPhX/c0ge/3JRJv9vWi7/amM2/2VuPP9hekL/XYVH/1qPSv9X mE3/VaBQ/1SoUv5Sr1P9UbdV/FDAVvpPy1b4T9xX9U/pV/JP81fqUvZX4VP3WNpV+FnRVvhaz1b4 Ws9W+FrPVvhaz1b4Ws9W+FrPVvha/1kmA/9aLAX/ZC0H/24zDf91PRX/eEYd/3dPJf90WC3/cGA1 /2pqPP9mdkL/YoFH/l6LS/tblE/5WZ1S+FekVPZWrFb1VLRX81O8WPJTx1nwUtVa7FLmWulT8lnh VPVb11b2XM9X913IWfhdx1n4XcdZ+F3HWfhdx1n4XcdZ+F3HWfhd/1olA/9dKgX/ZyoG/3IyDP95 OxT/fEUc/3xNJP96VSz/dV40/29nPPxqckL5Zn1I9mOHTPNfkFDxXZlT71uhVu1ZqFjrWLBa6le5 W+hWw1zmVtFc41bkXN9W8F3VV/VfzFn2YMZa9mDAW/Zhvlz2Yb5c9mG+XPZhvlz2Yb5c9mG+XPZh /1slA/9gKAX/aygG/3cwC/9+OhP/gUMa/4JLIv9/Uyr/e1sz+XZkOvVwbkHxbHlI7WiDTepkjFHn YZVV5V+dWONdpVrhW61c3lq2XtxZwF/aWc5g1VniYNFZ72HKWvRiwlz0Y7xd9GS3XvNktl/zZLZf 82S2X/Nktl/zZLZf82S2X/Nk/1wkA/9jJgT/byYF/3svC/+CORH/hkEY/4dJIP+FUSj4glkw8n1g OO13akDocnVH5G5/TeFpiFLdZpFX2WOZWtVgoV3SX6hgz12xYs1cu2PLXMdkyVzbZcVd62W/XfJm uF/xZ7Ng8WevYfFnrmLxZ65i8WeuYvFnrmLxZ65i8WeuYvFn/10kA/9mJAT/ciQF/34uCv+HNxD/ iz8W/4xHHfmLTyXyiFYt7INdNuZ+Zz7geHFG23N7TdVug1PQaoxYzGeUXcllnGDGY6Njw2GsZcFg tWe/X8FovV/Qabpg5mm1Ye9qr2Lvaqtj72qnZO9ppmXwaaZl8GmmZfBppmXwaaZl8GmmZfBp/14j A/9pIgT/diME/4IsCf+LNg7/jz4U/ZFFG/SRTCLtjlMq5opaMt+FZTvXfm1F0Hh2Tct0f1TGcIda wmyPXr9pl2K7Z59luGWnaLZksGqzY7trsWPKbK9j4WyrZO1tpmbtbKNn7WygaO5rn2jua59o7muf aO5rn2jua59o7mufaO5r/18jA/9rIAP/eSIE/4UrCP+ONAz/kzwS+JZDGO+WSh7nlVAm4JFYLteK YTrOhGpFyH5zTcJ5e1W+dYNbuXGLYLVukmSybJpnr2qjaqxorGypZ7Zup2fEb6Vn2m+iaOtvnmns b5tq7G6Za+1tmGvtbZhr7W2Ya+1tmGvtbZhr7W2Ya+1t/18jA/9uHgP/eyEE/4gqB/+RMgv/lzoP 9JpBFeubRxrjm00h2pZVLc+PXjnIiWdEwYNvTbt+d1W2eX9bsXaHYK1zj2WpcJZopm6fbKNsqG6g a7JwnWvAcZxr0nKabOlxl23qcJRt63CSbuxvkm7sbpJu7G6Sbuxukm7sbpJu7G6Sbuxu/2EhA/9w HQP/fiAD/4spBv+VMQn7mzgN8J4+EeegRBbfoEod05pSK8qTXDjCjWRDu4dtTbSCdFSvfnxbqnqE YaZ3i2WidJNpnnKbbZpwpHCXb69ylW+8c5NvzXOScOZzkHDpco5x6nGNcetwjHHrcIxx63CMcetw jHHrcIxx63CMcetw/2MgA/9yGwP/gB8D/44nBf+XLwj4njYL7aI7DuSlQBLapEYczp5RKsWXWje9 kWJCtYxqTK+HclSpgnlbpH+AYJ98iGWbeZBql3eYbZN1oXCQc6xzjXO4dItzyXWKdOJ0iXToc4h1 6XKHdepxh3XqcId16nCHdepwh3XqcId16nCHdepw/2UfA/90GgL/gx4C/5AmBP+aLQb0oTQJ6aY3 C+CqPQ7Up0QbyaFPKcCbWDa4lWBCsJBoS6mLb1Ojh3ZanoN+YJmAhWWUfY1qkHuWbox5n3GJeKlz hne1dYR3xXaDeN91g3jodIJ46XOCeOpxgnjqcYJ46nGCeOpxgnjqcYJ46nGCeOpx/2cdA/93GQL/ hRwC/5MkA/+dKwXxpDAG5qozCNyuNwzPqkMaxaVOKLyfVzWzmV9Bq5RmSqSQbVOei3RamIh7YJOF g2WOgotqioCTboZ+nHGCfad0f3yzdX18w3Z8fdt2fH3odH186HN9fOlyfXzqcX186nF9fOpxfXzq cX186nF9fOpx/2kcAv95GAL/hxsC/5UjA/ugKQTuqCwE468vBdeyNAvLrUEZwahMJ7ejVTSvnV1A p5lkSZ+Ua1KZkHJZk415X46KgGSJh4hphIWRbYCDmnF8gqR0eYGxdneBwHZ2gdZ2doHndHeB6HN4 gOlyeH/qcXh/6nF4f+pxeH/qcXh/6nF4f+px/2sbAv97FwL/ihoB/5ghAvijJgPqrCcD37QpA9K1 MgrHsEAYvKxLJrOnUzOqols+op1jSJqZaVGUlXBYjpJ3XoiPfmSDjYZpfoqObXqJmHF2h6Jzc4au dXGGvXZvh9J2cIfodHGF6HNyhOlyc4TqcXOE6nFzhOpxc4TqcXOE6nFzhOpx/20ZAv9+FgH/jRgB /5seAfSnIgLmsCAB2rohAc24MQnCtD4XuLBJJK6rUjGlplo9naJhR5WeaE+Om25XiJh1XYKVfGN9 k4RoeJCMbHSPlXBwjaBybYysdGqMu3Vpjc51aY3odGuL6XNtiepxbYjqcW2I6nFtiOpxbYjqcW2I 6nFtiOpx/3AXAv+BFQH/kBYB/54aAfCrGwHithYA070dAci7Lwi9uDwVs7RHI6mwUDCgq1g7mKhf RZCkZk6JoWxVgp5zW32cemF3mYFmcpeKam6Wk25qlJ5xZpSqc2STuHNjlMtzY5TmcmWS6nFnj+pw Z47qcGeO6nBnjupwZ47qcGeO6nBnjupw/3MVAv+FEwH/lBQA/KMVAOqwEgDZvgwAzcEbAcLALQe4 vToTrrlGIaS1Ty2asVY5kq5eQ4qrZEyDqGpTfKVxWXajeF9xoX9jbJ+HaGiekWtknZxuYJyocF6c tnFdnMlxXZzkcF6a63BglutvYZXsb2GV7G9hlexvYZXsb2GV7G9hlexv/3cSAf+JEQH/mREA86gO ANe1CgDPwQoAxsUYALzEKgWywjgRp79EHp67TSuUuFU2i7VcQISyYkl8r2lQdq1vVnCrdltrqn1g ZqiGZGKnj2depppqW6WmbFiltW1XpsdtV6bibFek7Wxan+1sWp7tbFqe7Wxanu1sWp7tbFqe7Wxa nu1s/3wQAf+OEAD2ng0A2K0JAM24CQDHxAgAvsoUALXKJwSryDYPocVBG5fCSyiNv1Mzhb1aPH26 YUV2uGdLcLdtUWq1dFZltHxbYLKEX1yxjmJYsZllVbClZlOws2dSscZnUrHhZ1Gv8WhTqvBoVKnw aFSp8GhUqfBoVKnwaFSp8GhUqfBo/4IOAP+UDADbpQYAzrEHAMW7BwC9xwcAtdAQAKzQIwOjzzMM mc0/GI/KSCT/4v/iSUNDX1BST0ZJTEUAAwmGyFEufcZYOHbEXz9vwmZGacFsS2TAc1Bfv3tUW76E WFe9jVtUvZhdUbykX0+8s2BNvcVgTb3gX0y88GFNt/ViTbb1Yk229WJNtvViTbb1Yk229WJNtvVi /4kLAOGcAwDQqgUAxbUFALu/BACyywgAq9gNAKPZIAKa2C8JkNY8FIfURh9+0k8pdtBWMm/PXjlo zWQ/Y8xrRF7Mc0lay3pMVsqDT1LKjVJPyphUTcqlVkvKs1dKy8VXScvgVknJ8FhHx/pZSMX7WkjF +1pIxftaSMX7WkjF+1pIxfta95EEANSiAgDHrwQAurkDALDEBQCn0AkAn+EQAJjhIQOP4DAJhuA7 En3fRBt13k0kbt1VK2fcXDJi22Q3XdtrO1nacj9V2npDUtqDRU7ajUhM2phKSdqlS0jbs0xH3MRM RtzeTEba7UxE2PlPQ9j7T0PY+09D2PtPQ9j7T0PY+09D2PtP25oAAMqpAgC7swIAsL0DAKXJBQCb 1gkAlOgUAYzpJQSE6DMLe+g8FHPoRBtr6EsiZOdSKF7nWS1Z52AyVedoNVLnbzhP53c7TOeAPUnn iT9H6JRBROifQkLprENB6bpEQOrNREDq5ERA6PVEQOf4Q0Dn+ENA5/hDQOf4Q0Dn+ENA5/hDzaMA AL2uAQCwuAEApMQCAJnQBQCP4QoAifEaAYHxKAV48jIMcPI7E2nyQxli8kofXPNQI1bzVydS814r T/NlLUz0bDBJ9HMyRvR7NEP0hDZB9Y43PvWZOT32pDo79rA7Ove/PDn4zzw49+g8OPfsPDj37Dw4 9+w8OPfsPDj37Dw49+w8v6oAALGzAACkvwAAmMoBAIzYBACE+g4AfPsbAnT7JgVs/DAKZfw4EF79 QBVY/kcZU/5NHU//VCBL/1oiSP9hJUX/ZyZC/20oQP91Kj3/fSs6/4YtOP+RLjb/my80/6YwM/+y MTL/vjIx/9AyMf/WMjH/1jIx/9YyMf/WMjH/1jIx/9Yysq8AAKW6AACYxgAAi9IAAH/fAgB5/xEB b/8ZAmf/IgRg/ywHWv80DFT/PA9P/0MTSv9JFUf/TxdD/1UZQP9bGz7/YRw7/2YeOf9tHzb/dCA0 /30hMf+GIy//kSQt/5slLP+lJiv/ryYq/7snKf++Jyn/vicp/74nKf++Jyn/vicp/74nprYAAJjC AACLzgAAftsAAHX5BwBr/w8BYv8WAlv/HgNU/yYFTv8uBkn/NQhF/zwLQf9DDT7/SA47/04QOP9T ETX/WBIz/14TMf9kFC7/ahUs/3IWKv96Fyf/gxgl/44ZJP+YGiP/oBoi/6obIf+tGyH/rRsh/60b If+tGyH/rRsh/60bmr4AAIvKAAB+1wAAcOMAAGf/BABe/w0AVv8SAU//GQJJ/yADQ/8nBD//LgU6 /zQGN/86BzP/Pwcw/0QILv9JCSz/Tgkp/1MKJ/9YCiX/Xgsj/2QLIf9sDB//dA0d/30OG/+HDhn/ jw8Y/5kPGP+bEBj/mxAY/5sQGP+bEBj/mxAY/5sQ/0wqA/9IMwX/TzQG/1Q3CP9aQQ7/XEoW/1pU Hf9XYCT/VGsq/1B4L/9NhDP/So82/0eZOf9GoTv/Rak8/0SwPv9Dtz//QsA//0LJQP9B1UH/QeRB /0HuQv9B9kL/Qf1C/0L/QflE/0H0Rv9C70f/Qu9H/0LvR/9C70f/Qu9H/0LvR/9C/00pA/9KMgT/ UTIG/1c2CP9cPw7/XkkW/11THf9aXiT/V2kq/1N1L/9QgTT/TY03/0qXOv9Inzz/R6c9/0auP/9F tUD/RL1B/0TGQv9D0UL/Q+JD/0PsQ/9D9UP/Q/xD/ET/Q/VH/0PvSP9E60n/ROtJ/0TrSf9E60n/ ROtJ/0TrSf9E/00pA/9MMAT/VDEF/1k0CP9fPQ7/YUcW/2BSHf9dXCT/Wmcr/1ZzMP9TfzT/T4o4 /02UO/9LnT3/SqQ//0isQP9Is0H/R7tC/0bDQ/9GzkT/Rd9E/0XqRf1F80X7RftF90b/RPBJ/0Xq Sv9G5Uv/R+VL/0flS/9H5Uv/R+VL/0flS/9H/04pA/9PLgT/Vy4F/10yB/9jOw7/ZUYW/2VQHf9h WST/XWQr/1pwMP9WfDX/U4c5/1CRPP9Omj//TaJA/0upQv9KsEP/SrdE/0nARf9Iykb9SNtG+kjn R/hI8kf1SPpG8Un/R+pL/0jjTP9J3k3/St5N/0reTf9K3k3/St5N/0reTf9K/08oA/9SLAT/WiwF /2EvB/9nOg7/akQV/2pOHP9nVyT/YmEr/15tMf9beDb/V4M6/1SNPf9SlkD/UJ5C/k+lRPxOrUX7 TbRH+ky8SPlMx0j2S9RJ80vlSfBL8EntTPlI6Uz/SuFO/0vaT/9M01D/TdNQ/03TUP9N01D/TdNQ /03TUP9N/1AoA/9VKgT/XSkF/2UtB/9sOA3/b0IU/29LHP9sVSP/aF4q/2NpMf9fdDb9XH87+1mJ P/lWkkL3VJpE9VOiRvRSqUjyUbFJ8VC5Su9Pw0vuT89L60/iS+dP7kvkT/hN30/+TtVR/0/OUv9Q yVP/UMlT/1DJU/9QyVP/UMlT/1DJU/9Q/1EnA/9YJwT/YScE/2osBv9xNgz/dEAT/3RJGv9yUiL/ blsp/WhkMPllcDb2YXs7816FQPBbjkPuWZZG7FeeSOpVpkroVK1M51O1TeVTv07jU8xO4VPfTt1T 7U/YUvdR0VP9UspU/lPEVv9Tv1f/U79X/1O/V/9Tv1f/U79X/1O/V/9T/1InA/9bJQP/ZSQE/24q Bv92NAv/ej0R/3pGGP94TyD7dFgo9m9hL/FrbDbtZ3Y86WOAQOZgikXkXZJI4VuaSt9Zok3dWKpP 2leyUNhWvFHVVchS0lXbU85W61PLVvZVxlb9Vr9Y/Va6Wf1Xtlr9V7Za/Ve2Wv1Xtlr9V7Za/Ve2 Wv1X/1MmA/9fIgP/aSED/3MoBf97Mgr/fzsQ/4BEFvt+TB70e1Ql7nZdLelxaDTkbXI74Gl8Qdxl hUbYYo5K1F+WTdFdnVDOXKVSzFqtVMlZtlbHWcJXxlnQV8JZ5li/WfNZu1r7WbVb+1qwXftarV37 Wa1d+1mtXftZrV37Wa1d+1mtXftZ/1YkA/9iIAP/bSAD/3cmBP9/MAj/hDkN/YZBFPWFSRvuglEi 531aKuF4ZDLcc2461G53QdBqgEfMZolMyGSRUMVimFPDYKBVwF6oWL5dsVm7XbxbuVzJXLdc4Fy0 Xe9csF75Xatf+V2oYPlcpWH5XKVh+VylYflcpWH5XKVh+VylYflc/1giA/9lHgP/cR8D/3skA/+E Lgf/iTYL+Is+Ee+LRhfoiE4e4YRXJtl+YTHReGo6y3NzQsZvfEjCbIRNvmmMUbtmk1W4ZJtYtWOj WrNhrFywYLdermDEX6xg2F+pYetfp2H3X6Jj91+fZPdfnWT4Xp1k+F6dZPhenWT4Xp1k+F6dZPhe /1sgAv9oHAL/dB0C/34jA/+IKwX9jTQJ85A7DuqQQxTij0oa2opUJdCDXTDJfmc6w3hvQr50eEi5 cYBOtW6IUrJrj1avaZdarGefXKllqF+mZLJhpGS/YqJk0GKgZOdinmX1Yppm9WGYZ/Zglmj2YJZo 9mCWaPZglmj2YJZo9mCWaPZg/10fAv9qGgL/dxwC/4IhAv+LKQT5kTEH75U4C+aWPxDdlEcX0o5R JMqIWy/Cg2Q5vH5sQbd5dEiydXxOrnKEU6pvi1embZNbo2ubXqBqpGCdaK5jm2i6ZJloy2WXaONk lWnzZJNq9GORa/VikGv1YZBr9WGQa/VhkGv1YZBr9WGQa/Vh/18dAv9tGAL/ehsC/4UfAv+OJwP1 lS4F65k1COGcOwzWmEMWzJNPIsSNWC69h2E4toJpQbB+cUirenlOp3eAU6N0iFifcZBbm2+YX5hu oWKVbatkkmy3ZpBsxmaPbN9mjm3xZYxu82SLbvRjim70Yopu9GKKbvRiim70Yopu9GKKbvRi/2Ec Av9vFgL/fBoB/4geAf+RJALymSsE554xBd2gNgnRnEEVx5dNIb+RVi23jF83sYdnQKuCbkilfnZO oHt9U5x4hViYdo1clHSVX5FynmKOcahli3C0Z4lww2iHcNtnhnHuZoZy8mWFcvNkhHL0Y4Ry9GOE cvRjhHL0Y4Ry9GOEcvRj/2MaAv9xFQH/fxgB/4ocAfyUIQLunCcC46IsA9ikMgjMn0AUw5pLILqV VSyzkF03rItlP6WHbEegg3NNm4B7U5Z9gleSeopcjniSYIp2m2OHdaVmhHSxZ4J0wGiAdNVogHXs Z3928mZ/dfNlf3XzZH9182R/dfNkf3XzZH9182R/dfNk/2UZAv90FAH/gRcB/40aAfmXHgHroCMB 36YmAtKnMAfIoz4Tv55JH7aZUyuulFs2p49jP6CLakabh3FNlYR4UpCBf1eMf4dciH2QYIR7mWOA eqNmfnmvaHt5vWl6edFpeXrqaHp68mZ6efJlennzZHp582R6efNkennzZHp582R6efNk/2cXAv92 FAH/hBYB/5AXAfWbGgHnpB0B26sfAc6qLwbEpj0SuqFIHrKdUSqqmFk0opRhPpyQaEWWjG9MkIl2 UouGfVeGhIVbgoKNX36Al2N6f6Fmd36saHV9u2lzfs5pc37oaHR+8WZ0ffJldXzzZHV882R1fPNk dXzzZHV882R1fPNk/2kWAf94EwH/hxQA/5MVAPGeFQDjqBYA1a4bAcqtLQbAqTsRtqVGHa2hUCml nFgznphfPJeUZkSQkW1Li450UYaMe1aBiYNbfIeLX3iGlGJ0hJ9lcYOqZ2+DuGltg8tpbYPmaG6D 8mZvgvJlcIHzZHCB82RwgfNkcIHzZHCB82RwgfNk/2sUAf97EgH/ihIA/5YSAO2iEADerQ4A0LEZ AMWwKwW7rTkPsqlEG6mlTiegoVYymZ1eO5KaZEOLl2tKhpRyUICSeVV7j4Bad42JXnKMkmFuipxk a4moZ2mJtmhnichoZ4njZ2iJ8mZph/NlaobzZGqG82RqhvNkaobzZGqG82RqhvNk/24SAf9+EAD/ jRAA95oOANunCgDTsAsAyrQWAMC0KQS2sTcOra5DGqSqTCWbplUwk6NcOYygY0GGnWlIgJpwTnuY d1N2ln5YcZSGXGySkGBokZpjZZCmZWOQtGZhkMZmYZDhZmGQ8mVjjvNkZIz0Y2SM9GNkjPRjZIz0 Y2SM9GNkjPRj/3EQAf+CDwD/kQ0A3p8JANOqCQDMswkAxLgTALq4JgOxtjUMp7NBGJ6vSiOWrFMu jqlaN4emYT+ApGdGeqFuTHWfdVFwnXxVa5yEWmaajl1jmZhgX5ikYl2YsmRbmMNkW5jeY1uY8GNc lfViXpP1Yl6T9WJek/ViXpP1Yl6T9WJek/Vi/3UOAP+GDQDrlggA1aMHAMytCADFtgcAvbwRALS9 IwKruzIKobk/FZi2SCCQs1EriLBYNICuXzx6q2ZDdKlsSG+oc05qpnpSZaWCVmGjjFpdopZcWqKi X1ehsGBWocFgVaLcYFWh72BWn/dfV5z3X1ec919XnPdfV5z3X1ec919XnPdf/3oMAP2LCQDamwQA zqcGAMSwBgC8uQQAtcEOAKzCIAGkwTAImr88E5G9Rh2Juk8ngbhWMHq2XThztGQ/brJqRGixcUlk sHlNX66BUVutilRYrZVXVKyhWVKsr1tQrMBbUKzaWk+r7ltPqvpbUab6W1Gm+ltRpvpbUab6W1Gm +ltRpvpb/4AJAOGSAQDRoAQAxqsFALy0BACzvQMAq8cLAKTJHAGcyCwGk8c5D4rFRBmBw00jesFU LHO/WzNtvmI5Z7xpPmK7cENeundHWrmAS1a5iU5TuJRQULigUk24rlRMuL9US7nYVEu37VRKtvlV SrP+Vkqz/lZKs/5WSrP+Vkqz/lZKs/5W+ocCANaYAADJpQMAva8DALO4AQCpwgQAoc0IAJrQFgCS 0CgEis82DIHOQRV5zEoecstSJmzKWi1myWEyYchoN1zHbzxYxnY/VcZ/Q1HFiUVOxZRIS8WgSknF rktIxb9LR8bYS0fF7UtGw/lNRcL/TkXC/05Fwv9ORcL/TkXC/05Fwv9O35AAAMyfAAC/qgEAs7MB AKm9AgCfxwUAltIJAI7aEgCI2yQCgNoyCHjZPhBx2EgYatdQH2TWWCVf1V8qW9RnL1fUbjNT03Y2 UNN/OUzTiDtK05Q+R9OgP0XUrkBE1L9BQ9XYQETT7EBC0vZCQdH+REHR/kRB0f5EQdH+REHR/kRB 0f5E0ZgAAMOlAAC1rgAAqbgAAJ7DAgCUzQYAitkKAITjGAF95CYDdeQyCG7jPA9n40UVYeNNG1zj VSBX410kVONkJ1DiaypN4nMtSuN8MEjjhjJF45A0Q+OcNUHkqTZA5Lg3P+XLNz/l5Dc/4/M2PeL7 OD3i+zg94vs4PeL7OD3i+zg94vs4xqEAALerAACqtAAAnr4AAJPJAgCI1AYAf+4OAHntGwFx7ScD au4yCGTuOw1e7kMTWO5LF1PuUhpQ71keTO9gIEnvZyNH728lRPB3J0HwgCk/8IoqPfGVLDvxoS05 8q4uOPK+Lzfz0C838+cvNvHzLzbx8y828fMvNvHzLzbx8y828fMvuacAAKuwAACfuwAAksYAAIbQ AQB73QUAdPcRAG33HAFm+CYDX/gvBlr5OApU+UAOUPpHEUz6ThRI+1UWRftbGEL7YhpA/GgcPfxw HTr9eB84/YIgNv2NIjT+mCMy/qQkMf+xJTD/vyYv/88mLv/jJi7/4yYu/+MmLv/jJi7/4yYu/+Mm ra0AAJ+3AACSwgAAhs0AAHnaAABw8ggAaP8RAGH/GgFa/yMDVP8rBE//MwZK/zsIRv9CC0P/SQ1A /08OPf9VEDr/WxE4/2ETNf9oFDP/bxUw/3gWLv+CFyz/jRkq/5kaKf+kGij/rxsn/7ocJv/HHCb/ xxwm/8ccJv/HHCb/xxwm/8ccobQAAJO/AACGygAAeNYAAGziAABj/AcAXP8PAFX/FgFP/x4CSf8m A0T/LgRA/zQFPP87Bjn/QQc2/0YIM/9MCDH/UQku/1cKLP9dCir/ZAso/2wMJf91DSP/fw4h/4oP IP+VEB7/oBAe/6gRHf+xER3/sREd/7ERHf+xER3/sREd/7ERlbwAAIbHAAB50wAAa+AAAF7tAABW /wMAT/8MAEn/EgFD/xkBPv8gAjn/JwM1/y0DMv8zBC7/OAQr/z0FKP9CBSb/RwUk/0wGIv9RBiD/ VwYd/14HG/9lBxn/bggX/3gIFf+DCBP/jQkT/5YJEv+eCRL/ngkS/54JEv+eCRL/ngkS/54J/0It A/9CMgT/SDIE/0w2Bv9OPAj/UEcO/1BSFf9OXxr/S2sf/0h3JP9Fgyf/Qo4q/0GXLP8/oC7/P6cv /z6uMP89tTH/Pbwy/zzFMv88zjP/O98z/zvqNP878zT/O/s0/zz/M/48/zP8Pf809j//NfU//zX1 P/819T//NfU//zX1P/81/0MsA/9EMAT/SjAE/040Bv9ROgj/U0YO/1JRFf9RXRr/Tmkg/0t0JP9I gCj/RYsr/0OVLf9CnS//QaUw/0CsMf8/szL/P7oz/z7CNP8+zDT/Ptw1/z3oNf898TX/Pvo1/T7/ Nfs//zT4P/828kH/N/BB/zfwQf838EH/N/BB/zfwQf83/0QsA/9HLgP/TS4E/1EyBf9UOQj/V0QO /1ZPFf9UWhv/UWYg/05yJf9LfSn/SIgs/0aSLv9FmzD/RKIy/0OpM/9CsDT/Qrc1/0G/Nv9ByTb/ QNc3/0DlN/1A8Df6QPg390H/NvZB/zfyQf847EP/OepE/znqRP856kT/OepE/znqRP85/0UrA/9J LAP/UCwE/1UvBf9ZNwj/XEIO/1tNFf9YVxv/VmMg/1JvJf9Peir/TIUt/0qPMP9ImDL/R580/0am Nf9FrTb/RbQ3/0S8OP5Exjj8RNI5+UPiOfZE7jnzRPc58UT/Oe9E/zrrRf875Eb/PONG/zzjRv88 40b/PONG/zzjRv88/0YrA/9NKQP/VCkE/1ksBf9eNQf/YUAN/2FKFP9eVBr/Wl8g/1drJv9Udir/ UYEu/06LMf5MlDT8S5w1+0qjN/pJqjj4SLE590i5OvZHwjv1R8078kffO+5H7DvrSPY76Uf/PedH /z7hSP8/2kr/QNhK/0DYSv9A2Er/QNhK/0DYSv9A/0cqA/9QJwP/WCYD/14qBP9jMwf/Zj0N/2ZH E/9kURr/YFsg/1xnJv1Zciv6Vn0v+FOHM/ZRkDX0UJg38k6fOfFNpjvvTK087ky1PexLvj3rS8o+ 6UvcPuVM6j3iS/U/30v+QdxK/0LUTP9DzU3/Q8tO/0PLTv9Dy07/Q8tO/0PLTv9D/0ooA/9UJAP/ XCMD/2MoBP9oMAb/bDsL/2xEEv9qThn+Zlgf+WFiJfVebSvyW3gw71iCNOxWizfqVJQ56FObO+ZR oz3lUao+41CyP+FPu0DgT8dA3k/YQdlP6EHUT/RD0E7+Rc5O/0bIUP9GwlH/R8BR/0fAUf9HwFH/ R8BR/0fAUf9H/00lAv9XIQL/YCAD/2gmA/9uLgX/cjgK/3JBEP1wSxf3bVQd8mheJO1kaSrpYXQw 5V5+NOJbhzjgWY873VeXPttVn0DYVKZC1VOuQ9JSt0TQUsJFzlLQRstS5UbIUvJIxVL9ScJS/0q8 VP9Kt1X/SrZV/0q2Vf9KtlX/SrZV/0q2Vf9K/1AjAv9bHgL/ZB4C/20kA/9zKwT/dzUI/ng+DvZ3 RxTwdFAb6m9aIuRrZSngZ28v22N5NdZggjrSXYo+z1uSQcxZmkPKWKFFyFepR8ZWsknEVrxKwlXJ S79V30u8Vu5MuVb6TbdW/02yWP9Nrln/TaxZ/02sWf9NrFn/TaxZ/02sWf9N/1MgAv9eHAL/aBwC /3EiAv94KAP/fDEH+H46C/B9QxHpekwY4nZXH9xyYSjUbWsvz2l0NstlfTvHYoVAxGCNQ8FelUa/ XZxIvFukS7parUy4WbdOtlnDT7RZ1U+xWupQrlr3UKxa/1CoW/9QpFz/UKRd/0+kXf9PpF3/T6Rd /0+kXf9P/1YeAv9hGQL/bBoC/3UgAv98JQP9gS4F84Q3CeqEPw7igUgV231THdF3XSfLcmcwxm5w N8JqeDy+Z4BBumWIRbdjkEi0YZhLsl+fTa9eqE+tXbJRq12+UqldzlOmXeVTpF70U6Je/1OfX/9S nGD/Uptg/1KbYP9Sm2D/Uptg/1KbYP9S/1gcAv9kFwH/cBkB/3kdAf+AIwL4hioD7YkyBuSKOwrc iEUS0YJQHMp9WibEeGMvvnNsN7lvdD21bHxCsmqERq5njEqrZZNNqGSbT6VipFKjYa5UoWG5VZ9h yFadYeFWm2LxVZli/VWXY/9UlWT/VJRk/1OUZP9TlGT/U5Rk/1OUZP9T/1oaAv9nFQH/cxcB/30b Af+EIAHziiYC6I4uBN+QNgfUjEERy4dNG8SCVya9fWAvt3hpNrJ0cT2ucXhCqm6AR6ZsiEqjao9O oGiYUZ1noFOaZqpVmGW1V5VlxFiUZdtYkmbvV5Fm/FePZ/5Wjmf+VY1o/lWNaP5VjWj+VY1o/lWN aP5V/1wYAf9pEwH/dhYB/4AZAf2IHQHvjiIB5JMpAtqUMQbOkD8PxotLGr6GVSW3gV4usX1mNqx5 bjyndnVCo3N9R59whEucboxOmGyUUpVrnVSSaqdXkGmyWY1pwFqMadVaimrsWYpq+liJa/1Xh2v9 Vodr/laHa/5Wh2v+Vodr/laHa/5W/14XAf9sEgH/eBQB/4MXAPmLGgDrkh0B4JgjAdOYLwXKlD0O wY9JGbmKUySyhlstrIFkNaZ+azyhenJCnXd6R5l1gUuVc4lPkXGRUo5vmlWLbqRYiG2vWoZtvVuE bdBbg27pWoNu+FmCb/xYgm/9V4Jv/VeCb/1Xgm/9V4Jv/VeCb/1X/2AVAf9uEQH/exMA/4YUAPaP FgDnlhgA25wcAM+bLQTFlzsNvJNHGLSOUSOtilksp4ZhNKGCaTucf3BBl3x3RpN5fkuPd4ZPi3WO Uohzl1WEcqFYgnGsWn9xulx+ccxcfXLnW31y9lp8cvxZfHL8V3xy/Vd8cv1XfHL9V3xy/Vd8cv1X /2IUAf9xEQH/fREA/4gSAPKSEgDjmhIA1Z8ZAMqeKwTBmzkMuJdFF7CSTyKpjlgroopfM5yGZzqX g25AkoB1RY1+fEqJfIROhXqMUoJ4lVZ+d59Ye3aqW3l1uFx3dcpcd3blXHd39Vp3dvtZd3b8WHd2 /Fd3dvxXd3b8V3d2/Fd3dvxX/2QSAf9zEAD/gBAA/4sQAO+VDgDfng0A0KIXAMahKQO9njcLtJpD FqyWTSCkklYqnY5eMpeLZTmSiGxAjYVzRYiDekqEgIFOgH+KUnx9k1V4fJ1YdXuoW3N6tlxxesdc cXriXHF781pxe/tZcnr8WHJ6/FhyevxYcnr8WHJ6/FhyevxY/2cRAf91DwD/gw4A9I4NANuZCgDU oQsAzKQVAMKkJwO4ojYKsJ5CFaeaTB+gl1QpmZNcMZOQYziNjWo/iIpxRIOIeEl+hn9NeoSIUXaC kVVzgZtYb4CmWm1/tFxrf8Vca4DfXGuA8lprgPtZbH78WG1+/FhtfvxYbX78WG1+/FhtfvxY/2kQ Af94DgD/hQwA4pIIANWbCQDOowkAx6gSAL2oJQK0pjQJq6JAE6OfSh6bm1InlJhaMI6VYTeIkmg9 gpBvQ36Odkh5jH1MdYqFUHGIjlRth5lXaoakWWeFsVtlhcJbZYXcW2WF8FpmhftZZ4P8WGeD/Fdn g/xXZ4P8V2eD/Fdng/xX/2wOAP97DADyiQkA2ZUGAM+eCADJpggAwasQALirIgKvqjIIpqc+Ep6k SByWoVElj55YLoibXzWCmWY8fZZtQXiUdEZzkntLb5CDT2uPjFJnjpZVZI2iWGGMr1lfjMBaX4zZ WV+M7llfjPtYYYr9V2GJ/Vdhif1XYYn9V2GJ/Vdhif1X/28MAP9/CQDfjQMA0pgGAMqiBgDCqQYA uq8OALKwIAGpri8Goaw8EJipRhqRp08jiaRWLIOiXTN9n2Q5d51rP3KbcURumnlIaZiBTGWXilBh lZRTXpWgVVuUrVdalL1YWZTUV1mU7FdZk/lWW5H+VVuQ/lVbkP5VW5D+VVuQ/lVbkP5V/3MJAPWE BADYkQMAzJwFAMOlBQC7rQQAs7MMAKu1HAGjtCwFm7I5DpKwRBeKrU0gg6tUKX2pXDB3p2I2caVp PGykb0FoondFZKF/SV+fiExcnpJPWJ6eUladq1NUnbxUU53RVFOd61NTnPhTVJr/U1SZ/1NUmf9T VJn/U1SZ/1NUmf9T/3gGAOGJAADQlgIAxqEDALypAwCzsAEAq7gIAKS6GACcuikDlLk2C4y3QRSE tUodfLNSJXaxWixwr2Aya65nOGatbjxiq3VAXqp9RFqphkhWqJFKU6idTVGnqk5PqLpPTqjPT06n 6U9NpvdPTaX/T06k/09OpP9PTqT/T06k/09OpP9P+n8AANiOAADJmwEAvqUCALStAQCrtQAAob8E AJvBFACUwSUCjMAzCIS/PhF8vUgZdbxQIW+6WCdquV8tZbhlMmC3bDZctnQ6WLV8PlW0hUFRtJBE TrOcRkyzqUhKs7lISbTOSEmz6UhIsfZJSLD/Skiw/0pIsP9KSLD/Skiw/0pIsP9K4oYAAM6UAADC oQAAtqkAAKuxAAChugEAmMMFAJDJEACKySABg8kvBXvIOw10x0UUbsZOG2jFViFjxF0nXsNkK1rC ay9WwXIzU8F7Nk/AhDlMwI88SsCbPkfAqD9GwLhARcDNQEXA6D9EvvZBQ73/QkO8/0NDvP9DQ7z/ Q0O8/0NDvP9D1o0AAMabAAC4pQAAra4AAKK2AACYvwIAjcgGAIPRCwB/0hoAedIqA3LSNwhs0UIP ZtFLFWHQUxpcz1sfWM9iI1TOaSdRznEqTc56LUrOgzBIzo4yRc6aNEPOqDVCzrg2Qc/NNUHO6DVA zfU3P8v+OT7L/zk+y/85Psv/OT7L/zk+y/85ypYAALyiAACvqgAAo7MAAJi8AACNxgMAgs8HAHjZ CwBz3hgAbt4mAmjeMwVi3j4KXd5ID1neUBRV3lgXUd5gG07eZx5L3W8gSN54I0begSVD3ownQd6Y KT/epio+37UqPeDIKj3f4yo83fErO9z7LTrc/S463P0uOtz9Ljrc/S463P0uwJ8AALGnAACksAAA mLoAAI3DAACBzQIAdtcHAG7oDwBp6BsBY+gnAl7pMgVY6TsIVOlEDE/qTA9M6lMSSepbFUbqYhdE 62oZQetyGz/rex0864YeOuyRIDjsniE37awiNu27IzXuzyM07uYjNOv1IzTr+CM06/gjNOv4IzTr +CM06/gjs6UAAKatAACZtwAAjcEAAIDLAAB11QEAaeEGAGTzEQBe8xwBWfQmAlT0MARP9TgGS/VA CEf2RwpE9k4MQfdVDj/3XA8892MROvhqEzf4cxQ1+H0WM/mIFzH5lBgv+qEZLvqvGi37vhos+88b K/vnGyv76xsr++sbK/vrGyv76xsr++sbqKoAAJq0AACNvwAAgMkAAHTTAABn3gAAXvIIAFn+EQBT /xoBTv8jAkn/KwNF/zMEQf86BT7/QQY7/0cHOP9OCDX/VAkz/1oJMf9hCi//aQss/3IMKv99DSj/ iA4m/5UPJf+hECT/rhEj/7oSIv/KEiL/0BIi/9ASIv/QEiL/0BIi/9ASnLIAAI68AACBxwAAc9EA AGfdAABZ4wAAU/0GAE3/DgBI/xYAQ/8eAT//JgI6/y0CN/8zAzP/OQMw/z8ELv9EBCv/SgUp/1AF J/9WBiT/XQYi/2UHIP9uBx3/eQgb/4UIGv+SCRn/ngkY/6gJF/+zCRf/twkX/7cJF/+3CRf/twkX /7cJkLoAAILFAAB00AAAZ9wAAFjjAABN8AAAR/8CAEL/DAA8/xEAOP8YATT/HwEw/yUBLP8rAin/ MAIl/zUCI/86AiD/PwMe/0QDHP9JAxn/TwMX/1YEFf9eBBL/aAQR/3IFD/9+BQ7/igUO/5QFDf+e BQ3/ogUN/6IFDf+iBQ3/ogUN/6IF/zkvAv88MAP/QTED/0Q0BP9EOgb/REUI/0VRDP9DXRH/QWkW /z52Gf88gRz/Oowe/zmWIP84niH/N6Uj/zerI/82siT/Nrkl/zbAJf81yib/Ndcm/zXlJv817yb/ Nfgm/zb/Jv42/yb8Nv8m/Db/J/o2/yj6Nv8o+jb/KPo2/yj6Nv8o/zkvAv8+LwP/RC8D/0YyBP9I OAb/SEMI/0hPDf9HWxL/RGcW/0JzGv8/fx3/PYof/zyTIf87myP/OqIk/zmpJf85sCb/OLYm/zi+ J/84xyf/ONMo/zjjKP847Sj+OPco+zj+J/k5/yf4OP8p+Dj/KvY4/yr2OP8q9jj/KvY4/yr2OP8q /zovAv9BLAP/RiwD/0ovBP9MNwX/TUEI/0xMDf9LWBL/SGQX/0ZwG/9DfB7/QYcg/z+QI/8+mCT/ PaAl/z2mJv88rSf/PLQo/zu7Kf87xCn/O88p/jvgKvs76yr4O/Up9jz+KfQ8/yrzO/8r8jv/LO87 /y3vO/8t7zv/Le87/y3vO/8t/zwtAv9EKQL/SikD/04sBP9RNAX/Uj4I/1JKDf9QVRL/TWEX/0pt G/9IeB//RYMi/0ONJP9ClSb/QZ0n/0CjKP9Aqin+P7Eq/T+4K/w/wSv6P8sr9z/cLPU/6SzxP/Qr 7z/9LO0//y3sPv8v6z7/MOc//zDnP/8w5z//MOc//zDnP/8w/0AqAv9IJgL/TiYD/1IpA/9WMgX/ VzwH/1dHDP9VURL/Ul0X/1BpHP9NdCD/Sn8j/UiJJvtHkSj6Rpkp+EWgKvdEpyv1RK0s9EO1LfND vS3yQ8gu8EPXLuxD5y7pRPMt5kP8MORC/zHjQv8y4UL/M9xD/zTcQ/803EP/NNxD/zTcQ/80/0Mn Av9LIwL/UiIC/1gnA/9cLwT/XTkH/15DDP9bThH/WFgX/lVkHPpSbyD3UHok9E2EJ/JMjSnwSpUr 70mcLe1Joy7sSKov6kexL+lHujDnR8Uw5kfSMOJI5TDfR/Iy20f7NNhG/zXVRv820kb/N81I/zfN SP83zUj/N81I/zfNSP83/0YkAv9PIAL/Vh8C/10kA/9hLAT/YzUG/2RAC/9iShD6XlQW9VtfHPFY ayDuVXUl61N/KOhRiCvmT5Et5E6YL+JNoDDhTKcx30yuMt1LtzPbS8I02UrPNdVL5DXQS/A2zUr7 OMpK/zrISv86xkv/O8FM/zvBTP87wUz/O8FM/zvBTP87/0ohAv9THQL/WxwC/2IiAv9nKQP/aTIF /2o8CfloRg/yZVAV7WFbGuheZiDkW3El4Vh7Kd5WhCzbVIwv2FKUMtRRmzTSUKM10E+qN85OsjjM Trw5yk7JOshO3TrET+07wU75Pb5O/z28Tv8+uk//PrZQ/z62UP8+tlD/PrZQ/z62UP8+/00eAv9W GgH/XxoB/2cgAv9sJgL/by4E+XA4B/JvQgzrbEsS5WlXGd9lYh/aYWwl1F12KtBbfi/NWYcyyleP NchWljfGVJ05xFOlO8FTrTy/Urc+vVLDP7xS0z+5Uug/tVL2QbNS/0GxU/9Br1P/QaxU/0GsVP9B rFT/QaxU/0GsVP9B/1AcAf9aFwH/ZBgB/2wdAf9xIwL9dSoD83YzBet2PQrjc0cP3G9TF9RrXh/O ZmcmymNxK8ZgeTDCXoE0v1yJN71akTq6WZg8uFigPrZXqEC0VrJCsla9Q7BVzEOtVuNEq1bzRKhX /kSnV/9EpVj/RKJY/0SiWP9Eolj/RKJY/0SiWP9E/1MZAf9dFAH/aBYB/3AaAf92IAH3eiYC7Xwu A+R8OAfcekQN0nVPFstwWh7GbGMmwWhsLL1mdTG5Y301tmGEObNfjDywXZQ/rlybQatbpEOpWq1F p1q4RqVZx0ejWt5HoVrvR59b/EedW/9Hm1z/Rppc/0aaXP9Gmlz/Rppc/0aaXP9G/1UXAf9gEgH/ axQB/3QXAP96HAHyfyIB54EpAt6CMwTTf0AMy3pMFcR2Vh6+cWAluW5oLLRrcTKxaHk2rWaAOqpk iD2nYo9ApWCXQ6JfoEWfXqlHnV60SZtdwkqZXdZKl17sSpZf+kmVX/9Jk2D/SJJg/0eSYP9HkmD/ R5Jg/0eSYP9H/1gVAf9jEQH/bhIA/3cVAPt+GADtgx0A4ocjAdaHLgPMgz0LxX9JFL17Ux23dl0l snNlLK1vbTKpbXU3pmp8O6JohD6fZoxBnGWURJljnEeXYqZJlGKwS5JhvkyQYdBMj2LoTI5j+EuN Y/9KjGT/SYtk/0mLZP9Ji2T/SYtk/0mLZP9J/1oTAf9mEAD/cREA/3oSAPeCFADohxcA3YscANCL LAPHiDsKv4RHE7h/URyxe1okrHdiK6d0ajGjcXI2n295O5ttgD+Ya4hClWmQRZJomUiPZqJKjGat TIpluk2IZcxOh2bmToZn9kyGZ/9LhWj/S4Ro/0qEaP9KhGj/SoRo/0qEaP9K/1wSAf9oDwD/dBAA /30QAPOFEADkixEA1o8XAMuOKgLCjDgJuohEErOETxusf1gjp3xgK6F4aDGddW82mXN2O5VxfT+S b4VCjm2NRYtslkiIa6BLhWqqTYNpt06BachPgGrjT4Br9E5/a/9Mf2v/S39r/0t/a/9Lf2v/S39r /0t/a/9L/14QAf9rDgD/dg4A+4ANAOqIDQDbjwwA0JIVAMeSJwK+jzYItoxCEa6ITRqohFYiooBe Kpx9ZTCXemw1k3dzOo91ez6Mc4JCiHKLRoVwk0mCb51Mf26oTn1utU97bcZQem7gUHlv8k55b/5N eW//THlv/0t5b/9LeW//S3lv/0t5b/9L/2APAP9tDQD/eQwA7oMLANuLCQDUkQoAzJUTAMKVJQK5 kzQHsY9BEKqMSxmjiFQhnYRcKZeBYy+Sfmo1jnxxOYp6eD2GeIBCg3aIRX91kUl8c5tMeXKmTnZy s1B1csNQc3LdUHRz8E90c/1NdHP/THRz/0x0c/9MdHP/THRz/0x0c/9M/2IOAP9vDAD8ewoA3oYG ANWOCADPlAkAx5gRAL6YIwG1ljIGrZM/D6aQSRifjFIgmIlaKJOGYS6Og2g0iYFvOYV/dj2BfX5B fXuGRXp5j0l2eJlMc3ekTnF3sVBvdsFQbnfZUG53709ud/xObnf/TW93/0xvd/9Mb3f/TG93/0xv d/9M/2QNAP9yCgDwfgYA2ogFANCQBwDKlwgAwpsQALmbIQGxmjAGqZc9DqGURxeakVAflI1YJ46L Xy2JiGYzhIZtOICEdD17gntBeICERXR/jUhxfZdLbXyiTmt8r09pe75QaHzVUGh87U9pfPtOaXz/ TWp7/0xqe/9Manv/TGp7/0xqe/9M/2YKAP91CADhgQIA1IsFAMuTBgDEmgYAvZ4OALWfHwGsni4F pJs7DJ2YRRWWlU4ej5NWJYmQXSyEjmQyf4trN3qKcjx2iHlAcoaBRG+Fikdrg5VKaIKgTWWBrE5j gbxPYoHRT2KB605jgflNY4H/TGSA/0tkgP9LZID/S2SA/0tkgP9L/2kIAPt4BADchAEAz48EAMaX BQC/nQUAt6EMAK+jHACnoiwEn6A5C5ieQxSRm0wciphUI4SWXCp/lGIwepJpNXWQcDpxjnc+bY1/ QmmLiEZlipJJYomeS1+Iqk1eiLpOXIjOTl2I6U1dh/hMXYf/S16G/0tehv9LXob/S16G/0tehv9L /20FAOp8AADViAAAypIDAMGaAwC5oAMAsaYJAKmnGQCipykDmqU2CZKjQRKLoUoahJ9SIX6dWih5 m2AudJlnM2+XbjhrlnU8Z5R9QGOThkNgkZBGXJGcSVqQqUtYkLhMV5DMTFeQ50tXj/dKV47/SliO /0lYjv9JWI7/SViO/0lYjv9J/3EBAOCAAADPjAAAxJYCALueAgCypAAAqaoFAKKsFQCbrCYClKs0 B4yqPw+FqEgXfqZQHnikWCVzol4rbqFlMGqfbDRlnnM5YZ17PF6bhEBamo5DV5maRVSZp0dSmbZI UZnKSFGY5khRl/VIUZf/R1GW/0dRlv9HUZb/R1GW/0dRlv9H9ncAANiFAADJkQAAv5sBALSiAACr qAAAobAAAJqyEQCUsyIBjbIwBYWxPAx+r0YUeK5OG3KsViFtq1wnaKljLGSoajBgp3E0XKZ5OFil gjtVpIw+UaOYQE+jpUJNo7RDTKPIQ0yj5ENLofRDS6D/REug/0RLoP9ES6D/REug/0RLoP9E430A AM+LAADClgAAt58AAK2mAACjrQAAmbUAAJC5DgCLuh4BhLotA325OQl3uEMQcbZMF2u1Ux1mtFoi YrNhJl6yaCtasW8uVrB3MlOwgTVPr4s4TK+XOkqupDxIrrM9R67HPUeu4zxGrfM9Rqv+PkWr/z9F q/8/Rav/P0Wr/z9Fq/8/2oMAAMeRAAC7nAAAr6QAAKWrAACasgAAkLoBAIbBCQCBwhgAe8IoAnXC NQZvwUAMacBJEmS/URdfvlgcW75fIFe9ZiRUvG4nUbx2Kk27fy1Ku4owSLuWMkW7ozRDu7I0QrvF NUO74jRCufM1Qbj9N0C3/zdAt/83QLf/N0C3/zdAt/83zosAAL+YAACyoQAAp6kAAJywAACRuAAA hsACAHvIBwB0yxIAcMwiAWvLMANmyzwHYctFDFzKThFYylYVVMpdGVHJZBxOyWwfS8l0IkjIfiRF yIgnQ8iVKEHIoio/yLErPsnEKz7J4So+x/IrPcb8LTzF/y48xf8uPMX/LjzF/y48xf8uxJMAALaf AACppgAAna4AAJK3AACGvwAAe8cDAHDPBwBn1g0AZNcaAGDYKgFc2DYDWNhBBlTYSgpQ2FINTdha EErXYhNH12kWRddyGELXfBpA2IccPdiTHjzYoR862bAgOdnDIDnZ3yA51+8gONX5IjfU/yM31P8j N9T/IzfU/yM31P8juZwAAKukAACfrAAAk7UAAIe+AAB7xgAAcM4DAGXWBwBd4w4AWuMbAFbjJwFS 5DICTuQ8BErkRAZH5U0IReVVCkLlXAxA5WQOPuZsEDvmdhI55oAUN+eMFTXnmRY056gXMui4GDLo zBgx6OUYMeb0GDHl/Bgx5fwYMeX8GDHl/Bgx5fwYrqIAAKGqAACUswAAiL0AAHvGAABvzgAAY9YB AFjeBQBU7hAAUe8bAE3vJgFJ8C8CRfA4A0HxPwQ+8UcFPPJOBjryVQc38lwINfNkCTPzbQox9HcM L/SCDS30jw4r9Z0PKvarECn2vBAo9s4RJ/fmESf18REn9fERJ/XxESf18REn9fERo6gAAJayAACI uwAAe8UAAG/OAABi1wAAVt4AAE7wBwBK+hAARvsZAEL7IgE//CoBO/0yAjj9OQI1/j8DMv5GAzD/ TAQu/1MFK/9aBSn/YgYn/2sGJP92ByP/gggh/5AIIP+dCR//qwke/7oJHf/JCRz/3Qkc/90JHP/d CRz/3Qkc/90JmLAAAIq6AAB8xAAAb80AAGLYAABV3gAASeQAAET7BQA//w4AO/8VADj/HAA0/yQB Mf8rAS3/MQEq/zYCJ/88AiX/QgIj/0gCIP9OAx7/VQMc/10DGf9nBBf/cgQV/38EFP+MBRP/mgUS /6YFEf+yBRH/vAUR/7wFEf+8BRH/vAUR/7wFjLgAAH3CAABvzAAAYtgAAFTfAABH5QAAPvEAADn/ AQA0/wsAMP8QACz/FgAp/xwAJv8iACL/JwEf/ywBHP8xARr/NgEY/zwBFf9BARP/SAIR/08CEP9X Ag3/YQIM/2wCCv95Agn/hgMI/5IDB/+dAwb/pQMG/6UDBv+lAwb/pQMG/6UD/zExAv82LgL/Oi8C /zsyA/87OQT/O0MF/zlPB/84XAr/NmgN/zR0EP8ygBL/MYsU/zCUFv8wmxf/L6IX/y+oGP8urxn/ LrUZ/y68Gf8uxRr/Ls8a/y7gGv8u6xr/LvQa/y78Gvwv/xn7L/8a+i7/G/ou/xz6Lv8c+i7/HPou /xz6Lv8c/zMvAv85LAL/PS0C/z4wA/8/NgT/P0EF/z1NB/88WQr/OmUO/zhyEf82fRP/NYgV/zSR F/8zmRj/M6AZ/zKmGf8yrBr/MbMa/zG6G/8xwhv/Mcwb/zHdG/8x6Rv9MfMb+jL7G/gy/xv3Mv8c 9jH/HfUx/x71Mf8e9TH/HvUx/x71Mf8e/zUsAv88KgL/QCoC/0ItA/9DNAT/RD8F/0JKB/9BVgr/ P2IO/z1uEf87ehT/OYQW/ziOGP83lhn/Np0a/zakG/81qhz/NbAc/zW3Hf81vx3/Nckd/DXYHfo1 5x33NfEd9DX6HfI1/x7xNf8f8DX/IO80/yHvNP8h7zT/Ie80/yHvNP8h/zgqAv8/JwL/QyYC/0Yp Av9JMgP/STwF/0hHB/9GUwv/RF8P/0JqEv9AdhX/PoAY/zyKGf88khv/O5oc/TqgHfw6px37Oa0e +jm0H/k5vB/4OcYf9jnTH/I55B/vOfAf7Dr6H+o5/yHpOf8j6Dn/JOc5/yTnOf8l5zn/Jec5/yXn Of8l/zwnAv9DIwL/SCIC/0wmAv9PLwP/UDkF/05DB/9MTwv/SlsP/0hmE/9FcRb8Q3wZ+kKGG/hB jhz2QJYe9T+dH/M/oyDyPqog8T6xIfA+uSHuPsMh7T7PIeo+4iHmP+8h4z75I+E9/yXfPf8n3j3/ KNw9/yjcPf8o3D3/KNw9/yjcPf8o/z8jAf9HIAH/TB4B/1EkAv9VLAP/VjUE/1U/Bv9TSgr+UFYP +k5iE/ZLbRfzSXca8EeBHO5Gih7sRZIg60SZIelDoCLoQ6cj5kOuI+VCtiTkQsAk4kPMJN9D4CTb Q+0l1kL4KNNC/yrRQv8rz0H/K85B/yzOQf8szkH/LM5B/yzOQf8s/0MgAf9KHAH/UBsB/1chAf9b KAL/XDID/1s7BvxZRgn2VlEO8VRdE+1RaBfpT3Ia5k18HeRLhSDiSo4h4EmVI95InCTcR6Mm2ker J9hGsyjVRrwo00bIKdFG3CrNR+wqyUb3LMdG/y7ERv8vw0b/L8JG/y/BRv8vwUb/L8FG/y/BRv8v /0YdAf9OGAH/VhgB/1weAf9gJQL/Yi0D/GI3BfRgQQjuXUwN6FpYEuNYYxffVW4b21J3H9hQgCLU T4kk0U2QJ89MlyjNTJ4qy0umK8lKrSzHSrctxkrCLsRK0S/BS+cvvUr0MbtK/zK4Sv8yt0v/M7ZL /zO2S/8ztkv/M7ZL/zO2S/8z/0oaAf9SFQH/WhYB/2EbAf9mIQH+aCkC9GgyA+xnPAblZEgL32FU ENleXhfSW2kczlhyIMtWeyTIVIMnxVKLKsNRkizBUJkuv0+hL71PqDG7TrEyuU68M7dOyjS1TuE0 sk7xNa9P/TatT/82rE//NqtP/zarT/82q0//NqtP/zarT/82/00XAf9VEgH/XxQA/2YYAP9rHQH4 bSQB7W4sAuVtNgTda0MI1GdPEM1kWhfIYGQdxF1tIsFbdia9WX4pu1eFLLhWjS+2VZQxtFScM7JT pDSwUq02rVK3N6xSxTiqUto4p1LtOaVT+jmjU/85olP/OaFU/zihVP84oVT/OKFU/zihVP84/08U Af9ZEAD/YxIA/2oUAP9vGQDych8A5nQmAd10MQLTcT8Iy21LD8VpVhfAZmAdu2NpIrdgcSe0Xnkr sVyALq5biDGsWY8zqliXNadXnzelV6g5o1azOqFWwDufVtI8nVbpPJtX+DyaV/88mVj/O5hY/zuY WP86mFj/OphY/zqYWP86/1ISAf9cDgD/ZhAA/20RAPpzFADrdxgA4HkfANR5LQLLdjwHxHJIDr5v Uxa4a1wds2hlIq9lbSesY3UrqWF8L6ZfhDKjXos1oV2TN55cmzmcW6Q7mVqvPZdauz6WWsw/lFrl P5Jb9T6RW/8+kFz/PZBc/zyPXP88j1z/PI9c/zyPXP88/1URAP9fDQD/aQ4A/3EOAPV3EADmexEA 2X0YAM59KgLFezkGvndFDrd0UBWxcFkcrW1iIqhqaSelaHEsoWZ4L55kgDObYoc2mGGPOJZgmDuT X6E9kV6rP49euECNXshBi17hQYpf80CJX/8/iWD/Pohg/z6IYP89iGD/PYhg/z2IYP89/1cPAP9i DAD/bAwA+HQMAOl6DADefgwA0oEVAMiBJwHAfzYGuHxCDbJ4TRWsdVYbp3JfIqJvZieebG4sm2p1 MJdofDOUZ4Q2kWWMOY5klTyMY54+iWKoQIditUKFYsVChGLeQ4Nj8UKCY/1BgmT/QIJk/z+CZP8/ gmT/P4Jk/z+CZP8//1kOAP9kCwD/bgoA6ncIANt9CADUggoAzIQSAMOFJAG7gzQFs4BADK18SxSm eVQboXZcIZxzZCaYcWsrlG9yL5FteTOOa4E2i2qJOYhokjyFZ5s/gmamQYBmskN+ZsFEfWbZRHxn 70N8Z/xBfGj/QHxo/0B8aP8/fGj/P3xo/z98aP8//1sMAP9nCQD3cQcA3noFANSABwDOhQkAx4cR AL6IIgG2hzEEr4Q+C6iBSROifVIanHpaIJd3YSaTdWgrj3NvL4txdzOIb342hW6GOoJtjz1/a5k/ fGujQnlqsEN4ar9EdmrURXZr7UN2a/tCdmv/QXZs/0B2bP9Admz/QHZs/0B2bP9A/10KAP9pBwDs dAMA2nwEANCDBgDJiAcAw4oPALqLIAGyii8Eq4g8CqSFRxKdgVAZmH5YH5N8XyWOeWYqindtLoZ1 dDKCdHw2f3KEOXxxjT15cJZAdm+hQnRurkRybr1FcG7RRXBv60Rwb/pDcW//QXFv/0BxcP9AcXD/ QHFw/0BxcP9A/18IAP9rBADhdgAA1H8DAMuGBQDFiwYAvo0NALWPHgCuji0Dpow6CZ+JRRGZhk4Y k4NWHo6AXSSJfmQphXxrLYF6cjJ9eHk1eneCOXd2izxzdZU/cXSfQm5zrERsc7tFa3PORWtz6URr c/hDa3P/Qmxz/0Fsc/9AbHP/QGxz/0Bsc/9A/2EFAPpuAQDdeQAA0IICAMeJBADAjgQAuZEMALGS GwCpkisDopA4CJuNQw+UikwXjohUHYmFWyOEg2IogIFpLXx/cDF4fnc1dXx/OHF7iDxuepI/a3md QWh4qkNmeLhEZXjMRWV450RlePdDZnj/QmZ4/0FmeP9AZnj/QGZ4/0BmeP9A/2QDAO5xAADYfAAA y4UCAMOMAwC7kQMAs5QJAKyWGAClligCnZQ2B5aSQQ6Qj0oVio1SHISLWiJ/iWAne4dnLHeFbjBz g3U0b4J9N2yBhjtpf5A+Zn6bQWN+qENhfbZEYH3JRF995UNgffZCYH3/QWF9/0Bhff9AYX3/QGF9 /0Bhff9A/2cAAON0AADSfwAAx4gBAL6PAgC2lQEArpgGAKaaFQCfmiYCmJkzBpGXPwyLlUgUhZNQ Gn+RWCB6j18ldo1lKnKLbC5uinMyaoh7NmaHhDljho48YIWZP12EpkFbhLRCWoTHQ1qE40Jag/RB W4P/QFuD/0Bbg/8/W4P/P1uD/z9bg/8//2oAAN54AADNgwAAwowAALmTAACwmAAAp50CAKCfEgCZ nyMBk54xBYydPAuFm0YSf5lOGHqXVh51ll0jcJRjKGySaixokXEwZZB5NGGOgjdejYw6WoyXPViM pD9Wi7JAVIvFQFSL4UBUivM/VYr+P1WJ/z5Vif8+VYn/PlWJ/z5Vif8+728AANZ8AADIhwAAvZEA ALSYAACqnAAAoKIAAJmkEACTpSABjKQuA4WjOQl/okMPeaBMFnSfUxtvnVogapxhJWaaaCljmW8t X5h3MFuXgDRYloo3VZWVOVKVojtQlLA9T5TDPU+U3zxPk/I8T5L9PE+S/zxPkf88T5H/PE+R/zxP kf885HQAAM+BAADCjAAAuJYAAK2cAACjoQAAmKgAAJCqDQCLqxsAhasqAn6qNgZ4qUEMcqhJEm2n URhpplgcZKRfIWCjZiVdom0pWaF1LFahfi9ToIgyT5+TNU2foDdLnq84Sp7BOEme3ThJnfA4SZz8 OEmb/zlJm/85SZv/OUmb/zlJm/8523oAAMiHAAC8kgAAsZoAAKagAACcpgAAkawAAIexCACBshYA fLMmAXayMwRxsj0Ja7FHDmawTxNir1YYXq5dHFqtZCBXrGsjVKxzJlCrfClNqoYsSqqSL0ipnzBG qa0yRam/MkSq2jJEqO8yQ6f7M0Om/zNDpf80Q6X/NEOl/zRDpf800IEAAMGOAAC1mAAAqZ8AAJ6l AACTrAAAiLIAAHy5AgB2uhEAcrshAG67LgJouzoGZLpDCl+6TA5buVMSV7haFlS4YRlRt2kcTrdx H0u2eiJItoQlRbaQJ0O1nSlBtawqQLa+Kj+22Co/tO4qPrP6LD2y/y09sf8tPbH/LT2x/y09sf8t x4kAALmVAACsnQAAoaQAAJarAACKsgAAf7gAAHO/AwBqxAwAZ8UaAGPFKAFfxTUDW8U/BVfFSAlU xFAMUMRYD03EXxJKw2YVSMNuF0XDeBpCw4IcQMOOHj7DnB88w6sgO8O8ITrD1SE7wu4hOcD5Iji/ /yQ4v/8kOL//JDi//yQ4v/8kvZEAALCbAACkogAAmKoAAIyxAACAuQAAdb8AAGrGBABezAgAWc8S AFfQIQBV0C4BUdA5Ak7QQwRL0EwGSdBTCEbQWwtD0GMNQdBrDz7QdRE80YATOtGMFDjRmhY20akX NdG7FzTS0hc10OwWNM/3GDPO/xozzv8aM87/GjPO/xozzv8as5kAAKahAACaqQAAjrEAAIG5AAB1 wAAAascAAF7NAwBU1AgATN0NAErdGABI3iYARt4yAUTfPAJC30UDP99NBD3gVQU74F0GOeBmCDfg bwk14XoKM+GGDDHhlA0w4qMOLuKzDi7jxw4t4+MOLeDyDizf+w8s3/0QLN/9ECzf/RAs3/0QqKAA AJynAACPsAAAg7gAAHbBAABqyQAAXs8AAFPVAQBJ3AYARekPAELpGQBA6iQAPeouADrrNgE47D4B NuxGAjPtTQMx7VUDL+5dBC3uZQUr7nAFKe97BijviQcm8JcHJfCnCCTxuAgj8cwIIvLlCCLw8wgi 7/UIIu/1CCLv9Qgi7/UInqYAAJGvAACEuAAAd8EAAGrJAABd0AAAUdcAAEbdAAA/6gUAPPYOADn2 FwA29yAAM/coADH4MAAu+TYBK/k9ASn6RAEn+koCJftSAiP7WgIg/GMDHvxuAxz9ewMb/okEGf6Y BBj/qAQX/7cEFv/IBBb/4AQW/+QEFv/kBBb/5AQW/+QEk64AAIW3AAB4wAAAaskAAF3SAABQ2QAA RN8AADrkAAA19wMAMv8MAC7/EgAr/xoAKP8hACb/JwAj/y0AIP8zAB7/OQEc/z8BGf9FARf/TQEV /1UBE/9fARH/agIQ/3gCDv+HAg7/lgIN/6QCDP+wAgz/vgIM/8ICDP/CAgz/wgIM/8ICh7YAAHm/ AABryQAAXtMAAFDbAABD4AAAOOUAAC/wAAAr/wAAJ/8IACT/DgAh/xMAHv8ZABv/HgAY/yMAFf8o ABP/LQAR/zIAEP84AA7/PwAM/0YBCv9PAQf/WQEE/2UBAf9yAQD/gQEA/48BAP+bAQD/pwEA/6kB AP+pAQD/qQEA/6kB/ywvAf8wLAH/MiwC/zMwAv8xNgP/MEED/y9NBP8tWgb/K2YH/ylzCP8ofgr/ J4gL/yeRDP8nmQ3/Jp8N/yalDv8mqw7/JrEP/ya4D/8mwA//JskP/ybXD/8m5g//JvAP/ib5D/sn /w/5J/8P+Sb/Efgm/xH4Jv8S+Cb/Evgm/xL4Jv8S/y4sAf8zKQH/NSoC/zYtAv82NAL/NT8D/zNL BP8yVwb/MGQH/y5wCf8sewr/LIUM/yuODf8rlg7/Kp0P/yqjD/8qqRD/Kq8Q/ym2EP8pvRH/KccR /ynTEf4p4xH7Ku8R+Cr4EPYr/xD0Kv8S9Cr/E/Mq/xTzKf8U8yn/FPMp/xTzKf8U/zEpAf82JgH/ OSYB/zopAv87MgL/Oz0D/zlIBf83VAb/NWAH/zNsCf8ydwz/MIIN/zCLDv8vkw//L5oQ/y6gEf8u phH/LqwS/y6zEv4uuhL9LsQS+y7PE/gu4RL1Lu0S8S/3Eu8v/xPuLv8V7S7/Fuwu/xfsLv8X7C7/ F+wu/xfsLv8X/zQmAf85IwH/PSMB/z4mAv9BLwL/QTkD/z9FBP89UAb/O1wI/zloCv83cw3/Nn4O /zWHEP00jxH8NJYS+jOdE/kzoxP4M6kU9zOwFPYztxT0M8AU8zPMFPAz3hTtM+sU6TT2Fecz/xfm M/8Y5DL/GeQz/xrjMv8a4zL/GuMy/xrjMv8a/zgjAf89IAH/QR8B/0UjAf9HLAL/RzYD/0ZABP9E TAb/QVgI/z9kC/s+bw75PHkQ9juDEfQ6ixPzOZMU8TmZFPA4oBXuOKYW7TitFuw4tBbqOL0W6TjJ Fuc42xbjOeoW4Dj1GN04/xrbN/8c2Tf/Hdc3/x3WN/8e1jf/HtY3/x7WN/8e/zsgAf9BHAH/RRoB /0sgAf9NKAH/TjIC/008BP9KRwb6SFMI9kZfC/JEag7vQnQR7EF+E+pAhxToP44V5j6WFuU+nBfj PaMY4j2qGOA9shjfPbsZ3T3GGds92BrWPeka0j31Hc49/h/MPP8gyzz/Ick8/yHJPP8hyTz/Ick8 /yHJPP8h/z8cAf9FFwH/SxcB/1AdAf9TJAH/VC0C/1M3A/dRQgXxTk0I7ExaC+hKZQ/lSG8R4kd5 FN9FghbdRIoX2kORGdhCmRrVQp8b00GmHNFBrh3PQbcezkHBHsxB0B/JQuUfxULzIcJB/iPAQf8k vkH/JL1B/yW9Qf8lvUH/Jb1B/yW9Qf8l/0IYAf9JEwD/UBQA/1YZAP9ZIAH/WigB91oyAu9YPQTo VUkH41NVCt5RYA7ZTmoS1Ex0FtBLfBjOSYQbzEiMHMpHkx7IR5ofxkahIcRGqSLCRbEjwUW8I79F ySS9Rt8luUbvJrZG+ye0Rv8os0b/KLJG/yixRv8osUb/KLFG/yixRv8o/0YVAP9NEQD/VRIA/1sW AP9eGwD5YCMB72AsAeZeNgPfXEQF2FlQCtFXWw/MVGUUyFJuGMVQdxvDT38dwE6GH75NjiG8TJUj ukucJLhKpCa2SqwntEq2KLNJwymxSdYprkrqKqtK+CupSv8rqEv/K6dL/yunS/8rp0v/K6dL/yun S/8r/0kSAP9QDgD/WRAA/18SAP9jFgDyZR0A52UlAN5kMQHUYj8FzWBLCsddVg/CWmAVvlhpGbtW cRy4VHkftlOBIrNSiCSxUJAmr1CXKK1PnymrTqgrqU6yLKdOvi2mTs4uo07mLqFP9S6fT/8unk// Lp1P/y6dUP8unVD/Lp1Q/y6dUP8u/0wQAP9UDQD/XQ4A/2MPAPlnEQDraRUA32ocANNqLAHLaDsE xWVHCb9iUg+6YFwVtl1lGbJbbR2vWXUhrFh8I6pWgyanVYsopVSTKqNTmyyhU6Mun1KtL51SuTCb UskxmVLiMZdT8jGWU/8xlVT/MZRU/zCUVP8wlFT/MJRU/zCUVP8w/08OAP9YCwD/YAsA+2YMAPBr DQDkbQ4A1m4WAMxvKAHEbTcEvWtECbdoTw+yZVgVrmJhGqpgaR6nXnAhpF14JaFbfyefWocqnFmO LJpYly6YV6AwlVaqMpNWtTORVsU0kFbdNI5X8DSNV/0zjFj/M4xY/zKMWP8xjFj/MYxY/zGMWP8x /1EMAP9bCQD/YwgA62oHAN1uCADYcQoAz3ITAMZzJQG+cjQDt3BBCLFtTA6salUUp2deGaNlZR6g Y20inGF0JZpgeyiXXoMrlF2LLZJckzCPW5wyjVqmNItasjWJWsE2h1rWNoZb7TaFW/s1hVz/NIRc /zOEXP8zhFz/M4Rc/zOEXP8z/1MKAP9dBgD1ZgQA320DANVyBgDQdQkAyXYRAMB3IgC4djEDsXQ+ B6txSQ6mblIUoWxbGZ1pYh2ZZ2oilmZxJZNkeCiQY38rjWGHLopgkDCIX5kzhV+jNYNerzaBXr44 gF7ROH9f6jd+X/o2fmD/NX5g/zR+YP80fmD/NH5g/zR+YP80/1UIAP9gBADoaQAA2nADANB1BQDK eAcAw3oPALt7HwCzei8CrHg8B6Z1Rg2hc1ATnHBYGJduYB2Ta2chkGpuJY1odSiKZ3wrh2aELoRk jTGBY5Y0f2OhNnxirTd6Yrs5eWLOOXhj6Dh4Y/g3eGT/Nnhk/zV4ZP81eGT/NXhk/zV4ZP81/1cF AP9iAQDhbAAA1HMCAMt4BADFewUAvn0NALZ+HQCvfiwCqHw5BqF5RAycd04Sl3RWGJJyXRyOcGQg im5rJIdsciiEa3orgWqCLn5pijF7aJQ0eGefNnZmqjh0Zrk5c2bLOnJm5jlyZ/c4cmf/N3Jo/zZy aP81cmj/NXJo/zVyaP81/1kCAPZlAADdbgAAz3YBAMd7AwDAfwQAuYAMALGCGgCqgioCo4A3BZ19 QguXe0sRknhUF412WxuJdGIghXJpJIFxcCd+b3cre25/LnhtiDF2bJI0c2ucNnBqqDhuarc6bWrJ Omxq5Dpta/U4bWv/N21r/zZta/82bWv/Nm1r/zZta/82/1sAAOtnAADZcQAAzHkAAMN+AgC7ggMA tIQJAK2FGACmhSgBn4Q1BZmCQAqTf0kQjX1SFol7WRuEeWAfgHdnI3x1bid5dHUqdnN9LnNyhjFw cZA0bXCbNmtvpzhpb7U6aG/HOmdv4jpnb/Q4aG//N2hv/zZob/82aG//Nmhv/zZob/82/14AAORq AADTdAAAyHwAAL+BAQC3hQEAr4cHAKiJFQChiSUBm4gzBJSGPgmOhEcPiYFQFYR/Vxp/fl4ee3xl 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 ABr/BQAX/wwAFf8QABL/FAAQ/xkADv8eAA3/IwAL/ygACP8uAAb/NQAD/z0AAP9GAAD/UQAA/10A AP9rAAD/ewAA/4sAAP+ZAAD/pQAA/6wAAP+sAAD/rAAA/6wA/ycsAf8qKgH/KyoB/youAf8mNAL/ JT8C/yNLA/8hWAP/IGQE/x5wBP8dewT/HYUF/x2OBf8dlgX/HZwG/x2iBv8cqAb/HK4H/xy0B/8c uwf/HMMH/xzOB/8d3wf/HesH/B31B/kd/gb3Hv8H9x3/CPYd/wn2Hf8J9h3/CfYd/wn2Hf8J/ykq Af8sJwH/LicB/y0qAf8sMgH/Kz0C/ylJA/8nVQP/JWEE/yNtBP8ieAX/IoIF/yGLBv8hkwb/IZoH /yGgB/8hpQf/IasI/yGxCP8huAj/IcEI/yHLCPwh3Aj5IekI9iH0CPMi/QfyIv8J8SL/CvEh/wvw If8L8CH/C/Ah/wvwIf8L/ywmAf8wJAH/MSMB/zEmAf8yLwH/MToC/y9GA/8tUgP/K14E/ylpBf8o dQX/J38G/yeIB/8mkAf/JpYI/yadCP4mown9JqkJ/CavCfsmtgn6Jr4J+CbICfYm2QnyJugJ7yfz Ce0n/QrrJv8L6ib/Dekm/w3oJv8O6Cb/Dugm/w7oJv8O/y8jAf8zIAH/NR8B/zcjAf84LAH/ODcC /zZCAv80TgP/MloE/zBlBf8ucAb+LXsH/C2ECPosjAn4LJMJ9yyZCvYroAr0K6YK8yusC/Irswvx K7sL7yvGC+4s1AvqLOYL5izyC+Qs/A3iLP8P4Sz/EOAs/xDfLP8R3yz/Ed8s/xHfLP8R/zMfAf83 GwH/OhoB/z0gAf8/KAH/PzIB/z0+Av87SQP/OVUE+zdhBvc1bAf1NHYI8jN/CfAyhwrvMo8L7TKW C+wxnAzqMaIM6TGpDOgxsA3mMbkN5THDDeMy0Q3fMuUM3DLxD9gx/BHVMf8S0jH/E9Ex/xTQMf8U 0DH/FNAx/xTQMf8U/zcbAf87FwD/PxYA/0McAP9GJAH/Ri4B/0Q5AvxCRAP2P1AE8T1cBu08Zwfq O3EJ6Dp6CuU5gwvjOIsM4jiSDeA3mQ3fN58O3TemDts3rQ/ZNrYQ1zbBENU2zhDRN+MRzTfxE8o3 +xXIN/8Wxjf/F8U3/xjEN/8YxDf/GMQ3/xjEN/8Y/zsXAP9AEwD/RRMA/0kYAP9MIAD/TCkB+ksz AfJIPgLsRkoE50RWBuNDYgjfQWwK3EB1DNk/fg3VPoYP0z2NENE9lBHPPJsSzTyiE8w8qRTKO7EU yDu7Fcc7yBbFPNwWwTztF748+Rm7PP8aujz/G7k8/xu4PP8buDz/G7g8/xu4PP8b/z4UAP9EEAD/ ShEA/08UAP9RGwD7UiMA8VEtAelPOAHiTUUD3EtRBdZJXAjRR2YLzkZwDstFeBDIRIASxkOHFMRC jhXDQpUWwUGcF79BpBi9QKwZvEC2GrpAwhq4QNIbtUHoG7JB9h2wQf8erkH/Hq1B/x6sQf8erEH/ HqxB/x6sQf8e/0IRAP9HDQD/Tw4A/1MRAP9WFQDzVxwA6FYlAOBVMQHXUz8Cz1JMBcpQVwnGTmEN w0xqEMBKchK9SXoVu0iCFrlHiRi3R5AZtUaXG7NGnxyxRacdsEWxHq5FvB+sRcwfqkXjIKdG8yGl Rv8ho0b/IqJG/yGiRv8hokb/IaJG/yGiRv8h/0UOAP9LCgD/UwwA/1cNAPlaEADrWxQA31ocANRa KwDMWjsCxlhIBcFWUwm8VFwNuVJlEbVQbRSzT3UXsE58Ga5NhBqsTIscqkuSHqhKmh+mSqMhpEms IqNJuCOhScYkn0reJJ1K8CSbSv0lmUv/JJlL/ySYS/8kmEv/JJhL/ySYS/8k/0gMAP9PCAD/VggA 9VsJAOleCgDkXg0A1V8VAMtgJwDEXzYCvl5DBbhbTgm0WVgOsFdhEqxVaRWqVHAYp1N4GqVSfxyi UYYeoFCOIJ5PliKcTp8jmk6oJZhOsyaXTsInlU7WJ5NO7CeRT/snkE//J5BQ/yaPUP8mj1D/Jo9Q /yaPUP8m/0oJAP9TBQD4WgQA4l8DANpiBgDUYwkAzWMSAMRlIwC8ZTICtmNABbFhSwmsXlQOqFxd EqVbZRahWWwYn1hzG5xWeh6aVYIgmFSKIpVUkiSTU5smkVKlJ49SsCmNUr4qjFLQKopT6SqJU/kp iFT/KYdU/yiHVP8oh1T/KIdU/yiHVP8o/0wFAP9WAQDpXQAA3GMCANFnBQDMaAcAxmgQAL1qIAC2 aS8BsGg8BKplRwmlY1ENoWFaEp1fYRaaXmkZl1xwHJVbdx6SWn4hkFmGI41YjiWLV5cniVehKYZW rSuFVrosg1bMLIJX5iyBV/crgFj/KoBY/yqAWP8pgFj/KYBY/ymAWP8p/08CAP1ZAADiYAAA1WcA AMxqAwDGbAUAwGwOALdtHQCwbiwBqmw5BKVqRAigaE4Nm2ZXEZdkXhWUYmUZkWBsHI5fcx6LXnsh iV2CJIZciyaEW5QogVueKn9aqix9WrctfFrJLnpa4y56W/Utelz/LHlc/yt6XP8qelz/Knpc/yp6 XP8q/1EAAPJbAADeZAAAz2oAAMduAgDAcAQAunAMALJxGgCrcSkBpXA3A59uQgeabEsMlmpUEZJo XBWOZmMYi2VpG4hjcB6FYnghgmF/JIBgiCZ9X5Epe1+cK3hepy12XrUudV7GL3Re4S90X/MudF// LHRg/yt0YP8rdGD/K3Rg/yt0YP8r/1MAAOheAADZZwAAy20AAMNxAQC7cwIAtXMJAK11FwCndScB oXQ0A5tyPweVcEkLkW5SEIxsWRSJamAYhWlnG4Jobh5/ZnUhfWV9JHpkhSZ3ZI8pdWOaK3JipS1w YrMvb2LEL25i3i9uY/IubmP+LW5j/yxuY/8rbmP/K25j/ytuY/8r/1UAAOVgAADTaQAAyHAAAL90 AAC3dwEAsHcHAKh4FQCieSQAnHgyApZ2PQaRdEcLjHJPD4hwVxOEb14XgG1kGn1sax16a3Mgd2p6 I3RpgyZyaI0pb2eXLG1noy5rZrEvaWbBMGlm2zBpZ/AvaWf9LWln/yxqZ/8ramf/K2pn/ytqZ/8r /lgAAOFjAADPbAAAxHMAALt4AACzegAAq3oEAKR7EgCefCIAmHwvApJ6OwWMeEUKh3dNDoN1VRJ/ c1wWe3JiGnhwaR11b3Agcm54I29tgSZtbIspamyWK2hroS5ma68vZGq/MGNr2DBja+8vZGv8LWRr /y1la/8sZWv/LGVr/yxla/8s9FsAAN1mAADLbwAAwHYAALd7AACvfgAApn4BAJ9/EACZgB8Ak4At Ao1/OQWIfUMJg3tLDX56UxJ6eFoWdndhGXN1ZxxwdG4fbXN2ImpyfyZocYkoZXCUK2JwoC1gb60v X2+9L15v1C9eb+0vX2/7LV9v/yxgb/8sYG//LGBv/yxgb/8s614AANhpAADHcgAAvHkAALN/AACr ggAAoYIAAJmDDgCUhB0AjoQrAYiDNgSDgkAIfoBJDHl/URB1fVgUcnxfGG57ZRtremweaHl0ImV4 fSVid4cnYHaSKl11nixbdasuWnS7L1l10S9ZdOwuWXT6LVp0/yxadP8rWnT/K1p0/ytadP8r5mEA ANFtAADDdgAAuX0AAK+DAACmhgAAnIYAAJSIDACOiRkAiYkoAYOJNAN+hz4HeYZHC3SFTw9whFYT bYJdF2mBYxpmgGodY39yIGB+eiNdfYQmWnyPKVh7nCtWe6ksVHu5LVN7zi1UeuotVHr5LFR5/ytV ef8qVXn/KlV5/ypVef8q4WUAAMxxAAC/egAAtIIAAKuHAAChigAAlYsAAI2NCQCHjhYAgo8kAX2P MQJ4jjsFc41ECW+MTA1rilQRZ4laFWSIYRhhh2gbXoZwHluFeCFYhIIkVYSNJlKDmilQgqcqT4K3 K06CzCtOgugrToH4Kk+A/ypPgP8pT4D/KU+A/ylPgP8p22oAAMd1AAC6fwAAsIcAAKaMAACcjwAA j5EAAIaTBQCAlBIAe5UhAHeVLQFylTgEbZRCB2mTSgtlklEOYpFYEl6QXxVbj2YYWI5tG1WOdh5S jYAhT4yLI02LmCVLi6UnSYu1KEiLyihIiucnSYn3KEmI/ydJh/8nSYf/J0mH/ydJh/8n0W8AAMF7 AAC1hAAAq4wAAKCQAACVlAAAiZcAAH6aAAB3mw4Ac5wcAG+dKQFrnDUCZpw/BWKbRwhfmk8LXJpW D1iZXBJVmGMVU5hrF1CXcxpNln0dSpWJH0eVlSFFlaQjRJSzI0OUyCNDlOUjQ5L1JEOR/yRDkP8k Q5D/JEOQ/yRDkP8kynUAALuBAACwiwAApJEAAJqVAACPmQAAg50AAHSiAABuowsAaqQXAGalJQBj pTEBX6Q7A1ukRAVYpEsIVaNTC1KjWg1PomEQTaJoE0qhcRVHoHsYRKCGGkKfkxxAn6IdPp+yHj2f xh49n+MdPZ30Hj2c/x88m/8fPJv/IDyb/yA8m/8gwnwAALWIAACpkAAAnpYAAJObAACHnwAAe6QA AG+oAABjrAQAX60RAFytHwBarisAV642AVSuQANRrUgFTq1PB0utVwlJrV4LRqxmDUSsbg9BrHgR P6uEEzyrkRU6q6AWOauwFzirwxc4quEXN6nzGDen/hk2pv8aNqb/Gjam/xo2pv8auoQAAK6PAACi lgAAl5sAAIuhAAB/pgAAc6sAAGevAABatAAAU7YMAFG3FwBPtyQATbgwAEq4OgFIuEMCRrhLA0S4 UgRBuFoGP7hiBz24awk6uHULOLeBDDa3jg40t50PM7etDzK3wQ8xt94PMbbyEDC0/BEws/8SMLP/ EzCz/xMws/8Tso4AAKWVAACamwAAjqIAAIKoAAB1rQAAabMAAF63AABTuwAAR8AFAEPCEABCwhsA QMMnAD/DMgA+xDwAPMREATrETQE4xFUCNsRdAzXEZgQzxXAEMcV8Bi/FigYtxZoHK8WqCCrFvggq xdoIKsTwCCnC+wkowf8KKMH/CyjB/wsowf8LqJUAAJ2bAACRogAAhKkAAHivAABrtQAAX7sAAFS/ AABJwwAAP8gEADbNCQAzzhEAMs8cADHPJwAw0DEAL9A6AC7RQwAt0UwAK9JVACrSXwEo02kBJ9N2 ASXThAIk1JQCItSmAiHVuQIh1dICINPrAiDS9gMf0f8EH9H/BB/R/wQf0f8En5sAAJSiAACHqQAA ebEAAG24AABgvgAAVMMAAEnHAAA+ywAANdABAC3VBgAl2wsAJN4SACPeHAAi3yUAIeAuACDgNwAf 4UAAHuFKAB3iUwAc414AG+NqABrkeAAY5IgBF+WaARbmrAEV5sABFOfdARPl7wET4/oBE+P6ARPj +gET4/oBlqIAAImpAAB7sQAAbrkAAGHAAABUxgAASMoAAD3PAAAz0wAAKtkAACLeAgAe6woAHOwQ ABvtFwAZ7R8AF+4mABXuLQAU7zUAE/A9ABHwRgAQ8VAAD/JbAA7yaQAN83gADPSKAAv1nAAK9a4A CfbCAAn22QAI9e0ACPXtAAj17QAI9e0Ai6kAAH2yAABvugAAYsIAAFXJAABHzgAAO9IAADHYAAAn 3QAAH+EAABnoAAAW+AYAFPoNABL7EgAQ/BcADvwdAA39IwAM/SkACv4wAAj/OAAG/0EAA/9MAAD/ WAAA/2YAAP93AAD/iQAA/5sAAP+rAAD/uwAA/84AAP/PAAD/zwAA/88Af7IAAHG6AABjwwAAVssA AEjRAAA61gAAL90AACXhAAAc5QAAFOkAABH3AAAP/wEADf8JAAv/DQAI/xAABv8UAAP/GAAA/x4A AP8jAAD/KgAA/zIAAP88AAD/RwAA/1QAAP9jAAD/cwAA/4UAAP+XAAD/pAAA/7IAAP+yAAD/sgAA /7IA/yIpAf8jJwH/IygB/yArAf8cMQH/Gj0B/xhJAf8WVgL/FGIC/xNuAv8SeAL/EoIC/xKLAv8S kgL/EpkC/xKeAv8SpAL/EqkC/xKvAv8StgL/Er0C/xLHAv8S1AL9EuUC+hLxAvcS+gL1E/8C9BP/ A/QT/wP0E/8D9BP/A/QT/wP0E/8D/yQnAf8mJAH/JiQB/yQnAf8iLwH/IDoB/x5GAf8cUwL/Gl8C /xhqAv8XdQL/F38C/xeIAv8XjwL/F5YC/xecAv8XoQL/F6cC/xetAv8XswP+F7sD/RfFA/oX0QP3 F+QC9BfvAvEY+gLvGP8D7hj/BO4Y/wTtGP8F7Rj/Be0Y/wXtGP8F/ycjAf8pIAD/KSAA/ygjAP8p LQH/JzcB/yVDAf8jTwL/IVsC/x9mAv8dcQL/HXsD/x2EA/8djAP+HZMD/ByZA/scnwP6HKQD+Ryq A/ccsQP2HLkD9R3CA/MdzgPwHeED7B3uA+ke+QToHv8F5h7/BuUe/wblHv8H5R7/B+Ue/wflHv8H /ysfAP8tHAD/LRsA/y4gAP8vKQD/LzQB/yw/Af8qSwL/KFcC/yZiAv0lbQP6JHcD+COAA/YjiAP1 I48D8yOVBPIjmwTxI6EE7yOoBO4jrgTtI7YE6yO/BOojzATnI+AE4yTtBOAk+QbeJP8H3CT/CNsk /wnaJP8J2iT/Cdok/wnaJP8J/y4bAP8xFwD/MhYA/zUcAP82JQD/Ni8B/zQ6Af8xRgH7L1IC9y1d AvMsaAPwK3ID7ip7BOwqhATqKosE6CqSBecpmAXmKZ4F5CmlBeMprAXhKbQF4Cq9Bd4qygXbKt4F 1irtB9Iq+AnPK/8KzSr/C8wq/wzLKv8Myyr/DMsq/wzLKv8M/zIXAP81EgD/OBIA/zsYAP89IAD/ PCoA/js1Afc5QQHxNk0C7DRYAugzYwPlMm0E4zJ2BOAxfwXeMYcF3DCOBtowlQbYMJsH1i+iB9Qv qQjSL7EI0C+6Cc8wxgnNMNgJyTHqCsYx9wzDMf8OwTH/D8Ax/w+/Mf8PvzH/EL8x/xC/Mf8Q/zYT AP85DwD/PhAA/0EUAP9DGgD/QiMA9UEuAO0+OgHnPUYB4TxTAt06XgPZOWgE1DhxBtE4egfPN4EI zTeICcs2jwrKNpYKyDadC8Y1pAzFNawMwzW1DcE1wA3ANs8OvTbmDrk29BC3Nv8RtTb/ErQ2/xOz Nv8Tszb/E7M2/xOzNv8T/zkQAP89CwD/Qw0A/0cQAP9IFAD1RxwA60YmAONEMgDcREEB1ENNAs9B WATLQGIGyD9rCMU+dAnDPXsLwT2DDL88ig29PJAOuzyXD7o7nxC4O6cQtjuwEbU7uxKzO8kSsTvg E6488RSrPP0VqTz/Fqg8/xaoPP8Wpzz/Fqc8/xanPP8W/z0NAP9CCAD/SAoA/0sMAPpMDwDsTBQA 4UodANZKLADOSzsByUpIAsRIUwTAR10HvEZmCbpEbgu3Q3YNtUN9DrNChBCxQYsRsEGSEq5AmhOs QKIUqkCrFalAthanQMQXpkDZF6NB7RigQfsYn0H/GZ5B/xmdQf8ZnUL/GJ1C/xidQv8Y/0AJAP9G BQD/TAUA8U8HAOZQCQDjTw0A1U8VAMxRJwDFUTYBv1BDArpPTgW2TVgIs0xhCrBKaQ2tSXAPq0h4 EalHfxKnR4YUpUaNFaNGlRahRZ4Yn0WnGZ5FshqcRb8amkXRG5hF6RuWRvgclUb/G5RG/xuTRv8b k0f/G5NH/xuTR/8b/0IFAP9KAQDyUAAA4VQBANlWBQDTVQkAzFUSAMNWIgC8VzIBt1Y/ArJUSgWt U1QIqlFdC6dQZA6kTmwQok1zEp9MehSdTIEWm0uJF5lKkRmXSpkalUmjG5NJrh2SSbsekEnMHo5K 5R6NSvYei0v/HotL/x2KS/8dikv/HYpL/x2KS/8d/0UAAP9NAADlVAAA2VkAAM9bAwDKWwYAxFoP ALtbHgC1XC4Br1s7AqpaRgWmWFAIolZZC59VYA6cU2gRmVJvE5dRdhWVUH0Xk1CEGZBPjRqOTpYc jE6fHopOqh+ITrcgh07IIYVO4iGET/Mgg0//IINP/x+CUP8fglD/HoJQ/x6CUP8e/0cAAPNRAADf WAAA0V0AAMlgAgDDYAQAvV4NALVgGgCuYSoAqWA3AqReQwSfXU0Im1tVC5hZXQ6VWGQRkldrE49W chaNVXkYi1SBGohTiRyGU5IehFKcH4JSpyGAUrQif1LEI31S3iN8U/EifFP+IXtU/yF7VP8ge1T/ IHtU/yB7VP8g/0oAAOlUAADaXAAAzGEAAMNkAAC8ZAIAtmMKAK9kFwCpZScAo2Q0Ap5jQASZYUoH lV9SC5FeWg6OXWERi1toE4labxaGWXYYhFh9GoFYhhx/V48efVaZIHtWpCJ5VrEjd1bBJHZW2iR1 V+8kdVf9I3VY/yJ1WP8hdVj/IXVY/yF1WP8h/00AAOVXAADTXwAAyGQAAL9nAAC3aAAAsWcHAKlo FACjaSQAnmgyAZlnPQSUZUcHkGRPCoxiVw2IYV4QhV9lE4NebBaAXXMYfV16Gntcgx15W4wfdluX IXRaoiNyWq8kcVq/JXBa1SVvW+0lb1v8I29b/yJvW/8ib1v/IW9b/yFvW/8h+k8AAOFaAADPYgAA xGcAALtrAACzbAAArGoEAKRrEgCebCEAmWwvAZRrOgOPaUQGimhNCYZmVQ2DZVwQgGRiE31iaRV6 YnAYeGF4GnVggB1zX4ofcF+UIW5eoCNsXq0la168Jmpe0SZpXuwlal/7JGpf/yNqX/8ial//Impf /yJqX/8i8FIAAN1dAADLZQAAwGsAALduAACvbwAAp24BAKBvEACacB8AlHAsAY9vOAOKbUIGhmxL CYJqUgx+aVkPe2hgEndmZhR1Zm4XcmV1GnBkfh1tY4gfa2OSImliniRnYqslZWK6JmRizyZkYuom ZWL6JGVj/yNlY/8iZWP/ImVj/yJlY/8i61UAANhgAADIaAAAvG4AALNxAACrcwAAonEAAJtyDgCV cxwAkHQqAYpzNgKFckAFgXBICH1vUAt5bVcOdmxeEXNrZBRwamwXbWlzGmtpfBxoaIYfZmeQIWRn nCNiZqklYGa5Jl9mzSZfZugmYGb5JGBm/yNgZv8jYWb/ImFm/yJhZv8i6FgAANNjAADEawAAuXEA ALB1AACndwAAnnUAAJZ2DQCQdxkAi3gnAIZ3MwKBdj0EfHVGB3hzTgt1clUOcXFcEW5wYxRrb2oW aW5xGWZuehxjbYMeYWyOIV9rmiNda6clW2u3JlpryiZaa+clW2v3JFtq/yNcav8iXGr/Ilxq/yJc av8i41sAAM5mAADAbgAAtnQAAKx5AACjewAAmHkAAJB6CwCKexYAhXwkAIF8MQF8ezsEd3pEBnN5 TApweFMNbHdaEGl2YRNndWgWZHRvGGFzeBtecoEdXHGMIFpxmCJYcKYkVnC1JVVwyCVVcOUlVXD2 JFZv/yNWb/8iV2//Ildv/yJXb/8i318AAMppAAC8cgAAsngAAKl9AACffwAAkn4AAIp/BwCEgBMA gIEhAHuBLgF3gDkDcoBCBW5/SghrflELaH1YDmR8XxFie2YUX3ptF1x5dRlZeH8cV3iKHlR3liFS dqQiUXazI1B2xiRQduMjUHX1I1F1/yJRdP8hUXT/IVF0/yFRdP8h2GMAAMVtAAC4dgAArn0AAKWC AACagwAAjYMAAISEAwB9hRAAeYYeAHWHKwFxhzYCbYY/BGmFRwdlhE8KYoNWDV+DXA9cgmMSWoFr FVeAcxhUf30aUX+IHE9+lB9NfqIgS32xIUp9xCJKfeEhS3z0IUt7/yBLe/8gS3v/IEt7/yBLe/8g 0GcAAMByAAC0ewAAqoIAAKCGAACViAAAh4gAAHyKAAB2jA4Aco0aAG6OJwBqjjIBZo08A2ONRAVg jEwIXItTClqLWg1XimEQVIloElGIcRVPiHoXTIeFGkqGkhxIhqAdRoavHkWFwh5Fhd8eRYTyHkWD /h5Fgv8eRYL/HkWC/x5Fgv8eym0AALp4AACvgQAApYcAAJqLAACPjQAAgY4AAHSRAABukwoAaZQV AGaVIgBjlS4BYJU4AlyVQQRZlEkGVpRQCFSTVwpRk14MTpJmD0ySbhFJkXgURpCDFkSQkBhCj54Z QI+tGj+PwBo/j9waP43xGj+M/Rs/i/8bP4v/Gz+L/xs/i/8bwnMAALV+AACqhwAAn4wAAJSQAACI kwAAe5UAAGyZAABlmwQAYJwQAF2dHQBbnikAWJ40AVWePQJSnUUDUJ1NBU2dVAdLnFsJSJxjC0ac aw1Dm3UPQZuAET6ajRM8mpsUOpqrFTmavRU5mtkVOZjvFjmX/BY4lv8XOJX/FziV/xc4lf8Xu3oA AK+FAACkjAAAmJEAAI2VAACBmgAAdZ0AAGigAABbpAAAVqUMAFOmFwBRpyMAT6cvAEynOAFKp0EB SKdJAkanUARDp1gFQadfBj+maAg9pnIKOqZ9Czimig02pZkONKWpDzOluw8zpdQPM6TuDzKi+xAy of8RMqH/ETKh/xEyof8RtIIAAKiMAACdkgAAkpcAAIacAAB5oQAAbaUAAGGpAABVrAAAS68FAEew EABFsBwARLEnAEKxMgBBsjsAP7JDAT2ySwE7slMCObJbAzeyZAQ1sm4FM7J5BjGyhwcvsZYILrKm CC2yuAksstAILLDsCSuv+Qorrv8LKq3/Cyqt/wsqrf8LrYsAAKCSAACVmAAAiZ0AAH2jAABxqAAA ZK0AAFmxAABNtAAAQrgAADu6CgA4uxMAN7weADW8KQA0vTIAM707ADK9RAAxvkwAL75VAS6+XgEs vmgBKr50Aim+ggInv5EDJr+iAyS/tAMjv8sDI77oAyO89wQiu/8FIrv/BSK7/wUiu/8FpJIAAJiY AACMngAAgKUAAHOrAABnsAAAW7UAAE+5AABEvAAAOsAAADDEBAAqxwsAKMgTACfJHQAmyScAJckw ACTKOQAjykIAIstLACHLVQAgzF8AH8xsAB3NegAczYoAG82cABnOrgEYzsUAGM3kABjM9AEYyvwB GMr/AhjK/wIYyv8Cm5kAAI+fAACCpgAAda0AAGizAABcuQAAUL0AAETBAAA5xAAAMMgAACjMAQAg 0AYAGdULABbXEAAV2BkAFdkiABTZKwAT2jQAE9o9ABLbSAAR3FMAEd1fABDdbQAQ3n4ADt+RAA7g pAAN4LgADODSAAvf7QAM3vcADN37AAzd+wAM3fsAkp8AAIWnAAB3rgAAarUAAF28AABQwQAARMUA ADjJAAAuzQAAJdEAAB7VAAAW2gEAEd4GABDnDQAO5xIADegZAAzoIQAL6SkACuoxAAnqOwAH60UA BetRAATrXgAD624AAeuAAADqlAAA6qcAAOu8AADr0gAA6+kAAOzvAADs7wAA7O8Ah6cAAHmvAABr twAAXr4AAFHFAABDyQAAN80AAC3RAAAj1gAAG9sAABPfAAAO4wAADO4CAAr2CgAH9g4ABfYSAAP2 GAAA9R4AAPUlAAD1LgAA9TcAAPZCAAD2TgAA9l0AAPZuAAD2gQAA9pUAAPenAAD3twAA+McAAPjQ AAD40AAA+NAAe68AAG24AABgwAAAUsgAAETNAAA30QAAK9cAACHcAAAY4AAAEeQAAAznAAAH7wAA BPoAAAH/AwAA/wgAAP8NAAD+EAAA/hQAAP8aAAD/IQAA/ykAAP8zAAD/PgAA/0sAAP9bAAD/bAAA /4AAAP+SAAD/oQAA/60AAP+zAAD/swAA/7MA/xwmAP8cJAD/GiUA/xUnAP8RLgD/EDoA/w5HAf8N UwH/C18B/wprAf8KdQH/Cn8B/wqHAf8KjgH/CpUB/wqbAf8JoAH/CaUA/wmrAP8JsQD/CbgA/wnB AP4JzAD8Cd4A+QnrAPUJ9gDzCf8A8gr/APEK/wHxC/8B8Qv/AfEL/wHxC/8B/x8jAP8fIQD/HiEA /xkkAP8XLAD/FTcA/xNEAP8RUAH/EFwB/w5nAf8OcgH/DnsB/w6EAf8OiwH/DpIB/w6YAf8OnQH/ DqMB/g6oAfwOrgH7DrUA+g6+APgOyQD1DtsA8g7qAO4O9QDsDv8B6w//AeoP/wHqEP8B6RD/AekQ /wHpEP8B/yIfAP8iHAD/IRwA/x8gAP8fKQD/HDQA/xpAAP8XTAH/FVgB/xRjAf8TbgH/E3cB/hOA AfwTiAH6Eo4B+RKVAfgSmgH2EqAB9RKmAfQSrAHzErMB8RK8AfASxwHtEtgB6RPoAeYT9QHkFP8B 4hT/AuEV/wLhFf8C4BX/AuAV/wLgFf8C/yUbAP8mFwD/JBYA/yUcAP8mJQD/JDAA/yE7AP8fSAD/ HVQB/RtfAfkaaQH3GnMB9Bl8AfIZhAHxGYsB7xmRAe4ZlwHsGZ0B6xmjAekZqgHoGbEB5xm6AeUZ xQHjGdUB3xroAdwb9QLYG/8C1Rz/A9Qc/wPTHP8E0hz/BNIc/wTSHP8E/ykXAP8qEwD/KRIA/ywY AP8sIQD/LCsA/yk3AP0nQwD3JU8B8yNaAe8iZAHsIW4B6SF3AechfwHlIYYB5CGNAeIglAHhIJoB 3yCgAd4gpwHcIa8B2iG4AtghwwLVIdMC0SLnAs0i9APKI/8EyCP/Bccj/wbGI/8GxiP/BsYj/wbG I/8G/ywSAP8uDwD/MBAA/zMUAP8zGwD/MiUA+jAwAPIuPADsLEkA5ypVAeMqXwHgKWkB3SlyAdoo egHXKIIC1SiJAtMokALRKJYDzyicA84oowPMKKsDyiizA8kovgTHKMwExSniBMEq8Qa+Kv4HvCr/ CLoq/wi6Kv8IuSr/Cbkq/wm5Kv8J/zAPAP8yCwD/Ng0A/zgQAP85FQD5Nx4A7zUoAOczNQDgMkIA 2zJPANUxWgHQMWQCzTBtAsswdQPJMHwDxy+DBMUvigTEL5EFwi+XBcEvnga/L6YGvS+vBrwvuQe6 L8cHuDDdB7Uw7gmyMPsKsDD/C64w/wuuMP8LrTD/C60w/wutMP8L/zMMAP82BgD/PAkA/z4MAP09 EADvPBUA5DkfANs5LQDSOjwAzTpJAcg5VAHEOV4CwThnA783bwS9N3YFuzZ9Brk2hAe3NosHtjWS CLQ1mgmzNaEJsTWqCq81tAuuNcELrDXUC6k26gymNvgNpTb/DqM3/w6iN/8Oojf/DqI3/w6iN/8O /zcHAP87AgD/QAMA8kIFAOlCCQDlPw4A2D4WAM5AJwDHQTYAwkFEAb1BTwK5QFkDtj9hBLQ+aQax PXEHrz14CK48fwmsPIYKqjuNC6k7lQynO50NpTumDaM6sA6iO7wPoDvND5475hCbPPURmjz/EZk8 /xGYPP8RmDz/EZg8/xGYPP8R/zoBAP9AAADvRQAA4UgAANlIBQDTRgkAzEUSAMRHIgC9SDEAuEg/ AbNHSgKwRlQErEVdBapEZAenQ2wIpUJzCqNCeguhQYEMoEGIDZ5AkA+cQJgQmkChEZhArBKXQLgS lUDIE5NA4RORQfMUkEH/FI9B/xSOQv8TjkL/E45C/xOOQv8T/zwAAPlEAADkSgAA2E4AAM5PAgDJ TQYAw0sPALtNHQC1Ti0Ar046AatNRgKnTE8EpEtYBqFKYAieSWcJnEhuC5pHdQ2YRnwOlkaDD5RF ixGSRZQSkEWdE45FqBSMRbQVi0XEFopF3BaIRvAWhkb9FoZG/xaFR/8VhUf/FYVH/xWFR/8V/z8A AOxIAADdTwAAz1MAAMZVAADAUwMAu1EMALNSGQCtUykAqFM2AaNSQgKfUUsEnFBUBplPXAiWTmMK lE1qDJFMcQ6PS3gPjUt/EYtKhxKJSpAUh0maFYVJpReDSbEYgknAGIFK1hl/Su0Yfkv8GH5L/xd9 S/8XfUv/Fn1L/xZ9S/8W/0MAAOZMAADWUwAAyVgAAMBZAAC6WAEAtFYJAKxXFgCmWCUAoVgyAZ1X PgKYVkgElVVRBpJUWAiPUl8KjFJmDIpRbQ6IUHQQhU97EoNPhBOBTo0Vf06XF31OoRh7Ta4Zek69 GnhO0Rp3Tusad0/6GXZP/xl2T/8Ydk//F3ZP/xd2T/8X+EYAAOJQAADQVwAAxFwAALteAAC0XQAA rloGAKZbEwCgXCIAm1wvAJdbOwKSWkUDj1lNBotYVQiIV1wKhlZjDINVag6BVHEQflR4EnxTgBR6 UokWeFKUGHZSnxl0UqsaclK6G3FSzRxwUugbcFP5GnBT/xpwU/8ZcFP/GHBT/xhwU/8Y70kAAN1T AADLWgAAwF8AALdiAACvYQAAqF4CAKFfEACbYB4AlmAsAJFgOAGNXkIDiV1LBYVcUgeCW1kKgFpg DH1ZZw57WG4QeFh1EnZXfRR0V4cWclaRGG9WnBpuVqkbbFa4HGtWyx1qVuYcalf3G2pX/xpqV/8Z a1f/GWtX/xlrV/8Z60wAANhWAADIXgAAvGIAALNlAACrZQAAo2IAAJxiDgCWYxwAkWQpAIxjNQGI Yj8DhGFIBYBgUAd9X1cJel5dC3ddZA11XGsQc1xyEnBbexRuW4QXbFqPGGpamhpoWqccZlq2HWVa yB1lWuQdZVr2HGVa/xtlWv8aZVr/GWVa/xllWv8Z6E8AANNZAADEYQAAuWYAALBoAACnaQAAnmUA AJdmDQCRZxkAjGgnAIdnMgGDZj0Cf2VGBHtkTQZ4Y1QJdWJbC3JhYQ1wYWkPbWBwEmtfeRRpX4IW Z16NGWVemBpjXqUcYV60HWBexx1gXuMdYF71HGBe/xtgXv8aYV7/GmFe/xphXv8a5FIAAM9cAADA ZAAAtmkAAKxsAACjbAAAmWkAAJJqCwCMahYAh2skAIJrMAF+ajoCemlDBHZoSwZzZ1IIcGdZCm1m YA1rZWYPaGRuEWZkdhRkY4AWYmOLGGBilxpeYqQcXGKyHVtixR1bYuEdW2L0HFti/xtcYv8aXGL/ Glxi/xpcYv8a4FUAAMtfAAC9ZwAAsmwAAKlwAACfbwAAlGwAAIxtCACGbhMAgm8hAH1vLQF5bzgC dW5BA3JtSQVubFAHa2tXCmlrXgxmamUOZGlsEWFpdBNfaH4WXWeJGFtnlRpZZqIbV2awHFZmwx1W Zt8dVmbzHFdm/xtXZv8aV2b/Gldm/xpXZv8a21kAAMdiAAC6agAAr3AAAKZzAACacwAAj3AAAIdx BQCBchEAfHMeAHhzKgB0czUBcHM/A21yRwVqcU4HZ3FVCWRwXAtib2MOX29qEF1uchJabXwVWG2G F1ZskxlUbKAbUmuvHFFrwRxRa9wcUWvxG1Jr/hpSav8aUmr/GVJq/xlSav8Z1FwAAMNmAAC2bgAA rHQAAKJ3AACWdgAAiXUAAIF2AQB6dw8AdngbAHJ5JwBveTIBa3g8Amh4RARld0wGYndTCF92Wgpd dWEMWnVoD1h0cBFVc3kTU3OEFlFykBhPcp4ZTXGtGkxxvxtLcdkbTHHwGkxw/RpNcP8ZTW//GU1v /xlNb/8ZzmAAAL5qAACycgAAqHgAAJ17AACQegAAhHoAAHp7AAB0fAwAb34XAGx+JABpfy8BZn85 AmJ/QgNffkkFXX1QB1p9VwlXfF4LVXxlDVJ7bg9QencSTnqCFEt5jhZJeZwXSHirGEZ4vRlGeNUZ RnfvGEd2/BhHdv8YR3X/F0d1/xdHdf8XyWUAALpvAACudwAApH0AAJh/AACLfwAAfn8AAHOBAABs gwkAaIQTAGWFIABihiwAX4Y2AVyGPwJZhUYDV4VOBVSFVQdShFwJT4NjC02Daw1LgnQPSIJ/EUaB jBNEgZoVQoCpFkGAuhZAgNIWQX/tFkF++xZBff8WQX3/FkF9/xZBff8WwmoAALV1AACqfQAAn4IA AJKDAACFhAAAeYUAAGqJAABkigMAYIwQAF2NGwBbjicAWI4yAFWOOwFTjkMCUI5KA06NUgVMjVkG SYxgCEeMaApFi3IMQot9DkCKiQ8+ipgRPIqnEjuKuBI6is8SO4jrEjuH+hM7hv8TO4b/EzuG/xM7 hv8TvHEAAK97AAClgwAAmYcAAIyIAAB/iQAAc4wAAGWQAABckwAAV5UMAFSWFgBSliIAUJctAE2X NgBLlz8BSZdHAkeXTgNFllUEQ5ZdBUGWZQY+lW8IPJV6CTqVhws4lZUMNpSlDTWUtg40lMwNNJPp DTSS+A40kP8PNJD/DzSQ/w80kP8PtXgAAKqCAACeiAAAk40AAIaOAAB5kAAAbZMAAGGXAABVmwAA TZ4GAEmfEABHnxsARqAmAESgMABDoToAQaFCAT+hSQE9oVECO6FZAjmhYQM3oGsENaB2BTOggwYx oJIHMKCiCC6gswguoMkILp/nCC2d9wktnP8KLZv/Ci2b/wotm/8Kr4AAAKOJAACXjgAAjZMAAH+V AABymAAAZpwAAFugAABPpAAARacAAD6pDAA8qhQAOqofADmqKQA4qzIAN6s7ADWrQwA0rEsAMqxT ATGsXAEvrGYCLaxxAiusfwMqrI4DKKyeBCessAQmrMUEJqvkAyWp9QQlqP8FJaf/BSWn/wUlp/8F p4kAAJuPAACRlAAAhJkAAHieAABrogAAX6YAAFOqAABIrQAAPbAAADSzAwAvtQ4ALbUWACy1IAAr tikAKrYyACm3OgAot0MAJ7dMACa4VQAkuF8AI7hrACK4eAEguIgBH7iZAR25qwEcucABHLjfARy2 8gEbtfwCG7T/Ahu0/wIbtP8Cn48AAJSVAACImwAAe6EAAG6mAABiqwAAVrAAAEqzAAA/tgAANbkA ACy8AAAkvwYAH8INAB3CFAAcwh4AG8MmABrDLwAZxDgAGMRBABfESgAWxVUAFcVhABTGbwATxn8A EsaRABHHpAAQx7kAD8fUABDG7gAQxPoAEMP/ABDD/wAQw/8Al5YAAIucAAB+ogAAcakAAGSvAABY tAAAS7gAAEC7AAA1vgAAK8EAACPFAAAbyQEAFMwGABDQCwAO0READdEZAA3RIQAM0SoADNE0AAvS PgAK0kkACdNVAAnTYgAI03IABtSEAAXUmAAE1KsAA9XAAAHV3AAB1e0AAdX2AAHV9gAB1fYAjp0A AICkAABzqwAAZrEAAFm4AABMvQAAP8AAADTDAAAqxwAAIcoAABnOAAAS0gAADdYBAAnbBQAG3A0A BNwRAAPdGAAB3iAAAN4oAADfMQAA4DwAAOFHAADiVAAA42MAAON0AADkiAAA5JsAAOWuAADlwQAA 5dUAAObnAADm5wAA5ucAg6QAAHWsAABoswAAWrsAAE3BAABAxAAAM8gAACjMAAAf0AAAF9QAABDZ AAAL3QAABeEAAADkAAAA5QcAAOYNAADnEQAA6BYAAOkdAADqJQAA6y4AAO05AADvRQAA8FMAAPFk AADxdgAA8ooAAPOcAADzrQAA9LsAAPTIAAD0yAAA9MgAd60AAGq1AABcvQAAT8QAAEDJAAAzzQAA J9EAAB3WAAAU3AAADuAAAAjjAAAB5gAAAOoAAADuAAAA7gAAAO8EAADwCgAA8Q4AAPMSAAD0GAAA 9iAAAPgqAAD6NQAA/UMAAP5SAAD/YwAA/3YAAP+JAAD/mgAA/6YAAP+wAAD/sAAA/7AA/xYjAP8V IQD/ESEA/w0kAP8JKwD/BjcA/wNEAP8AUQD/AF0A/wBoAP8AcgD/AHsA/wCDAP8AigD/AJEA/wCW AP8AnAD/AKEA/QCmAPsArAD5ALMA9wC7APUAxQDzANEA8gDkAPEA8QDvAPoA7gD/AO4A/wDtAP8A 7QD/AO0A/wDtAP8A/xkgAP8YHQD/FR0A/xAfAP8OKQD/DDQA/wpBAP8HTQD/BVkA/wRkAP8EbgD/ A3cA/wOAAP8DhwD/A40A/QKTAPsCmQD5Ap4A9wKkAPUCqgDzAbAA8QG4AO8BwgDtAc8A6wHjAOoB 7wDoAvsA5wT/AOYF/wDmBv8A5gb/AOYG/wDmBv8A/xwbAP8bGQD/FxgA/xUdAP8TJQD/ETAA/xA9 AP8OSQD/DFUA/wtgAP8LagD9C3MA+wt8APkKgwD3CooA9QqQAPQKlgDzCpsA8QqhAO8JpwDtCa4A 6wm2AOgJwADmCc0A5AniAOIK8ADfC/sA3gz/ANwN/wDcDf8A2w3/AdsN/wHbDf8B/x8XAP8eEwD/ GxIA/xwZAP8bIgD/GCwA/xU4AP8TRAD+ElAA+RFbAPUQZgDzEG8A8BB3AO4QfwDsEIYA6hCMAOkQ kgDoEJgA5g+eAOUPpQDjD6wA4Q+0AOAPvgDeD8wA2hDhANUR8ADSEvsAzxL/Ac4T/wHNE/8BzRP/ AcwT/wHME/8B/yISAP8iDwD/IQ8A/yIUAP8iHAD/ICcA/x0yAPgbPgDyGUsA7hhWAOoXYADnFmoA 5BZyAOIWegDgFoIA3haIANwWjwDbFpUA2RabANYWogDUFqkA0haxANAXuwDOF8kAzBjeAMgZ7gHF GvsBwxr/AsEb/wLAG/8CwBv/AsAb/wLAG/8C/yYOAP8lCwD/KAwA/ykQAP8oFgD+JiAA9CQrAOwh OADmIEQA4R9QAN0fWwDZHmUA1R5tANIfdQDQH30Azh+DAMwfigHLH5AByR+XAcgfngHGH6UBxSCt AcMgtwHBIMQBwCHWAbwi6gK5IvgDtiL/A7Uj/wO0I/8EsyP/BLMj/wSzI/8E/ykLAP8qBQD/LggA /y8MAP8tEADzKxcA6CgiAOAmLwDZJj0A0idKAM0nVQDKKF8AxyhoAcUobwHDJ3cBwSd+Ab8nhAG+ J4sCvCeSArsnmQK5J6ACtyepA7YoswO0KL8DsyjPA7Ap5gStKfYEqyr/Bakq/waoKv8GqCr/Bqgq /waoKv8G/y0FAP8wAAD/MwIA9jQGAO8yCgDoLhAA3CwYANEuKADLLzcAxjBEAMEwTwC+MFkBuzBi AbgwagK2L3ECtS94ArMvfwOxL4YDsC+NA64ulAStLpwEqy6kBakvrgWoL7oFpi/KBqQw4gahMPMH nzD/CJ4x/widMf8InDH/CJwx/wicMf8I/zAAAP81AADvOAAA4joAANs5BADWNQkAzjQTAMY2IgC/ ODEAujg/ALY4SgGzOFQBsDddAq03ZAKrNmwDqTZzBKg2eQSmNYAFpDWHBaM1jwahNZcHnzWgB541 qgicNbYImzXFCZk13QmWNu8KlDb9CpM3/wqSN/8Kkjf/CpI3/wqSN/8K/zMAAPY6AADkPwAA2EIA AM5CAQDJPgYAxDsPALs+HQC1PywAsT86AK0/RQGpP08Bpj5YAqM9XwOhPWcEnzxtBZ08dAacO3sG mjuCB5g7igiWO5MJlTqcCpM6pguROrILkDvADI471QyMPOwNijz7DYk8/w2JPP8MiDz/DIg8/wyI PP8M/zcAAOo/AADcRQAAzkkAAMVJAAC/RgIAukMMALNEGQCtRScAqEY1AKRFQQGgRUsCnURTAppD WwOYQ2IFlkJpBpRBcAeSQXYIkEB+CY5AhgqNQI4Li0CYDIlAog2HQK4OhUC8D4RAzw+CQekPgUH5 D4BB/w+AQv8OgEL/DoBC/w6AQv8O+jsAAOVEAADTSwAAx04AAL5PAAC4TAAAskkJAKtJFQClSyMA oEsxAJxLPQGYSkcClUlPA5JJVwSQSF4FjkdlBotHaweJRnIJiEZ5CoZFgguERYoNgkWUDoBEnw9+ RKsQfEW5EXtFyxF6ReYReUb3EXhG/xB4Rv8QeEb/D3hG/w94Rv8P8D8AAN9JAADNTwAAwVMAALhU AACxUgAAq04FAKROEQCeTyAAmVAtAJVQOQGST0MBjk5MA4tNUwSJTVoFhkxhBoRLaAiCS24JgEp2 C35Kfgx8SYcOekmRD3hJnBB2SagSdEm2EnNJyBNySuMTcUr1EnFK/xFxS/8RcUv/EHFL/xBxS/8Q 7EMAANlMAADIUwAAvVcAALRYAACsVwAApVIBAJ5TDwCYVBwAk1QpAI9UNQCLU0ABiFNIAoVSUASC UVcFf1BeBn1QZAh7T2sJeU9yC3dOew11ToQOc02OEHFNmRFvTaUTbU2zFGxNxRRrTuEUa070E2tO /xJrTv8Sa07/EWtO/xFrTv8R6EYAANNQAADEVgAAuVoAALBcAACmWgAAn1YAAJhWDQCSVxkAjlgm AIlYMgCGWD0BgldFAn9WTQN8VVQFeVRbBndUYQh1U2gJc1NwC3FSeA1vUoEPbVKLEGtRlxJpUaMT Z1GxFGZRwxVlUt4VZVLyFGVS/xNlUv8SZVL/EmVS/xJlUv8S5EoAAM9TAADAWgAAtV4AAKxgAACi XgAAmlkAAJJaCwCNWxYAiFwjAIRcLwCAWzoBfVtDAnlaSwN2WVIEdFhYBnFYXwdvV2YJbVdtC2tW dQ1pVn4PZ1aJEWVVlRJjVaEUYlWvFWFVwRZgVdsWYFbxFWBW/hRgVv8TYVb/EmFW/xJhVv8S4E0A AMtWAAC9XQAAsmEAAKhjAACdYQAAlV0AAI1eCQCHXhMAg18gAH9fLAB7XzcBd15AAnReSANxXU8E b1xWBWxcXAdqW2MJaFtrC2Zacw1kWnwPYlqHEWBZkxJeWaAUXVmuFVtZvxZbWdgWW1nvFVtZ/RRc Wf8TXFn/ElxZ/xJcWf8S3FAAAMdZAAC6YAAAr2QAAKRlAACZZAAAkGAAAIhhBgCCYhEAfmMdAHpj KgB2YzQBc2I9AW9iRgJsYU0EamFUBWdgWgdlYGEIY19pCmFfcQxfXnoOXV6FEFtekRJZXZ4UWF2s FVddvRZWXdUWVl3uFVdd/BRXXf8TV13/Eldd/xJXXf8S1lMAAMRcAAC3YwAArGgAAKBoAACVZwAA imMAAINlAgB9Zg8AeGYaAHRnJwBxZzIAbmc7AWtmQwJoZksDZWVSBWNlWQZhZF8IXmRnClxjbwxa Y3gOWGODEFZijxJUYpwTU2KqFVJiuxVRYtIVUWHtFVJh+xRSYf8TU2H/ElNh/xJTYf8S0VYAAMBf AACzZgAAqWsAAJxrAACQagAAhWcAAH1pAAB3ag0Ac2sXAG9rJABsbC8AaWw4AWZrQQJja0kDYWtQ BF5qVwZcal0HWmllCVhpbQtVaHYNU2iBD1FnjRFPZ5oSTmepFE1nuRRMZ88UTGbrFE1m+xNNZv8S TmX/Ek5l/xJOZf8SzFoAALxjAACwagAApW8AAJhuAACMbQAAgGwAAHdtAABxbgsAbW8UAGlwIQBm cSwAZHE2AWFxPgFecUYCXHBNA1lwVAVXcFsGVW9iCFNvagpQbnMMTm5+DkxtihBKbZgRSWynEkhs uBNHbM0TR2zqE0hr+hJIa/8SSGr/EUhq/xFIav8Rx14AALhnAACsbgAAoXIAAJNyAACHcQAAenEA AHFyAABrdAcAZnURAGN2HQBgdygAXnczAFt4PAFZd0MCVndLA1R3UgRSdlkFUHZgB051aAhLdXEK SXR8DEd0iA5Fc5YPQ3OlEEJzthFBc8sRQnLoEUJy+BFCcf8QQ3D/EENw/xBDcP8QwWMAALNsAACo cwAAm3YAAI51AACBdgAAdXYAAGl4AABjegIAXnwOAFx9GQBZfiQAV38vAFV/OAFTf0ABUH9IAk5+ TwNMflYESn5dBUh9ZQZGfW4IQ3x5CkF8hgs/e5QNPnujDjx7sw48e8gOPHrmDjx59w48eP8OPHj/ Dj13/w49d/8OvGgAAK9yAACkeQAAlnoAAIh6AAB8egAAcHwAAGN/AABcggAAV4QLAFOFFABRhiAA T4YqAE6HNABMhzwBSodEAUiHSwJGh1MCRIZaA0KGYgRAhmwGPoV2BzuFgwg5hZEKOISgCzaEsQs2 hMYLNoPkCzaC9gs2gf8MNoD/DDaA/ww2gP8Mtm8AAKp4AACffwAAkH4AAIN/AAB3gAAAa4IAAF6H AABVigAATowGAEqOEABIjxoAR48lAEWQLwBEkDgAQpBAAECQRwE/kE8BPZBWAjuQXwI5kGgDN49z BDWPgAUzj44GMY+eBzCOrwcvjsMHL47hBy+M9Agvi/8IL4r/CC+K/wkviv8JsHYAAKV/AACYhAAA ioQAAH2FAABwhwAAZYoAAFqOAABPkgAARpUAAEGYDAA+mBQAPZkfADuZKAA6mjEAOZo6ADeaQgA2 mkoANZpSATOaWgExmmQBL5pvAi2aewIsmooDKpqaAymarAQomsAEJ5neAyeX8gQnlv0FJ5X/BSeV /wUnlf8FqX4AAJ6FAACSiQAAhIoAAHaMAABqjwAAXpMAAFSXAABJmwAAQJ8AADeiBAAyow4AMaMX ADCkIQAupCoALaQyACylOgArpUMAKqVLACmlVAAopV4AJqVpACWldgEjpYUBIqWWASCmqAEfpbsB HqXXAR6k7wEeovsCHqH/Ah6h/wIeof8CooYAAJeMAACLjwAAfZEAAG+UAABjmAAAV50AAE2hAABD pQAAOKgAADCrAAAorgcAJK8QACOvFwAhryEAILApAB+wMQAesDoAHbFCAByxTAAbsVYAGrFhABmy bwAYsn4AFrKQABWyogAUsrYAE7LOABOx6wATr/kAE67/AROu/wETrv8Bmo0AAJCSAACElwAAdZoA AGifAABbowAAUKgAAEWsAAA7sAAAMbIAACe1AAAguAAAGLoHABS8DgATvBUAErweABG9JgARvS4A EL03ABC+QQAOvkwADr5XAA2+ZQAMv3QAC7+GAAq+mQAIvqwAB77CAAe+3wAIvvAACL36AAi9/AAI vfwAk5QAAIeZAAB6nwAAbKUAAGCqAABTrwAAR7MAADy2AAAxuAAAJ7sAAB++AAAXwQAAEcQBAAzI CAAIyQ4AB8kUAAbJHAAFySQABMosAAPKNgACykAAAMtMAADLWQAAy2gAAMt5AADMjAAAy58AAMuz AADLyAAAzOIAAMzvAADM8QAAzPEAipoAAHyhAABvpwAAYq0AAFWzAABIuAAAO7sAADC+AAAmwQAA HcQAABXIAAAPywAACs4AAATSAgAA0woAANMPAADUFAAA1RoAANYiAADXKgAA2TQAANo/AADcSwAA 3FoAAN1qAADdfQAA3ZEAAN2kAADetgAA3sgAAN7eAADe4gAA3uIAf6IAAHGpAABksAAAVrcAAEm8 AAA8wAAAL8QAACTHAAAbywAAE88AAA3SAAAH1gAAANsAAADeAAAA3wMAAOAJAADhDgAA4hIAAOMX AADlHgAA5icAAOgxAADqPQAA7EsAAOxaAADtbAAA7oAAAO6UAADupQAA7rQAAO7CAADuxgAA7sYA dKoAAGayAABYuQAAS8AAAD3FAAAvyQAAJM0AABnRAAAR1gAAC9sAAAPeAAAA4QAAAOUAAADoAAAA 6QAAAOoAAADrBgAA7QsAAO8PAADwEwAA8hoAAPQjAAD3LgAA+TsAAPtKAAD8WwAA/W0AAP2AAAD+ kwAA/qIAAP6tAAD+rwAA/q8A/xAfAP8OHQD/Ch0A/wEgAP8AKAD/ADUA/wBBAP8ATgD/AFoA/wBl AP8AbgD/AHcA/wB/AP4AhgD8AIwA+wCSAPkAlwD4AJwA9wCiAPYApwD1AK0A8wC1APIAvQDxAMkA 7wDcAO4A6wDtAPcA7AD/AOsA/wDqAP8A6gD/AOoA/wDqAP8A/xMcAP8RGQD/DRkA/wYcAP8DJQD/ ADEA/wA+AP8ASgD/AFYA/wBhAP8AawD9AHMA+gB7APcAgwD1AIkA9ACPAPIAlADxAJkA8ACfAO4A pADtAKsA7ACyAOoAugDoAMYA5wDWAOUA6ADkAPUA4wD+AOIA/wDhAP8A4QD/AOEA/wDhAP8A/xUY AP8TFAD/DxQA/w0ZAP8LIgD/CC0A/wQ5AP8BRgD/AFEA/gBcAPoAZgD2AG8A8gB3AO8AfgDtAIUA 6wCLAOoAkQDoAJYA5wCcAOYAoQDkAKgA4wCvAOEAuADfAMMA3QDRANsA5gDZAPMA1wD9ANUC/wDU Av8A1AP/ANQD/wDUA/8A/xgTAP8VEAD/Eg8A/xIVAP8RHQD/DigA/ww0AP8KQQD5CEwA9QZXAPEG YQDtBmoA6QVyAOYFegDkBYEA4gWHAOAGjQDfBpIA3QaYANsGngDZBqUA1watANQGtQDSBsAA0AfP AM4I5QDMCfQAygv/AMgM/wDHDP8Axwz/AMYM/wDGDP8A/xsOAP8ZDAD/GA0A/xgRAP8XGAD/FCIA +xEuAPMQOgDtDkYA6A1SAOUNXADhDWUA3g1tANsNdQDYDXwA1Q2CANMNiQDRDY8A0A2VAM4NnADN DqMAyw6rAMkOtADIDsAAxg7PAMMQ5gDAEfUAvRL/ALwS/wC7Ev8AuhL/AboS/wG6Ev8B/x8KAP8c BAD/HwgA/x8NAP8dEgD4GhsA7hYmAOYUMwDgEz8A2hNLANQTVgDQE18AzhRoAMsUbwDJFHcAxxV9 AMYVhADEFYoAwxWRAMEWmADAFp8AvhanALwXsAC7F7wAuRfLALcY4gCzGfIBsRr/Aa8b/wGuG/8B rhv/Aa0b/wGtG/8B/yIEAP8iAAD/JQIA/CQHAPchDADsHRIA4RocANgaKgDQGzgAyx1FAMcdUADD HloAwB5iAL4eagC8H3EAuh94ALkffgC3H4UAth+MALQfkwCzH5oBsSCjAbAgrAGuILcBrCHGAash 3QGnIu8CpSL9AqMj/wKiI/8CoiP/AqEj/wKhI/8C/yUAAP8oAADyKgAA5SsAAN8oBQDcIQsA0iEU AMkkJADDJTIAviY/ALonSgC3J1QAtCddALInZACwJ2wAridyAa0neQGrJ38BqieGAagnjgGnJ5YC pSeeAqMoqAKiKLMCoCjBAp8o1QKcKewDmir6A5gq/wSXKv8Elyr/BJYq/wSWKv8E/ygAAPUuAADl MwAA2jUAANAzAQDMLQYAxioQAL4tHgC4LiwAsy86AK8vRQCsME8AqS9YAKcvXwGlL2YBoy9tAaEv cwKgLnoCni6BAp0uiQKbLpEDmS6aA5gupASWL68ElS+9BJMvzwSRMOgFjzD4BY0x/wWNMf8FjDH/ BYwx/wWMMf8F/y0AAOo1AADcOgAAzj0AAMY8AADANwIAuzMNALM0GQCuNicAqTc0AKU3QACiN0oA nzdTAZ02WgGbNmEBmTZoApc1bwKVNXUDlDV8A5I1hASQNY0EjzWWBY01oAWLNasGijW5Bog1ygeH NuUHhTb2B4Q3/weDN/8Hgzf/B4I3/weCN/8H9DIAAOM7AADSQQAAxkQAAL1DAAC3PwAAsTsJAKo7 FAClPCIAoD0wAJ09OwCZPUUAlj1OAZQ8VgGSPF0CkDxjAo47agOMO3EEijt4BIg6gAWHOogGhTqS BoM6nAeBOqgIgDq1CX47xgl9O+EJezzzCXs8/wl6PP8Iejz/CHo8/wh6PP8I7jcAAN1BAADLRgAA v0kAALZJAACuRgAAqUEEAKNBEQCdQh4AmEMrAJVDNwCRQ0EAjkJKAYxCUgGJQVkCh0FfA4VBZgOD QG0EgUB0BYBAewZ+P4QHfD+OCHo/mQl4P6UKd0CyCnVAwwt0QN0Lc0HxC3JB/wpyQf8KckH/CXJB /wlyQf8J6TwAANVFAADFSwAAuk4AALBOAACnSwAAokYAAJtGDgCWRxoAkUgnAI5IMwCKSD0Ah0dG AYRHTgGCRlUCgEZcA35FYgR8RWkEekVwBXhEeAZ2RIEIdESLCXJElgpwRKILb0SvDG5EwAxtRdkN bEXvDGtF/QtrRv8La0b/CmtG/wprRv8K5UAAAM9JAADBTwAAtVIAAKtSAAChTwAAm0oAAJRKDACP SxcAi0wkAIdMLwCETDoAgUxDAX5LSwF7S1ICeUpYA3dKXwR1SWYFc0ltBnFJdQdvSX4IbUiICWtI kwtqSJ8MaEitDWdJvQ1mSdQOZUntDWVK/AxlSv8LZUr/C2VK/wtlSv8L4EQAAMtNAAC9UgAAslYA AKZVAACcUgAAlU4AAI5OCQCJTxQAhVAgAIFQLAB+UDcAe1BAAXhQSAF1T08Cc05VA3FOXARvTmMF bU1qBmtNcgdpTXsIZ02FCmVNkQtkTJ0MYk2rDWFNuw5gTdEOYE3sDmBN+w1gTf8MYE3/C2BN/wtg Tf8L3EcAAMdQAAC5VgAArlkAAKJYAACYVgAAkFEAAIlSBgCDUxEAf1MdAHtUKQB4VDQAdVQ9AXJT RQFwU0wCbVJTAmtSWQNpUmAEZ1FnBmVRbwdjUXgIYlGDCmBRjwteUJsNXVCpDltRuQ5bUc4PWlHq DltR+g1bUf8MW1H/DFtR/wtbUf8L1koAAMNTAAC2WQAAq1wAAJ5aAACTWQAAi1QAAIRWAwB+VhAA elcaAHZXJgBzWDEAcFc6AG1XQgFqV0kCaFZQAmZWVwNkVl4EYlVlBWBVbQdeVXYIXVWBCltVjQtZ VJoNWFSnDlZVuA9WVcwPVlXpDlZV+Q1WVf8NV1T/DFdU/wxXVP8M0U0AAMBWAACzXAAAp14AAJpd AACPXAAAhlgAAH9ZAAB5Wg0AdFsXAHFbIwBuWy4Aa1s3AGhbQAFlW0cBY1pOAmFaVQNfWlwEXVpj BVxaawZaWXQIWFl/ClZZiwtUWZgNU1imDlJZtg5RWcoPUVnnDlFY+A1SWP8NUlj/DFJY/wxSWP8M zVEAALxZAACwXwAAo2EAAJZgAACLXwAAgVsAAHldAABzXgwAb14VAGtfIABoXysAZmA1AGNgPQFh X0UBX19MAl1fUwNbX1oEWV5hBVdeaQZVXnIIU159CVFdiQtQXZYMTl2kDU1dtA5MXcgOTF3mDk1d 9w1NXP8MTVz/DE5c/wxOXP8MyVQAALlcAACtYwAAn2MAAJJjAACHYgAAfGAAAHRhAABuYgkAaWMS AGZjHQBjZCgAYWQyAF5kOwBcZEMBWmRKAlhkUQJWZFgDVGRfBFJjZwVQY3AHTmN6CExihgpLYpQL SWKiDEhisg1HYscNR2LkDUhh9gxIYf8MSGD/C0lg/wtJYP8LxFgAALVgAACqZgAAm2YAAI1mAACC ZQAAdmQAAG5lAABoZgUAY2cQAGBoGgBdaSUAW2ovAFlqOABXakABVWpHAVNqTgJRalUDT2ldBE1p ZAVLaW0GSWh4B0dohAlGaJIKRGehC0NnsQxCZ8UMQmfiDEJm9QxDZv8LQ2X/C0Nl/wtDZf8Lv1wA ALFkAACmagAAlmkAAIlpAAB9aQAAcWkAAGdqAABibAEAXW0NAFluFgBXbyEAVXArAFNwNQBRcD0A UHBFAU5wTAFMcFMCSnBaA0hwYgRGb2sFRG91BkJvggdAbo8JP26eCj1urwo9bsIKPG7gCj1t9Ao9 bP8KPWv/Cj5r/wo+a/8KumAAAK1pAACgbgAAkW0AAIRtAAB4bQAAbG4AAGFwAABbcgAAVnQKAFJ1 EgBQdh0ATncnAEx3MQBLeDkASXhBAEh4SQFGeFABRHdXAkJ3XwNAd2gDPndzBDx2fwY6do0HOXac CDd1rQg3dcAINnXeCDd08gg3c/4IN3L/CDdy/wg3cv8ItWYAAKlvAACacQAAi3EAAH5xAABzcgAA aHMAAFx2AABUeQAATnsFAEp9DwBIfhgARn8jAEV/LABDgDUAQoA9AEGARQA/gEwBPYBUATyAXAI6 f2UCOH9vAzZ/fAQ0f4oEMn+aBTF+qgYwfr0GMH7aBjB98AYwe/0GMHv/BjB6/wYwev8GsGwAAKR1 AACUdQAAhnUAAHl2AABudwAAY3kAAFd9AABPgQAAR4QAAEKGDAA/hxMAPYgdADyIJwA7iTAAOok4 ADiJQAA3iUgANolPADSJWAEziWEBMYlsAS+JeAItiYcCLImXAyqIpwMpiLoDKYjUAymG7gMphfwE KYT/BCmE/wQphP8EqnQAAJ57AACOegAAgHoAAHR7AABofgAAXYEAAFKFAABJiQAAQYwAADmQBQA1 kQ8AM5IXADKSIQAxkikAMJMyAC6TOgAtk0EALJNKACuUUgAqlFwAKJRnACeUcwEllIIBJJSTASKT pAEhk7cBIJPPASGS7AEgkPoCII//AiCP/wIgj/8CpHwAAJeAAACHfwAAe4AAAG6CAABihQAAV4kA AE2OAABCkgAAOpYAADKZAAAqnAkAKJ0RACadGQAlnSIAJJ4qACOeMgAinjoAIZ5CACCeSwAfn1UA Hp9gAByfbQAbn3wAGp+NABifnwAXn7IAFp/JABae6AAWnPcAFpv/AReb/wEXm/8BnYMAAI+GAACC hgAAdIcAAGeLAABbjwAAUJMAAEaYAAA8nAAAM6AAACujAAAjpgAAHKgLABqpEQAYqRgAF6khABaq KQAVqjEAFKo5ABOqQwATq00AEqtYABGrZQAQq3QADquGAA6rmQANq6wADKvBAAyq3wAMqfIADaj8 AA2o/wANqP8AlooAAImMAAB6jQAAbJEAAGCVAABUmgAASZ8AAD+jAAA1pwAAK6oAACOuAAAbsAAA FLMBAA+1CgANthAADLYWAAu2HwAKticACbYvAAi2OQAHt0MABrdPAAS3WwADt2oAArd7AAC3jgAA t6EAALa0AAC2ywAAtuUAALXxAAC19wAAtfcAj5EAAIGUAABylwAAZZwAAFihAABMpgAAQasAADev AAAssgAAI7UAABq4AAATuwAADr0AAAnABQADwQ0AAMERAADBFwAAwh4AAMImAADCLwAAwzkAAMRE AADEUAAAxF4AAMVvAADFgQAAxZUAAMWoAADFvAAAxNEAAMTmAADE7gAAxO4AhpgAAHmeAABrowAA XakAAFCuAABEswAAN7YAACy5AAAivAAAGb8AABHCAAAMxQAABsgAAADLAAAAzAcAAMwNAADNEQAA zRYAAM4dAADPJAAA0C0AANI4AADURAAA1FIAANVhAADVcwAA1ocAANabAADWrQAA178AANjOAADY 3QAA2N0Ae6AAAG6mAABgrQAAU7MAAEW4AAA4vAAAK78AACHCAAAXxgAAEMkAAArMAAAC0AAAANQA AADXAAAA2AAAANoFAADbCwAA3A4AAN4TAADfGQAA4SEAAOMqAADlNgAA50MAAOdTAADoZAAA6XcA AOmMAADqnwAA6q4AAOq6AADqwwAA6sMAcKgAAGKvAABVtgAAR7wAADnAAAAsxAAAIMgAABbMAAAO 0AAAB9QAAADZAAAA3QAAAOEAAADjAAAA5AAAAOYAAADnAQAA6QcAAOsMAADsEAAA7hUAAPAdAADz JwAA9jMAAPdDAAD4VAAA+WYAAPl6AAD6jgAA+p4AAPupAAD7sAAA+7AA/wsbAP8HGQD/ABkA/wAc AP8AJQD/ADIA/wA/AP8ASwD/AFcA/wBiAP8AawD/AHMA/QB7APsAggD6AIgA+ACNAPcAkgD2AJgA 9QCdAPQAogDzAKkA8QCwAO8AuADuAMMA7ADRAOsA5gDpAPMA6AD+AOgA/wDoAP8A6AD/AOgA/wDo AP8A/w4YAP8KFQD/ARQA/wAYAP8AIgD/AC4A/wA7AP8ARwD/AFMA/QBeAPoAZwD3AG8A9QB3APMA fgDyAIQA8ACJAO8AjwDuAJQA7ACaAOsAnwDpAKUA6ACsAOYAtADkAL8A4wDMAOEA4gDfAPAA3gD7 AN4A/wDdAP8A3QD/ANwA/wDcAP8A/xATAP8NEQD/BhAA/wIVAP8AHgD/ACkA/wA2AP8AQgD6AE4A 9ABZAPEAYgDuAGsA7AByAOoAeQDoAH8A5wCFAOUAiwDkAJAA4gCWAOEAnADfAKIA3QCpANoAsQDY ALsA1QDIANIA3QDRAO0A0AD5AM8A/wDOAP8AzQD/AM0A/wDNAP8A/xEPAP8ODQD/DA0A/wsSAP8H GQD/AiQA/wAwAPYAPADvAEkA6gBTAOcAXQDkAGYA4QBtAN8AdADdAHsA2wCBANkAhgDWAIwA1ACS ANIAmADQAJ4AzgCmAMwArgDKALgAyADEAMYA1wDFAOoAwwD3AMIA/wDBAf8AwAL/AMAC/wDAAv8A /xQLAP8QBgD/EAkA/xAOAP8OFAD/Ch4A9QYpAOsENgDjA0IA3wNOANsEVwDWBGAA0wRoANAEbwDO BXYAzAV8AMoFggDJBYgAxwWOAMYFlADEBZsAwgWjAMAGqwC+BrUAvQbCALsI1AC6CekAtwv4ALUM /wC0DP8AtAz/ALQM/wC0DP8A/xcEAP8UAAD/FgMA/xQJAP8RDgDyDhUA6AwhAN4KLgDWCzsA0AxH AMwMUQDJDFoAxg1iAMQNagDCDXEAwA13AL8NfQC9DoMAvA6KALoOkQC5DpgAtw6gALYOqQC0D7QA sg/BALEQ1ACuEesAqxL6AKkS/wCoE/8ApxP/AKcT/wCnE/8A/xoAAP8bAAD5GwAA6xkAAOUUBgDl EA4A2Q4XAM8RJgDIEjQAxBNAAL8USwC8FFQAuRVdALcVZAC1FWsAtBVxALIVeACxFn4ArxaFAK4W jACsFpQAqxecAKkXpgCnGLAAphi9AKQYzwCiGucAnxr3AJ0b/wGcG/8BnBv/AZsb/wGbG/8B/x0A APchAADoJAAA3SUAANQhAQDPGwgAyhcRAMIaIAC8HC0Atx06ALMeRQCwHk8ArR5XAKseXwCpH2YA qB9sAKYfcwClH3kAox+AAKIfhwCgII8AnyCYAJ0gogCbIKwBmiG5AZghygGWIuQBlCP1AZIj/wGR I/8BkCP/AZAj/wGQI/8B/yIAAOspAADdLgAAzy8AAMctAADBJwMAvSINALYjGgCwJSgArCY0AKgm QAClJ0kAoidSAKAnWgCeJ2EAnCdnAJsnbQCZJ3QAmCd7AZYnggGVJ4sBkyeUAZEongGQKKkBjii1 Ao0pxgKLKd8CiSryAocq/wKGKv8Chir/AoYq/wKGKv8C9CgAAOMxAADRNgAAxTgAALw2AAC2MAAA sisJAKssFACmLSIAoi4vAJ4uOgCbLkQAmC9NAJYvVQCULlwAki5iAJAuaQGPLm8BjS52AYwufgGK LoYCiC6PAocumgKFL6UDgy+yA4IvwgOBMNoDfzDvA30x/gN9Mf8DfDH/A3wx/wN8Mf8D7S8AANs3 AADJPQAAvj4AALM8AACsOAAApzMEAKIyEQCdNB0AmTUqAJU1NQCSNUAAjzVJAI01UACLNVcAiTVe AYc1ZAGFNGsBhDRyAoI0eQKANIICfjSLA300lgN7NaEEeTWuBHg1vgV3NtQFdjbtBXQ3/AV0N/8E dDf/BHQ3/wR0N/8E5zUAANI9AADDQgAAuEQAAKxCAACkPgAAnzkAAJo4DgCUOhkAkDomAI07MQCK OzsAhztEAIQ7TACCO1MBgDpaAX46YAF9OmcCezpuAnk6dQJ3On4DdjqIBHQ6kwRyOp4FcTqrBW87 uwZuO88GbTvqBm08+gZsPP8FbDz/BWw8/wVsPP8F4jkAAMxCAAC+RwAAsUgAAKVGAACdQwAAlz8A AJI+CwCNPxUAiT8hAIVALQCCQDcAf0BAAH1ASAB7QE8BeUBWAXc/XQF1P2MCcz9qAnE/cgNwP3oD bj+EBGw/kAVrP5wGaT+pBmg/uAdnQMwHZkDoB2ZA+QZlQP8GZUD/BmVA/wVlQP8F3D4AAMdGAAC5 SwAArEwAAKBKAACXRwAAkUMAAItDCACGQxIAgkQeAH5EKQB7RTQAeUU9AHZFRQB0REwBckRTAXBE WQFuRGACbENnAmtDbwNpQ3cEZ0OBBWZDjQZkQ5kGYkOnB2FEtghgRMoIYETmCF9F+AdfRf8HYEX/ BmBE/wZgRP8G1kEAAMNJAAC2TgAAp08AAJtNAACSSwAAjEcAAIVHBACARxAAfEgaAHhIJgB1STAA c0k6AHBJQgBuSUkBbEhQAWpIVgFoSF0CZkhkAmVIbANjSHUEYUd/BWBHigZeSJcHXUilCFtItAhb SMcJWkjkCFpJ9ghaSf8HWkj/BlpI/wZaSP8G0UUAAL9MAACyUgAAo1EAAJdQAACNTgAAhkoAAIBK AQB6Sw4AdkwXAHJMIwBvTC0AbU02AGpMPwBoTEYAZkxNAWRMUwFiTFoCYUxhAl9MaQNeTHIEXEx8 BVpMiAZZTJUHV0yjCFZMsghVTMYJVUziCVVM9QhVTP8HVUz/B1ZM/wZWTP8GzEgAALxQAACvVQAA oFQAAJNTAACJUQAAgU0AAHpOAAB1TwwAcE8VAG1QIABqUCoAZ1AzAGVQPABjUEMAYVBKAV9QUQFd UFgCXFBfAlpQZwNZUHAEV1B6BVVQhgZUUJMHUlChCFFQsQlQUMQJUFDhCVBQ9AhRUP8HUU//B1FP /wZRT/8GyUsAALlTAACrVwAAnFYAAI9VAACFVAAAfFAAAHVRAABwUgkAa1MSAGhUHQBlVCcAYlQx AGBUOQBeVEEAXFRIAVpUTwFZVFYBV1RdAlZUZQNUVG4EUlR4BVFUhAZPVJEHTlSgCExUrwhMVMIJ S1TfCUxU8whMU/8HTFP/B01T/wZNU/8GxU4AALZWAACnWgAAmFkAAItYAACBVwAAd1QAAHBVAABq VgYAZlcQAGJXGgBgWCQAXVguAFtZNwBZWT8AV1lGAFZZTQFUWVQBU1lbAlFZYwJPWGwDTlh2BExY ggVKWI8GSVieB0hYrghHWMAIR1jdCEdY8ghHV/8HSFf/B0hX/wZIV/8GwVEAALJZAACjXAAAlFsA AIdbAAB9WgAAclgAAGtZAABlWgMAYFsOAF1cFwBaXCEAWF0rAFZdNABUXjwAU15EAFFeSwFQXlIB Tl5ZAkxeYQJLXWoDSV10BEddgAVFXY0GRF2cB0NdrAdCXb4IQl3aCEJc8QdCXP4HQ1v/BkNb/wZD W/8GvVUAAK9dAACfXwAAkF4AAINeAAB4XQAAbVwAAGVdAABfXwAAWmAMAFdhFABVYh4AUmIoAFFj MQBPYzkATmNBAExjSABLY08BSWNWAUdjXgJFY2cCRGNxA0JjfQRAYosFP2KaBj5iqgY9YrwHPGLW Bz1h7wY9Yf0GPmD/Bj5g/wY+YP8GuVkAAKthAACaYQAAi2EAAH9hAAB0YQAAaWEAAF9iAABZZAAA VGYJAFFnEQBOZxoATGgkAEtpLQBJaTYASGk+AEZqRQBFakwAQ2pUAUJqXAFAaWUCPmlvAjxpewM7 aYkEOWmYBThoqAU3aLoFN2nTBTdo7gU3Z/wFOGb/BThm/wU4Zv8FtF4AAKdlAACVZQAAhmQAAHpl AABvZQAAZGYAAFloAABSagAATWwEAEluDgBHbhYARW8gAERwKQBCcDIAQXA6AEBxQgA/cUkAPXFR ADxxWQE6cWIBOHFsAjZweAI1cIYDM3CVAzJwpgQxcLgEMHDQBDFv7AQxbvsEMW3/BDFs/wQxbP8E r2QAAKFpAACPaAAAgWgAAHVpAABraQAAYGsAAFVuAABNcQAARnMAAEJ1CwA/dhIAPXccADx3JQA6 eC0AOXg1ADh5PQA3eUUANnlNADV5VQAzeV4AMXloATB5dAEueYMCLXmSAit4owIqeLUCKnjMAip3 6gIqdvkDKnX/Ayp0/wMqdP8DqmoAAJptAACJbAAAfG0AAHBtAABmbgAAW3EAAFB1AABIeAAAQXsA ADp+BQA2fw4ANIAWADOBIAAygSgAMIEwAC+COAAugkAALYJIACyCUAArgloAKoJkACiCcAAmgn8B JYKPASSCoAEjgrIBIoLJASKB5wEif/cBIn7/AiJ9/wIiff8CpXEAAJNxAACDcQAAdnEAAGxyAABg dQAAVngAAEx8AABDgAAAO4MAADOGAAAtiQoAKooRACmLGQAniyIAJosqACWMMQAkjDkAI4xCACKN SgAhjVQAII1eAB+NawAdjXkAHI2KABuNnAAZja4AGIzEABiM4wAZivUAGYn/ARmI/wEZiP8BnXcA AIx2AAB9dgAAcncAAGV5AABafAAAUIAAAEaEAAA8iQAANIwAAC2QAAAlkwIAH5UMAB2WEgAclhoA G5ciABqXKgAZlzIAGJg6ABeYQwAWmE0AFZhYABSYZAATmHMAEZiEABCYlgAQmKkADpi/AA6X3QAP lvIAEJX8ABCU/wAQlP8AlX0AAIV8AAB4fAAAa34AAF+BAABUhgAASooAAECPAAA2kwAALZcAACaa AAAenQAAF6ADABKiDAAQoxIAEKMZAA+jIQAOpCkADqQxAA2kOgAMpEUAC6RQAAqkXAAJpGoAB6R7 AAajjgAEo6EAAqO0AAOiywADouYAA6HzAAOh+wADofsAjYMAAH+CAABxhAAAZIcAAFiMAABNkQAA QpYAADiaAAAvngAAJqIAAB6lAAAXqAAAEasAAAyuBwAHrw0AA68SAAKvGQABryEAAK8pAACwMgAA sDwAALBHAACwUwAAsGEAALBxAACwgwAAr5cAAK+qAACvvwAArtkAAK7rAACu9AAArvQAh4kAAHiK AABqjgAAXZMAAFGYAABFnQAAO6IAADCmAAAnqgAAHq4AABaxAAAQtAAAC7YAAAW5AwAAugoAALoO AAC6EwAAuxkAALshAAC8KAAAvDEAAL08AAC+SAAAvlYAAL5lAAC+dwAAvowAAL6fAAC9swAAvscA AL7eAAC96wAAvesAf5IAAHCVAABimgAAVZ8AAEmlAAA9qwAAMq8AACi0AAAetgAAFbkAAA68AAAJ vwAAAsIAAADEAAAAxQQAAMYKAADGDgAAxxIAAMgYAADJHwAAyicAAMwwAADOPAAAzkkAAM9ZAADP agAAz34AAM+TAADPpgAAz7gAAM/IAADP2wAAz9sAd5wAAGihAABbpwAATq4AAEG0AAA0twAAKLoA AB29AAATwAAADcQAAAbHAAAAygAAAM4AAADQAAAA0QAAANICAADTCAAA1QwAANYQAADZFQAA2xwA AN0kAADgLwAA4jwAAONLAADkXAAA5G8AAOWDAADlmAAA5akAAOW2AADlwwAA5cMAbKUAAF+sAABR sgAARLkAADW8AAAowAAAHMQAABLIAAAMywAAA88AAADTAAAA2AAAANwAAADfAAAA3wAAAOEAAADj AAAA5AMAAOYIAADoDQAA6REAAOwYAADuIgAA8S4AAPM8AAD0TQAA9V8AAPZzAAD3hwAA95kAAPil AAD4sAAA+LAA/wMXAP8AFQD/ABUA/wAYAP8AIwD/AC8A/wA8AP8ASAD/AFQA/wBeAP8AZwD9AG8A +wB2APkAfQD4AIMA9gCIAPUAjgD0AJMA8gCYAPEAngDwAKQA7gCrAO0AswDrAL0A6gDLAOgA4QDn APEA5gD9AOUA/wDkAP8A5AD/AOQA/wDkAP8A/wcTAP8AEQD/ABEA/wAVAP8AHwD/ACsA/wA3AP8A RAD+AE8A+gBaAPcAYwD0AGsA8gByAPAAeQDvAH8A7QCEAOsAigDqAI8A6ACUAOcAmgDlAKAA5ACn AOIArwDgALkA3gDGANwA2gDaAOwA2AD5ANYA/wDWAP8A1wD/ANgA/wDYAP8A/woQAP8DDgD/AA0A /wASAP8AGgD/ACYA/AAyAPcAPwD0AEoA8QBVAO0AXgDqAGYA6ABuAOUAdADjAHoA4gCAAOAAhQDe AIsA3ACQANsAlgDYAJwA1QCjANMAqwDRALUAzgDBAMwA0QDLAOcAyQD1AMgA/wDIAP8AyAD/AMgA /wDIAP8A/wwMAP8GCAD/AgoA/wAPAP8AFQD8ACAA8QAsAOwAOQDpAEUA5QBPAOEAWQDeAGEA2wBo ANcAbwDUAHUA0gB7ANAAgADOAIYAzACMAMsAkgDJAJgAxwCgAMUAqADDALEAwQC8AL8AywC9AOMA vADyALsA/QC7AP8AugD/ALoA/wC6AP8A/w4FAP8JAAD/CQUA/wYLAP8BEADwABkA5gAlAOEAMgDc AD8A1gBJANEAUwDOAFsAywBjAMgAagDGAHAAxQB2AMMAewDBAIEAwACHAL4AjgC8AJQAuwCcALkA pAC3AK4AtQC5ALMAyACxAN8AsAHvAK8B+wCuAv8ArQP/AK0D/wCtA/8A/xAAAP8OAAD/DQAA9gsD APIHCgDiAREA2wIdANIDKwDMAzcAyARDAMQETQDBBFYAvgVdALwFZAC6BWsAuAVxALcFdgC1BXwA swaDALIGiQCwBpEArweZAK0HoQCrB6sAqQi3AKgJxgCmCt0ApQvwAKMM/QCiDf8AoQ3/AKEN/wCg Df8A/xEAAPwSAADsEwAA4hMAANsPAwDWCQsAzggUAMYKIgDADDAAvA08ALgNRgC1DU8Asg5XALAO XwCuDmUArQ5rAKsOcQCqDngAqA5+AKcPhQClD40ApA+WAKIQnwCgEKkAnxC1AJ0RxQCbEd4AmRLx AJcT/wCWFP8AlRT/AJUU/wCUFP8A/xUAAO0bAADgHwAA0h8AAMkbAADEFAUAwRAOALoSGwC0EykA sBQ1AKwVQACpFUkAphVSAKQWWQCiFmAAoRZmAJ8WbACeFnIAnBZ5AJsXgACZF4gAmBeRAJYYmwCU GKYAkxmyAJEZwQCQGtgAjRvuAIsc/QCKHP8Aihz/AIkc/wCJHP8A9B0AAOQlAADTKQAAxyoAALwm AAC2IAAAtBkLAK4aFQCoHCMApB0vAKEeOgCeHkQAmx5MAJkeVACXH1sAlR9hAJQfZwCSH20AkR90 AI8gfACOIIQAjCCNAIoglwCJIaIAhyGuAIYivQCFItEBgiPrAYEk+wGAJP8BfyT/AX8k/wF/JP8B 7CUAANstAADJMQAAvDEAALEuAACrKQAApyQFAKMjEQCeJB0AmiUqAJYmNQCTJj8AkSZHAI8mTwCN JlYAiydcAIknYgCIJ2kAhidvAIUndwCDJ38AgSeJAYAokwF+KJ4BfSmrAXspuQF6Kc0BeCroAXcr +QF2K/8Bdiv/AXUr/wF1Kv8B5SwAANA0AADBOAAAszgAAKg1AACiMQAAnS0AAJkqDgCUKxgAkCwk AI0tMACKLToAhy1DAIUtSgCDLVEAgS5YAIAuXgB+LmQAfS5rAHsucwF5LnsBeC6FAXYujwF0L5sB cy+oAnEvtgJwMMkCbzDlAm4x9wJtMf8CbTH/Am0x/wJtMf8C3zIAAMk5AAC7PgAArD0AAKE6AACa NwAAlTMAAJAxCgCMMRQAhzIgAIQzKwCBMzUAfzM+AH0zRgB7M00AeTNUAHczWgB2M2EAdDNnAXI0 bwFxNHcBbzSBAW40jAJsNJgCajWlAmk1swNoNcYDZzbiA2Y29QNmNv8CZjb/AmY2/wJmNv8C2DcA AMQ+AAC1QgAApkEAAJs/AACTPAAAjTgAAIg2BwCENxEAgDccAHw4JwB6ODEAdzk6AHU5QgBzOUkA cTlQAHA5VwBuOV0AbDlkAWs5awFpOXQBaDl+AmY5iQJkOZUDYzqiA2I6sQNhOsMDYDvgBF878wNf O/8DXzv/A187/wJfO/8C0TsAAMBCAACwRQAAoUQAAJVDAACNQAAAhz0AAII7AgB9Ow4AeTwYAHU9 IwBzPS0AcD02AG49PwBsPUYAaz1NAGk9UwBnPVoAZj1hAWQ9aAFjPXEBYT57Al8+hgJePpMDXD6g A1s/rwRaP8EEWj/dBFk/8gRZP/8DWT//A1k//wNZP/8DzD8AALxGAACrSAAAnEcAAJFGAACIRAAA gkAAAHw/AAB3QAwAc0AVAG9BIABsQSoAakEzAGhBOwBmQkMAZEJKAGNBUABhQVcAYEJeAV5CZQFd Qm4CW0J4AlpChANYQpADV0KeBFZDrQRVQ78EVEPaBFRD8QRUQ/4DVEP/A1RD/wNUQ/8DyEIAALhJ AACnSwAAmEoAAI1JAACDRwAAfUMAAHZDAABxRAoAbUQSAGpFHQBnRScAZEUwAGJFOABgRT8AX0VH AF1FTQBbRVQAWkZbAVlGYwFXRmwBVkZ2AlRGgQNTRo4DUkecBFBHqwRQR70ET0fWBU9H7wRPR/0E T0f/A09H/wNQR/8DxEUAALVNAACjTQAAlUwAAIlLAAB/SgAAeEYAAHFHAABsRwcAaEgQAGRIGgBh SSQAX0ktAF1JNQBbST0AWUlEAFdJSgBWSVEAVUpZAVRKYQFSSmkBUUp0Ak9KfwNOSowDTUqbBExL qgRLS7wESkvTBUpL7gRLS/0ES0r/A0tK/wNLSv8DwUgAALJQAACgTwAAkU8AAIVOAAB7TQAAc0kA AGxKAABnSwQAYkwOAF9MFwBcTSEAWk0qAFhNMgBWTToAVE1BAFNOSABSTk8AUE5XAU9OXwFOTmcB TE5yAktOfQJJTosDSE6ZBEdPqARGT7oERk/RBEZP7QRGTvwERk7/A0dO/wNHTv8DvUwAAK5SAACc UQAAjVEAAIFRAAB3UAAAbkwAAGdOAABiTwAAXVANAFpQFABXUR4AVVEnAFNRMABRUjgAUFI/AE5S RgBNUk0ATFNVAEpTXQFJU2UBSFNvAkZTewJFU4kDQ1OXA0JTpwRBU7gEQVPPBEFT7ARBUvsDQlL/ A0JS/wNCUf8Duk8AAKpUAACYVAAAiVQAAH1TAABzUwAAaVEAAGJSAABcUwAAWFQKAFRVEgBSVRsA T1YkAE5WLQBMVzUAS1c8AEpXRABIV0sAR1hSAEZYWgFEWGMBQ1htAUFYeQJAWIYCPliVAz1YpQM8 WLcEPFjNBDxX6gM8V/oDPVb/Az1W/wM9Vv8DtlMAAKVXAACUVwAAhVYAAHlWAABvVgAAZVUAAFxW AABXWAAAUlkHAE5aEABMWhgASlshAEhcKgBHXDIARVw6AERdQQBDXUgAQl1QAEBdWAA/XWEBPV1r ATxddgI6XYQCOV2TAjhdowM3XbUDNl3LAzZc6AM3XPkDN1v/Azhb/wM4Wv8DslcAAKBaAACPWQAA gVkAAHVZAABrWQAAYFoAAFZbAABRXQAATF4CAEhgDQBFYBQARGEeAEJiJgBAYi4AP2I2AD5jPgA9 Y0UAPGNNADtjVQA5Y14AOGNoATZjdAE1Y4EBM2ORAjJjoQIxY7MCMWPIAjFi5wIxYfgCMWH/AjJg /wIyYP8CrlwAAJtdAACKXQAAfF0AAHBdAABmXQAAXF4AAFJgAABMYgAARWUAAEFmCgA+ZxEAPGga ADtoIgA5aSsAOGkyADdqOgA2akEANWpJADRqUgAzalsAMWplADBqcAEuan4BLWqOASxqnwErarAB KmrGASpp5QEqaPYCK2f/Aitn/wIrZ/8CqWEAAJVgAACEYAAAd2AAAGxhAABiYQAAWGMAAE5mAABH aAAAQGsAADpuBQA2bw4ANHAVADNwHgAycSYAMHEuAC9xNQAucj0ALXJFACxyTQArclcAKnJhACly bQAncnsAJnKLACRynAEjcq4BI3LDASNx4gEjcPQBI2//ASNu/wEjbv8BoWUAAI5kAAB/ZAAAcmQA AGhlAABeZgAAVGkAAElsAABCbwAAO3IAADR1AAAueAoAK3kRACp5GAApeiEAJ3ooACZ6MAAlezgA JHtAACN7SAAie1IAIXtcACB7aAAffHYAHXyGABx7mAAbe6oAGnu/ABp73gAaefIAG3j+ABt3/wEb d/8BmWkAAIhpAAB5aQAAbWkAAGNqAABZbAAAT28AAEVzAAA9dwAANXoAAC59AAAngQMAIoMNACCE EgAfhBoAHYQiAByFKgAbhTEAGoU5ABmFQgAYhkwAF4ZWABaGYwAVhnEAFIaBABKGkwARhqYAEYW7 ABCF1gARg+8AEYL7ABKC/wASgf8AkW4AAIFtAAB0bgAAaW4AAF1wAABTcwAASXcAAEB8AAA3gAAA L4MAACeHAAAhigAAGo0GABWPDQATkBMAEpAaABKQIgARkCoAEJEyABCROwAPkUQADpFPAA2RXAAM kWoAC5F6AAqRjQAIkJ8AB5CzAAePyQAHj+YAB470AAiN/AAIjf8AiXMAAHtzAABvcwAAY3UAAFd4 AABNfQAAQ4EAADmGAAAwigAAKI4AACGRAAAalQAAE5cAAA6aCAALnA4ACZwTAAicGgAHnCIABpwq AAScMwADnD0AAp1IAACdVAAAnWIAAJxyAACchAAAnJcAAJuqAACbvwAAmtsAAJrsAACa9QAAmfgA gnkAAHZ5AABoegAAXH4AAFGCAABGhwAAPIwAADKRAAAplQAAIZkAABmdAAASoAAADqMAAAmmBQAD pwwAAKcQAACnFQAAqBwAAKgjAACoKwAAqTQAAKk/AACpSwAAqVkAAKloAACpegAAqY4AAKmhAACo tQAAqMsAAKfkAACn7wAAp/MAfYAAAG+BAABhhAAAVYkAAEmOAAA+lAAANJkAACqeAAAhogAAGaYA ABKpAAANrAAAB68AAACyAAAAswcAALMMAACzEAAAtBUAALQbAAC1IgAAtisAALc1AAC3QAAAuE4A ALhdAAC4bgAAuIIAALiXAAC4qgAAt74AALfSAAC35gAAt+oAdogAAGeLAABakAAATpYAAEKcAAA3 ogAALKcAACKrAAAZrwAAEbMAAAu2AAAEuQAAALwAAAC+AAAAvgAAAL8GAADACwAAwQ8AAMITAADD GQAAxCAAAMUpAADHNAAAyEIAAMlRAADJYgAAyXUAAMmKAADJnwAAyrEAAMrBAADJ0QAAydkAbpMA AGCYAABTngAARqQAADqrAAAvsAAAJLUAABm4AAAQvAAACr8AAAHBAAAAxAAAAMgAAADKAAAAygAA AMwAAADNAwAAzggAANANAADREAAA0xYAANYeAADaKAAA3TQAAN5DAADfVAAA32cAAOB8AADgkQAA 4KQAAOCyAADgvgAA4MMAZp8AAFmmAABMrQAAP7QAADK4AAAkvAAAGL8AABDDAAAIxwAAAMoAAADN AAAA0QAAANUAAADYAAAA2QAAANsAAADdAAAA3wAAAOEEAADjCgAA5Q4AAOcTAADqHAAA7ScAAPA1 AADxRgAA8lgAAPNrAADzgAAA9JQAAPSjAAD0rgAA9LIA/wATAP8AEQD/ABEA/wAVAP8AHwD/ACwA /wA5AP8ARQD/AFAA/wBaAP4AYwD7AGsA+QByAPcAeAD1AH4A9ACEAPIAiQDxAI4A8ACTAO4AmQDt AJ8A7ACmAOoArgDoALgA5gDFAOUA2wDjAO0A4gD7AOIA/wDhAP8A4QD/AOEA/wDhAP8A/wAQAP8A DgD/AA0A/wASAP8AGwD/ACgA/wA0AP4AQQD7AEwA9wBWAPQAXwDxAGYA7wBtAOwAdADqAHoA6QB/ AOcAhQDmAIoA5QCPAOMAlQDhAJsA4ACiAN4AqgDbALQA2QDAANYA0ADTAOgA0gD3ANEA/wDRAP8A 0AD/ANAA/wDQAP8A/wANAP8ACQD/AAoA/wAPAP8AFgD7ACIA9wAvAPQAOwDwAEcA7QBRAOkAWgDl AGIA4gBpAOAAbwDeAHUA3AB6ANoAgADYAIUA1QCLANMAkQDRAJcAzwCeAM0ApgDLAK8AyQC6AMcA yQDFAOIAxADyAMMA/gDCAP8AwQD/AMIA/wDCAP8A/wMGAP8AAQD/AAYA/wAMAPkAEQDxAB0A6wAp AOcANgDjAEEA3wBLANsAVADVAFwA0gBjAM8AagDNAHAAywB1AMkAewDIAIAAxgCGAMUAjADDAJMA wQCaAL8AogC9AKsAuwC2ALkAxAC3ANoAtgDtALQA+gC0AP8AtAD/ALQA/wC0AP8A/wQAAP8AAAD/ AAAA/wAGAOwADQDlABYA3gAiANcALwDRADsAzQBFAMoATgDGAFcAxABeAMEAZAC/AGoAvQBwALwA dQC6AHsAuQCBALcAhwC1AI4AswCVALIAngCwAKcArgCyAKwAvwCqANEAqADoAKgA9wCnAP8ApwD/ AKYA/wCmAP8A/wYAAP8FAADxAwAA6AAAAOEABwDVABAAzQAbAMcAJwDDADMAvwA+ALwASAC5AFEA tgBYALQAXwCyAGUAsABqAK8AcACtAHYArAB8AKoAggCpAIkApwCRAKUAmgCjAKQAoQCuAKAAuwCe Ac0AnQLmAJwE9ACbBP8AmgX/AJoF/wCZBf8A/woAAPEOAADkEAAA2Q8AAM4LAADIAwsAwgATALwC HwC3AywAswQ3ALAFQgCtBkoAqgZSAKgHWQCmB18ApQdlAKMHawCiCHEAoAh3AJ8IfgCdCIUAmwmO AJoJlwCYCqEAlgqsAJULugCTC8wAkgzlAJAN9gCPDv8Ajg7/AI4O/wCNDv8A9hEAAOYXAADWGwAA xxkAAL4VAAC5EAAAtwoNALELFwCsDSQAqA4wAKUOOwCiDkQAnw9MAJ0PUwCbD1oAmg9gAJgQZgCX EGwAlRByAJMQeQCSEIEAkBCKAI8RlACNEZ8AixGqAIoSuACIEssAhhPmAIUU9wCDFf8AgxX/AIIV /wCCFf8A7RoAANwhAADKJQAAuyIAALEfAACrGgAAqRQGAKUSEQCgFB4AnBUqAJkVNQCWFj4AlBZH AJIWTgCQFlUAjhdbAIwXYQCLF2cAiRdtAIgXdACGGHwAhRiGAIMZkACBGZsAgBqnAH4atQB9G8cA fBziAHod9QB5Hf8AeB3/AHgd/wB4Hf8A5SIAANApAAC/LAAAsCoAAKcnAACgIwAAnR8AAJoaDgCV HBgAkR0kAI4eLwCMHjkAiR5BAIcfSQCFH1AAgx9WAIIfXACAH2IAfx9pAH0gcAB8IHgAeiCBAHkh jAB3IZcAdSKkAHQisgBzI8MAciPfAHAk8wBvJP8AbyT/AG4k/wBuJP8A3SkAAMgwAAC3MgAAqDAA AJ4uAACXKgAAkycAAJAjCgCMIxMAiCQfAIQlKgCCJTQAgCY9AH0mRAB8JksAeiZSAHgmWAB3Jl4A dSZlAHQnbAByJ3QAcSd9AG8oiABuKJQAbCihAGsprwFqKcABaSrbAWcq8QFnK/8BZiv/AWYq/wFm Kv8B1C8AAMI2AACvNgAAoTUAAJY0AACQMAAAii0AAIcqBgCDKRAAfyoaAHwrJQB5Ky8Adyw4AHUs QABzLEcAcSxNAHAsVABuLFoAbSxhAGstaABqLXAAaC16AGcuhQBlLpEBZC6eAWIvrAFhL70BYTDV AWAw7wFfMP0BXzD/AV8w/wFfMP8BzTQAALw7AACpOgAAmzoAAJA4AACJNQAAgzIAAH8wAQB7Lw4A dzAWAHQwIQBxMSsAbzE0AG0xPABrMUMAajFKAGgyUABnMlcAZTJdAGQyZQBiMm0AYTN3AF8zggFe M44BXTScAVs0qgFaNbsBWjXSAVk17QFZNfwBWDX/AVg1/wFZNf8ByDgAALc+AACkPgAAlj0AAIs8 AACDOgAAfTcAAHg0AAB0NAsAcDUTAG01HQBqNScAaDYwAGY2OABkNj8AYzZGAGE2TQBgNlMAXjda AF03YgBcN2oAWjh0AVk4fwFXOIwBVjmZAVU5qAJUObkCUzrPAlM66wJTOvsBUzr/AVM5/wFTOf8B xDwAALJBAACgQAAAkkAAAIY/AAB+PQAAeDoAAHM4AABuOQgAajkRAGc5GgBkOiQAYjosAGA6NABe OjwAXTtDAFs7SgBaO1AAWDtXAFc7XwBWPGcAVDxxAVM8fAFSPYkBUT2XAU89pgJOPrcCTj7NAk4+ 6QJNPvoCTj7/AU49/wFOPf8BwD8AAK5DAACcQwAAjkMAAIJCAAB6QAAAcz0AAG08AABoPQUAZD0O AGE+FwBePiEAXD4pAFo+MQBYPjkAVz5AAFU/RgBUP00AUz9VAFJAXABQQGUAT0BvAU5BegFNQYcB S0GWAUpBpQJJQrUCSULLAklC6AJJQvkCSUH/AklB/wFJQf8BvUMAAKpFAACYRQAAikUAAH9FAAB2 QwAAb0AAAGhAAABjQQEAX0ENAFxBFABZQh0AV0ImAFVCLgBTQjYAUUI9AE9CQwBPQ0sATkNSAE1E WgBMRGMASkRtAUlFeAFIRYUBR0WUAUVFowJFRrQCREbJAkRG5wJERfgCREX/AkVF/wJFRf8BukYA AKZIAACUSAAAhkgAAHtHAAByRgAAakIAAGNDAABeRAAAWkULAFZFEgBURhsAUUYjAE9GKwBORjMA TEc6AEtHQQBKR0kASUhQAEhIWABHSGEARklrAERJdgFDSYMBQkmSAUFJogJASbMCP0rHAj9K5QI/ SfcCQEn/AkBI/wJASP8BtkkAAKJKAACRSgAAg0oAAHdKAABuSQAAZUUAAF5HAABZSAAAVUkIAFFK EABPShgATEohAEpLKQBJSzEAR0s4AEZMPwBFTEYARExOAENNVgBCTV8AQU1oAEBNdAE+TYEBPU2Q ATxNoAE7TrECOk7GAjpO5AI7TfYCO03/ATtM/wE8TP8Bs00AAJ5MAACNTAAAf0wAAHRMAABqTAAA YEoAAFlLAABUTAAAUE0FAExODgBJTxUAR08eAEVPJgBEUC4AQlA1AEFQPQBAUUQAP1FLAD5RUwA9 UlwAPFJmADpScgA5Un8BOFKOATdSngE2Uq8BNVLEATVS4gE2UvUBNlH/ATZQ/wE3UP8Brk8AAJlP AACJTwAAe08AAHBPAABmTwAAXE4AAFRPAABPUQAASlIBAEZTDABDVBIAQVQbAEBVIwA+VSsAPVYy ADxWOgA7VkEAOlZJADlXUQA4V1oANldjADVXbwA0V3wBM1eMATFXnAEwV60BMFfCATBX4AEwVvQB MVb/ATFV/wExVf8BqFIAAJVSAACEUgAAd1IAAGxSAABiUgAAWFMAAE9UAABJVgAARFcAAEBZCAA9 WhAAO1oXADlbIAA4WycAN1wvADZcNgA1XD4ANFxGADNdTgAxXVcAMF1hAC9dbAAuXXoALF2JACtd mgEqXasBKl2/ASld3gEqXPIBKlv+AStb/wErWv8Bo1UAAI9VAAB/VQAAclUAAGdWAABeVgAAVFcA AExZAABFWwAAP10AADpfBAA2YA0ANGETADJiHAAxYiMAMGIrAC9jMgAuYzoALWNCACxjSgAqZFMA KWRdAChkaQAnZHYAJmSGACVklwAkZKkAI2S9ACJk2gAjY/EAI2L9ASRh/wEkYf8BnFgAAIlYAAB6 WQAAblkAAGNZAABaWgAAUFwAAEheAABBYAAAOmMAADRmAAAvaAoALGkQACppFwApah8AKGomACdq LgAmazUAJWs9ACRrRgAja08AImxZACBsZQAfbHIAHmyCAB1slAAcbKYAG2u6ABpr1AAbau4AHGn8 ABxo/wAcaP8AlVwAAINcAAB1XAAAaV0AAF9dAABWXgAATGEAAENkAAA8ZwAANWoAAC9tAAAocAQA I3INACFyEgAgcxoAH3MhAB5zKAAddDAAHHQ4ABt0QAAadEoAGXRUABd1YAAWdW4AFXV+ABR1kAAT dKIAEnS2ABF0zwASc+wAEnL6ABNx/wATcf8AjmAAAH1gAABvYQAAZWEAAFtiAABRZAAASGcAAD5r AAA3bgAAMHEAACl1AAAieAAAHHsHABd9DgAWfRMAFX0bABR+IgATfioAEn4xABF+OgARfkQAEH9O AA9/WgAOf2gADX94AAx/igALfp0ACn6wAAl9xgAKfeQACnz0AAt7/QALev8AhmUAAHdlAABqZQAA YWYAAFZoAABMawAAQm8AADlzAAAxdwAAKnoAACN+AAAcgQAAFYQAABCHCAANiQ4ADIkUAAyJGwAL iSMACokrAAmJMwAIiT0ABolIAAWJVAAEiWEAAolxAAGJgwAAiZYAAIipAACHvgAAh9oAAIbsAACG 9QAAhvoAfmoAAHFqAABnawAAW2wAAFBwAABGdAAAPHgAADN9AAAqgQAAI4UAAByIAAAVjAAAEI8A AAySBgAGkwwAApMRAACUFgAAlB0AAJQkAACVLAAAlTUAAJVAAACVTAAAllkAAJZpAACVegAAlY4A AJShAACUtQAAk8wAAJLmAACS8gAAkvcAeHAAAG1wAABgcgAAVHUAAEl5AAA/fgAANYMAACyIAAAj jQAAG5EAABSUAAAPlwAACpoAAASdAwAAngkAAJ8OAACfEgAAoBcAAKAdAAChJQAAoi0AAKI3AACj QwAAo1AAAKNfAACjcQAAo4QAAKKZAACirQAAocIAAKHcAACh6wAAoPIAc3YAAGZ3AABZewAATYAA AEKFAAA4iwAALpAAACSVAAAbmgAAFJ4AAA6hAAAJpAAAAqcAAACqAAAAqwQAAKsKAACsDQAArREA AK0WAACuHAAAryQAALAtAACxOQAAsUYAALJVAACyZgAAsnkAALKOAACxowAAsrcAALHKAACx4AAA sekAbH4AAF+CAABShwAARo0AADuTAAAwmQAAJp4AAByjAAATpwAADasAAAeuAAAAsgAAALUAAAC3 AAAAuAAAALkCAAC5CAAAugwAALsQAAC8FAAAvRsAAL8jAADBLQAAwjoAAMJJAADDWgAAw2wAAMSC AADElwAAxKsAAMS8AADEywAAxNoAZYkAAFiOAABLlQAAP5sAADOiAAAoqAAAHa0AABSxAAANtgAA BrkAAAC8AAAAvwAAAMMAAADEAAAAxQAAAMYAAADHAAAAyQQAAMoJAADLDQAAzREAAM8YAADSIQAA 1S0AANY8AADYTQAA2V8AANpzAADaigAA254AANuuAADbugAA3MMAXpYAAFGcAABEowAAOKoAACyx AAAgtwAAFbsAAA2+AAAEwgAAAMUAAADJAAAAzQAAANAAAADSAAAA0gAAANUAAADWAAAA2QAAANsA AADeBQAA4AoAAOIPAADlFgAA6CAAAOwtAADtPgAA7VEAAO5lAADvegAA748AAPCfAADwqwAA8LMA /wAQAP8ADgD/AA4A/wASAP8AHQD/ACkA/wA1AP8AQQD/AE0A/gBWAPsAXwD4AGYA9gBtAPQAdADy AHkA8QB/APAAhADuAIkA7QCPAOsAlQDqAJsA6ACiAOYAqgDlALMA4wDAAOEA0gDgAOoA3wD5AN0A /wDdAP8A3QD/AN4A/wDeAP8A/wANAP8ACgD/AAkA/wAPAP8AGAD/ACQA/gAxAPsAPQD4AEgA9ABS APAAWgDtAGIA6wBpAOkAbwDnAHUA5QB6AOMAfwDiAIUA4ACKAN4AkADcAJYA2gCdANgApQDVAK8A 0gC6ANAAygDOAOMAzQD0AMsA/wDLAP8AywD/AMsA/wDLAP8A/wAIAP8AAwD/AAUA/wAMAPwAFAD3 AB8A8gArAO8ANwDrAEIA5wBMAOQAVQDgAF0A3QBkANoAagDYAHAA1QB1ANIAegDQAIAAzwCFAM0A iwDLAJIAyQCZAMcAoQDFAKoAwwC1AMEAwwC/ANoAvgDuAL0A/AC8AP8AvAD/ALwA/wC8AP8A/wAA AP8AAAD/AAAA+QAHAPEAEADqABoA5AAlAN8AMQDbADwA1wBHANIAUADOAFcAywBeAMkAZQDGAGoA xQBwAMMAdQDBAHoAwACAAL4AhgC8AI0AugCUALkAnAC3AKUAtQCwALMAvQCxAM8ArwDoAK4A+ACu AP8ArQD/AK0A/wCtAP8A/wAAAP8AAAD9AAAA7gABAOMADADaABQA0QAfAMwAKwDIADYAxQBAAMIA SgC/AFIAvABZALoAXwC4AGUAtgBqALQAbwCzAHUAsQB6ALAAgQCuAIgArQCPAKsAmACpAKEApwCr AKUAuACjAMgAogDiAKEA8wCgAP4AoAD/AKAA/wCgAP8A/wAAAPYAAADqAAAA4AAAANMABgDJAA8A wgAYAL0AJAC5AC8AtgA6ALQAQwCxAEwArgBTAKwAWQCqAF8AqQBkAKcAagCmAG8ApAB1AKMAewCh AIIAoACKAJ4AkwCcAJ0AmgCnAJgAtACWAMMAlQDcAJQA7wCTAPsAkwD/AJMA/wCSAP8A+QUAAOoL AADcDQAAywoAAMIFAAC8AAoAtgARALEAHACuACgAqgAzAKcAPQCkAEUAogBNAKAAUwCeAFkAnABf AJsAZACaAGoAmABwAJcAdgCVAH4AkwCGAJIBjwCQAZkAjgKkAIwCsQCLA8AAiQXWAIgG7QCIB/oA hwj/AIYI/wCGCP8A7w8AAN4UAADKFQAAvBIAALMQAACuDAAAqwYNAKcDFQCiBSAAnwcsAJwINgCZ CD8AlwlHAJUJTgCTCVQAkQpaAJAKXwCOCmUAjQprAIsKcgCKC3kAiAuCAIcLjACFDJcAgwyiAIEN sACADcAAfw3YAH0O7wB8D/0Aew//AHsQ/wB7EP8A5hcAANEeAAC9HQAArxwAAKYZAAChFQAAnhAE AJ0NDwCYDhkAlA4lAJEPLwCPEDkAjBBBAIoQSACIEE8AhxBVAIUQWwCEEWEAghFnAIARbgB/EXUA fRF+AHwSiAB6EpQAeBKgAHcTrgB1E74AdBTVAHMV7gBxFv0AcRb/AHEW/wBwFv8A3B8AAMYlAACz JQAApSMAAJwhAACWHgAAkhkAAJEUCwCNFBQAiRUfAIYWKQCDFjMAgRc8AIAXQwB+F0oAfBdQAHoX VgB5GFwAdxhiAHYYaQB0GHEAcxl6AHEZhABvGpAAbhqdAGwbqwBrHLsAahzQAGkd7ABoHvsAaB7/ AGce/wBnHv8A0SYAAL0qAACrKgAAnSoAAJMoAACNJQAAiCIAAIYdBgCDGxAAfxwaAHwdJAB6HS4A dx42AHYePgB0HkUAch9LAHEfUQBvH1gAbh9eAGwfZQBrIG0AaSB2AGghgQBmIY0AZSKaAGMiqABi I7gAYSPNAGAk6QBgJPoAXyT/AF8k/wBfJP8AyiwAALYvAACkLwAAli8AAIwtAACFKgAAgCgAAH0k AAB6Ig0AdiMVAHMjIABxJCkAbyQyAG0kOgBrJUEAaiVHAGglTQBmJVQAZSVaAGQmYQBiJmkAYSZy AF8nfQBeJ4oAXSiXAFsppQBaKbUAWirKAFkq5wBYKvgAWCr/AFgq/wBYKv8AxTEAAK8zAACeMwAA kDMAAIYyAAB/LwAAeS0AAHUqAAByKAoAbygSAGspGwBpKSUAZyotAGUqNQBjKj0AYipDAGAqSgBf K1AAXitXAFwrXgBbLGYAWSxvAFgtegBXLYcAVi6VAFQuowBTL7MAUy/HAFIv5QBSL/cAUi//AFIv /wBSL/8AwTYAAKo2AACZNgAAizYAAIE1AAB5MwAAczEAAG8vAABrLgYAaC0QAGQuGABiLiEAYC8q AF4vMQBcLzkAWy9AAFkvRgBYL00AVzBTAFYwWwBUMWMAUzFsAFIydwBRMoQATzOSAE4zoQBNM7EA TTTFAUw04wFMNPYATDT/AEw0/wBMM/8AuzkAAKY5AACVOQAAhzkAAHw5AAB0NwAAbjQAAGkzAABl MgIAYTINAF4yFABcMx4AWjMmAFgzLgBWMzUAVTQ8AFM0QwBSNEoAUTRQAFA1WABONWAATTZqAEw2 dQBLN4IASjeQAEk4nwBIOLABRzjDAUc44QFHOPUBRzj/AUc4/wFHOP8BtzsAAKI8AACRPAAAgzwA AHg8AABwOgAAajcAAGQ2AABgNgAAXDYLAFk3EgBWNxoAVDcjAFI3KwBQNzIATzg5AE04QABMOEcA SzhOAEo5VQBJOV4ASDpoAEc6cwBGO4AARTuOAEQ8ngBDPK4BQjzCAUI93wFCPPMBQjz/AUI8/wFC O/8Bsz0AAJ4+AACNPgAAfz4AAHU+AABsPQAAZjoAAGA5AABbOgAAVzoIAFM7EABROxgATjsgAEw7 KABLOy8ASTw2AEc8PQBHPEQARj1LAEU9UwBEPlwAQz5mAEI/cQBBP34AQD+NAD9AnAA+QK0BPUDA AT1A3QE9QPIBPUD/AT4//wE+P/8BrkAAAJpAAACJQQAAfEEAAHFBAABoQAAAYTwAAFs9AABWPgAA Uj4FAE4/DgBMPxUAST8dAEdAJQBGQCwAREAzAENAOgBCQUIAQUFJAEBBUQA/QloAPkJjAD1DbwA8 Q3wAO0OLADpEmwA5RKsBOUS+AThE2wE5RPEBOUP+ATlD/wE5Q/8BqkIAAJZDAACGQwAAeEMAAG5D AABlQwAAXUAAAFZAAABRQgAATUICAElDDABGQxIAREQaAEJEIgBBRCoAP0UxAD5FOAA9RT8APEZH ADtGTwA6RlcAOUdhADhHbAA3R3oANkiJADVImQA0SKoANEi9ADNI2QA0SPAANEf9ADRH/wA1Rv8A pkQAAJJFAACCRgAAdUYAAGpGAABhRQAAWUQAAFFEAABMRgAASEcAAERHCgBBSBAAP0kYAD1JIAA8 SScAOkouADlKNgA4Sj0AN0tEADZLTAA1S1UANExfADNMagAyTHcAMUyGADBMlwAvTagALk27AC5N 1QAuTO8AL0z9AC9L/wAwS/8AoUcAAI5IAAB+SAAAcUgAAGZJAABdSAAAVUgAAExJAABHSgAAQksA AD9MBgA7TQ4AOU4VADdOHQA2TyQANU8rADNPMwAyUDoAMVBCADBQSgAvUVIALlFcAC1RZwAsUXUA K1GEACpSlQApUqYAKVK5AChS0gApUe4AKVD8ACpQ/wAqT/8AnEoAAIlKAAB6SwAAbUsAAGNMAABa TAAAUUwAAEhNAABDTwAAPVAAADlSAgA1UwwAM1QSADFUGQAwVSEALlUoAC1VLwAsVjcAK1Y+ACpW RgApVk8AKFdZACdXZAAmV3IAJVeBACRXkgAjV6QAIle3ACJXzwAiV+wAI1b6ACNV/wAkVf8Alk0A AIROAAB1TgAAaU4AAF9PAABWTwAATVAAAEVSAAA/UwAAOVYAADNYAAAvWggAK1sPACpbFQAoXB0A J1wkACZcKwAlXDMAJF06ACNdQwAiXUwAIV1WACBeYQAfXm4AHl5+AB1ejwAcXqEAG160ABpdzAAb XekAG1z5ABxb/wAcW/8AkFEAAH5RAABwUQAAZFIAAFtSAABSUwAASlQAAEFXAAA7WQAANVsAAC5e AAAoYAMAJGIMACJjEQAhYxgAH2QgAB5kJwAdZC4AHGQ2ABtlPgAaZUcAGWVRABhlXQAXZWoAFmV6 ABVliwAUZZ4AE2WxABJlyAASZOcAE2P3ABRi/wAUYv8AiVQAAHhVAABrVQAAYFYAAFdWAABPVwAA RlkAAD1cAAA2XwAAMGIAAClkAAAjZwAAHWoHABlsDgAYbBMAFm0aABVtIQAUbSkAFG0wABNtOQAS bkIAEW5MABBuWAAPbmUADm51AA1uhwANbpoADG2tAAttwgALbOAADGvzAA1r/QANav8AglkAAHJZ AABmWQAAXFoAAFRaAABKXAAAQV8AADljAAAxZgAAKmkAACRsAAAdbwAAF3IAABJ1CQAPdw8ADncU AA53GwANdyMADHcqAAt3MwAKdzwACXdHAAh3UgAHd18ABXdvAAR3gAADd5QAAXanAAB2uwABddUA AXTrAAJ09gACdPwAe10AAG1dAABiXgAAWV4AAE5gAABFYwAAPGcAADNrAAArbgAAJHIAAB51AAAX eQAAEnwAAA1/BgAJgQwABYERAAOBFgACgR0AAYEkAACBLQAAgjYAAIJAAACCTAAAglkAAIJoAACC eQAAgo0AAIGgAACAtAAAgMsAAH/nAAB+8gAAfvkAdGIAAGhiAABeYgAAU2QAAElnAAA/awAANnAA AC10AAAleAAAHnwAABeAAAARgwAADYYAAAiJBAACiwoAAIsOAACLEwAAjBgAAIwfAACNJgAAjS8A AI45AACORAAAjlEAAI5gAACOcQAAjoUAAI6ZAACNrQAAjMMAAIzfAACL7gAAi/YAbmgAAGRnAABY aQAATWwAAEJxAAA4dgAAL3sAACZ/AAAehAAAFogAABCMAAAMjwAABpIAAACVAAAAlgcAAJcMAACX DwAAmBMAAJkYAACaHwAAmyYAAJswAACcOwAAnEgAAJxXAACcaAAAnHsAAJyQAACbpQAAm7oAAJrQ AACa5wAAmvEAam0AAF5vAABRcgAARncAADt8AAAxggAAJ4cAAB6MAAAWkQAAEJUAAAqZAAAEnAAA AKAAAACiAAAAowEAAKMGAACkCwAApQ4AAKYSAACnFwAAqB4AAKomAACrMQAAqz4AAKxNAACsXQAA rHAAAKyFAACsmwAAq68AAKvDAACr2QAAqugAZHUAAFd5AABLfgAAP4QAADSKAAApkAAAH5YAABab AAAQnwAACaMAAAGnAAAAqgAAAK4AAACwAAAAsAAAALEAAACyAwAAtAgAALUNAAC2EAAAtxUAALkd AAC7JgAAvDMAAL1BAAC9UgAAvWQAAL55AAC+kAAAvaQAAL23AAC9xgAAvdcAXH8AAFCFAABEiwAA OJIAACyZAAAhnwAAF6QAABCpAAAJrgAAALIAAAC2AAAAuQAAAL0AAAC/AAAAvwAAAMAAAADBAAAA wwAAAMQFAADGCgAAxw4AAMkTAADLHAAAziYAANA1AADRRQAA0lcAANJrAADTggAA05cAANOpAADS uAAA0sQAVYwAAEmTAAA9mgAAMKIAACWoAAAargAAEbQAAAm5AAAAvQAAAMEAAADEAAAAyAAAAMsA AADNAAAAzQAAAM8AAADQAAAA0gAAANQAAADYAAAA2gYAAN0MAADgEQAA4xoAAOYnAADnOAAA6EoA AOldAADqcgAA64gAAOubAADsqAAA7LIA/wANAP8ACwD/AAsA/wAQAP8AGgD/ACYA/wAyAP8APQD/ AEgA+wBSAPgAWgD2AGIA8wBpAPEAbwDwAHUA7gB6AOwAfwDrAIQA6QCKAOgAkADmAJYA5ACdAOIA pQDhAK8A3wC7AN0AywDbAOYA2QD3ANgA/wDYAP8A1wD/ANcA/wDUAP8A/wAIAP8ABAD/AAQA/wAN AP8AFQD+ACEA+gAsAPcAOAD0AEMA8ABNAO0AVQDqAF0A5wBkAOQAagDiAHAA4AB1AN4AegDdAH8A 2wCFANkAiwDVAJEA0wCZANEAoADPAKoAzQC1AMsAxADJAN0AyADxAMcA/wDGAP8AxgD/AMYA/wDH AP8A/wAAAP8AAAD/AAAA/wAKAPgAEQDxABwA7AAnAOkAMgDmAD0A4gBHAN0AUADZAFgA1QBfANIA ZQDQAGoAzgBwAMwAdQDKAHoAyQB/AMcAhQDFAIwAwwCUAMEAnAC/AKUAvQCwALsAvQC6ANAAuADr ALcA+wC2AP8AtgD/ALYA/wC2AP8A/wAAAP8AAAD9AAAA8wAFAOkADgDhABYA2wAhANUALQDRADcA zgBBAMoASgDHAFIAxABZAMIAXwDAAGUAvgBqALwAbwC7AHQAuQB6ALcAgAC2AIcAtACOALIAlwCw AKAArgCqAK0AtwCrAMgAqQDjAKgA9QCnAP8ApwD/AKcA/wCmAP8A/wAAAP4AAADxAAAA5QAAANcA CgDNABEAxwAcAMIAJgC/ADEAvAA7ALoARAC3AEwAtABTALIAWQCxAF8ArwBkAK0AaQCsAG8AqgB0 AKkAegCnAIEApgCJAKQAkQCiAJsAoAClAJ4AsgCdAMEAmwDaAJoA7wCZAP0AmAD/AJgA/wCYAP8A /QAAAPAAAADhAAAA0QAAAMYABAC9AA0AtwAVALMAIACwACsArQA1AKsAPgCoAEYApgBNAKQAVACj AFkAoQBfAKAAZACeAGkAnQBuAJsAdQCaAHsAmACDAJYAjACVAJYAkwChAJEArQCPALsAjQDPAIwA 6QCLAPgAjAD/AIwA/wCMAP8A8wIAAOIHAADMBwAAvwQAALcAAACxAAgAqwAQAKcAGQCkACQAoAAu AJ4ANwCcAEAAmgBHAJgATgCWAFQAlQBZAJMAXgCSAGQAkABpAI8AbwCNAHYAiwB+AIoAiACIAJIA hgCdAIUAqQCDALgAgQDKAIAA5QCAAPUAfwD/AH8A/wB/AP8A6A0AANAQAAC+EAAAsQ4AAKgNAACj CAAAoAIMAJwAEwCYAB0AlQAnAJIAMQCQADkAjgFBAIwBSACKAk4AiQJUAIcCWQCGAl8AhANkAIMD awCBA3IAgAR6AH4EhAB9BY4AewWaAHkGpwB4BrUAdgfIAHUI4wB1CfQAdAr/AHMK/wBzCv8A3RUA AMQXAACxFwAApRYAAJwTAACWEQAAlA0EAJMIDQCOBxUAiwkgAIgJKgCFCjMAgws7AIELQgCAC0kA fgtPAH0MVAB7DFoAegxgAHgMZwB3DG4AdQ12AHQNgAByDYwAcA2ZAG8OpgBtDrUAbA7JAGsP5gBq EPcAaRD/AGkQ/wBpEP8A0B0AALkeAACoHgAAmx0AAJIbAACLGQAAiBUAAIcRBwCFDhAAgQ8aAH4Q JAB7EC0AeRA2AHcRPQB2EUQAdBFKAHMRUABxEVYAcBFcAG4SYgBtEmoAaxJzAGkTfQBoE4kAZhOW AGUUowBjFbMAYhXGAGIW4wBhFvYAYBf/AGAX/wBgF/8AxyIAALAjAACfJAAAkiMAAIkiAACCIAAA fh0AAHwZAAB6FQ0AdxUVAHQWHwBxFigAbxcwAG4XOABsFz8AaxdFAGkYSwBoGFEAZhhYAGUYXgBj GWYAYhlvAGAZeQBfGoUAXRuSAFwboQBbHLAAWhzDAFkd4ABYHvQAWB7/AFge/wBYHv8AvycAAKko AACZKAAAiygAAIInAAB7JQAAdiMAAHMgAABxHAkAbhwRAGscGgBpHSMAZx0sAGUdMwBjHjoAYh5B AGAeRwBfHk0AXh5UAFwfWwBbH2IAWSBrAFggdgBWIYIAVSGQAFQingBTIq4AUiPAAFEj3QBRJPIA UST/AFEk/wBRI/8AuSsAAKMsAACTLAAAhi0AAHwsAAB0KgAAbygAAGslAABpIgUAZiEOAGMiFgBh Ih8AXyMnAF0jLwBcIzYAWiM9AFkkQwBXJEoAViRQAFUkVwBTJV8AUiVoAFEmcwBPJn8ATieNAE0o nABMKKwASym+AEsp2gBKKfEASin/AEsp/wBLKf8Asy4AAJ4vAACOMAAAgTAAAHcvAABvLgAAaisA AGUqAABjJwEAXycMAFwnEwBaJxsAWCgkAFYoKwBVKDIAUyg5AFIpQABQKUYATylNAE4pVABNKlwA TCplAEorcABJK3wASCyLAEctmgBGLaoARS68AEUu1gBFLu8ARS7+AEUu/wBFLf8ArjEAAJoyAACJ MwAAfDMAAHIzAABrMQAAZS8AAGAtAABdLAAAWSwJAFYsEABULBgAUiwgAFAsKABOLS8ATS02AEwt PABKLUMASS1KAEguUQBHLlkARi9jAEUwbQBDMHoAQjGJAEExmABBMqgAQDK7AD8y0wA/Mu4AQDL9 AEAy/wBAMv8AqjMAAJY1AACGNQAAeTYAAG41AABmNQAAYTIAAFwwAABXMAAAVDAGAFEwDgBOMBUA TDEdAEoxJQBIMSwARzEyAEYxOQBEMUAAQzJHAEIyTwBBM1cAQDNgAD80awA+NXgAPTWHADw2lgA7 NqcAOza5ADo20QA6Nu0AOzb8ADs2/wA7Nv8ApjYAAJI3AACCOAAAdTgAAGs4AABjNwAAXTYAAFcz AABTNAAATzQDAEs0DABJNBIARjUaAEU1IgBDNSkAQTUvAEA1NgA/Nj0APjZEAD03TAA8N1UAOzhe ADo4aQA5OXYAODmFADc6lQA3OqUANjq4ADU6zwA2OuwANjr7ADY5/wA3Of8AojgAAI45AAB+OgAA cjsAAGg7AABfOgAAWTkAAFM2AABONwAASjgAAEY4CgBEORAAQTkXAD85HwA+OSYAPDktADs6NAA6 OjsAOTtCADg7SgA3O1MANjxcADU8ZwA0PXQAMz2DADM+kwAyPqQAMT62ADE+zQAxPuoAMT76ADI9 /wAyPf8AnjsAAIs8AAB7PAAAbj0AAGQ9AABcPQAAVTwAAE46AABJOwAARTwAAEE9BwA+PQ4APD0V ADo+HAA5PiMANz4qADY/MQA1PzgAND9AADNASAAyQFAAMUBaADBBZQAvQXIALkKBAC1CkQAtQqIA LEK1ACtCywAsQukALEL5AC1B/wAtQf8AmT0AAIc+AAB3PwAAaz8AAGFAAABZPwAAUj8AAEk+AABE PwAAQEAAADxBBAA5Qg0AN0ISADVDGQAzQyEAMkMoADFELwAwRDYAL0Q9AC5FRQAtRU4ALEVYACtG YwAqRm8AKUZ+AChGjwAnR6EAJkezACZHyQAmRucAJ0b4AChF/wAoRf8AlUAAAIJBAABzQgAAZ0IA AF5CAABVQgAATkIAAEVCAAA/RAAAO0UAADdGAAA0RwoAMUgQAC9IFgAuSR4ALEklACtJLAAqSTMA KUo6AChKQgAnSksAJktVACVLYAAkS20AI0t8ACJLjQAhTJ8AIUyxACBMxwAgS+YAIUv3ACJK/wAi Sv8AkEMAAH5EAABvRAAAZEUAAFpFAABSRQAASkYAAEFHAAA8SAAAN0kAADJLAAAuTQcAK04OAClO EwAnTxoAJk8hACVPKAAkTzAAI1A3ACJQPwAhUEgAIFBSAB9RXQAeUWoAHVF5ABxRigAbUZwAGlGv ABlRxQAZUeQAGlD2ABtP/wAcT/8AikYAAHlHAABrRwAAYEgAAFZIAABOSAAAR0kAAD5LAAA5TAAA M04AAC5QAAAoUwIAJFQLACJVEAAgVRYAH1YeAB5WJAAdViwAHFYzABtXOwAaV0QAGVdOABhXWQAX WGYAFVh1ABRYhwAUWJoAE1esABJXwgASV+EAE1b0ABRV/wAUVf8AhEkAAHRKAABmSwAAXEsAAFNL AABLTAAARE0AADxPAAA1UQAAL1QAAClWAAAkWQAAHlsHABpdDQAYXRIAF10ZABZeIAAVXicAFF4u ABNeNwASXkAAEV9KABFfVQAQX2IAD19xAA5fgwANX5YADV+pAAxevgAMXtoADV3wAA1c/AAOXP8A fk0AAG5OAABiTgAAWE8AAE9PAABIUAAAQFIAADhUAAAwVwAAKloAACRdAAAfXwAAGWIBABNlCQAR Zg8AEGYUAA9mGwAOZyIADWcpAA1nMgAMZzsAC2dFAApnUAAJZ10AB2dsAAZnfQAFZ5AABGajAAJm twADZc8ABGXpAARk9QAEZPwAd1EAAGlSAABdUgAAVFIAAExTAABDVQAAO1gAADNbAAArXgAAJWEA AB9kAAAZZwAAE2oAAA9tBgALcAwACHD/4v/iSUNDX1BST0ZJTEUABAkRAAdwFgAFcB0ABHAkAANw LAACcDUAAHA/AABwSgAAcFcAAHBlAABwdgAAcIoAAG+eAABvsgAAbsgAAG3lAABt8gAAbfkAcFYA AGNWAABZVgAAUVcAAEdYAAA+WwAANl8AAC5iAAAmZgAAH2oAABltAAATcAAADnMAAAt2BAAFeAsA AXgPAAB5EwAAeRkAAHkfAAB6JgAAei8AAHo5AAB6RAAAelAAAHpfAAB6cAAAeoMAAHqYAAB6rAAA ecIAAHjfAAB47wAAd/cAalsAAF9bAABWWwAATFwAAEJgAAA5YwAAMGgAAChsAAAgcAAAGXQAABN3 AAAOewAACX4AAASBAgAAgggAAIMNAACDEAAAhBQAAIUZAACGIAAAhigAAIcxAACHPAAAh0kAAIdX AACHaAAAh3sAAIeQAACGpQAAhboAAIXTAACE6gAAhPQAZWAAAFxgAABRYQAARmQAADxpAAAybQAA KXIAACF3AAAZewAAEoAAAA2DAAAIhwAAAooAAACNAAAAjgQAAI4JAACPDQAAkBAAAJEUAACSGQAA kyAAAJQpAACVMwAAlUAAAJZOAACWXwAAlXIAAJWIAACVnQAAlLIAAJTIAACT4gAAk+4AYWUAAFZm AABKagAAP24AADV0AAAreQAAIX8AABmEAAARiQAADI0AAAaRAAAAlAAAAJgAAACaAAAAmwAAAJwC AACdBwAAngsAAJ8OAAChEgAAohgAAKMgAAClKQAApjYAAKZEAACmVQAApmgAAKZ9AACmlAAApakA AKS9AACk0QAApOQAW2wAAE9wAABDdQAAOHsAAC2BAAAjhwAAGY0AABGSAAALlwAABJwAAACgAAAA owAAAKYAAACoAAAAqQAAAKoAAACsAAAArQQAAK4JAACwDQAAsREAALMXAAC1IAAAtisAALc6AAC3 SwAAuFwAALhxAAC4iAAAuJ0AALixAAC3wgAAt9AAVHYAAEh8AAA8ggAAMYkAACaQAAAblwAAEp0A AAyiAAADpwAAAKsAAACuAAAAsgAAALYAAAC4AAAAuAAAALoAAAC7AAAAvQAAAL4AAADABQAAwQsA AMMQAADGFgAAySAAAMouAADLPgAAzFAAAMxkAADNegAAzZEAAM2kAADNtAAAzcAATYMAAEGKAAA1 kQAAKZkAAB6gAAATpgAADKwAAAOxAAAAtgAAALoAAAC+AAAAwgAAAMYAAADIAAAAyAAAAMoAAADL AAAAzQAAAM4AAADQAAAA0gEAANUIAADZDgAA3RUAAOEhAADiMQAA5EMAAOVWAADmawAA5oIAAOeW AADnpQAA5rAA/wAJAP8ABQD/AAYA/wAOAP8AFgD/ACEA/wAtAP8AOAD9AEMA+QBNAPUAVQDyAF0A 8ABjAO4AaQDsAG8A6gB0AOkAegDnAH8A5gCFAOQAiwDjAJEA4QCZAN8AoQDcAKoA2gC2ANcAxgDV AOEA0wD0ANIA/wDRAP8A0QD/AM8A/wDKAP8A/wABAP8AAAD/AAEA/wAMAP8AEgD6AB0A9gAoAPMA MwDwAD4A7ABIAOgAUADlAFgA4gBeAN8AZADdAGoA2wBvANkAdADWAHoA1AB/ANIAhQDQAIwAzgCT AMwAnADJAKUAxwCwAMYAvgDEANQAwgDuAMEA/gDAAP8AwAD/AL8A/wC+AP8A/wAAAP8AAAD/AAAA +gAHAPEADwDrABgA5gAjAOIALgDgADgA2wBCANUASwDRAFIAzgBZAMsAXwDJAGUAxwBqAMYAbwDE AHQAwgB6AMEAgAC/AIYAvQCOALsAlgC5AKAAtwCqALYAtwC0AMoAsgDmALEA+ACwAP8ArwD/AK8A /wCwAP8A/wAAAP8AAAD3AAAA6gACAOEADADXABMA0AAdAMwAKADJADIAxgA8AMIARQC/AE0AvABT ALoAWQC4AF8AtwBkALUAaQC0AG4AsgB0ALEAegCvAIAArQCIAKwAkQCqAJoAqAClAKYAsQCkAMEA owDcAKEA8gChAP8AoAD/AKAA/wChAP8A/wAAAPcAAADoAAAA2QAAAMsACADDABAAvQAYALkAIgC2 ACwAtAA2ALIAPwCvAEcArABNAKsAVACpAFkApwBeAKYAYwClAGgAowBuAKIAdACgAHoAngCCAJwA iwCbAJUAmQCfAJgArACWALoAlADPAJMA6wCSAPsAkgD/AJIA/wCRAP8A9wAAAOcAAADTAAAAxgAA ALsAAgCzAAwArQASAKoAHACnACYApAAwAKMAOACgAEAAngBHAJwATgCaAFMAmQBYAJcAXQCWAGMA lQBoAJMAbgCSAHQAkAB8AI8AhQCNAI8AiwCaAIoApwCIALUAhgDHAIUA5ACEAPUAhAD/AIMA/wCD AP8A7AAAANMAAADBAQAAtAAAAKwAAACmAAcAoAAOAJ0AFgCaACAAlwApAJUAMgCTADoAkQBBAI8A SACNAE0AjABTAIsAWACJAF0AiABjAIcAaQCFAG8AgwB3AIIAgACAAIoAfgCWAH0AowB7ALAAegDC AHkA3QB4APEAdwD9AHgA/wB4AP8A3goAAMQLAACyDAAApgsAAJ0IAACZBAAAlQAKAJEAEQCOABkA iwAjAIkALACHADQAhQA7AIMAQgCCAEgAgABOAH8AUwB9AFgAfABeAHsAZAB5AGoAeAByAHYAewB0 AIYAcwCSAHEAnwBwAK0AbgC+AG0B1gBtAu0AbAP6AGwD/wBsA/8AzhAAALcRAACmEgAAmhEAAJEQ AACLDgAAiQsDAIcFDACEARMAgQEcAH4CJQB8Ay4AegM2AHgEPAB3BEMAdQVIAHQFTgBzBVQAcQVZ AHAGXwBuBmYAbQZuAGsHeABqB4MAaAiQAGcJnQBlCawAZAm8AGMK1ABjC+wAYgz6AGIM/wBiDP8A wxYAAK0XAACdGAAAkBgAAIcWAACBFAAAfREAAHwOBgB8Cg4AeAoWAHULHwByCygAcAwwAG8MNwBt DD4AbAxEAGsNSgBpDU8AaA1VAGcNXABlDWMAYw5rAGIOdQBgDoEAXw6OAF0PnABcEKsAWxC9AFoQ 1gBZEfAAWRH9AFkR/wBZEf8AuRsAAKUdAACUHgAAiB4AAH4dAAB4GwAAdBgAAHEVAABxEQkAbxAR AGwQGQBpECIAZxEqAGYRMgBkETkAYxE/AGIRRQBgEksAXxJRAF0SWABcEl8AWhNoAFkTcgBXFH0A VhSLAFQVmQBTFakAUha6AFEW0gBRF+0AURf9AFEX/wBRF/8AsiAAAJ4iAACOIgAAgSMAAHciAABw IQAAbB4AAGkbAABnGAQAZhUOAGMWFQBhFh4AXxYmAF0WLQBcFzQAWhc7AFkXQQBYGEcAVhhNAFUY VABTGFwAUhlkAFEZbgBPGnoAThuIAE0blwBLHKYAShy4AEodzwBJHesASR37AEkd/wBKHf8ArCQA AJglAACIJgAAeycAAHEmAABqJQAAZiMAAGIhAABgHgAAXhwLAFsbEgBZHBoAVxwiAFUcKQBUHDAA Ux03AFEdPQBQHUMATx1KAE0eUQBMHlgASx9hAEkfawBIIHcARyCFAEYhlABEIqQARCK2AEMizABD I+kAQyP6AEMj/wBDIv8ApicAAJMpAACDKgAAdioAAG0qAABlKQAAYCcAAFwlAABZIwAAVyEHAFUh DwBSIRYAUCEeAE4hJQBNIiwATCIzAEoiOQBJIkAASCJGAEcjTQBFI1UARCReAEMkaQBCJXUAQCaD AD8mkgA+J6MAPie0AD0nygA9KOgAPSj5AD0n/wA+J/8AoioAAI4rAAB/LQAAci0AAGgtAABhLAAA XCsAAFgoAABUJgAAUSYEAE4lDQBMJRMASiYaAEgmIgBHJikARSYvAEQmNgBDJzwAQSdDAEAnSwA/ KFMAPilcAD0pZgA8KnIAOyqBADorkAA5K6EAOCyyADcsyAA3LOYAOCz4ADgs/wA4LP8AnSwAAIou AAB7LwAAbzAAAGUwAABdLwAAWC4AAFMrAABQKgAATCoAAEkqCwBGKhEARCoXAEIqHwBBKiUAPyos AD4rMwA9KzkAPCtAADssSAA6LFAAOS1ZADguZAA3LnAANi9/ADUvjwA0MJ8AMzCxADIwxwAyMOUA MzD3ADMw/wA0L/8AmS8AAIcxAAB3MgAAazIAAGIyAABaMgAAVDEAAE8vAABLLQAARy4AAEQuCABB Lg4APy4UAD0uHAA7LiIAOS8pADgvLwA3LzYANjA+ADUwRgA1MU4ANDFXADMyYgAyMm4AMTN9ADAz jQAvNJ4ALjSwAC00xQAtNOMALjT2AC8z/wAvM/8AlTEAAIMzAAB0NAAAaDUAAF41AABXNAAAUTQA AEsyAABGMQAAQjIAAD8yBQA8Mg0AOTMSADgzGQA2MyAANDMmADMzLQAyNDQAMTQ7ADA1QwAwNUwA LzZVAC42YAAtN2wALDd7ACs3iwAqOJwAKTiuACg4wwAoOOIAKTj1ACo3/wAqN/8AkjQAAH81AABx NgAAZTcAAFs3AABUNwAATTYAAEc2AABCNQAAPTYAADo2AgA3NwsANDcQADI3FgAxOB0ALzgkAC44 KwAtOTIALDk5ACs5QQAqOkkAKjpTACk7XgAoO2oAJzt5ACY8iQAlPJsAJDytACM8wgAjPOAAJDz0 ACU7/wAlO/8AjTYAAHw4AABtOQAAYjkAAFg6AABROQAASjkAAEQ5AAA9OQAAOToAADU7AAAyOwgA LzwOAC09FAAsPRoAKj0hACk9KAAoPi8AJz42ACY+PgAlP0cAJD9QACNAWwAiQGgAIUB2ACBAhwAf QZkAH0GrAB5BwAAeQd4AH0DzAB9A/gAgP/8AiTkAAHg6AABpOwAAXjwAAFU8AABNPAAARzwAAEA8 AAA4PQAAND4AADBAAAAtQQUAKkIMACdCEQAmQxgAJEMeACNDJQAiQywAIUQzACBEOwAfREQAHkVO AB1FWQAcRWUAG0V0ABpFhQAZRpcAGUapABhGvgAXRdwAGEXxABlE/QAaRP8AhDwAAHM9AABmPgAA Wz8AAFI/AABKPwAARD8AAD1AAAA2QQAAMUMAACxEAAAnRgEAJEcKACFIDwAgSRQAHkkbAB1JIgAc SSkAG0owABpKOAAZSkEAGEpLABdLVQAWS2IAFUtxABRLggATS5QAEkunABJLvAARS9kAEkrwABNK /AAUSf8Afz8AAG9AAABhQQAAV0IAAE5CAABHQgAAQUIAADpDAAAyRQAALUcAAChJAAAjSwAAHk0G ABtPDQAYUBEAF1AXABZQHgAVUCUAFFAsABNRNAASUT0AEVFHABFRUgAQUV8AD1JtAA5SfgANUZEA DVGkAAxRuAAMUdEADVDsAA1Q+gAOT/8AeUMAAGpEAABdRAAAU0UAAEtFAABERQAAPkYAADZIAAAv SgAAKUwAACRPAAAfUQAAGlMAABRWCQARVw4AEFgTABBYGQAPWCAADlgoAA1YMAANWDkADFhDAAtY TgAKWFoACFhoAAdYeQAGWIwABVifAARYswAEV8oABVfmAAVX8wAGVvwAc0YAAGRHAABZSAAAUEgA AEhIAABBSQAAOkoAADJNAAArUAAAJVIAACBVAAAaWAAAFVoAABBdBgAMYAwACmAQAAlgFQAIYBwA B2AjAAVgKwAEYDQAA2A9AAFgSQAAYFUAAGBjAABgcwAAYIYAAF+aAABfrgAAX8QAAF7iAABe8AAA XvgAbEoAAF9LAABVSwAATEwAAEVMAAA9TgAANVAAAC5TAAAnVgAAIFkAABpcAAAVXwAAEGIAAA1l BAAIZwsAA2cOAABoEwAAaBgAAGgfAABpJgAAaS4AAGk4AABpQwAAaU8AAGldAABpbQAAaYAAAGmU AABoqQAAaL8AAGfcAABm7gAAZvcAZk8AAFpPAABRTwAASk8AAEFRAAA4VAAAMFcAAChbAAAhXgAA GmIAABRlAAAQaAAADGsAAAduAwABcAkAAHANAABxEAAAcRQAAHIaAABzIQAAcygAAHMxAABzPAAA dEgAAHNWAABzZgAAc3kAAHOOAABzowAAcrkAAHHSAABx6wAAcPQAYVMAAFZTAABPUwAARVUAADtY AAAyXAAAKmAAACJkAAAbaAAAFGwAAA9vAAALcgAABnYAAAB5AAAAegYAAHoKAAB7DgAAfBEAAH0V AAB+GwAAfyIAAIAqAACANQAAgEEAAIBPAACAXwAAgHEAAICGAACAnQAAf7IAAH7KAAB+5QAAffEA XFgAAFRYAABJWgAAP10AADVhAAAsZQAAI2oAABtvAAAUcwAADncAAAl7AAADfwAAAIIAAACEAAAA hgEAAIYGAACICgAAiQ0AAIoQAACLFQAAjBsAAI4iAACPLAAAjzgAAI9GAACPVgAAj2gAAI9+AACP lQAAjqsAAI3BAACN3AAAjOsAWV0AAE5fAABDYgAAOGYAAC5sAAAkcQAAHHcAABR8AAAOgQAACIUA AACJAAAAjQAAAJAAAACSAAAAkwAAAJQAAACWAwAAlwgAAJgMAACaDwAAmxMAAJ0aAACfIwAAoC4A AKA8AACgTAAAoF4AAKB0AACfjAAAn6IAAJ+3AACeywAAnuAAU2QAAEdoAAA8bQAAMXMAACd5AAAd fwAAFIUAAA2LAAAGkAAAAJQAAACYAAAAnAAAAJ8AAAChAAAAogAAAKQAAAClAAAApwAAAKgEAACq CQAArA0AAK0SAACwGQAAsiMAALIxAACyQgAAslQAALJpAACygAAAspgAALGsAACyvwAAsc4ATG4A AEBzAAA1egAAKoEAAB+IAAAVjgAADpUAAAaaAAAAnwAAAKQAAACoAAAArAAAAK8AAACxAAAAsQAA ALMAAAC1AAAAtgAAALgAAAC6AAAAvAYAAL4MAADAEQAAwxkAAMUmAADFNwAAxkkAAMZdAADHcgAA x4oAAMifAADIrwAAyLwARnoAADmBAAAuiQAAIpAAABeYAAAPnwAAB6UAAACqAAAArwAAALMAAAC3 AAAAvAAAAL8AAADBAAAAwgAAAMQAAADFAAAAxwAAAMkAAADLAAAAzQAAAM8DAADSCgAA1hAAANwa AADdKgAA3jwAAN9QAADgZQAA4XsAAOGRAADiogAA4q0A/wACAP8AAAD/AAMA/wAMAP8AEwD/AB0A /wAoAP4AMwD7AD4A9wBIAPMAUADwAFcA7QBeAOsAZADoAGkA5wBvAOUAdADjAHkA4gB/AOAAhQDe AIwA3ACTANkAnADWAKYA0wCxANEAwADPANoAzgDxAMwA/wDLAP8AywD/AMYA/wDBAP8A/wAAAP8A AAD/AAAA/wAIAPsAEAD2ABkA8gAkAO8ALgDtADkA6ABCAOMASwDgAFIA3QBZANkAXwDWAGQA0wBp ANEAbgDPAHQAzgB5AMwAfwDKAIYAyACOAMYAlgDEAKAAwgCrAMAAuQC+AM0AvADqALsA/AC6AP8A ugD/ALoA/wC2AP8A/wAAAP8AAAD+AAAA9AAEAOsADQDkABQA3wAfANsAKQDYADMA0wA9AM4ARQDK AE0AxwBTAMUAWQDDAF8AwQBkAL8AaQC9AG4AuwBzALoAeQC4AIAAtgCIALQAkACyAJoAsQClAK8A sgCtAMQArADhAKsA9gCqAP8AqgD/AKoA/wCqAP8A/wAAAP0AAADuAAAA4gAAANUACgDNABEAxwAZ AMQAIwDBAC0AvwA3ALsAPwC3AEcAtQBOALIAUwCwAFkArwBeAK0AYwCsAGgAqwBtAKkAcwCoAHoA pgCBAKQAigCjAJQAoQCfAJ8ArACeALsAnADSAJsA7gCaAP8AmgD/AJkA/wCZAP8A/gAAAO4AAADe AAAAywAAAMEABQC5AA0AtAAUALEAHgCuACcAqwAwAKoAOQCnAEEApABIAKIATQChAFMAnwBYAJ4A XQCdAGIAmwBnAJoAbQCYAHMAlwB7AJUAhACUAI4AkgCZAJAApgCOALQAjQDIAIwA5gCLAPkAigD/ AIoA/wCLAP8A8AAAANsAAADHAAAAugAAALAAAACoAAoApAAQAKAAGACdACEAmwAqAJoAMwCYADsA lgBBAJQASACSAE0AkQBSAI8AVwCOAFwAjABhAIsAZwCKAG4AiAB1AIcAfgCFAIgAgwCUAIIAoACA AK8AfwDAAH4A3QB9APIAfQD/AH0A/wB9AP8A4AAAAMYAAAC1AAAAqgAAAKIAAACbAAUAlQANAJIA EwCQABwAjQAkAIsALQCKADQAiAA7AIYAQgCFAEcAgwBNAIIAUgCBAFcAfwBcAH4AYgB9AGgAewBw AHoAeQB4AIMAdgCPAHUAnAB0AKoAcgC6AHEA0QBwAOwAcAD7AHAA/wBwAP8AzQQAALcGAACnBwAA mwYAAJMEAACOAAAAigAIAIYADwCEABYAgQAeAH8AJwB9AC4AfAA2AHoAPAB5AEIAdwBHAHYATAB1 AFIAcwBXAHIAXQBxAGMAbwBrAG4AdABsAH4AawCKAGkAmABoAKYAZwC2AGYAywBlAOcAZQD3AGUA /wBlAP8AwAwAAKsNAACbDgAAjw4AAIYNAACBCwAAfgcBAHwBCwB5ABEAdwAYAHUAIQBzACkAcQAw AG8ANgBuADwAbABCAGsARwBqAE0AaQBSAGgAWABmAF8AZQBnAGMAcABiAXoAYAGHAF8ClQBeAqMA XAOzAFwDxwBbBOQAWwX0AFsG/gBbBv8AtRAAAKESAACREwAAhRMAAHwSAAB2EQAAcw4AAHIMBABx Bw0AbgQSAGwEGwBpBSMAZwUqAGYGMQBkBjcAYwY9AGIHQwBhB0kAXwdOAF4IVQBdCFwAWwljAFoJ bQBYCngAVwqFAFYLkwBUC6IAUwuzAFIMxwBSDOQAUQ31AFEN/wBRDf8ArRUAAJkXAACJGAAAfRkA AHQYAABtFwAAahQAAGcRAABnDgcAZgwOAGMMFQBhDB0AXwwlAF0NLABcDTMAWw05AFoNPwBYDUUA Vw1LAFYOUQBVDlkAUw5hAFIOawBQD3YAThCDAE0QkgBMEKIASxCyAEoRyABJEeUASRH3AEkS/wBJ Ef8ApRkAAJIcAACDHQAAdh4AAG0dAABmHAAAYhoAAF8XAABeFAEAXhEKAFsQEQBZERgAVxEgAFUR JwBUES4AUxE0AFEROwBQEkEATxJHAE4STgBMElUASxNeAEkTZwBIFHMARhSAAEUVjwBEFZ8AQxaw AEIWxQBCF+MAQhf2AEIX/wBCF/8Anx0AAIwgAAB9IQAAcSIAAGgiAABhIQAAXB8AAFkcAABXGQAA VRYGAFQVDgBRFRQATxYcAE4WIwBMFioASxYwAEoWNwBJFz0ARxdDAEYXSgBFGFIAQxhaAEIZZABB GXAAPxp9AD4bjQA9G50APByuADscwwA7HOEAOx31ADsc/wA8HP8AmiEAAIcjAAB4JAAAbCUAAGMl AABcJAAAVyMAAFMgAABRHgAATxwCAE0bDABLGhEASBsYAEcbIABFGyYARBstAEMcMwBCHDkAQBxA AD8dRwA+HU8APR5YADweYgA6H20AOR97ADggiwA3IZsANiGtADUhwQA1Id8ANSHzADYh/wA2If8A liMAAIMmAAB0JwAAaCgAAF8oAABYJwAAUyYAAE8kAABMIgAASSAAAEcgCQBEHw8AQh8VAEAgHAA/ ICMAPiApADwgLwA7ITYAOiE9ADkhRAA4IkwANyJVADYjXwA0I2sAMyR5ADIliQAxJZoAMCWrADAm vwAvJtwAMCbyADAm/wAxJf8AkSYAAH8oAABxKgAAZSoAAFwqAABVKgAATykAAEsoAABIJQAARCQA AEEkBQA/JA0APSQSADskGQA5JB8ANyQmADYkLAA1JTMANCU6ADMmQQAyJkoAMSdTADAnXQAvKGkA Lil3AC0phwAsKZgAKyqqACoqvQAqKtoAKyrxACsq/gAsKf8AjSgAAHwqAABtLAAAYi0AAFktAABR LQAATCwAAEcrAABDKAAAPygAADwoAgA5KAsANygQADUoFgAzKBwAMigjADAoKQAvKTAALyo3AC4q PwAtK0cALCtRACssWwAqLGcAKS11ACgthQAnLZcAJi6oACUuvAAlLtgAJi7wACYu/QAnLf8AiisA AHgtAABqLgAAXy8AAFYvAABOLwAASC4AAEMtAAA/LAAAOywAADcsAAA0LAkAMiwOADAtEwAuLRoA LS0gACstJwAqLi0AKi41ACkvPQAoL0UAJzBOACYwWQAlMWUAJDFzACMxgwAiMpUAITKnACEyuwAg MtQAITLvACIx/AAiMf8Ahi0AAHUvAABnMAAAXDEAAFMxAABLMQAARTEAAEAwAAA7MAAANjAAADMw AAAwMQYALTENACsxEQApMhcAKDIeACcyJAAlMysAJTMyACQzOgAjNEMAIjRMACE1VwAgNWMAHzVx AB42gQAdNpMAHDalABs2uQAbNtIAHDbtAB02+wAdNf8AgjAAAHEyAABjMwAAWTQAAFA0AABJNAAA QjMAAD0zAAA3MwAAMTQAAC41AAArNQIAKDYLACU3EAAkNxUAIjcbACE4IgAgOCgAHzgwAB44NwAd OUAAHDlJABs6VAAaOmAAGTpuABg6fwAXO5EAFzukABY7twAVO9AAFjrsABc6+gAYOf8AfTIAAG00 AABgNQAAVTYAAE02AABGNgAAQDYAADo2AAA0NgAALjgAACo5AAAmOgAAIzsIACA8DgAePRIAHT0Y ABw9HwAbPiUAGj4tABk+NAAXPj0AFj9HABU/UQAUP14AFD9sABNAfAASQI8AEUCiABFAtgAQQM4A ET/rABI/+QASPv8AeTUAAGk3AABcOAAAUjkAAEo5AABDOQAAPTkAADc5AAAxOgAAKzwAACc9AAAi PwAAHkEEABpCCwAYQxAAF0MVABVEGwAURCIAE0QpABNEMQASRDoAEUVDABBFTgAQRVsADkVpAA5F eQANRYwADUWfAAxFsgALRckADEXlAA1E9gANRP8AdDkAAGU6AABYOwAATzsAAEc8AABAPAAAOjwA ADQ8AAAuPgAAKEAAACNCAAAfRAAAGkYAABVICAASSg0AEUoSABBKGAAPSx4ADkslAA1LLQANSzYA DEtAAAtLSgAKS1YACUtkAAhLdAAHS4cABUuaAARLrgAESsQABUrgAAVK8AAGSfoAbjwAAGA9AABU PgAASz4AAEQ+AAA9PgAANz8AADFAAAAqQgAAJEUAAB9HAAAaSQAAFUwAABFOBQAOUQsAC1EQAApR FAAJURsACFEiAAdRKQAFUTIABFI7AANSRgABUlIAAFJfAABSbwAAUoEAAFGWAABRqQAAUb8AAFDc AABQ7gAAUPcAaEAAAFtBAABQQQAASEEAAEFBAAA7QgAANEMAAC1FAAAmSAAAIEsAABtNAAAWUAAA EVMAAA5VBAAKWAoABlgOAAJYEgAAWRcAAFkdAABZJQAAWS0AAFk2AABZQQAAWU0AAFpaAABaaQAA WXwAAFmQAABZpQAAWLoAAFjVAABX7AAAV/YAY0QAAFZFAABNRQAARUUAAD9FAAA3RwAAL0kAAChM AAAiTwAAG1IAABZVAAARWAAADVoAAAldAwAEXwkAAGANAABgEAAAYRQAAGEZAABiIAAAYicAAGIx AABiOwAAYkcAAGJVAABjZAAAYnYAAGKLAABioAAAYbYAAGHPAABg6gAAYPUAXUgAAFJJAABKSAAA Q0gAADpKAAAyTQAAKlAAACNTAAAcVwAAFloAABFdAAANYAAACGMAAANmAQAAZwYAAGgLAABpDgAA ahEAAGsVAABsGwAAbSIAAG0qAABtNAAAbUAAAG1OAABtXQAAbW8AAG2EAABsmgAAbLAAAGvIAABr 5gAAavMAWE0AAE5NAABITAAAPk4AADVRAAAsVAAAJFgAAB1cAAAWYAAAEGQAAAxnAAAHawAAAW4A AABwAAAAcgMAAHIHAABzCwAAdQ4AAHYRAAB3FgAAeBwAAHkjAAB6LQAAejkAAHpHAAB6VgAAeWgA AHp8AAB5lAAAeKoAAHjBAAB33wAAd+8AVFEAAExRAABCUgAAOFUAAC9ZAAAmXgAAHmIAABZnAAAQ awAAC28AAAVzAAAAdwAAAHoAAAB8AAAAfgAAAH8CAACABgAAgQoAAIMNAACEEQAAhhUAAIgcAACJ JQAAijAAAIo+AACJTQAAiV8AAIlzAACIiwAAiKIAAIe5AACH0QAAhugAUlYAAEdXAAA8WgAAMl8A AChkAAAfaQAAFm8AABB0AAAKeQAAAn0AAACBAAAAhQAAAIgAAACKAAAAjAAAAI0AAACPAAAAkAQA AJIIAACTDAAAlRAAAJcVAACZHQAAmycAAJs0AACbRAAAmlYAAJpqAACZggAAmpoAAJiwAACYxwAA l94AS1wAAEBgAAA1ZQAAK2oAACFxAAAXdwAAEH0AAAmDAAABiAAAAIwAAACRAAAAlQAAAJgAAACa AAAAmwAAAJ0AAACfAAAAoAAAAKIAAACkBQAApgoAAKgOAACqFAAArR0AAK0qAACtOQAArUsAAK1f AACtdwAArJAAAKunAACrugAAq8sARWYAADlrAAAucQAAI3gAABl/AAAQhgAACY0AAACTAAAAmAAA AJ0AAAChAAAApQAAAKgAAACrAAAAqwAAAK4AAACvAAAAsQAAALMAAAC1AAAAtwEAALkHAAC8DQAA vxMAAMIfAADCLgAAwkAAAMJUAADBawAAwYMAAMCbAADBrQAAwbwAPnIAADJ4AAAngAAAHIgAABKQ AAAKlwAAAJ0AAACjAAAAqAAAAK0AAACyAAAAtgAAALkAAAC7AAAAvAAAAL4AAADAAAAAwgAAAMQA AADGAAAAyAAAAMsAAADOBQAA0Q0AANYUAADXIwAA2DUAANlJAADaXgAA23UAANuMAADcnwAA3KsA /wAAAP8AAAD/AAAA/wAJAP8AEAD/ABkA/gAkAPwALwD5ADkA9ABDAPAASwDtAFIA6gBZAOcAXwDk AGQA4gBpAOAAbgDeAHMA3AB5ANoAfwDXAIYA1ACOANEAlgDPAKEAzACsAMoAuwDIANIAxgDuAMYA /wDFAP8AxQD/AL8A/wC6AP8A/wAAAP8AAAD/AAAA/gAFAPcADgDyABUA7gAfAOsAKgDpADQA4wA9 AN4ARQDZAE0A1ABTANEAWQDOAF4AzABjAMoAaADJAG0AxwBzAMUAeQDDAIAAwQCIAL8AkAC9AJsA uwCmALkAtAC3AMgAtgDmALUA+wC0AP8AtAD/ALMA/wCuAP8A/wAAAP8AAAD4AAAA7QAAAOUACwDd ABEA1wAaANIAJADPAC4AywA3AMcAQADDAEcAwABOAL4AUwC8AFkAugBeALgAYwC2AGgAtQBtALMA cwCxAHkArwCBAK0AigCrAJQAqQCgAKgArQCmAL4ApQDbAKQA9ACkAP8AowD/AKMA/wCiAP8A/wAA APYAAADmAAAA1wAAAMsABgDEAA4AvgAVALsAHwC5ACgAtwAxALQAOgCwAEEArQBIAKsATgCpAFMA pwBYAKYAXACkAGEAowBnAKEAbACgAHMAngB6AJ0AgwCbAI4AmQCZAJcApgCWALYAlQDMAJQA6wCT AP0AkwD/AJMA/wCTAP8A9wAAAOQAAADQAAAAwQAAALcAAgCvAAsAqwARAKcAGQClACIAowArAKIA MwCfADsAnABCAJsASACZAE0AlwBSAJYAVwCVAFsAkwBhAJIAZgCQAG0AjwB0AI0AfQCMAIcAigCT AIgAoACHAK8AhQDCAIUA4gCEAPcAhAD/AIQA/wCEAP8A5QAAAM0AAAC8AAAArwAAAKYAAACeAAcA mgAOAJYAFACUAB0AkgAlAJEALQCQADUAjQA8AIwAQgCKAEcAiABMAIcAUQCGAFYAhABbAIMAYACB AGcAgABuAH4AdwB9AIEAewCNAHoAmgB4AKkAdwC6AHYA0wB2AO8AdgD+AHUA/wB1AP8A0AAAALsA AACrAAAAnwAAAJcAAACQAAIAiwALAIgAEACGABcAhAAgAIIAJwCBAC8AfwA1AH0APAB8AEEAewBG AHkASwB4AFAAdwBVAHYAWwB0AGEAcwBpAHEAcQBwAHsAbgCHAG0AlQBrAKMAagC0AGoAyQBpAOgA aQD5AGkA/wBpAP8AwAAAAKwAAACcAgAAkAIAAIgAAACDAAAAfwAGAHsADQB5ABIAdwAaAHYAIgB0 ACkAcwAwAHEANgBwADwAbwBBAG0ARgBsAEsAawBQAGoAVgBoAFwAZwBkAGUAbABkAHYAYwCCAGEA kABgAJ8AXwCvAF4AwwBeAOEAXgD0AF0A/wBdAP8AtAcAAKAJAACQCwAAhAsAAHwKAAB3BwAAdAQA AHEACQBvAA8AbQAVAGsAHABpACMAaAAqAGcAMQBlADYAZAA8AGMAQQBiAEYAYABMAF8AUgBeAFgA XQBfAFsAaABaAHIAWAB+AFcAjABWAJsAVQCrAFQAvgBUANoAUwDvAFQA+wBUAP8AqQ0AAJYOAACH EAAAehAAAHIQAABsDgAAaQwAAGcJAwBmBAsAZAAQAGIAFwBgAB4AXgAlAF0AKwBcADEAWgA3AFkA PABYAEIAVwFHAFYBTgBVAlQAUwJcAFIDZQBRA28ATwR7AE4EigBNBZkATAWpAEsFvABKBtQASgft AEoH+QBKB/8AoRAAAI4SAAB+FAAAcxQAAGoUAABkEwAAYBEAAF4PAABdDQUAXQkNAFoGEgBYBxkA VgcgAFUHJwBTBy0AUggzAFEIOABQCD4ATwlEAE4JSgBMCVEASwpZAEoKYgBIC20ARwt6AEYMiABE DJgAQwypAEINvABCDdUAQg3uAEIN+wBCDf8AmhQAAIcWAAB4GAAAbBkAAGMZAABdGAAAWRYAAFYT AABUEQAAVA4IAFMNDgBRDRQATw0bAE0NIgBMDSgASw0uAEoNNABJDToARw5BAEYORwBFDk8ARA5X AEIPYQBBEGwAPxB5AD4QiAA9EZgAOxGpADsRvAA6EdYAOhHwADoS/QA7Ef8AkxgAAIEaAABzHAAA Zx0AAF4dAABYHAAAUxsAAFAYAABOFgAATBMDAEwRCwBKEBAASBEXAEYRHgBFESQARBEqAEIRMABB ETcAQBI9AD8SRAA9EkwAPBNUADsTXgA5FGkAOBR2ADcVhQA2FZYANBanADQWugAzFtMAMxbuADQW /AA0Fv8AjhsAAHwdAABuHwAAYyAAAFogAABTIAAATh4AAEodAABIGgAARhgAAEUWBwBDFQ4AQRUT AD8VGgA+FSAAPRUnADsVLQA6FjMAORY6ADgWQQA3F0kANRdRADQYWwAzGWYAMhlzADAagwAvGpQA LhulAC0buAAtG9AALRvsAC4b+wAuG/8Aih4AAHggAABqIgAAXyMAAFYjAABPIgAASiEAAEYgAABD HgAAQRsAAD8aAwA9GgwAOxkRADkZFgA3Gh0ANhojADUaKQA0GjAAMxs2ADEbPgAwHEYALxxPAC4d WQAtHWQALB5xACsfgQAqH5IAKR+kACggtwAnIM4AJyDrACgg+gApH/8AhiAAAHQjAABnJAAAXCUA AFMlAABMJQAARyQAAEIjAAA/IQAAPR8AADoeAAA3HgkANR4OADMeEwAxHhoAMB4gAC8eJgAuHy0A LR8zACwgOwArIEMAKiFMACkhVgAoImIAJiJvACUjfwAkI5AAIyOiACIktQAiJMwAIiTpACMk+QAk I/8AgiMAAHElAABjJgAAWScAAFAoAABJJwAAQycAAD8mAAA7JAAAOCIAADUiAAAyIgYAMCINAC4i EQAsIhcAKiIdACkiIwAoIyoAJyMxACYkOAAlJUEAJCVKACMmVAAiJmAAISdtACAnfQAfJ48AHiih AB4otAAdKMoAHSjoAB4o+AAfJ/8AfiUAAG4nAABgKQAAVikAAE0qAABGKgAAQSkAADwoAAA3JwAA NCYAADAmAAAtJgMAKycLACgnEAAnJxQAJScaACQnIQAjKCcAIiguACEpNgAgKT4AHypIAB4qUgAd K14AHCtrABsrewAaLI0AGSyfABgssgAYLMkAGCznABkr9wAaK/8AeicAAGoqAABdKwAAUywAAEos AABDLAAAPisAADkrAAA0KgAAMCoAACsqAAApKwAAJisIACMsDgAiLBIAICwYAB8sHgAeLSUAHS0s ABwtMwAbLjwAGi5FABkvUAAYL1wAFy9pABYweQAVMIsAFDCeABQwsQATMMcAEzDlABQw9gAVL/8A dioAAGcsAABaLQAAUC4AAEguAABBLgAAOy4AADYtAAAxLQAALC0AACcvAAAkLwAAITAFAB8xDAAc MRAAGzIVABoyHAAZMiIAGDIpABczMQAWMzkAFTNDABQ0TQATNFkAEjRnABE1dwARNYkAEDWcABA1 sAAONcYADzTkABA09QAQNP8AciwAAGMuAABXMAAATTAAAEUwAAA+MAAAODAAADMwAAAvMAAAKTEA ACQyAAAhMwAAHTUCABo2CQAXNw4AFTcTABQ4GQATOB8AEjgmABI4LgAROTYAEDlAABA5SwAOOVcA DjpkAA06dAAMOoYADDqZAAs5rAAKOcEACjneAAs58QAMOPwAbi8AAF8xAABTMgAASjMAAEIzAAA7 MwAANjMAADEyAAAsMwAAJzQAACE2AAAdOAAAGTkAABU7BgASPQwAED4QABA+FQAOPhwADj4jAA0+ KgAMPjMADD48AAs/RwAKP1IACD9gAAc/bwAGP4EABT+UAAQ/qAADPrwABD7XAAU+7AAFPvcAaTMA AFs0AABQNQAARzUAAD81AAA5NQAANDUAAC41AAApNwAAIzgAAB47AAAaPAAAFj8AABJBBAAOQwoA DEQOAApEEwAJRBkACEQgAAdEJwAGRC8ABUQ4AANFQgACRU4AAEVbAABFagAARXwAAEWQAABEpAAA RLkAAETRAABE6gAAQ/UAZDYAAFc3AABMOAAAQzgAADw4AAA3OAAAMTgAACs5AAAlOwAAID0AABpA AAAWQgAAEkQAAA5HBAALSQkAB0oNAARLEQABSxYAAEscAABLIwAASysAAEs0AABLPgAATEkAAExX AABMZgAATHcAAEuMAABLoQAAS7UAAErOAABK6QAASvUAXzoAAFI7AABIOwAAQDsAADo7AAA0OwAA LjwAACc+AAAiQQAAHEMAABZGAAASSQAADksAAAtOAwAHUAgAAlEMAABREAAAUhMAAFMYAABTHwAA UyYAAFMvAABTOQAAU0UAAFNSAABTYQAAU3IAAFOHAABSnAAAUrEAAFHKAABR5wAAUfQAWT4AAE4+ AABFPgAAPj4AADg+AAAwQAAAKUIAACNEAAAdRwAAF0oAABJNAAAOUAAAC1MAAAZVAgAAVwcAAFgL AABZDgAAWhEAAFoVAABbGgAAXCEAAFwqAABcNAAAXD8AAFxNAABcWwAAXGwAAFyBAABblwAAW60A AFrFAABa5AAAWfMAVEIAAEpCAABCQgAAPEIAADRDAAAsRgAAJUkAAB5MAAAXTwAAElMAAA5WAAAK WQAABVsAAABeAAAAYAQAAGEIAABiDAAAYw4AAGQRAABlFgAAZhwAAGcjAABnLQAAZzkAAGdGAABn VQAAZ2YAAGd6AABmkQAAZagAAGXAAABk3gAAZPAAT0YAAEdGAABARQAAN0cAAC9KAAAmTQAAH1EA ABhVAAASWQAADVwAAAhgAAACYwAAAGYAAABoAAAAagAAAGsEAABsCAAAbQwAAG8OAABwEgAAchcA AHMdAAB0JgAAdDIAAHQ/AAB0TgAAc18AAHRyAABzigAAcqEAAHG4AABx1AAAcOwATEoAAEVKAAA7 SwAAMk4AAClSAAAgVgAAGFsAABJfAAANZAAAB2gAAABrAAAAbwAAAHIAAAB1AAAAdgAAAHcAAAB5 AgAAegYAAHwKAAB+DgAAgBEAAIIWAACEHgAAhCkAAIQ2AACERQAAhFYAAINqAACDgQAAgpkAAIGx AACAyQAAgOUASk4AAD9QAAA1UwAAK1cAACJcAAAZYgAAEmcAAAxsAAAFcQAAAHUAAAB5AAAAfQAA AIEAAACDAAAAhQAAAIYAAACIAAAAiQAAAIsEAACNCAAAjw0AAJIQAACUFgAAliAAAJYsAACWOwAA lkwAAJVgAACVdgAAlJAAAJOnAACSvQAAktUARFUAADlZAAAvXQAAJGMAABppAAASbwAADHUAAAR7 AAAAgAAAAIUAAACJAAAAjQAAAJEAAACTAAAAlAAAAJYAAACYAAAAmgAAAJwAAACeAAAAoAYAAKIL AAClEAAAqBcAAKkjAACpMQAAqUMAAKlWAACobQAApocAAKeeAACmswAApccAPl4AADJjAAAnagAA HXAAABN4AAAMfwAAA4UAAACLAAAAkQAAAJYAAACbAAAAnwAAAKIAAACkAAAApQAAAKcAAACpAAAA qwAAAK0AAACwAAAAsgAAALUCAAC3CQAAuxAAAL4YAAC+JgAAvjgAAL5LAAC9YQAAvHoAALuUAAC6 qQAAurkAN2oAACtwAAAgeAAAFoAAAA2IAAAFjwAAAJYAAACcAAAAogAAAKcAAACsAAAAsAAAALMA AAC2AAAAtwAAALkAAAC7AAAAvQAAAL8AAADCAAAAxQAAAMgAAADKAAAAzggAANIQAADVGwAA1SwA ANRAAADUVwAA024AANSGAADUmwAA06sA/wAAAP8AAAD/AAAA/wAFAP8ADgD/ABUA/AAgAPkAKgD2 ADQA8QA9AO0ARgDpAE0A5gBTAOQAWQDhAF4A3gBjANwAaADZAG4A1QBzANMAeQDQAIAAzgCIAMsA kQDJAJwAxgCnAMQAtwDCAMwAwADsAL8A/wC+AP8AvQD/ALcA/wCyAP8A/wAAAP8AAAD/AAAA+gAB APMACwDtABIA6AAbAOUAJQDkAC4A3wA4ANgAQADSAEcAzgBOAMsAVADIAFkAxgBeAMQAYwDCAGcA wABtAL8AcwC9AHoAuwCBALkAiwC2AJUAtAChALIArwCwAMIArgDjAK4A+gCsAP8ArQD/AKkA/wCm AP8A/wAAAP8AAADyAAAA5gAAAN0ABwDSAA4AzQAWAMoAIADIACkAxQAyAMAAOgC8AEIAuQBIALcA TgC1AFMAswBYALEAXQCwAGIArgBnAKwAbACqAHMAqQB7AKcAhAClAI4AowCaAKEAqACfALkAngDS AJ0A8gCcAP8AnQD/AJwA/wCZAP8A/AAAAO4AAADdAAAAzAAAAMEAAgC6AAwAtgASALIAGgCwACMA rwAsAK0ANACpADwApgBCAKQASACiAE0AoABSAJ4AVwCdAFsAnABgAJoAZgCZAGwAlwB0AJUAfQCT AIcAkQCTAJAAoQCOALEAjQDGAIwA6ACLAP0AjAD/AIwA/wCMAP8A7QAAANgAAADFAAAAtwAAAKwA AACmAAgAoQAOAJ8AFQCdAB4AmwAmAJoALgCXADUAlQA8AJMAQgCRAEcAkABMAI4AUQCNAFUAiwBa AIoAYACJAGYAhwBtAIUAdgCEAIAAggCMAIAAmgB/AKkAfQC8AHwA3AB8APUAfAD/AHwA/wB8AP8A 2QAAAMEAAACxAAAApAAAAJwAAACUAAMAkAAMAI0AEQCLABgAiQAgAIkAKACHAC8AhQA2AIMAPACC AEEAgABGAH8ASwB9AE8AfABUAHsAWgB5AGAAeABnAHYAcAB1AHoAcwCGAHEAkwBwAKIAbwC0AG4A zABuAO0AbgD+AG4A/wBuAP8AxAAAAK8AAACgAAAAlAAAAIwAAACGAAAAgQAIAH4ADgB8ABQAewAb AHkAIgB4ACkAdwAwAHUANgB0ADsAcgBAAHEARQBwAEoAbwBPAG0AVABsAFsAawBiAGkAagBoAHQA ZgCAAGUAjgBjAJ0AYgCtAGEAwgBhAOQAYQD4AGEA/wBhAP8AtAAAAKAAAACRAAAAhgAAAH4AAAB5 AAAAdQADAHEACwBvABAAbQAWAGwAHQBrACQAawAqAGkAMABoADYAZgA7AGUAQABkAEUAYwBKAGEA TwBgAFYAXwBdAF0AZQBcAG8AWgB6AFkAiABYAJgAVwCoAFYAuwBWANgAVgDxAFYA/wBWAP8AqAEA AJQFAACFBwAAegcAAHIGAABsBAAAaQEAAGcABwBkAA0AYwARAGEAGABgAB8AXwAlAF4AKwBdADAA WwA2AFoAOwBZAEAAWABFAFcASwBWAFEAVQBYAFMAYQBSAGoAUAB2AE8AhABOAJMATQCkAEwAtgBM AM0ATADrAEwA+gBMAP8AnQkAAIsLAAB8DQAAcA0AAGgNAABiDAAAXwoAAF0GAQBcAQkAWgAOAFgA EwBXABkAVgAgAFUAJgBTACsAUgAxAFEANgBQADsATwBBAE4ARwBNAE0ASwBVAEoAXQBJAGcARwBz AEYAgABFAJAARAChAEMAsgBDAMgAQwDmAEMA9QBDAP8AlQ0AAIMPAAB0EAAAaREAAGARAABaEAAA Vg4AAFQNAABTCgQAUwYLAFEDEABPARUATgEbAEwBIQBLAScASgIsAEkCMgBIAjcARwM9AEUDQwBE A0oAQwRRAEIEWgBABWQAPwVwAD4GfgA9Bo4APAefADsHsQA6B8YAOgfjADoH8wA6CPwAjhAAAHwS AABuFAAAYhUAAFoVAABUFAAAUBMAAE0RAABLDgAASw0GAEoKDABJCBEARwgWAEUIHQBECCMAQggo AEEJLgBACTMAPwk5AD4KQAA9CkcAPApPADoLWAA5C2MAOAxvADYMfgA1DI4ANA2fADMNsQAyDccA Mg3jADIN9AAyDf4AiBMAAHcVAABpFwAAXhgAAFUYAABPGAAAShYAAEcVAABFEwAAQxACAEMOCABC DQ4AQA0SAD8NGAA9DR8APA0kADsNKgA5DTAAOA43ADcOPQA2DkUANQ5NADMPVwAyD2IAMRBuAC8Q fQAuEI4ALRGgACwRsgArEcgAKxHmACsR9gAsEf8AgxYAAHIZAABkGgAAWRsAAFEbAABLGwAARhoA AEIYAAA/FwAAPhQAADwSBAA7EQoAOhAQADgQFQA3EBsANREhADQRJwAzES0AMhEzADAROgAvEkIA LhJLAC0TVAArE18AKhRsACkUewAoFIwAJxWeACYVsAAlFcYAJRXkACUV9gAmFf8AfhkAAG4bAABg HQAAVh4AAE0eAABHHgAAQh0AAD4cAAA6GgAAOBgAADcWAAA1FQcANBQNADIUEgAwFBcALxQdAC0U IwAsFSoAKxUwACoVNwApFj8AKBZIACcXUgAmGF0AJBhqACMZeQAiGYoAIRmcACAZrwAfGcQAHxni ACAZ9AAgGf8AehsAAGoeAABdHwAAUyAAAEogAABEIAAAPh8AADoeAAA3HQAANBwAADIZAAAwGQQA LhgLACwYEAAqGBQAKRgaACcYIAAmGSYAJRktACQaNQAjGj0AIhtGACEbUAAgHFsAHx1oAB4ddwAd HYgAHB6bABserQAaHsMAGh7gABod8wAbHf8Adx0AAGcgAABaIQAAUCIAAEgiAABBIgAAOyIAADch AAAzIAAAMB8AAC0dAAArHQAAKB0IACYdDgAlHRIAIx0XACEdHQAhHSQAIB4qAB8eMgAeHzoAHR9D ABwgTQAbIVkAGiFmABkhdQAYIocAFyKZABYirAAVIsEAFSLfABUh8gAWIf4AcyAAAGQiAABXIwAA TSQAAEUlAAA+JAAAOSQAADQjAAAwIgAALCIAACkhAAAmIQAAJCEGACIhDAAgIRAAHiEVAB0iGwAb IiEAGyIoABojLwAZIzgAGCRBABckSwAWJVcAFSVkABQmcwATJoUAEiaYABEmqwARJsAAECbdABEl 8QASJf0AcCIAAGEkAABUJgAASiYAAEInAAA8JgAANiYAADElAAAtJQAAKSQAACYkAAAiJQAAHyUD AB0mCgAbJg4AGScSABgnGAAXJx8AFiclABUoLQAUKDUAEyk+ABIpSQARKVUAESpiABAqcQAPKoMA DiqWAA4qqQANKr0ADSrXAA0q7gAOKfsAbCQAAF0mAABRKAAASCgAAEApAAA5KAAANCgAAC8oAAAr JwAAJycAACIoAAAeKQAAGyoAABgrBwAWKw0AFCwRABMsFgASLBwAES0jABAtKgAQLTIADy48AA4u RgANLlIADS5fAAwvbgALL38ACi+SAAkvpQAJLrkACC7QAAku6QAKLvcAaCcAAFopAABOKgAARSsA AD0rAAA3KwAAMSoAAC0qAAApKgAAJCoAACArAAAbLQAAGC4AABUvBAASMQoAEDIOAA8yEwAOMhkA DTIgAA0yJwAMMi8ACzM4AAozQgAJM04ACDNbAAY0agAFNHsABDOOAAMzogACM7YAAjPNAAMz5wAE MvMAZCoAAFYsAABLLQAAQi0AADotAAA0LQAALywAACssAAAmLAAAIi0AAB0vAAAZMQAAFTIAABI0 AwAPNgkADDgNAAo4EQAJOBYACDgdAAc4JAAGOCwABDg0AAM4PgACOUoAADlXAAA5ZQAAOXcAADmL AAA4nwAAOLMAADjKAAA45gAAN/IAXy0AAFIuAABILwAAPzAAADgvAAAyLwAALS8AACkvAAAkMAAA HzEAABozAAAVNQAAEjcAAA85AwAMOwgACD0NAAU+EAADPhQAAD4aAAA+IQAAPigAAD4xAAA/OwAA P0YAAD9TAAA/YQAAP3MAAD+HAAA+nAAAPrAAAD3HAAA95AAAPfIAWjAAAE4yAABEMgAAPDIAADUy AAAwMQAAKzEAACYyAAAgNAAAGzYAABY4AAASOwAADz0AAAw/AwAIQQgABEMMAABDDgAARBIAAEUW AABFHQAARSQAAEUtAABGNgAARkIAAEZOAABGXQAARm4AAEWCAABFmAAARK0AAETEAABD4wAAQ/IA VTQAAEo1AABBNQAAOTUAADM0AAAuNAAAKDUAACI3AAAdOgAAFzwAABI/AAAPQQAADEQAAAhGAQAD SAYAAEkKAABKDQAASxAAAEwUAABNGQAATiAAAE4oAABOMgAATT0AAE5KAABOWAAATWkAAE19AABM lAAATKoAAEvBAABL4QAASvIAUDgAAEY4AAA9OAAANzgAADE3AAAqOQAAJDsAAB49AAAYQAAAE0MA AA9GAAALSQAAB0sAAAJOAAAAUAQAAFEIAABSCwAAUw4AAFQRAABVFQAAVhsAAFcjAABXLAAAVzgA AFdEAABXUgAAVmMAAFZ3AABWjgAAVaUAAFS9AABT3QAAU/AASzwAAEI8AAA7OwAANTsAAC08AAAm PwAAH0IAABlFAAATSAAADksAAAtPAAAFUQAAAFQAAABXAAAAWAEAAFoFAABbCAAAXAwAAF0OAABf EQAAYBYAAGIdAABiJgAAYjEAAGI+AABhTAAAYV0AAGFwAABgiAAAYKAAAF+3AABe1AAAXe4AR0AA AD8/AAA6PwAAMUAAAClDAAAhRgAAGkoAABNOAAAOUQAAClUAAARYAAAAWwAAAF4AAABhAAAAYwAA AGQBAABlBAAAZwgAAGgLAABqDgAAbBIAAG4XAABvIAAAbyoAAG82AABuRQAAblUAAG5oAABtfwAA bZgAAGywAABrygAAaugAREQAAD5DAAA1RAAAK0cAACNLAAAbTwAAE1QAAA5YAAAIXAAAAmAAAABk AAAAZwAAAGsAAABtAAAAbwAAAHAAAAByAAAAdAIAAHUGAAB3CgAAeQ4AAHwSAAB+GAAAfyIAAH8u AAB/PQAAfk0AAH1hAAB9dwAAfJAAAHuoAAB6wAAAed8AQ0cAADlJAAAvTAAAJVAAABxVAAAUWwAA DmAAAAdlAAAAagAAAG4AAAByAAAAdgAAAHkAAAB8AAAAfgAAAH8AAACBAAAAgwAAAIUAAACHAwAA iggAAIwNAACPEQAAkhkAAJIlAACSMwAAkkQAAJFXAACQbQAAj4YAAI6fAACNtQAAjM0APU4AADJR AAAoVgAAHlwAABViAAAOaAAAB24AAAB0AAAAeQAAAH4AAACCAAAAhgAAAIkAAACMAAAAjgAAAJAA AACSAAAAlAAAAJYAAACYAAAAmwAAAJ4GAAChDAAApBEAAKYbAACmKQAApjoAAKVNAAClYgAApHsA AKOUAAChqwAAob8ANlcAACxcAAAhYgAAF2kAAA9wAAAHdwAAAH4AAACEAAAAigAAAI8AAACUAAAA mAAAAJsAAACeAAAAnwAAAKIAAACkAAAApgAAAKgAAACrAAAArQAAALAAAACzBAAAtwwAALsSAAC7 HwAAuzAAALtDAAC6WAAAuXAAALeLAAC3oQAAt7MAMGIAACVpAAAacAAAEHgAAAmAAAAAiAAAAI8A AACWAAAAmwAAAKEAAACmAAAAqgAAAK4AAACwAAAAsQAAALQAAAC2AAAAuAAAALsAAAC9AAAAwAAA AMMAAADHAAAAywMAAM8MAADTFQAA0iUAANI4AADRTgAA0GUAAM9+AADNlgAAzKkA/wAAAP8AAAD/ AAAA/wADAP8ACwD8ABEA+QAbAPcAJQDzAC8A7gA4AOkAQADmAEgA4gBOAN8AVADcAFkA2QBeANUA YwDTAGgA0ABtAM4AcwDLAHoAyACCAMYAjADDAJcAwACjAL4AsgC8AMgAugDqALkA/wC4AP8AsQD/ AKoA/wCnAP8A/wAAAP8AAAD7AAAA9gAAAO0ABwDnAA8A4gAWAN8AIADeACkA2QAzANEAOwDMAEIA yABIAMUATgDCAFMAwABYAL4AXQC8AGIAugBnALkAbQC3AHQAtQB7ALIAhQCwAJAArgCcAKwAqgCp AL0ApwDeAKYA+QClAP8AowD/AJ0A/wCbAP8A/QAAAPYAAADrAAAA3wAAANEAAwDKAAwAxQASAMMA GwDAACQAvgAsALkANQC2ADwAswBDALAASACuAE4ArABSAKsAVwCpAFwApwBhAKYAZwCkAG0AogB0 AKAAfQCeAIgAnACVAJoAowCYALQAlgDNAJUA8QCUAP8AlQD/AJAA/wCOAP8A8wAAAOYAAADRAAAA wgAAALgAAACxAAgArQAPAKoAFgCoAB4AqAAnAKYALwCiADYAnwA8AJ0AQgCbAEcAmQBMAJcAUQCW AFUAlABaAJMAYACRAGYAkABuAI4AdgCMAIEAigCNAIgAmwCGAKwAhQDBAIQA5gCDAP0AhAD/AIMA /wCBAP8A5AAAAMsAAAC6AAAArAAAAKIAAACcAAQAmAAMAJYAEQCUABkAkwAhAJIAKACPADAAjQA2 AIsAPACJAEEAiABGAIYASwCFAE8AhABUAIIAWgCBAGAAfwBnAH4AbwB8AHoAegCGAHgAlAB3AKQA dQC3AHQA1ABzAPQAdAD/AHQA/wB0AP8AywAAALYAAACmAAAAmgAAAJIAAACKAAAAhgAIAIMADgCB ABQAgQAbAIAAIwB/ACoAfQAwAHsANgB6ADsAeABAAHcARQB1AEkAdABOAHMAVABxAFoAcABhAG4A aQBtAHMAawB/AGkAjQBoAJ0AZwCuAGYAxwBlAOoAZgD/AGYA/wBnAP8AuAAAAKQAAACVAAAAigAA AIEAAAB8AAAAdgAEAHQADAByABAAcQAWAHAAHQBwACQAbgAqAG0AMABrADUAagA6AGkAPwBoAEQA ZwBJAGUATgBkAFQAYwBbAGEAYwBgAG0AXgB5AF0AhwBbAJYAWgCoAFkAvQBZAN8AWQD4AFoA/wBa AP8AqAAAAJUAAACHAAAAewAAAHMAAABuAAAAagABAGcACABlAA4AZAASAGMAGABjAB8AYgAlAGEA KgBfADAAXgA1AF0AOgBcAD4AWwBEAFkASQBYAE8AVwBWAFYAXgBUAGgAUwBzAFEAgQBQAJEATwCi AE4AtQBOANAATgDwAE4A/wBPAP8AnAAAAIkAAAB7AwAAcAMAAGgDAABiAQAAXwAAAF0ABABbAAsA WQAPAFgAFABXABkAVwAgAFYAJQBVACoAUwAwAFIANABRADkAUAA/AE8ARABOAEsATQBSAEsAWgBK AGMASQBvAEcAfABGAIwARQCdAEUAsABEAMcARADoAEQA+gBFAP8AkgQAAIAHAABxCgAAZgoAAF4K AABZCQAAVQcAAFQEAABSAAcAUAAMAE8AEABOABUATQAbAEwAIABLACYASgArAEkAMABIADUARwA6 AEYAQABFAEYAQwBOAEIAVgBBAF8AQABrAD4AeAA9AIgAPACZADwAqwA8AMEAOwDgADsA9AA7AP8A iQoAAHgMAABqDgAAXw4AAFcOAABRDgAATQwAAEsLAABKCAIASQQJAEgADQBGABEARQAWAEQAHABD ACEAQgAmAEEAKwA/ADEAPgA2AD0APAA8AEMAOwBKADoAUgA5AFwAOABoADYAdQA1AIUANACWADQA qAAzALwAMwDYADMA7wAzAPsAgg0AAHEPAABkEAAAWREAAFERAABLEQAARxAAAEQOAABCDQAAQQsF AEEHCwA/BQ4APgMSADwCGAA7Ah0AOgMiADkDKAA4Ay0ANwMyADYEOQA1BD8ANAVHADMFUAAxBloA MAZmAC8HcwAuB4MALQeVACwHpwArB7oAKwfSACsH6wArB/cAfRAAAGwRAABfEwAAVBQAAEwUAABG FAAAQhMAAD4SAAA8EAAAOg4BADoNBgA6CgwAOAkQADYIFAA1CBkANAkfADIJJAAxCSkAMAkvAC8K NgAuCj0ALQpFACwLTgArC1kAKQxlACgMcwAnDIMAJg2VACUNpwAkDbsAIw3SACMN6wAjDfcAeBIA AGgUAABbFgAAURcAAEgXAABCFgAAPRYAADkVAAA3EwAANREAADMQAwAzDggAMg0NADANEQAvDRYA LQ0bACwNIQArDScAKg0tACkONAAoDjsAJw5EACUOTgAkD1kAIxBlACEQcwAgEIQAHxCWAB4QqQAd EL0AHBDYAB0Q7gAdEPkAcxQAAGQWAABXGAAATRkAAEUZAAA/GQAAOhgAADUXAAAyFgAAMBUAAC4T AAAtEQQALBAKACsQDgApEBIAKBAYACYQHgAlECQAJBAqACMRMQAiETkAIRFCACASSwAeElYAHRNj ABwTcQAaE4IAGRSVABgUpwAXFLsAFxPUABcT7gAYE/oAcBYAAGAZAABUGgAAShsAAEIcAAA8GwAA NhsAADIaAAAvGQAALBgAACoWAAAoFAEAJhMHACUTDAAjExAAIhMVACATGgAfEyEAHhQnAB0ULgAc FTYAGxU/ABoWSQAZFlQAGBdhABYXcAAVGIEAFBiTABMYpgASGLoAEhfSABIX7AATF/oAbBkAAF0b AABRHQAARx0AAD8eAAA5HQAANB0AAC8cAAArGwAAKBoAACYZAAAkGAAAIhcEACAXCgAeFw4AHBcS ABoXFwAZGB4AGRgkABgZLAAXGTQAFho9ABUaRwAUG1IAExtfABIcbgARHH8AEBySABAcpQAPHLkA DhzQAA4b6gAPG/gAaRsAAFodAABOHwAARR8AAD0gAAA2HwAAMR8AAC0eAAApHQAAJR0AACMcAAAg GwAAHRsBABsbBwAZHA0AFxwQABYcFQAVHBsAFB0iABMdKQASHjEAER46ABEfRQAQH1AADyBdAA4g bAANIHwADSCPAAwgogALILUACyDKAAsg5QAMH/QAZR0AAFcfAABMIQAAQiEAADohAAA0IQAALyEA ACogAAAmHwAAIx8AACAeAAAdHgAAGSAAABYgBAAUIAsAEiEOABEhEwARIhkAECIfAA8iJgAOIy8A DiM3AA0jQQAMJE0ACyRZAAokZwAJJHgACCSLAAckngAHJLEABiTHAAYj4wAHI/EAYh8AAFQhAABJ IwAAQCMAADgjAAAyIwAALCMAACgiAAAkIQAAISEAAB4hAAAaIQAAFiMAABMkAwARJQgADyYNAA4n EQANJxYADCcdAAsnIwAKJysACSg0AAgoPgAHKEkABihVAAUpZAAEKXQAAymHAAIpmwABKK8AACjF AAEo4QABJ/AAXiIAAFEkAABGJQAAPSUAADUlAAAvJQAAKiQAACYkAAAiIwAAHyMAABskAAAYJQAA FCYAABEoAwAPKQgADCwMAAosEAAILBQABywaAAYsIQAFLCgAAy0wAAItOgABLUUAAC1SAAAuYAAA LnEAAC2EAAAtmQAALa0AACzCAAAs4AAALPAAWiQAAE0mAABDJwAAOicAADMnAAAtJwAAKCYAACQm AAAhJgAAHSYAABknAAAVKQAAESsAAA8sAwANLgcACTAMAAYxDgADMRIAATIXAAAyHgAAMiUAADIt AAAyNgAAM0IAADNOAAAzXQAAM20AADOBAAAylgAAMqsAADHBAAAx3wAAMfAAVicAAEopAAA/KgAA NyoAADAqAAArKQAAJygAACMoAAAeKQAAGioAABYsAAASLgAADzAAAA0xAgAKNAcABTULAAI2DgAA NxAAADgUAAA4GgAAOCIAADgqAAA5MwAAOT4AADlKAAA5WQAAOWkAADl9AAA4kwAAOKgAADe/AAA3 3gAANvAAUSsAAEYsAAA8LAAANCwAAC4sAAAqKwAAJSsAACAsAAAbLQAAFy8AABMxAAAQMwAADTUA AAk3AgAFOgYAATsKAAA8DQAAPQ8AAD4SAAA/FwAAQB4AAEAlAABALwAAQDoAAEBGAABAVAAAQGUA AD94AAA/jwAAPqYAAD69AAA93AAAPfAATS4AAEIvAAA5LwAAMi8AAC0uAAAoLgAAIi8AAB0wAAAY MgAAEzUAABA3AAAMOgAACTwAAAU+AAAAQQQAAEIIAABDCwAARA0AAEYQAABHFAAASBkAAEghAABI KgAASDUAAEhBAABITwAASGAAAEdzAABHigAARqIAAEW5AABF2QAARPAASDIAAD4yAAA2MgAAMDEA ACsxAAAlMgAAHzQAABk2AAATOQAAEDwAAAw/AAAIQgAAA0QAAABGAAAASAIAAEoFAABLCAAATAsA AE4OAABPEQAAURUAAFIcAABSJQAAUjAAAFI8AABRSgAAUVoAAFFtAABQhAAAT50AAE61AABN0gAA Te4AQzYAADs2AAA0NQAALzQAACc1AAAhOAAAGjsAABQ+AAAQQQAADEQAAAdHAAACSgAAAE0AAABP AAAAUQAAAFMCAABUBQAAVQgAAFcLAABZDgAAWxEAAF0XAABdHwAAXSoAAF02AABcRAAAXFQAAFtn AABbfgAAWpcAAFmvAABYywAAV+oAPzkAADg5AAAzOAAAKzkAACM8AAAcPwAAFUMAABBHAAALSgAA BU4AAABRAAAAVAAAAFcAAABaAAAAXAAAAF0AAABfAAAAYAQAAGIHAABkCwAAZg4AAGgSAABrGQAA ayMAAGouAABqPAAAak0AAGlfAABodQAAZ48AAGaoAABlwgAAZOMAPT0AADc8AAAuPQAAJUAAAB1E AAAWSQAAEE0AAApRAAAEVQAAAFoAAABdAAAAYAAAAGMAAABmAAAAaAAAAGoAAABrAAAAbQAAAG8C AABxBgAAdAoAAHYOAAB5EwAAexsAAHsnAAB6NQAAeUUAAHhZAAB4bQAAd4YAAHafAAB1twAAdNIA PEEAADJCAAAoRQAAIEoAABdOAAAQVAAAClkAAAJeAAAAYwAAAGcAAABrAAAAbwAAAHIAAAB1AAAA dwAAAHkAAAB7AAAAfQAAAH8AAACCAAAAhAMAAIcJAACKDgAAjhMAAI8eAACOKwAAjjsAAI1OAACL YwAAinwAAIqVAACIrQAAh8UANkcAACxLAAAiTwAAGVUAABBbAAAKYQAAAWcAAABtAAAAcgAAAHcA AAB7AAAAfwAAAIMAAACGAAAAiAAAAIoAAACNAAAAjwAAAJEAAACUAAAAlwAAAJoBAACdBwAAoQ0A AKUUAACkIQAApDEAAKNEAACiWQAAoHAAAJ+LAACdogAAnbcAMFAAACVVAAAbWwAAEmIAAAtpAAAB cAAAAHcAAAB9AAAAgwAAAIgAAACNAAAAkQAAAJUAAACYAAAAmgAAAJwAAACfAAAAoQAAAKMAAACm AAAAqQAAAKwAAACwAAAAtAcAALgOAAC6GAAAuicAALk5AAC4TgAAt2UAALZ+AAC1lgAAs6sAKVsA AB5iAAAUaQAADHEAAAJ5AAAAgQAAAIkAAACPAAAAlgAAAJsAAACgAAAApAAAAKgAAACrAAAArAAA AK8AAACyAAAAtAAAALYAAAC5AAAAvAAAAMAAAADEAAAAyAAAAM0HAADSEAAA0h0AANEvAADQRAAA z1sAAM1zAADLjQAAyqEA/wAAAP8AAAD7AAAA+gAAAPwACAD4AA8A9QAXAPQAIADxACoA6wAzAOYA OwDiAEMA3gBJANoATwDWAFQA0wBZANAAXgDOAGMAywBoAMkAbgDGAHUAwwB9AMEAhgC+AJIAuwCe ALkArgC2AMMAtADoALMA/wCvAP8ApQD/AJ4A/wCbAP8A/QAAAPcAAADyAAAA8AAAAOcAAwDhAAwA 3AASANgAGwDWACQA0gAtAMwANgDGAD0AwgBDAL8ASQC8AE4AugBTALgAWAC2AF0AtQBiALMAZwCx AG4ArwB2AKwAfwCqAIoAqACXAKUApgCjALkAoQDZAKAA+QCeAP8AmAD/AJIA/wCPAP8A8wAAAOwA AADjAAAA0wAAAMgAAADBAAkAvQAPALsAFgC5AB8AtwAnALMALwCvADcArAA9AKoAQwCoAEgApgBN AKQAUgCjAFYAoQBbAJ8AYQCeAGcAnABvAJoAeACXAIMAlQCQAJMAngCRALAAkADIAI4A8ACNAP8A igD/AIUA/wCCAP8A5wAAAN0AAADGAAAAuAAAAK4AAACoAAQApQAMAKEAEgChABkAoAAiAJ8AKQCb ADAAmAA3AJYAPQCTAEIAkgBHAJAASwCPAFAAjQBVAIwAWgCKAGEAiABoAIcAcACFAHsAgwCIAIEA lgB/AKcAfQC8AHwA4wB8AP0AfAD/AHgA/wB2AP8A1gAAAMAAAACvAAAAowAAAJkAAACTAAAAjwAJ AI0ADgCLABQAigAcAIoAIwCIACoAhQAwAIMANgCCADsAgABAAH8ARQB+AEoAfABPAHsAVAB6AFoA eABhAHYAaQB1AHMAcwCAAHEAjgBvAJ8AbgCyAG0AzwBsAPQAbAD/AGsA/wBpAP8AwAAAAKsAAACb AAAAjwAAAIcAAACAAAAAfAAEAHoADAB4ABEAeAAXAHgAHgB3ACQAdQAqAHMAMABxADUAcAA6AG4A PwBtAEQAbABJAGsATgBqAFQAaABbAGcAYwBlAG0AZAB4AGIAhwBgAJcAXwCqAF4AwgBeAOkAXgD/ AF4A/wBdAP8ArAAAAJkAAACKAAAAfwAAAHcAAABxAAAAbQAAAGoACABpAA4AaAASAGcAGABnAB8A ZwAlAGUAKgBjAC8AYgA0AGEAOQBgAD4AXwBDAF4ASABdAE4AWwBVAFoAXQBYAGcAVwByAFUAgQBU AJEAUwCjAFIAuABRANwAUQD5AFIA/wBSAP8AnQAAAIsAAAB8AAAAcQAAAGkAAABkAAAAYAAAAF4A BQBcAAsAWwAPAFsAFABaABkAWgAfAFkAJQBXACoAVgAvAFUANABUADgAUwA9AFIAQwBQAEkATwBQ AE4AWABNAGIASwBtAEoAegBJAIsASACdAEcAsQBHAMwARgDwAEcA/wBHAP8AkAAAAH4AAABwAAAA ZgAAAF4AAABZAAAAVgAAAFMAAQBSAAgAUAANAE8AEABPABUATgAaAE4AIABNACUATAAqAEoALgBJ ADMASAA4AEcAPgBGAEQARQBLAEQAUwBDAF0AQQBoAEAAdQA/AIUAPgCXAD0AqwA9AMMAPQDmAD0A +wA+AP8AhwAAAHUDAABoBgAAXQcAAFUGAABQBgAATAQAAEoBAABJAAQARwAKAEYADgBFABEARQAW AEQAGwBDACAAQgAlAEEAKgBAAC8APwA0AD4AOgA9AEAAOwBHADoATwA5AFkAOABkADcAcQA2AIEA NQCTADQApgA0ALsANADdADQA9QA1AP8AfgYAAG0JAABgCwAAVgwAAE4MAABICwAARAoAAEIIAABA BQEAPwEHAD4ACwA9AA4APAASADsAFwA7ABwAOgAhADkAJQA3ACoANgAwADUANQA0ADwAMwBDADIA TAAxAFUAMABgAC8AbQAuAH0ALQCPACwAogAsALYALADQACwA7gAsAPwAdwoAAGcMAABaDgAAUA4A AEkOAABDDgAAPg0AADsMAAA5CwAAOAkDADcFCAA2Ag0ANQEQADQAEwAzABgAMgAdADEAIgAwACcA LwAsAC4AMgAtADgALABAACsASQAqAFIAKQBdACgAawAnAXoAJgGMACUAnwAlALIAJQDKACUA6AAl APcAcg0AAGIOAABWEAAATBEAAEQRAAA+EQAAORAAADYPAAAzDgAAMQ0BADALBQAwCAoALwYNAC4F EQAsBBQAKwMZACoDHgApAyMAKAQpACcELwAmBTUAJQU9ACQFRgAjBlAAIgZcACEHaQAgB3kAHweL AB4HnQAeB7AAHQbGAB0G4wAdBfMAbQ4AAF4RAABSEgAASBMAAEATAAA6EwAANRIAADERAAAuEAAA LA8AACoOAwAqDQcAKQsLACgJDgAnCREAJQgWACQIGwAjCSAAIgkmACEJLAAgCjMAHwo7AB4LRAAd C08AHAxbABsMaQAaDHkAGAyLABgMngAXDLAAFgzFABYM4QAWC/AAaRAAAFoSAABOFAAARRUAAD0V AAA3FQAAMRQAAC0TAAAqEgAAKBEAACYQAQAkEAQAIw4IACMNDAAiDA8AIAwTAB8MGAAeDR0AHQ0j ABwNKgAbDTIAGg46ABgORAAXDlAAFg9cABUPagATEHsAEhCNABEQoAARELMAEA/JABAP5AARD/IA ZRIAAFcUAABLFgAAQhcAADoXAAA0FwAALxYAACoVAAAnFAAAJBMAACITAAAgEgMAHhEGAB0QCQAc EA0AGw8QABkQFQAYEBsAFxAhABYQKAAVETAAFBE5ABMRQwASEk4AERJaABASaQAQE3kADhOMAA4T ngANE7EADRLFAAwS4QANEvEAYhQAAFQWAABJGAAAPxkAADcZAAAxGQAALBgAACgXAAAkFgAAIRYA AB8VAAAcFAIAGhMEABkSBgAXEgsAFRIOABQSEgATExgAEhMfABETJgARFC0AEBQ2AA8VQQAOFUwA DhZXAA0WZQAMF3UACxeHAAoXmgAJFq0ACBbBAAgW3QAJFe4AXxYAAFEYAABGGgAAPRoAADUbAAAv GgAAKhoAACUZAAAiGAAAHxgAABwXAAAZFgEAFxYDABUWBAATFgkAERYNABAXEQAPFxYADhccAA4Y IwANGCoADBkzAAwZPAALGkcAChpTAAkaYQAHG3EABhuDAAUblwAEGqoAAxq/AAMZ2gAEGewAXBgA AE4aAABDHAAAOhwAADMcAAAsHAAAJxwAACMbAAAgGgAAHRkAABoZAAAXGAEAFRgCABIZBAAQGwcA DhsMAA0cEAAMHBMACxwZAAocHwAJHScACB0vAAceOQAGHkMABB5QAAMfXgACH24AAR+AAAAflQAA HqkAAB69AAAd2AAAHewAWBoAAEscAABBHgAAOB4AADAeAAAqHgAAJR0AACEcAAAeHAAAGxsAABgb AAAWGwEAExsCABEcBAAOHgcADB8LAAogDgAIIBIABiEXAAUhHQAEISQAAiIsAAEiNQAAIkAAACNN AAAjWgAAI2sAACN+AAAjkwAAIqcAACK8AAAh1wAAIe0AVR0AAEgfAAA+IAAANSAAAC4gAAAoIAAA Ix8AACAeAAAdHQAAGh0AABYdAAATHgAAER8CAA4gBAANIgcACiQLAAYlDQAEJRAAAiYUAAAmGgAA JiEAACcpAAAnMgAAJz0AACdJAAAoVwAAKGcAACd7AAAnkAAAJ6UAACa7AAAm1gAAJe0AUSAAAEUh AAA7IgAAMiIAACwiAAAmIQAAIiEAAB4gAAAbHwAAGCAAABQgAAARIgAADyMAAA0lAwAKJgYABigK AAMpDQAAKw8AACwSAAAsFwAALB4AACwmAAAtLwAALTkAAC1GAAAtVAAALWQAAC13AAAsjQAALKQA ACu6AAAr1gAAKu4ATSIAAEEkAAA4JAAAMCQAACkkAAAkIwAAISIAAB0iAAAZIgAAFSMAABIkAAAP JgAADSgAAAoqAgAGLAUAAi4JAAAvCwAAMA4AADIQAAAzFQAAMxsAADMiAAAzKwAAMzYAADNCAAAz UAAAM2AAADNzAAAyigAAMqEAADG4AAAw1gAAMO8ASSUAAD4mAAA0JwAALScAACgmAAAjJQAAHyQA ABslAAAWJgAAEigAABAqAAANLAAACi4AAAYwAQACMgQAADQHAAA1CgAANwwAADgOAAA6EgAAOhcA ADofAAA6JwAAOjIAADo+AAA6TAAAOlwAADpvAAA5hgAAOJ4AADi2AAA31AAANu8ARCkAADopAAAx KQAAKykAACYoAAAiJwAAHSgAABgpAAATKwAAEC4AAA0wAAAJMgAABTUAAAE3AAAAOQIAADsFAAA8 CAAAPgsAAD8NAABBEAAAQxQAAEMbAABDIwAAQy4AAEM5AABDRwAAQlcAAEJqAABBgQAAQJoAAD+y AAA+zwAAPu8APywAADYsAAAvLAAAKisAACUqAAAfKwAAGS0AABQvAAAQMgAADTUAAAg4AAAEOgAA ADwAAAA/AAAAQQAAAEMCAABFBQAARggAAEgLAABKDgAATBEAAE0WAABNHgAATSgAAE00AABMQgAA TFEAAEtkAABLewAASpQAAEmtAABIygAAR+wAOzAAADMvAAAtLwAAKC0AACIvAAAbMQAAFTQAABA3 AAANOgAACD0AAAJAAAAAQwAAAEYAAABIAAAASgAAAEwAAABOAQAATwQAAFEHAABTCwAAVQ4AAFgS AABZGQAAWCIAAFguAABXPAAAV0sAAFZeAABWcwAAVY0AAFSnAABSwgAAUuYAODMAADEyAAAsMQAA JTIAAB01AAAWOAAAETwAAAxAAAAHRAAAAEcAAABKAAAATQAAAFAAAABTAAAAVQAAAFcAAABZAAAA WgAAAFwDAABeBwAAYQsAAGQOAABmEwAAZxwAAGYnAABmNAAAZUQAAGRXAABkawAAYoUAAGGfAABg uQAAXtwANTcAADA1AAAoNwAAIDoAABg9AAARQgAADEYAAAZKAAAATwAAAFMAAABWAAAAWQAAAFwA AABfAAAAYQAAAGQAAABlAAAAZwAAAGkAAABsAQAAbgYAAHELAAB0DwAAdxUAAHcgAAB2LQAAdj0A AHVPAAB0YwAAc3sAAHKVAABwrwAAb8kANToAACs7AAAiPwAAGkMAABJIAAAMTQAABVIAAABXAAAA XAAAAGAAAABkAAAAaAAAAGsAAABuAAAAcQAAAHMAAAB1AAAAdwAAAHoAAAB8AAAAfwAAAIIEAACG CgAAig8AAIwXAACLJAAAijMAAIlFAACHWwAAhnIAAIWLAACDpQAAgrwAL0AAACVEAAAcSQAAE04A AA1UAAAEWgAAAGEAAABmAAAAawAAAG8AAAB0AAAAeQAAAH0AAACAAAAAgwAAAIUAAACHAAAAigAA AIwAAACPAAAAkgAAAJYAAACZAgAAngkAAKIQAACiGgAAoSkAAKA7AACfUAAAnWcAAJqBAACamQAA ma8AKUkAAB9OAAAVVAAADlsAAAViAAAAaQAAAHAAAAB3AAAAfQAAAIIAAACGAAAAiwAAAI8AAACT AAAAlQAAAJcAAACaAAAAnQAAAKAAAACjAAAApgAAAKoAAACuAAAAsgAAALcKAAC7EQAAuh8AALkw AAC3RQAAtVwAALR0AACxjgAAr6QAIlQAABhbAAAQYgAAB2oAAABzAAAAewAAAIIAAACJAAAAkAAA AJUAAACaAAAAnwAAAKMAAACmAAAAqAAAAKsAAACuAAAAsAAAALMAAAC2AAAAugAAAL0AAADCAAAA xwAAAMwBAADTCwAA1BUAANMmAADROgAA0FEAAM1oAADLgQAAypYA/AAAAPYAAADyAAAA8QAAAPMA BQD0AAwA8gATAPAAHADtACUA6AAuAOIANgDeAD4A2QBEANQASgDRAE8AzgBUAMsAWQDJAF4AxgBj AMQAaQDBAHAAvgB4ALwAgQC5AI0AtgCaALMAqwCxAMAArwDmAK4A/wClAP8AmgD/AJQA/wCPAP8A 9AAAAOwAAADoAAAA5wAAAN8AAADZAAkA0gAQAM8AFwDPACAAzAAoAMYAMADAADcAvAA+ALkARAC3 AEkAtQBOALMAUwCxAFcArwBdAK0AYgCrAGkAqQBxAKcAegClAIUAogCTAKAAogCdALYAmwDUAJkA +QCWAP8AjQD/AIgA/wCEAP8A6AAAAN8AAADZAAAAyQAAAL8AAAC4AAQAtQANALMAEgCxABoAsAAi AK0AKgCpADEApgA4AKQAPQCiAEMAoABIAJ4ATACcAFEAmwBWAJkAXACXAGIAlQBpAJMAcgCRAH0A jwCLAI0AmgCLAKwAiQDFAIgA7gCGAP8AfwD/AHoA/wB4AP8A2QAAAM0AAAC7AAAArgAAAKUAAACf AAAAnAAJAJkADwCZABUAmQAdAJgAJACUACsAkQAxAI4ANwCMADwAiwBBAIkARgCIAEsAhgBQAIUA VQCDAFsAggBiAIAAawB+AHUAfACCAHoAkgB4AKMAdwC5AHYA4AB1AP8AcgD/AG4A/wBsAP8AxwAA ALUAAAClAAAAmQAAAI8AAACJAAAAhQAEAIQADACCABEAggAXAIIAHgCAACUAfgArAHwAMQB6ADYA eQA7AHcAQAB2AEQAdQBJAHMATwByAFUAcABcAG8AZABtAG4AbAB6AGoAigBoAJsAZwCvAGYAzABl APUAZAD/AGEA/wBgAP8AtAAAAKAAAACQAAAAhQAAAH0AAAB3AAAAcwAAAHAACABvAA4AbwASAG8A GABvAB8AbQAlAGsAKgBpADAAaAA0AGcAOQBmAD4AZQBDAGMASABiAE4AYQBVAF8AXgBeAGcAXABz AFsAggBZAJMAWACmAFcAvwBXAOoAVwD/AFYA/wBUAP8AoQAAAI4AAAB/AAAAdQAAAGwAAABoAAAA ZAAAAGEABABgAAsAXwAPAF8AEwBfABkAXwAfAF0AJQBcACoAWwAvAFkAMwBYADgAVwA9AFYAQwBV AEkAUwBQAFIAWABRAGEAUABtAE4AewBNAIwATACfAEsAtQBKANwASgD6AEoA/wBKAP8AkgAAAIAA AAByAAAAZwAAAF8AAABaAAAAVwAAAFUAAQBTAAcAUgAMAFIAEABSABQAUgAaAFEAHwBPACQATgAp AE0ALgBMADMASwA4AEoAPQBJAEMASABKAEYAUgBFAFwARABnAEMAdQBCAIYAQQCYAEAArgBAAMsA PwDyAEAA/wBAAP8AhQAAAHQAAABnAAAAXQAAAFUAAABPAAAATAAAAEoAAABIAAQARwAKAEcADQBG ABEARgAVAEYAGgBFAB8ARAAkAEMAKQBCAC0AQQAzAD8AOAA+AD4APQBFADwATgA7AFcAOgBiADkA bwA4AIAANwCTADYApwA2AMAANgDoADYA/gA2AP8AfAAAAGsAAABeAgAAVAMAAE0DAABHAwAAQwEA AEEAAAA/AAEAPgAHAD0ACwA9AA4APAARADwAFgA8ABoAOgAfADkAJAA4ACkANwAuADYAMwA1ADoA NABBADMASQAyAFMAMQBeADAAawAvAHsALgCOAC0AogAtALgALQDdAC0A+AAuAP8AcwEAAGQFAABX BwAATQgAAEYIAABACAAAOwcAADgFAAA3AwAANgAEADUACAA0AAwANAAPADQAEgAzABYAMgAbADEA IAAwACQALwApAC4ALwAtADYALAA9ACsARQAqAE8AKQBaACgAZwAnAHcAJgCJACYAnQAlALMAJQDP ACUA8AAmAP8AbQYAAF4JAABSCwAASAwAAEAMAAA6CwAANgsAADIKAAAwCAAALgYCAC4DBgAtAAoA LAANACwAEAArABMAKgAXACkAHAAoACAAJwAlACYAKwAlADIAJAA5ACMAQgAiAEsAIgBXACEAZAAg AHMAHwCFAB8AmQAeAK4AHgDHAB4A6QAfAPoAaAkAAFkMAABNDQAAQw4AADwOAAA2DgAAMQ0AAC0N AAAqDAAAKAsAACcJBAAmBggAJgQLACUDDgAkARAAJAEUACIBGAAhAR0AIQAiACAAKAAfAC4AHgE2 AB0BPwAcAUkAGwFUABoBYQAaAXAAGQGCABgAlgAYAKoAGADBABgA4QAYAPQAYwwAAFUOAABJDwAA QBAAADgQAAAyEAAALQ8AACkOAAAmDgAAIw0AACIMAwAgCwYAIAkJAB8HDAAeBg4AHgURABwFFQAb BRoAGgUfABoFJQAZBSsAGAUzABcGPAAWBkYAFgZSABUHXwAUB24AEweAABIHlAASBqcAEgW8ABIE 2QASA+8AXw4AAFEPAABGEAAAPBEAADURAAAvEQAAKhEAACYQAAAiEAAAIA8AAB0OAgAcDQUAGg0H ABoLCgAZCg0AGAkQABcJEgAWCRcAFQkcABQJIgAUCikAEwoxABIKOgASC0UAEQtRABAMXwAPDG4A DgyAAA4MlAANC6cADQu6AA0K0gANCuoAXA8AAE4RAABDEgAAOhMAADITAAAsEwAAJxIAACMRAAAf EQAAHBAAABoQAgAYDwQAFg4HABUOCQAUDQsAEwwNABIMEAASDBQAEQwaABENIAAQDSgADw0wAA4O OwANDkYADQ5RAAwPXgALD20ACg9/AAkPkwAJD6YACA65AAgO0AAHDugAWBEAAEsSAABAEwAANxQA ADAUAAApFAAAJRQAACETAAAdEgAAGhIAABcRAgAVEQUAExAHABIQCQARDwoAEA4MAA4ODgAODxIA DRAYAA0QHgAMECUADBAtAAsRNgAKEUEACRFNAAgSWgAHEmoABhJ8AAUSkAAEEqQAAxG4AAMRzwAC EegAVRIAAEkUAAA+FQAANRYAAC0WAAAnFgAAIhUAAB4UAAAbFAAAGBMAABUSAwATEgUAEhEHABAR CQAPEQoADRELAAwSDgALEhEAChIVAAkTGwAJEyIACBMqAAcUMwAFFD4ABBVKAAMVWAACFWcAARV6 AAAVjgAAFaMAABS3AAAUzwAAE+kAUhQAAEYWAAA7FwAAMhcAACsXAAAlFwAAIRYAABwWAAAZFQAA FhQBABQTBAASEwYAERIIAA8SCAAOEwkADBQKAAoVDQAIFhAABhYTAAUWGQAEFx8AAxcnAAIYMAAB GDsAABlHAAAZVQAAGWQAABl3AAAZjAAAGKIAABi3AAAXzwAAF+oATxYAAEMYAAA5GQAAMBkAACkZ AAAjGQAAHxgAABsXAAAYFgAAFRUCABMVBQARFAYAEBQGAA4VBwAMFggAChcKAAcZDAAEGg4AAhsS AAEbFgAAGx0AABwkAAAcLQAAHDgAAB1EAAAdUgAAHWIAAB11AAAdigAAHKAAABy2AAAb0AAAGusA TBgAAEAaAAA2GwAALRsAACYbAAAhGgAAHRkAABkZAAAXGAAAFBcDABIWBAAQFwQADhcEAAwZBQAK GgcABxwJAAMdCwAAHw0AACAQAAAgFAAAIRoAACEiAAAhKgAAITUAACJBAAAiTwAAIl8AACJyAAAh iAAAIZ8AACC2AAAf0QAAH+0ASBoAAD0cAAAzHQAAKx0AACQdAAAgHAAAHBsAABgaAAAWGQEAExkB ABEZAQAOGgEADBwCAAodAwAHHwUAAyEIAAAiCgAAJAwAACYOAAAmEgAAJhgAACcfAAAnJwAAJzIA ACc+AAAnSwAAJ1wAACduAAAmhQAAJp0AACW0AAAk0QAAI+4ARB0AADkfAAAwHwAAKB8AACMeAAAe HQAAGxwAABgbAAAUHAAAERwAAA4dAAANHwAACiEAAAYiAQADJAQAACYGAAAoCAAAKgsAACsNAAAt EAAALRUAAC0cAAAtJAAALi4AAC46AAAuSAAALVgAAC1qAAAtgQAALJoAACuyAAAq0AAAKe8AQCAA ADYhAAAtIQAAJiEAACEgAAAdHwAAGh4AABYeAAASHwAADyEAAA0iAAAKJAAABiYAAAIoAAAAKwIA AC0EAAAvBgAAMAkAADIMAAA0DgAANRIAADUYAAA1IAAANSoAADU2AAA1QwAANVMAADRmAAA0fAAA M5YAADKvAAAxzQAAMO8APCMAADIkAAAqJAAAJCMAACAiAAAcIQAAFyEAABMjAAAQJQAADScAAAkp AAAFKwAAAS4AAAAwAAAAMgAAADQBAAA2BAAAOAYAADoJAAA8DQAAPhAAAD4UAAA+HAAAPiYAAD4x AAA+PwAAPU4AAD1hAAA8dwAAO5EAADqrAAA5yQAAOO0ANycAAC8nAAAoJgAAIyUAAB8kAAAZJQAA FCYAABAoAAANKwAACS4AAAUwAAAAMwAAADUAAAA4AAAAOgAAADwAAAA+AQAAQAMAAEIHAABECgAA Rg0AAEkRAABJFwAASCEAAEgsAABHOgAAR0kAAEZbAABFcQAARIsAAEOlAABCwwAAQegANCoAACwq AAAnKAAAIicAABwoAAAWKgAAES0AAA0wAAAJMwAAAzYAAAA5AAAAPAAAAD4AAABBAAAAQwAAAEYA AABIAAAASgAAAEwDAABOBgAAUAoAAFMOAABUEwAAVBwAAFMnAABTNAAAU0MAAFJVAABRagAAUIMA AE+eAABNuQAATOAAMC0AACssAAAmKwAAHywAABguAAASMgAADTUAAAg5AAACPQAAAEAAAABDAAAA RgAAAEkAAABMAAAATgAAAFEAAABTAAAAVQAAAFcAAABZAQAAXAYAAF8KAABiDgAAYxUAAGMfAABi LAAAYTwAAGBOAABfYgAAXnsAAFyWAABbsAAAWc8ALzAAACovAAAiMAAAGjMAABM3AAAOOwAACD8A AAFEAAAASAAAAEwAAABPAAAAUgAAAFUAAABYAAAAWwAAAF0AAABgAAAAYgAAAGQAAABmAAAAaQAA AG0FAABwCwAAdBAAAHQYAABzJQAAcjQAAHJFAABwWQAAb3EAAG2LAABrpgAAasAALjMAACU1AAAd OAAAFDwAAA5BAAAHRwAAAEwAAABRAAAAVQAAAFkAAABdAAAAYQAAAGUAAABoAAAAawAAAG0AAABv AAAAcgAAAHQAAAB3AAAAegAAAH4AAACCBAAAhgsAAIoRAACJHAAAiCsAAIY9AACEUgAAg2cAAIGB AAB/mwAAfrIAKToAACA9AAAWQgAAD0gAAAhOAAAAVAAAAFoAAABgAAAAZAAAAGkAAABuAAAAcgAA AHYAAAB6AAAAfQAAAIAAAACCAAAAhQAAAIgAAACLAAAAjgAAAJIAAACWAAAAmwMAAKAMAACiEwAA oCEAAJ8zAACdRwAAml4AAJh3AACXjwAAlacAI0MAABlIAAARTgAACVUAAABcAAAAYwAAAGoAAABx AAAAdgAAAHsAAACAAAAAhgAAAIoAAACOAAAAkQAAAJMAAACWAAAAmQAAAJwAAACgAAAAowAAAKcA AACrAAAAsAAAALYEAAC8DQAAuhcAALkoAAC3PAAAtFIAALJqAACvhQAArZwAHE4AABNUAAALXAAA AWQAAABsAAAAdAAAAHwAAACDAAAAiQAAAI8AAACUAAAAmgAAAJ8AAACiAAAApAAAAKcAAACqAAAA rgAAALEAAAC0AAAAuAAAALwAAADBAAAAxwAAAM0AAADUBQAA2BAAANUeAADTMQAA0EgAAM1fAADL dgAAyI4AAAAAAAAAAAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQlJigpKist Li8wMjM0Njc4OTs8PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xub3Bxc3R1 d3h5enx9foCBgoOFhoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2uLm6u72+ v8HCw8TGx8jJy8zNz9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7///////// /////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAABAwQFBggJ CgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7PD0+QEFCREVGR0lKS01OT1BS U1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKDhYaHiIqLjI6PkJGTlJWWmJma nJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvMzc/Q0dLU1dbX2drb3d7f4OLj 5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////////////////////////////// //////8AAAAAAAAAAAAAAAAAAAAAAQMEBQYICQoLDQ4PERITFBYXGBobHB0fICEiJCUmKCkqKy0u LzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJSktNTk9QUlNUVVdYWVtcXV5gYWJjZWZnaWprbG5vcHFzdHV3 eHl6fH1+gIGCg4WGh4iKi4yOj5CRk5SVlpiZmpydnp+hoqOkpqeoqqusra+wsbO0tba4ubq7vb6/ wcLDxMbHyMnLzM3P0NHS1NXW19na293e3+Di4+Tm5+jp6+zt7vDx8vT19vf5+vv8/v////////// ////////////////////////////////////////////AAECAwQFBgcICQoLDA0ODxAREhMUFRYX GBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9Q UVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJ iouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHC w8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7 /P3+/21mdDEAAAAAAwQhAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAABAgME BQYHCAgJCgsMDQ4PEBESExQVFhcYGRoaGxwdHh8gISIjJCUmJygpKissLS4vMDExMjM0NTY3ODk6 Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJz dHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqus ra6wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR09TV1tfY2drb3N3e3+Dh4uPk5ebn 6Onq6+zt7u/x8vP09fb3+Pn6+/z9/v8AAQECAgMDBAQFBgYHBwgICQkKCwsMDA0NDg8PEBARERIT ExQUFRYWFxcYGRkaGhscHB0eHh8gICEiIiMkJCUmJicoKSkqKywtLS4vMDEyMjM0NTY3ODk6Ozw9 Pj9AQkNERUZISUpMTU9QUlNVV1haXF5gYmRmaGptb3F0dnl8foGDhomLjpCSlZeZm52foaOlp6iq rK2vsLKztba3ubq7vL2/wMHCw8TFxsfIycrLzM3Nzs/Q0dLS09TV1tbX2NnZ2tvb3N3d3t/f4OHh 4uPj5OXl5ubn6Ojp6err6+zs7e7u7+/w8PHy8vPz9PT19vb39/j4+fn6+/v8/P39/v7/AAEBAgID AwQEBQYGBwcICAkJCgsLDAwNDQ4PDxAQERESExMUFBUWFhcXGBkZGhobHBwdHh4fICAhIiIjJCQl JiYnKCkpKissLS0uLzAxMjIzNDU2Nzg5Ojs8PT4/QEJDREVGSElKTE1PUFJTVVdYWlxeYGJkZmhq bW9xdHZ5fH6Bg4aJi46QkpWXmZudn6Gjpaeoqqytr7Cys7W2t7m6u7y9v8DBwsPExcbHyMnKy8zN zc7P0NHS0tPU1dbW19jZ2drb29zd3d7f3+Dh4eLj4+Tl5ebm5+jo6enq6+vs7O3u7u/v8PDx8vLz 8/T09fb29/f4+Pn5+vv7/Pz9/f7+/9rLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiI y7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5Lm pZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLL ujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWX kuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS 5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIve qJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkual l5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Ol h9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS 5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKs xrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkual l5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trL CRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN 4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5Lm pZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9Gw oofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWX kuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQ tMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5Lm pZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvo zQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZ j+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS 5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofV rZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkual l5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCz aLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS 5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ46 6cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Ol l5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWX kuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I 2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5Lm pZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7 rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWX kuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQ YNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5Lm pZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkual l5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvEtaiIy7Olh9GwoofVrZ+I2aud idyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS 5qWXkuall5LmpZeS5qWXkuall5LmpZeS5trLCRvozQ466cwQYNzIDpLLujKsxrdQtMCzaLy7rnvE taiIy7Olh9GwoofVrZ+I2audidyqnIveqJqN4aeZj+Oll5LmpZeS5qWXkuall5LmpZeS5qWXkual l5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5qWXkuall5LmpZeS5tnLCRvnzg056M0QYNzJ DZLLuzCrxrhPtMCzZ727rnvEtamIy7Kmh9Gvo4fVraCI2aueidypnIrep5uM4KWZj+OhmJDkoZiQ 5KGYkOShmJDkoZiQ5KGYkOShmJDkoZiQ5KGYkOShmJDkoZiQ5KGYkOShmJDkoZiQ5KGYkOShmJDk oZiQ5NnLCRrkzg05584OYNrKDJLLvC6rxblNtMC0Zr26rnrFtamHy7Gmh9Guo4fVrKCI2aqeidyn nIrepZuL4KKajeKemY/jnpmP456Zj+OemY/jnpmP456Zj+OemY/jnpmP456Zj+OemY/jnpmP456Z j+OemY/jnpmP456Zj+OemY/jnpmP49jLCRrhzww55c8OYNnKDJHLviyrxblMtb60Z725rnvFtKqH zLCmh9Gto4fVq6CI2aieiNulnYndo5yK35+ai+GbmY7im5mO4puZjuKbmY7im5mO4puZjuKbmY7i m5mO4puZjuKbmY7im5mO4puZjuKbmY7im5mO4puZjuKbmY7im5mO4tjLCRrc0As549ANYNjLC5HL vyurxLpMtb2zZ764rnvFtKmHzLCmh9Gso4fVqaCH2KafiNujnYjdoJyJ3p2biuCYmo3hmJqN4Zia jeGYmo3hmJqN4ZiajeGYmo3hmJqN4ZiajeGYmo3hmJqN4ZiajeGYmo3hmJqN4ZiajeGYmo3hmJqN 4dfMCRra0Qs43tEMX9bLC5HLwCmswrlNtryzaL63rnvGs6mHzK+mh9Gqo4bVp6GH2KSfh9qhnofc np2I3Zqcid6Vm4zglZuM4JWbjOCVm4zglZuM4JWbjOCVm4zglZuM4JWbjOCVm4zglZuM4JWbjOCV m4zglZuM4JWbjOCVm4zglZuM4NbMCRnZ0Qs42tMMX9TMC5HJwCmtwLlOtrqzab+1rnzGsqmHzK2m htGpo4bUpaGG16Kghtmfn4bam56H3JediN2TnIvek5yL3pOci96TnIvek5yL3pOci96TnIvek5yL 3pOci96TnIvek5yL3pOci96TnIvek5yL3pOci96TnIvek5yL3tXMCRnY0gs32NMLXtLMC5PHvyut vrhQt7myar+0rXzGsKmHzKumhtCnpIXUo6KF1p+hhdicoIXZmJ+G2pSeh9yQnYrdkJ2K3ZCdit2Q nYrdkJ2K3ZCdit2QnYrdkJ2K3ZCdit2QnYrdkJ2K3ZCdit2QnYrdkJ2K3ZCdit2QnYrdkJ2K3dTN CRnW0gs31tQLXtDLCpXEvi2uvLhRuLeyasCzrXzGrqmHzKmmhtClpIXToKOE1Z2ihNaZoYXYlaCF 2ZGfh9qOnonbjp6J246eiduOnonbjp6J246eiduOnonbjp6J246eiduOnonbjp6J246eiduOnonb jp6J246eiduOnonbjp6J29PNChjV0ws21NQLX87LCZfBvjCvurdTuLWybMCwrX3HrKqGy6enhc+i pYTRnqSE05qjhNWWooTWk6GF14+ghtiLoInZi6CJ2YugidmLoInZi6CJ2YugidmLoInZi6CJ2Yug idmLoInZi6CJ2YugidmLoInZi6CJ2YugidmLoInZi6CJ2dLOChfT1As10dMKYsvMCZm+vTOxt7dV ubKxbcGtrX3GqqqGy6SohM6fp4TQm6WD0pekg9OTo4TUkKOF1YyihtaJoYjXiaGI14mhiNeJoYjX iaGI14mhiNeJoYjXiaGI14mhiNeJoYjXiaGI14mhiNeJoYjXiaGI14mhiNeJoYjXiaGI19DPChbR 1As3ztMKZcbKC525vDiytLZYuq2xbsGqrn3Gp6uFyaGphMycqIPOl6eDz5Omg9GQpYTSjaWF04qk htOHo4jUh6OI1IejiNSHo4jUh6OI1IejiNSHo4jUh6OI1IejiNSHo4jUh6OI1IejiNSHo4jUh6OI 1IejiNSHo4jUh6OI1M7QChXO1Ao6ytMKaMDID6G1uz60rbVbu6mxb8Gmr33Eo62Ex52rg8qYqoPL k6mDzZCohM6Np4TPiqeFz4emh9CFpojRhaaI0YWmiNGFpojRhaaI0YWmiNGFpojRhaaI0YWmiNGF pojRhaaI0YWmiNGFpojRhaaI0YWmiNGFpojRhaaI0czQCRjK1Ao+xdMKbbjFFqWuuUS1p7Veu6Oy cMChsH3Dn66ExZmtg8eUrITJkKuEyo2qhcuKqoXLiKmGzIWph82DqInNg6iJzYOoic2DqInNg6iJ zYOoic2DqInNg6iJzYOoic2DqInNg6iJzYOoic2DqInNg6iJzYOoic2DqInNg6iJzcjRCRvF1QpC v9MKcrHEHqeluUm2obZgu56zcL6dsX3Bm7CEw5WvhMSRroTGja2Fx4qthseIrIbIhqyHyISricmC q4rJgquKyYKrismCq4rJgquKyYKrismCq4rJgquKyYKrismCq4rJgquKyYKrismCq4rJgquKyYKr ismCq4rJgquKycTSCCDA1glIuNQKeKnPF5ievkeumrZiupi1cbyXs3y+l7KEwJKxhcKNsIXDiq+G xIivh8SGr4jFhK6JxYOuisWBrovFga6LxYGui8WBrovFga6LxYGui8WBrovFga6LxYGui8WBrovF ga6LxYGui8WBrovFga6LxYGui8WBrovFga6Lxb/UByW61wlOrtoLcKDbE4eXzTmaksNYqJG8bLKR t3q5krSDvY6zhr+LsofAiLGHwIaxiMGEsYnBg7GKwYKxi8KAsIzCgLCMwoCwjMKAsIzCgLCMwoCw jMKAsIzCgLCMwoCwjMKAsIzCgLCMwoCwjMKAsIzCgLCMwoCwjMKAsIzCgLCMwvfAEBX4wBYx+b0g U+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPY rYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqs hZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOS itCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd 2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/ vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqs hZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3 KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY 2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3a rIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCx j4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyF ndqshZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCI w7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3a rIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzM qESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayF ndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd 2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vS sIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqs hZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mb iMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd 2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESq xqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqs hZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfA EBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3mIjKtZWJzbOSitCxj4vSsIyN 1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3a rIWd2qyFndqshZ3arIWd2vfAEBX4wBYx+b0gU+q3KHzMqESqxqVdtMKjcLq+on+/vKCIw7mbiMa3 mIjKtZWJzbOSitCxj4vSsIyN1K+KkNauiJPYrYaY2ayFndqshZ3arIWd2qyFndqshZ3arIWd2qyF ndqshZ3arIWd2qyFndqshZ3arIWd2qyFndqshZ3arIWd2vfADxX4wBYw+b0gU+q4J3zMqESrxqVd tMKkcLq+on+/vKCIw7mbiMe3mIjKtZWJzrOSitCxj4vTsI2N1a+Kj9etiJPZrYaY2quGndqrhp3a q4ad2quGndqrhp3aq4ad2quGndqrhp3aq4ad2quGndqrhp3aq4ad2quGndqrhp3aq4ad2vfBDxX3 wRYw+L4fU+q4JnzLqUOrxqZctMKkb7q+on6/u6CIw7mdh8i2mofMs5eIz7GUidKwkorVro+M162N jtmsipLcq4mZ3aeInNuniJzbp4ic26eInNuniJzbp4ic26eInNuniJzbp4ic26eInNuniJzbp4ic 26eInNuniJzbp4ic2/bBDhT3wRUw+L8eU+q5JXzLqUKrxqdbs8Klbrq+o36/u6GIxLieh8m1nIfN spmH0bCWiNSulInXrZKL2quQjdypjZLfqI2a36OLnNyji5zco4uc3KOLnNyji5zco4uc3KOLnNyj i5zco4uc3KOLnNyji5zco4uc3KOLnNyji5zco4uc3PbBDhT2whUw978eU+q6JHzLqUGsxqdas8Kl bbq+o32/u6OIxLegh8m0nYfOsZuH06+ZiNatl4naq5WK3KmTjd+nkpHipJGZ4KCOnNygjpzcoI6c 3KCOnNygjpzcoI6c3KCOnNygjpzcoI6c3KCOnNygjpzcoI6c3KCOnNygjpzcoI6c3PXCDhT1whQw 9sAdU+q6I3zLqkGsxqhZs8Kmbbq+pH2/uqSHxbehh8qzn4fPsJ2H1K6biNirmYncqZiL36eYjuKl l5LmoJaZ4JyTm92ck5vdnJOb3ZyTm92ck5vdnJOb3ZyTm92ck5vdnJOb3ZyTm92ck5vdnJOb3ZyT m92ck5vdnJOb3fTCDRT1wxQw9sAcU+q7InzKqkCsxqhYs8KmbLq+pHy/uqWFxbajh8uzoYfQsJ+H 1a2diNqqnYrdp5uM4KSajuKfmI/jnZqY4ZmXm92Zl5vdmZeb3ZmXm92Zl5vdmZeb3ZmXm92Zl5vd mZeb3ZmXm92Zl5vdmZeb3ZmXm92Zl5vdmZeb3fLDDRT0wxMw9cEbU+q8IXzKqz+txqlXs8Kna7q+ pXu/uqaExbalh8uyo4fRr6GH1qufiNqnnYndpJyK36Cbi+Cbmo3il5qT4Zecm96XnJvel5yb3pec m96XnJvel5yb3pecm96XnJvel5yb3pecm96XnJvel5yb3pecm96XnJvel5yb3vDDDRT0xBMv9cIa Uuq9IHzKqz6sxqpWs8Koa7q+p3m/uqiDxbanh8yypYfRrKKH1qigh9mknojcoZ2I3Zycid6Xm4vg k5uP4JKdl96SnZfekp2X3pKdl96SnZfekp2X3pKdl96SnZfekp2X3pKdl96SnZfekp2X3pKdl96S nZfekp2X3u3EDBPzxRIv9MIZUuq9H3zKrDysxqtVs8Koarm+qXe/uqqAxbWph8yvpYfSqqKH1qWg htihn4banZ6H25mdh92UnYnekJyN3o6dk92OnZPdjp2T3Y6dk92OnZPdjp2T3Y6dk92OnZPdjp2T 3Y6dk92OnZPdjp2T3Y6dk92OnZPdjp2T3erFDBPyxREv88MYUuq+HXzLrTqsxqxUs8Kpabm+rHO/ uq1+xbKph8yspYbRp6OG1aKhhdeeoIXYmqCF2pafhtuRnojcjZ6L3Iuej9yLno/ci56P3Iuej9yL no/ci56P3Iuej9yLno/ci56P3Iuej9yLno/ci56P3Iuej9yLno/ci56P3ObFCxPxxhEv8sQXUurA G3zLrzisxq1SssKrZrm/sG++t61+xrCph82qpobRpKSF05+jhNWbooTWl6GF2JOghdmPoIfZi5+K 2oifjdqIn43aiJ+N2oifjdqIn43aiJ+N2oifjdqIn43aiJ+N2oifjdqIn43aiJ+N2oifjdqIn43a iJ+N2uHGChPwxxAu8MYWUerBGXzLsDWrx69PssOwYLi8smy/sq1+x62phsynp4XPoaWE0pykhNOY o4TUlKOE1ZCihdaNoYbXiaGI2Iehi9iHoYvYh6GL2Iehi9iHoYvYh6GL2Iehi9iHoYvYh6GL2Ieh i9iHoYvYh6GL2Iehi9iHoYvYh6GL2NvHCRLuyQ8u7sgUUevEFnzMszCrx7FMscS4Vre2sW7Brq1/ x6mqhsujqITOnqeDz5mmg9GVpYPSkaSE046khdSLo4bUiKOI1YWjitWFo4rVhaOK1YWjitWFo4rV haOK1YWjitWFo4rVhaOK1YWjitWFo4rVhaOK1YWjitWFo4rVhaOK1drICRLryw0t68oRUOvHEnzM tiqqyLdEsLq2WbqvsXDCqq1/x6arhcqgqoTMmqiDzZaog86Sp4PPj6aE0IymhdGJpYbRh6WH0oWl idKFpYnShaWJ0oWlidKFpYnShaWJ0oWlidKFpYnShaWJ0oWlidKFpYnShaWJ0oWlidKFpYnShaWJ 0tjJCRHfzQss580PT+jLDnvNvCKowrw8sbG1XrypsXLCpq5/xaKthMecq4PJl6qDypOqhMuQqYTM jamEzYuohc2IqIbOhqeHzoSnic+Ep4nPhKeJz4Snic+Ep4nPhKeJz4Snic+Ep4nPhKeJz4Snic+E p4nPhKeJz4Snic+Ep4nPhKeJz9XJCRDYzwor2tMLTtjQC3rNwxaos7pGtam0Yr2ksXTBobB/w56u hMWZrYTHlKyEyJCrhMmOq4TKi6qFy4mqhsuHqYfMhamIzIOpicyDqYnMg6mJzIOpicyDqYnMg6mJ zIOpicyDqYnMg6mJzIOpicyDqYnMg6mJzIOpicyDqYnMg6mJzNLLCQ/U0Qop1dULTNDQCn64vyWu qLhPuKG0ZryesnW/nbF/wZuwhMOWroTFka6Exo6thceLrIXHiayGyIesh8mGq4fJhKuJyYKrisqC q4rKgquKyoKrisqCq4rKgquKyoKrisqCq4rKgquKyoKrisqCq4rKgquKyoKrisqCq4rKgquKys/M CQ3Q0gooztQKUsXRCoOqwy2onrdXuJu1aLuatHW+mbJ/v5exhMGTsIXCj6+Fw4yvhcSKrobFiK6H xYauiMaErYjGg62KxoGti8eBrYvHga2Lx4Gti8eBrYvHga2Lx4Gti8eBrYvHga2Lx4Gti8eBrYvH ga2Lx4Gti8eBrYvHga2Lx8zNCQzL0wotx9QKWbLYC4CezSuamMFQq5a4Z7eVtXW8lLR+vpSzhb+Q soXAjLGGwYqxh8KIsIfChrCIwoWwicODsIrDgq+Lw4GvjMOBr4zDga+Mw4GvjMOBr4zDga+Mw4Gv jMOBr4zDga+Mw4GvjMOBr4zDga+Mw4GvjMOBr4zDga+Mw8fPCBDF1Ak0uNkKW6LnEnaX2iWJkM9F mI7HXaONwW6rjb15sYy6gbSJuIO3hreFuYS2hrqDtYe7grWIvIG0ib2AtIq9f7SLvn6zjL5+s4y+ frOMvn6zjL5+s4y+frOMvn6zjL5+s4y+frOMvn6zjL5+s4y+frOMvn6zjL5+s4y+frOMvsLRBxa9 1gg6p/EOVZvxG2iR5i14id1AhYXVVo+Dz2eXgstznX7IeKF7xnykecR/pnfDgqh1woSpdMKFqnPB h6tywYircsCKrHHAi6xxwIusccCLrHHAi6xxwIusccCLrHHAi6xxwIusccCLrHHAi6xxwIusccCL rHHAi6xxwIusccCLrP+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrD upGLxriNjci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGw fqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSb crbCm3+5wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k 0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n /7QqRvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820 g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+ pNGwfqTRsH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGL xriNjci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTR sH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbC m3+5wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+ pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n/7Qq RvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820g5bP s4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGw fqTRsH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGLxriN jci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k 0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbCm3+5 wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGw fqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB4n/7QqRvev Nmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGLxriNjci3io/KtoiRzLWFk820g5bPs4GZ 0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTR sH6k0f+4FA7/uB4n/7QqRvevNmnep0KPx5tiscSbcrbCm3+5wJuIvb6ZicC8lYrDupGLxriNjci3 io/KtoiRzLWFk820g5bPs4GZ0LOAndGyf6PRsH6k0bB+pNGwfqTRsH6k0bB+pNGwfqTRsH6k0bB+ pNGwfqTRsH6k0bB+pNGwfqTRsH6k0f+4FA7/uB0n/7UpRvewNWneqEGQx5xhscSccbbCm365v52G vb2aicG7l4nEuZOKx7ePjMq1jI7MtImQzrOHktCyhJXSsYKZ07GBntSugKLUrICj0qyAo9KsgKPS rICj0qyAo9KsgKPSrICj0qyAo9KsgKPSrICj0qyAo9KsgKPSrICj0v+5Ew7/uRwn/7YoRvewNGrd qECQx51gscSccbbCnHy6v56FvryciMK6mYjFuJWJybaRisy0jozPsouO0bGIkdOwhpTVr4SZ1q+D n9eqgqHVp4Ki06eCotOngqLTp4Ki06eCotOngqLTp4Ki06eCotOngqLTp4Ki06eCotOngqLTp4Ki 0/+5Ew7/uRwn/7YoRvexM2rdqT+Rx51gscSdcLbCnnu6v5+DvryeiMK5m4jHt5eIyrWUic6zkIvR sY2N06+KkNauiJPYrYaZ2aqFntmlhKHVpISi1KSEotSkhKLUpISi1KSEotSkhKLUpISi1KSEotSk hKLUpISi1KSEotSkhKLUpISi1P+6Eg7/uhsn/7cnRvexMmrdqT6Rx55fscSdb7bBn3m6vqCCv7ug iMO4nIfItpmIzLOWiNCxkorTr4+M1q6MjtisipPbq4mZ3KaHndqihqDWoIai1KCGotSghqLUoIai 1KCGotSghqLUoIai1KCGotSghqLUoIai1KCGotSghqLUoIai1P+6Eg7/uhsm/7cmRvayMWrdqj2R x55escSdb7bBoHi6vqGBv7uhiMS4nofJtZuHzbKYiNGwlYnVrpKL2KyPjduqjZLeqIya36KKndqe iaDWnImh1JyJodSciaHUnImh1JyJodSciaHUnImh1JyJodSciaHUnImh1JyJodSciaHUnImh1P66 EQ7/uxom/7gmRvayMGrdqjyRx55dscSebrbBoXa6vqJ/v7ujiMS3oIfKtJ2Hz7Gah9OumIjXrJWK 26qTjd6okZLipJCZ4J6NnduajKDXmYuh1ZmLodWZi6HVmYuh1ZmLodWZi6HVmYuh1ZmLodWZi6HV mYuh1ZmLodWZi6HVmYuh1f67EQ7+uxom/7glRvazMGrcqzuSx59dscSfbLbBonS6vqR+v7qkh8W3 oofKs5+H0LCch9WtmojZqpmK3qiYjuKll5Pmn5WZ4JqRnNuXj5/Xlo6h1ZaOodWWjqHVlo6h1ZaO odWWjqHVlo6h1ZaOodWWjqHVlo6h1ZaOodWWjqHVlo6h1f27EQ7+uxom/7klRvazL2rcqzqSx59c scSgarbBo3O6vqV8wLqlhcW2o4fLs6GH0a+fh9asnonbqJyL36SajeGfmY/jnJqY4ZeWnNyUk5/Y k5Kg1pOSoNaTkqDWk5Kg1pOSoNaTkqDWk5Kg1pOSoNaTkqDWk5Kg1pOSoNaTkqDWk5Kg1v27EQ39 vBkm/rkkRva0LmrcqzqSx6BcscShaLbBpXG6vqd6wLqnhMW2pofMsqSH0a6ih9epn4jbpJ2J3qCb iuCamozhlpuT4ZWbm92Sl57YkZWg15GVoNeRlaDXkZWg15GVoNeRlaDXkZWg15GVoNeRlaDXkZWg 15GVoNeRlaDXkZWg1/y8EA39vBkm/rojRva0LWrcrDmSx6BbscSjZrXBpm66vql4wLqpgsW2qIjM sKWH0qqih9emn4faoZ6H3JudiN6WnIrfkZuQ35Gdmd2Pm57Zj5mf14+Zn9ePmZ/Xj5mf14+Zn9eP mZ/Xj5mf14+Zn9ePmZ/Xj5mf14+Zn9ePmZ/Xj5mf1/y8EA38vBgm/boiRfa1LGrcrTeTx6FascWl Y7XCqWu6vqx1v7qtf8WzqYfMraWG0qeihtaioYbYnZ+G2pieh9uSnYndjp2N3YyelNyNoJ7ZjJ6f 14yen9eMnp/XjJ6f14yen9eMnp/XjJ6f14yen9eMnp/XjJ6f14yen9eMnp/XjJ6f1/u9EA37vRcl /bsiRfa2K2rbrTaTx6JZscWnX7XCrWa5v7FwvretfsawqYfNqqaG0aSkhdSeooXWmaGF2JSghtmP n4fai5+L24ifkNuIoJjYiKGd14ihndeIoZ3XiKGd14ihndeIoZ3XiKGd14ihndeIoZ3XiKGd14ih ndeIoZ3XiKGd1/q9Dg36vhYl/LwgRfa3KmrbrzSUyKRVscarWLTDs1+3u7Juv7KtfsesqYbMpqeF 0KClhNKbpITUlqOE1ZGihdaNoYbXiaGJ2IahjdiEoZPXhKKX1oSil9aEopfWhKKX1oSil9aEopfW hKKX1oSil9aEopfWhKKX1oSil9aEopfWhKKX1vm+Dgz5vxUl+r0fRfa4J2rbsDGUyKhNr8eyTrLB uFi4tLFwwa2tf8epqoXLoqiEzp2ng9CXpoPRkqWE0o6khdOLo4bUiKOI1YSji9WCo5DVgaOT1YGj k9WBo5PVgaOT1YGjk9WBo5PVgaOT1YGjk9WBo5PVgaOT1YGjk9WBo5PVgaOT1fTADQz3wBMk+b8d RPa6JWrasi6Vyq9Arci9Pa+3tl26rrFywqmtf8alq4XJn6qDy5mpg82UqIPOkKeEz4ymhdCJpobR hqWH0oSlitKBpY3SgKWP0oClj9KApY/SgKWP0oClj9KApY/SgKWP0oClj9KApY/SgKWP0oClj9KA pY/SgKWP0uzBCwz1whIk9sEaRPe9IWratCmWzbwoqbu7Q7OutWG8qLFzwaWuf8WhrYTHm6yDyZar g8qRqoTLjqmEzIuphc2IqIbOhqiHzoOoic6Bp4zPgKeNz4Cnjc+Ap43PgKeNz4Cnjc+Ap43PgKeN z4Cnjc+Ap43PgKeNz4Cnjc+Ap43PgKeNz9/ECQvyxRAj88QWQ/TBHGnewhWPwcAjrK+5TLamtGW9 orJ1wKCwgMOdroTFl62ExpOthMePrITIjKuFyYmrhsqHq4bKhaqIyoOqicuBqovLgKqMy4CqjMuA qozLgKqMy4CqjMuAqozLgKqMy4CqjMuAqozLgKqMy4CqjMuAqozLgKqMy9rFCArryQ0i7sgSQu/G FWjQ0gqHsb4vrqW4VLiftWi8nbN2v5uxf8GZsITClK+Ew5CvhcSNroXFiq6GxoithsaHrYfGha2I x4OticeBrYvHgKyLx4Csi8eArIvHgKyLx4Csi8eArIvHgKyLx4Csi8eArIvHgKyLx4Csi8eArIvH gKyLx9XGCAnZzAog5c8NQNjVC1+91guIpcQ0ppy3WriZtWu7l7R3vZazf76VsoXAkbGFwY6xhcGL sIbCibCHwoiwh8OGsIjDha+Jw4OvisSCr4vEga+LxIGvi8SBr4vEga+LxIGvi8SBr4vEga+LxIGv i8SBr4vEga+LxIGvi8SBr4vEga+LxNLICAfTzwod1dQLPcLZC2Or3hCDm84zmZTEU6aRvmevkLp0 tJC3fbmRtYS8jrOGvoyyhr+KsofAiLKIwIaxiMGFsYnBhLGKwYKxi8GBsYzCgLGMwoCxjMKAsYzC gLGMwoCxjMKAsYzCgLGMwoCxjMKAsYzCgLGMwoCxjMKAsYzCgLGMws7KCAbO0QocxtcKQa/qDmGd 5hx4kNoyiIvSTJSJy1+ciMZuo4jDeKiFwHyrg79/roC9gbB/vIOxfbyEsny7hrN7u4e0erqItHm6 ibV4uYu1eLmMtni5jLZ4uYy2eLmMtni5jLZ4uYy2eLmMtni5jLZ4uYy2eLmMtni5jLZ4uYy2eLmM tsnLCAbI0gkis98JQqD8FVqT8Chqi+Y5d4TfSYKB2FuLgNNpkXzQcZZ5zXaadst6nXTKfZ5yyX+g cciBoXDHg6Jvx4WjbsaGo23GiKRsxYqlbMWLpWzFi6VsxYulbMWLpWzFi6VsxYulbMWLpWzFi6Vs xYulbMWLpWzFi6VsxYulbMWLpcTOBwq32Qcmo/sOPZb/Hk6N+i9bhvI/Z4DrTnF75Vt5duBlgHHd bIRu2nKIa9l3i2nXeo1n1n6OZtWAj2XUgpBk1ISRY9OGkWLTiZJh0ouTYdKMk2HSjJNh0oyTYdKM k2HSjJNh0oyTYdKMk2HSjJNh0oyTYdKMk2HSjJNh0oyTYdKMk/+xGAn/sSMe/64xOv+pPlntokt5 2Zpcl8iVcrDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaUxbmDlsa5gZnHuICbyLh+nsm3 faLKt3ynyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyv+x GAn/sSMe/64xOv+pPlntokt52Zpcl8iVcrDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaU xbmDlsa5gZnHuICbyLh+nsm3faLKt3ynyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nK tHupyrR7qcq0e6nKtHupyv+xGAn/sSMe/64xOv+pPlntokt52Zpcl8iVcrDFlX21w5eFuMGXi7u/ k4y9vo+OwLyMj8K7iZLEuoaUxbmDlsa5gZnHuICbyLh+nsm3faLKt3ynyrR7qcq0e6nKtHupyrR7 qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyv+xGAn/sSMe/64xOv+pPlntokt52Zpc l8iVcrDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaUxbmDlsa5gZnHuICbyLh+nsm3faLK t3ynyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyv+xGAn/ sSMe/64xOv+pPlntokt52Zpcl8iVcrDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaUxbmD lsa5gZnHuICbyLh+nsm3faLKt3ynyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHup yrR7qcq0e6nKtHupyv+xGAn/sSMe/64xOv+pPlntokt52Zpcl8iVcrDFlX21w5eFuMGXi7u/k4y9 vo+OwLyMj8K7iZLEuoaUxbmDlsa5gZnHuICbyLh+nsm3faLKt3ynyrR7qcq0e6nKtHupyrR7qcq0 e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyv+xGAn/sSMe/64xOv+pPlntokt52Zpcl8iV crDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaUxbmDlsa5gZnHuICbyLh+nsm3faLKt3yn yrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyv+xGAn/sSMe /64xOv+pPlntokt52Zpcl8iVcrDFlX21w5eFuMGXi7u/k4y9vo+OwLyMj8K7iZLEuoaUxbmDlsa5 gZnHuICbyLh+nsm3faLKt3ynyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7qcq0e6nKtHupyrR7 qcq0e6nKtHupyv+xFwn/siIe/64wOv+pPVnso0p52JtbmMeVcrHFl3u1w5iDuMGZiru/lYu+vZGM wbuOjsO6ipDFuYeSx7iElcm3gpjKtoCby7Z+nsy1faPMs3ynza98qMuvfKjLr3yoy698qMuvfKjL r3yoy698qMuvfKjLr3yoy698qMuvfKjLr3yoy/+yFwn/siEe/68vOv+qPFnspEl62JtamcaWcbLE mHi1wpmBucCbiLy+l4q/vJSLwrqQjcW5jI7Ht4iRybaFlMu1g5fNtIGazrR/n8+zfqTPrn2mzqt9 qMyrfajMq32ozKt9qMyrfajMq32ozKt9qMyrfajMq32ozKt9qMyrfajMq32ozP+yFgn/syEe/7Au Ov+rO1nspEh615xZmsaXb7LEmXa2wpt/ucCch729monAu5aKw7mSi8a3jo3JtoqPzLSHks6zhJbQ soGa0bKAn9Kuf6PSqn+lz6Z/p82mf6fNpn+nzaZ/p82mf6fNpn+nzaZ/p82mf6fNpn+nzaZ/p82m f6fNpn+nzf+zFgn/syAe/7AtOv+rOlnspUd61pxZmsaYbbLEmnS2wpx9ub+dhb29nIjBu5iJxbiU isi2kIvLtIyOzrOIkdGxhZXTsIOa1LCCoNWqgaLTpoGl0KOBp82jgafNo4GnzaOBp82jgafNo4Gn zaOBp82jgafNo4GnzaOBp82jgafNo4Gnzf+zFQj/tCAe/7EtOv+sOVnrpUZ71pxYm8aZa7LEnHK2 wp17ub+fg768nojCupqIxreWicq1korNs46M0LGKj9Ovh5TWroWa2KuDn9emg6LUooOk0J+Dps2f g6bNn4OmzZ+Dps2fg6bNn4OmzZ+Dps2fg6bNn4OmzZ+Dps2fg6bNn4Omzf+0FQj/tB8e/7EsOv+s OVnrpkV71Z1Ym8eaabLEnXC2wp95ur+ggr68n4jCuZyIx7aYiMu0lInPsZCL06+MjtatiZPZrIeb 26aGntmihaHVnoWk0ZyFps6chabOnIWmzpyFps6chabOnIWmzpyFps6chabOnIWmzpyFps6chabO nIWmzv+0FAj/tB8d/7EsOv+tOFnrpkV71Z1XnMebZ7LEnm62wqB3ur+hgL67oYjDuJ6HyLWah82y l4jRsJOK1a2PjdmrjJPdqIqb3qKIntmeiKHVm4ek0ZmHps6Zh6bOmYemzpmHps6Zh6bOmYemzpmH ps6Zh6bOmYemzpmHps6Zh6bOmYemzv+0FAj/tR4d/7IrOv+tOFrrpkR71Z1XnMecZbLEn2y1wqF1 ur6ifr+7o4fEuKCHybSdh86xmYjTrpaJ2KuTjNyokJLho46a356Mntqai6HVl4qk0ZaJps6WiabO lommzpaJps6WiabOlommzpaJps6WiabOlommzpaJps6WiabOlommzv+0FAj/tR4d/7IqOv+tN1rr p0N81Z5VncedY7LEoGq1wqNzur6kfL+7pIXEt6KHyrOfh9CwnYfVrJqJ26mYjOCll5PmnpSa35mR ndqWj6DWlI2j0pOMpc+TjKXPk4ylz5OMpc+TjKXPk4ylz5OMpc+TjKXPk4ylz5OMpc+TjKXPk4yl z/+1Ewj/tR4d/7MqOv+uNlrrp0N81Z9TnceeYLLFomi1wqVwur6mer+7poPFt6WHy7Oih9GvoIfX qp6J3KSbi+CdmY7jmpuZ4JWWnNuTk6DXkZGj05CPpc+Qj6XPkI+lz5CPpc+Qj6XPkI+lz5CPpc+Q j6XPkI+lz5CPpc+Qj6XPkI+lz/+1Ewj/th0d/7MpOv+uNlrrqEJ81aBRncefXrHFpGS1wqdtub6p d7+7qYHEtqiIy7Glh9GroofXpZ+I256diN2Xm4vgkpuT35KcnNyPmJ/XjpWi042TpNCNk6TQjZOk 0I2TpNCNk6TQjZOk0I2TpNCNk6TQjZOk0I2TpNCNk6TQjZOk0P+1Ewj/th0d/7QpOv+vNVrqqEF8 1aJOnMehWrHFpmC0wqppub+tc767rn3EtKqHy62lhtGnoobVoKCG2JmfhtuSnYndjZ2O3YyemNuM np/Yi5qi1IqXpNGKl6TRipek0YqXpNGKl6TRipek0YqXpNGKl6TRipek0YqXpNGKl6TRipek0f+2 Egj/txwd/7QoOf+wNFrqqUB91aRJnMikVbDGqluzw69jt8CzbL22rnzFsKmHzKmmhtCjpIXUnKKE 1pWhhdiPn4faip+L24efktqIoZzXiJ+h1IecpNGHnKTRh5yk0YecpNGHnKTRh5yk0YecpNGHnKTR h5yk0YecpNGHnKTRh5yk0f+2Egj/txsd/7UnOf+wM1rqqj591qhEm8moT6/HsFOyxbhZtbmzbb+x rX3GrKqGy6Wnhc+fpoTRmKSE05KjhNWMoobXiKGK14WhjteDopbWhKSf1ISio9GEoqPRhKKj0YSi o9GEoqPRhKKj0YSio9GEoqPRhKKj0YSio9GEoqPRhKKj0f+3EQf/uBoc/7YlOf+xMVrqqzx+16w7 mcqtRK3JuUWuvbhZuLKyb8Csrn7GqKuFyqGphM2bp4PPlaaD0I+lhNKKpIbThqOI1IOjjNSBo5HU gKSZ04CmodGApqHRgKah0YCmodGApqHRgKah0YCmodGApqHRgKah0YCmodGApqHRgKah0f+4EAf/ uRkc/7ckOf+zL1rprTl+2bQvlsy4MqnCvUCws7ZduqyxccGnrn7FpKyFyJ2rg8qXqYPMkqiEzo2n hM+Jp4bQhaaI0IKmi9GApo7RfqaU0H2nms99p5rPfaeaz32nms99p5rPfaeaz32nms99p5rPfaea z32nms99p5rPfaeaz/+5Dwf/uhcc/7kiOf+1LVrsszB63cAfkMnDIai1uki0q7VivKayc8Cjr37D oK6Expmsg8iUq4TJj6qEyouqhcuIqYbMhamIzYKois2AqI3OfqiRzXypls18qZbNfKmWzXypls18 qZbNfKmWzXypls18qZbNfKmWzXypls18qZbNfKmWzfy7Dgf8vBUb/rsfOP+3KVrwvSR039MOhrnB KqqquU+2pLVlvKCydL+esX/Cm6+Ew5auhMWRrYTGja2Fx4qshsiHrIfJhauIyYKrisqAq4zKfquP ynyrksp8q5LKfKuSynyrksp8q5LKfKuSynyrksp8q5LKfKuSynyrksp8q5LKfKuSyvG9DAb5vhIa +r4bN/y6JVrnzhNoyNkLia3DMqehuFa4nbVou5uzdb6Zsn/AmLGEwZOwhcKPr4XDjK+GxImuhsWG rofFhK6IxoOtisaBrYvGf62Ox32tkMd9rZDHfa2Qx32tkMd9rZDHfa2Qx32tkMd9rZDHfa2Qx32t kMd9rZDHfa2Qx9/ACAX1wg8Z9sIWNu7IFVDN3AxmtdoPiKLJNqCavlawl7dquZW1dryUtH6+lLOE v5CyhcCNsYbBirGGwYixh8KGsIjChLCJwoOwisOBsIvDgK+Nw36vj8N+r4/Dfq+Pw36vj8N+r4/D fq+Pw36vj8N+r4/Dfq+Pw36vj8N+r4/Dfq+Pw9nCBwXkxwsY78gQNNHaC0W66Q5opt4YgpjRN5WR yFOhj8JlqY6+cq6NvHuyjLqBtYm4greHuIS4hbeFuYO2hrqCtoe6gbWIu4C1ibt+tYq8fbSMvHy0 jb18tI29fLSNvXy0jb18tI29fLSNvXy0jb18tI29fLSNvXy0jb18tI29fLSNvdTEBwTWywkV09QL J73iDEmp9BRlmeYleI7cOYaI1E+Qhs9gl4TMbZyDyXWgf8d4on3Ge6R6xX2mecSAp3fDgah2woOp dcKEqnTBhqtzwYercsCJrHG/i61xv4utcb+LrXG/i61xv4utcb+LrXG/i61xv4utcb+LrXG/i61x v4utcb+Lrc/GBwLQzQkSwNkJLKz3D0ib+h5cj+8xa4bnQnaA4lB+ft1fhXvZaYp31W6PdNNzknHR d5Rw0HqWbs99l23Of5lszYGZa82DmmrMhZtpzIecaMuJnWfKjJ1nyoydZ8qMnWfKjJ1nyoydZ8qM nWfKjJ1nyoydZ8qMnWfKjJ1nyoydZ8qMncrICAHC0gcTruYJLZ3/FUGR/yhQh/o5XIHzSGZ87VRu d+hedXHkZXpt4Wt+at9wgWjedYRm3HiFZdt7h2Pafohi2oGJYdmDimDZhYpg2IeLXtiKjF7WjY1e 1o2NXtaNjV7WjY1e1o2NXtaNjV7WjY1e1o2NXtaNjV7WjY1e1o2NXtaNjcTKBwOx2gQVn/8NKJL/ HTeJ/y5Dgv89Tnz9S1d3+FZfb/NdZWjwYmpk7WluYetvcV/pc3Nd6Hd1XOd7dlvmfnda5oB4WeWD eVjlhXpY5Ih6V+SLe1bjjnxW4458VuOOfFbjjnxW4458VuOOfFbjjnxW4458VuOOfFbjjnxW4458 VuOOfP+qHAX/qicX/6c2L/+iREr6nVJl6pdfftyTbpPPknilxpKCtMSSibbDkY64wY6QusCKkry/ h5S9voSWv76CmcC9gJvBvX6ewbx9ocK8e6TCvHqow7x5rcO4ea/CuHmvwrh5r8K4ea/CuHmvwrh5 r8K4ea/CuHmvwrh5r8K4ea/CuHmvwv+qHAX/qicX/6c2L/+iREr6nVJl6pdfftyTbpPPknilxpKC tMSSibbDkY64wY6QusCKkry/h5S9voSWv76CmcC9gJvBvX6ewbx9ocK8e6TCvHqow7x5rcO4ea/C uHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwv+qHAX/qicX/6c2L/+iREr6 nVJl6pdfftyTbpPPknilxpKCtMSSibbDkY64wY6QusCKkry/h5S9voSWv76CmcC9gJvBvX6ewbx9 ocK8e6TCvHqow7x5rcO4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmv wv+qHAX/qicX/6c2L/+iREr6nVJl6pdfftyTbpPPknilxpKCtMSSibbDkY64wY6QusCKkry/h5S9 voSWv76CmcC9gJvBvX6ewbx9ocK8e6TCvHqow7x5rcO4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4 ea/CuHmvwrh5r8K4ea/CuHmvwv+qHAX/qicX/6c2L/+iREr6nVJl6pdfftyTbpPPknilxpKCtMSS ibbDkY64wY6QusCKkry/h5S9voSWv76CmcC9gJvBvX6ewbx9ocK8e6TCvHqow7x5rcO4ea/CuHmv wrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwv+qHAX/qicX/6c2L/+iREr6nVJl 6pdfftyTbpPPknilxpKCtMSSibbDkY64wY6QusCKkry/h5S9voSWv76CmcC9gJvBvX6ewbx9ocK8 e6TCvHqow7x5rcO4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwrh5r8K4ea/CuHmvwv+q GwX/qicX/6c1L/+jREr6nVFl6ZdeftuUbZTPknemxZKBtMSTiLbDko24wY+PusCLkby/iJO+voWW v72CmMG8gJvCvH6ewrx9ocO7e6TEu3qpxLp5rcS1ea7DtXmuw7V5rsO1ea7DtXmuw7V5rsO1ea7D tXmuw7V5rsO1ea7DtXmuw/+rGwX/qyYX/6g0L/+kQ0r5nlBl6Zhdf9qVaZXNlHSoxZR+tMSVhrbC lYy5wZGOu7+NkL2+iZK/vYaUwbyDl8O7gZrEun6dxbp9oca6e6XGuXqqxrV6rMaxeq3EsXqtxLF6 rcSxeq3EsXqtxLF6rcSxeq3EsXqtxLF6rcSxeq3EsXqtxP+rGgX/qyUX/6k0L/+kQkr5n09m6Jlc gNqWZpbMlXGpxZV8tMSWg7fCl4u6wJOMvL6Pjr+9i5DBvIeTw7qElsW5gZnGuX+dx7h9oci4fKbJ tXqqybB7q8ese63FrHutxax7rcWse63FrHutxax7rcWse63FrHutxax7rcWse63FrHutxf+sGQX/ rCQW/6kzL/+lQUr5n09m6JlbgdmYY5bMlm+qxZZ5tMOXgbfBmIm6v5WLvb6RjcC8jY/CuoiSxbmF lce4gpjJt3+dyrZ9osu2fKjLsHupyqx8qsiofazFqH2sxah9rMWofazFqH2sxah9rMWofazFqH2s xah9rMWofazFqH2sxf+sGQX/rCQW/6oyL/+lQUv5oE5n55pZgdmZYZfLl22rxZd3tMOZf7fBmoe7 v5eKvr2TjMG7jo7EuYqQx7iGk8m2gpjLtX+dzbR+o86xfKbOrH2oy6h9qsmlfqzGpX6sxqV+rMal fqzGpX6sxqV+rMalfqzGpX6sxqV+rMalfqzGpX6sxv+sGQX/rSMW/6oyL/+mQEv4oE1n55xXgdma XpfLmGqsxZl0tMOafbfBm4W7vpmJv7yVisK6kIzFuIyPyLaHksu0g5fOs4Cd0LJ/pNGsfqXPqH6n zKR/qcmhgKzGoYCsxqGArMahgKzGoYCsxqGArMahgKzGoYCsxqGArMahgKzGoYCsxv+tGAX/rSMW /6sxL/+mP0v4oE1n551VgdmcXJfKmWisxZpytMOcerjAnIO7vpyJv7uXicO5k4vHt46Ny7SJkM6y hJbRsYGd06yAotOngKXQpICnzaCBqcqegavGnoGrxp6Bq8aegavGnoGrxp6Bq8aegavGnoGrxp6B q8aegavGnoGrxv+tGAX/rSIW/6sxL/+nP0v4oUxn555TgdmdWZfKm2WsxZxvtMOdeLjAnoG8vZ6I wLuaiMS4lYnJtZCLzbKLj9GwhpXVroSe16eCodSjgqTRn4KnzZyDqcqag6vHmoOrx5qDq8eag6vH moOrx5qDq8eag6vHmoOrx5qDq8eag6vHmoOrx/+tFwX/riIW/6swL/+nPkv4oUto559RgdmfVpfK nGKsxZ1stMOfdbjAoH68vaCHwbqdiMa3mIjLs5OJz7COjdStiZTZqIad2qKFodWehaTRm4WmzpmF qcqXhavHl4Wrx5eFq8eXhavHl4Wrx5eFq8eXhavHl4Wrx5eFq8eXhavHl4Wrx/+uFwT/riIW/6ww L/+nPkv4okto6KFPgdmgU5fKnl+sxp9ptMOhcrjAony8vaKEwbmgh8e1nIfNspeI0q6Ti9iqjpPf oouc3JyJoNaZiKPSl4imzpWIqcqUiKvHlIirx5SIq8eUiKvHlIirx5SIq8eUiKvHlIirx5SIq8eU iKvHlIirx/+uFwT/riEW/6wvL/+oPUv4okpo6KJNgNmiUJfLoFysxqFls8OkbrfApXi8vKWCwrik h8i0oIfOsJ2I1auZit2ll5Pmm5Gb3ZaPoNeUjaPTkoymz5GLqMuQiqvIkIqryJCKq8iQiqvIkIqr yJCKq8iQiqvIkIqryJCKq8iQiqvIkIqryP+uFgT/ryEW/60vL/+oPEv3oklo6KRKgNmkTZbLolir xqRhs8SnarfAqXS8vKl+wrioh8izpofPrKKH16Sdid2amo3hlZqb3pGVn9iPk6LTjpCl0I6PqMyN jqrJjY6qyY2OqsmNjqrJjY6qyY2OqsmNjqrJjY6qyY2OqsmNjqrJjY6qyf+vFgT/ryEW/60uL/+p PEv3o0lp6KZIf9qnSJXMpVOqx6hcssSsZLbBrm67va94wLashMmup4fQpqOG1Z2ghtmTnYndjZ2U 3Y2dn9iLmaHUi5ak0IqTp82KkanJipGpyYqRqcmKkanJipGpyYqRqcmKkanJipGpyYqRqcmKkanJ ipGpyf+vFQT/sCAW/64uL/+pO0v3pEdp6ahEfturQ5TNqUypyK1UsMazXLPCt2a5t7B3wrCrhMmp p4bPoaSE05eihNaOoIfZiJ+P2oehmtiHoKHUh5uk0YeYps6HlanKh5WpyoeVqcqHlanKh5WpyoeV qcqHlanKh5WpyoeVqcqHlanKh5Wpyv+wFQT/sCAV/64tL/+qOkv4pkRo6qtAfdyvPJLPr0KmyrVJ rca8UrG5tWe7sLB4w6ushMmkqYTNnKaD0JOkhNOLo4bVhaKM1oKilNaDpJ3Ug6Kk0YOeps6EmqjL hJqoy4SaqMuEmqjLhJqoy4SaqMuEmqjLhJqoy4SaqMuEmqjLhJqoy/+wFAT/sR8V/68sLv+rOUv4 qUBn6687e962M4/SujShzMI5qru6VbWwtGq9qrB5w6ethMefqoTLmKiDzZCnhNCJpYbShKSK04Ck kNN/pZfSf6ag0H+lps6AoKjLgKCoy4CgqMuAoKjLgKCoy4CgqMuAoKjLgKCoy4CgqMuAoKjLgKCo y/+xEwT/sh4V/7ArLv+sN0z6rDtl7bU0eOK/KYnYzCCYvr89rrC4Wbips2y+pbB6wqKuhMWbrIPI lKqEyo6phMyIqIbOg6eJz4Cnjc9+p5PPfKiaznypos18p6jLfKeoy3ynqMt8p6jLfKeoy3ynqMt8 p6jLfKeoy3ynqMt8p6jLfKeoy/+yEgT/sx0V/7EpLv+tNkz8sTVi8b0qcubNH4DIzCGbsbxFsqi3 Xrmjs2++oLF7wZ6vhMOXroTGkayEx4yrhcmHqofKg6qJy4CqjMx9qZDMfKqVy3qqnMp5q6TKeauk ynmrpMp5q6TKeaukynmrpMp5q6TKeaukynmrpMp5q6TKeaukyv+zEQT/tBsU/7MmLv+vM0z9uStd 68ofadLfEX+5zCecp71MsaC3YrmdtHG9m7J8v5qxhMGUsITDj6+FxYquhsaGrYfHg6yJx4Csi8h+ rI7IfKySyHusl8h5rZ7Hea2ex3mtnsd5rZ7Hea2ex3mtnsd5rZ7Hea2ex3mtnsd5rZ7Hea2ex/+1 EAP/thkU/7UkLf+0LEnyxR9U1t0SYsHfE4GszS6an8BPq5q4ZbeXtXK7lrR8vZWyg7+RsYXBjbGG womwh8OGr4jDg6+JxIGvi8R/ro3Ffa6QxXuulMV6r5nEeq+ZxHqvmcR6r5nEeq+ZxHqvmcR6r5nE eq+ZxHqvmcR6r5nEeq+ZxP+3DgP/uBYT/7cgLfm/H0Hc2RFExOsSZrHfGIGg0DOVl8ZQo5PAY62R u3Gzkbh7uJC2gruOtIW9i7OGv4iyh8CGsonAhLGKwYKxi8GAsY3BfrGPwnyxksJ7sZXBe7GVwXux lcF7sZXBe7GVwXuxlcF7sZXBe7GVwXuxlcF7sZXBe7GVwfS6CwP9uxIS/rsbLOXQDzLI6Q9KtPIV Z6LiIn2W1jeNj85PmIzIYaCKxG6misF4qoe/fa2EvoCwgbyCsX+7hLN9u4W0e7qHtXq5ibV5uYu2 d7mNtna4j7d0uJO3dLiTt3S4k7d0uJO3dLiTt3S4k7d0uJO3dLiTt3S4k7d0uJO3dLiTt9y+BgL4 wA4R7sgOIsvbCy62+BFMpfUdY5foLHWN3z2Bh9hQi4PTYJKCz2yXf81zm3zLd515yXqgd8h9oXXH f6NzxoKkcsWEpXDFhqVvxIimbsSKp23Djadrw5Coa8OQqGvDkKhrw5Coa8OQqGvDkKhrw5Coa8OQ qGvDkKhrw5Coa8OQqNfABgHbxggOy9MKFbjoDDKm/xVKmPomXI3wN2mF6UZ0f+RTe3zfYIF43GiF dNptiXDYcYtu1nWNbNV4j2rUe5Bp036RZ9OAkmbSg5Nl0oWUZNGHlGPQipVi0I6WYtCOlmLQjpZi 0I6WYtCOlmLQjpZi0I6WYtCOlmLQjpZi0I6WYtCOltHCBgHNywkFutoHGaj+DjGZ/x1Djv8vUYX6 P1x+9E1kefBYanPsX29t6mNzaedpdmflbnll5HJ7Y+N2fWLieX5g4Xx/X+B+gF7fgYFd34OCXN6G g1vdiYRa3Y2FWt2NhVrdjYVa3Y2FWt2NhVrdjYVa3Y2FWt2NhVrdjYVa3Y2FWt2NhcvEBgC70QYH qecGGpr/EyuO/yQ5hf82RH7/RE15/1FVcftXW2v3XWBl9GJkYvJoZ1/wbWpd73FsW+11bVrteG9Z 7HtwWOt+cVfqgXJW6oRyVemHc1TpinRT6I51U+iOdVPojnVT6I51U+iOdVPojnVT6I51U+iOdVPo jnVT6I51U+iOdbzJBQCr2wEImv8LFo//GSOF/ystfv85N3j/RkBw/05Haf9UTWL/WlJe/mFWWvxm WVj7a1tV+XBdVPh0XlL3eF9R93tgUPZ+YU/1gWJP9YRjTvSHZE30i2VM85BmTPOQZkzzkGZM85Bm TPOQZkzzkGZM85BmTPOQZkzzkGZM85BmTPOQZv+gGAP/oiwQ/6A7Jf+cSTz/l1dT+JJkZ+yQbHni j3WJ2Y5+l9GNh6LMjI2qx4qRscSIlLbDhZa4woOZucKBm7nBf566wX2hu8F7pLvAeqe7wHmqvMB4 rrzAd7S7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u/+gGAP/oiwQ/6A7 Jf+cSTz/l1dT+JJkZ+yQbHnij3WJ2Y5+l9GNh6LMjI2qx4qRscSIlLbDhZa4woOZucKBm7nBf566 wX2hu8F7pLvAeqe7wHmqvMB4rrzAd7S7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u7x4tLu8 eLS7vHi0u/+gGAP/oiwQ/6A7Jf+cSTz/l1dT+JJkZ+yQbHnij3WJ2Y5+l9GNh6LMjI2qx4qRscSI lLbDhZa4woOZucKBm7nBf566wX2hu8F7pLvAeqe7wHmqvMB4rrzAd7S7vHi0u7x4tLu8eLS7vHi0 u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u/+gGAP/oiwQ/6A7Jf+cSTz/l1dT+JJkZ+yQbHnij3WJ 2Y5+l9GNh6LMjI2qx4qRscSIlLbDhZa4woOZucKBm7nBf566wX2hu8F7pLvAeqe7wHmqvMB4rrzA d7S7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u/+gGAP/oiwQ/6A7Jf+c STz/l1dT+JJkZ+yQbHnij3WJ2Y5+l9GNh6LMjI2qx4qRscSIlLbDhZa4woOZucKBm7nBf566wX2h u8F7pLvAeqe7wHmqvMB4rrzAd7S7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7vHi0u7x4tLu8eLS7 vHi0u/+hGAP/oysQ/6A6Jf+cSDz/l1ZT+JNjaOySaXrhkXOK2I98mNCOhKTKjoytxo2QtMSKk7fD hpW4woSYucGBm7rBf527wH2gvMB7pLzAeqe9wHmsvcB4sL29eLO8uHizvLh4s7y4eLO8uHizvLh4 s7y4eLO8uHizvLh4s7y4eLO8uHizvP+hGAP/oyoQ/6E5Jf+dSD3/mFVU95RhaeuUZnvgkm+M1pF4 ms6QgqbIj4mwxI+PtsOLkbfCiJS5wYSXusCCmrzAf529v32gvr97pL6+eqi/vnitv714sb64eLK+ tHmzvbR5s720ebO9tHmzvbR5s720ebO9tHmzvbR5s720ebO9tHmzvf+iGAP/pCkQ/6E4Jf+dRz3/ mVVU95ZeaeuVY3vglGyN1ZJ1nM2Rf6jHkYeyxJGOtsONkLjBiZO6wIaWvL+Cmb2/f5y+vn2gv717 pcC9earAvXiwwLh5sMC0ebG/r3qyva96sr2verK9r3qyva96sr2verK9r3qyva96sr2verK9r3qy vf+jGAP/pCkQ/6I4Jf+eRj3/mVRV95dcaeuXYHzflmmN1ZNyncySfKrFkoW0xJKMtsKPj7nBi5K7 wIeVvb6DmL+9gJzAvX2gwbx7pcK8eavCuXmvwrR5r8GwerDArHuyvqx7sr6se7K+rHuyvqx7sr6s e7K+rHuyvqx7sr6se7K+rHuyvv+jGAL/pSgQ/6I3Jf+fRj3/mlNV95laaeuZXnzfl2WO1JVvncuU eavFk4K0xJSKt8KRjrnAjJC8v4iTvr2El8C8gJvCu32gw7t7psS6eq3FtHquxK96r8Kse7DAqHyx v6h8sb+ofLG/qHyxv6h8sb+ofLG/qHyxv6h8sb+ofLG/qHyxv/+kGAL/pSgQ/6M2Jf+fRT3/mlNV 95pXaeubW3zfmWKO1JdrnsuVdqzFlIC0w5WIt8GTjbrAjo+9vomSwLyFlcK7gZrEuX2gxrl7qMe0 eqvHr3utxat7rsOnfK/BpH2xv6R9sb+kfbG/pH2xv6R9sb+kfbG/pH2xv6R9sb+kfbG/pH2xv/+k GAL/picQ/6M2Jf+gRD3/m1JW95xVaeucWHzfm16O1JlnnsqXc6zFlny0w5eFt8GWi7u/kY2+vYuQ wbuGlMS5gZnHt36gybZ8qcque6rIqnysxqZ9rcSjfq/BoH6xv6B+sb+gfrG/oH6xv6B+sb+gfrG/ oH6xv6B+sb+gfrG/oH6xv/+lGAL/piYP/6Q1Jf+gRD3/nFFW955TaeueVXvfnlqN1JtknsqZb6zF mHm0w5mCuMGZiru+lIy/vI6Ow7mIkse3gpjLtX6hza98p82pfanKpX6rx6J/rcSff6/CnYCxv52A sb+dgLG/nYCxv52Asb+dgLG/nYCxv52Asb+dgLG/nYCxv/+mGAL/pyYP/6Q1Jf+gQz7/nVBV959R aOugU3vgoFeN1J5fnsqba6zFm3W0w5t+uMCbh7y9l4rAupGMxbeKkMq0hJfPsoCj0qh/pc+jgKjL oICrx52BrcWbga/CmYKxv5mCsb+ZgrG/mYKxv5mCsb+ZgrG/mYKxv5mCsb+ZgrG/mYKxv/+mGAL/ pyUP/6U0Jf+hQz7/nk5V+KFOaOyiUHrgo1KM1aFbncueZqzGnXG0w556uMCehLy8m4jCuZWKx7WN jc6whpbUqYKg1qGCpNCdgqjLmoOqyJmDrcWXhK/CloSwwJaEsMCWhLDAloSwwJaEsMCWhLDAloSw wJaEsMCWhLDAloSwwP+mGAL/pyUP/6U0Jf+hQj7/n0xV+KJMZ+ylTXnhpk6L1aRWnMyhYarGoWyz w6J2t8CigL28oIfDt5qIyrKTitKsi5TboIef2JqGpNGXhqfMlYaqyJSHrMWTh67DkoewwJKHsMCS h7DAkoewwJKHsMCSh7DAkoewwJKHsMCSh7DAkoewwP+nGAL/qCQP/6YzJf+iQj7/oEpU+aRKZu2n SnjiqUuK1qhRms2mW6nHpWWyxKdwtsCnery8poPDtqKHy6+diNall5Xml4+e2pONo9KRi6fNkIuq yZCKrMaPiq7Dj4mwwY+JsMGPibDBj4mwwY+JsMGPibDBj4mwwY+JsMGPibDBj4mwwf+nGAL/qCQP /6YzJf+iQT7/okhU+aZHZu6qR3fjrUeI2a1LmM+sVKbIrF6vxq9os8Kxc7m+sn3AsqqHy6WihtWU nIvej5qd2o2VotOMkqbOi5CpyouOq8eLja3EjIyvwYyMr8GMjK/BjIyvwYyMr8GMjK/BjIyvwYyM r8GMjK/BjIyvwf+oGAL/qSQP/6cyJf+jQT7/pEZT+qlEZO+tQ3XksUKF27RElNK1SqHLt1Oryr5f rb23briysHzCqaqGy5ylhNKNoIfYhqCX2YeeotOHmKXPh5Woy4eTqsiIka3FiJCvwoiQr8KIkK/C iJCvwoiQr8KIkK/CiJCvwoiQr8KIkK/CiJCvwv+oGAL/qSMP/6cyJf+jQD7/pkNS+6tBY/CxP3Pn tz2C3r47j9bEP5rMxUqmvLxdsrG1b7uqsH3Do6uEyZang86KpIbTgaOQ1YGln9KCoaXPgpyozIOZ qsmElqzGhZSuw4WUrsOFlK7DhZSuw4WUrsOFlK7DhZSuw4WUrsOFlK7DhZSuw/+pGAL/qiMP/6gx Jf+kPz7/qEBR/K88YfO2OXDqvzd948o1h9TRN5W+wkupsLlgtai0cL2jsH7Cna2Ex5KqhMuIp4bO gKaN0H2nmNB9qKTOfqSoy3+fqsmAm6vGgZitxIGYrcSBmK3EgZitxIGYrcSBmK3EgZitxIGYrcSB mK3EgZitxP+qFwL/qiIP/6gwJf+lPj7/qztP/7Q3Xfa9M2rryjF13NopgsTOOJmywU+rp7hjt6G0 c7yesX/BmK+ExI+shMiHqofKgKmMzHypk8x6qpzLeaumynqnqsh8oqvHfZ6txH2ercR9nq3EfZ6t xH2ercR9nq3EfZ6txH2ercR9nq3EfZ6txP+qFgL/qyEO/6kuJf+nPD7/sDZM/LowWe/ILGLe2Sdt y9wmhrbMPJuowVSrn7lmtpu1dLyZsn+/lbCEwo2vhcSGrYfGgayLyH2skMh7rJjIea2fx3etp8d3 qqzGeaWtxHmlrcR5pa3EeaWtxHmlrcR5pa3EeaWtxHmlrcR5pa3EeaWtxP+rFQL/rCAO/6stJP+r Njv/ti9I88QoUeDWJlbM5CJxu9ooiKrMQZufw1epmbxpspa3drmUtIC9kbKFwIuxhsGGsIjDga+L xH6uj8V7rpTFeq+axHivoMR1r6fEdK2uw3StrsN0ra7DdK2uw3StrsN0ra7DdK2uw3StrsN0ra7D dK2uw/+sFAL/rR8O/6wrJP+wLzf6vyVB5NEgRc7kHVu96SJ0rdosiZ/ORZmXxlqkk8BqrZG7drOQ uH+3jbaEu4m0hr2Fsoi/grGLwX+xjsF8sZLCerGWwXmxm8F4sqHAdLGnwXSxp8F0safBdLGnwXSx p8F0safBdLGnwXSxp8F0safBdLGnwf+uEgH/rx0N/64oJP+4JDHqyxo10OIXQ7/wHV6v6CV1oNsx h5bRSJSQylyejcVqpYvBdqqJvn2vhbyAsoK6g7R+uYa2fLiJt3m3jLh3t4+5draTunW2l7p0tp26 c7ekuXO3pLlzt6S5c7ekuXO3pLlzt6S5c7ekuXO3pLlzt6S5c7ekuf+wEAH/sRoN/7ElI/PEFyfU 3xArwe8XSLD3IGCh6itzld85go3XTI2I0V2Vhsxqm4TJdKCAxnmkfcR9pnrCgKl3wYOqdcCGrHO/ iq1xv42ub76Qr26+lK9svpmva76gr2u+oK9rvqCva76gr2u+oK9rvqCva76gr2u+oK9rvqCva76g r/+zDgH/tBYM/LwXGtbWCxbD7RAwsvwZSqL5JV6W7TNujOVBeoXeT4OB2V6Kf9Vqj3rScJN2z3WX c855mXHMfZtvy4CdbcqEnmvJh59pyYqgaMiOoWfHkqJlx5aiZMeco2THnKNkx5yjZMeco2THnKNk x5yjZMeco2THnKNkx5yjZMeco/S2CgH/uBIL1cwKC8TbChmy/BEzo/8dSJb8LFiM8ztlhOxJb37n VXZ642B8dd9ngXHdbYRt23KHatl2iWjYeotm132NZNaBjmPVhI9h1IiQYNOLkV/Tj5Je0pSSXNKZ k1zSmZNc0pmTXNKZk1zSmZNc0pmTXNKZk1zSmZNc0pmTXNKZk9y7BADYwwcExNEIB7PoChyj/xQx lv8kQ4z/NFCE+0JaffZPYnjxWmhx7l9ta+tkcWfpaXRk5252YuZzeGDld3lf5Hp7XeN+fFzigX1b 4oV+WuGIf1ngi4BX4JCAVt+VgVbflYFW35WBVt+VgVbflYFW35WBVt+VgVbflYFW35WBVt+VgdS9 BQDEyAcAtNkFCqP+DRyW/xosi/8rOoP/OkR8/0hNdf9SU279V1hn+l1cY/diX2D2Z2Jd9GtkW/Nv ZVnyc2dX8XdoVvF6aVXwfWpU74BrU++Ea1Luh2xQ7ottT+2Qbk/tkG5P7ZBuT+2Qbk/tkG5P7ZBu T+2Qbk/tkG5P7ZBuT+2QbsbABQC00AQBo+MCCpb/EBiL/yAkgv8wL3r/Pzdy/0g+av9OQ2T/VEhe /1lMW/9fT1j/ZFJV/2lUU/9tVVL+cVdQ/XRYT/x4WU77e1pN+39bTPqDXEv5hl1J+YteSPiQX0j4 kF9I+JBfSPiQX0j4kF9I+JBfSPiQX0j4kF9I+JBfSPiQX7XHAgCk2gABlv8GB4r/FBGB/yQaef8z InD/Oypo/0IxYf9KNlz/UTtX/1c/U/9dQlD/YkRO/2dGTP9sSEr/cElJ/3RKSP93S0b/e0xF/39N RP+DTkP/h05C/4tPQf+RUEH/kVBB/5FQQf+RUEH/kVBB/5FQQf+RUEH/kVBB/5FQQf+RUP+REgH/ lScL/5U7HP+TSy//j1lD/4xkVPuMa2PyinJx6oh8feOGhIfegoqP2n+PltZ9lJvTepif0XicotB3 n6TOdaKmzXSmqM1yqanMca2qzHCyq8twtqvLb7yryHDAq8RxwKrEccCqxHHAqsRxwKrEccCqxHHA qsRxwKrEccCqxHHAqv+REgH/lScL/5U7HP+TSy//j1lD/4xkVPuMa2PyinJx6oh8feOGhIfegoqP 2n+PltZ9lJvTepif0XicotB3n6TOdaKmzXSmqM1yqanMca2qzHCyq8twtqvLb7yryHDAq8RxwKrE ccCqxHHAqsRxwKrEccCqxHHAqsRxwKrEccCqxHHAqv+REgH/lScL/5U7HP+TSy//j1lD/4xkVPuM a2PyinJx6oh8feOGhIfegoqP2n+PltZ9lJvTepif0XicotB3n6TOdaKmzXSmqM1yqanMca2qzHCy q8twtqvLb7yryHDAq8RxwKrEccCqxHHAqsRxwKrEccCqxHHAqsRxwKrEccCqxHHAqv+REgH/lScL /5U7HP+TSy//j1lD/4xkVPuMa2PyinJx6oh8feOGhIfegoqP2n+PltZ9lJvTepif0XicotB3n6TO daKmzXSmqM1yqanMca2qzHCyq8twtqvLb7yryHDAq8RxwKrEccCqxHHAqsRxwKrEccCqxHHAqsRx wKrEccCqxHHAqv+SEgH/licK/5Y7HP+USzD/kFlD/49jVPqOaWTxjXBy6Yt6fuKJgonchYmS2IKO mdR/k57RfZeiz3ubps15nqjMd6Kqy3alrMp0qa3Jc62uyXKyr8lxt6/IcbyvwnO9rr50va++dL2v vnS9r750va++dL2vvnS9r750va++dL2vvnS9r/+TEgH/lycK/5g7HP+VSzD/kVlE/5FgVfqQZmTw j21z6I13gOGMgIvbiIeU1YWNnNKCkaHPf5amzH2Zqct7nazJeaGuyHelsMd2qbHGda2yxnSys8Zz ubPCdbqzvHW6s7h2urO4drqzuHa6s7h2urO4drqzuHa6s7h2urO4drqzuHa6s/+UEQH/mCcK/5k7 HP+WSzD/kllE/5JeVfqSZGXwkWp0549zgeCOfYzZi4WW1IiLntCFkKTNgpSpyn+Yrch9nLDHe6Cy xnmktMV4qLXEdq62xHW0tsF2t7a8d7e2t3e3trN4t7azeLe2s3i3trN4t7azeLe2s3i3trN4t7az eLe2s3i3tv+VEQH/mScK/5k7HP+XSjD/k1hE/5RcVfqUYWXwk2d055Fwgt+Peo7YjYOY0ouKoM6H j6fLhJOsyIGXsMZ/m7PEfZ+1w3ukt8J5qbnCd6+5wna1ubx4tri4eLa4s3i2t7B5t7ewebe3sHm3 t7B5t7ewebe3sHm3t7B5t7ewebe3sHm3t/+WEQH/micK/5o7HP+XSjH/lFVE/5ZZVfqWXmXwlWR0 55Nsgt6Rdo7Yj3+Z0Y2Ios2KjqnJh5KuxoSWs8SBmrbCfp+5wnukusF5qrrBd7G6vXi1urd4tbmz ebW5r3m2uKx6tresera3rHq2t6x6tresera3rHq2t6x6tresera3rHq2t/+XEQH/myYK/5s7HP+Y STH/llNE/5hXVfqYW2Xwl2F055Zogt6Tco/WkXua0I+Eo8uNjKvHipGxxIaVtsODmbjBf566wXuk u8B5q7y/d7O8uHizu7J5tLuuebW6q3q1uah7trioe7a4qHu2uKh7trioe7a4qHu2uKh7trioe7a4 qHu2uP+XEQH/myYK/5w6HP+YSTH/mFFE/5pUVPqbWGTwml1055hjgt6WbY/Wk3ea0JGApMqPiazG jY+zw4mUt8KEmLrAf568v3ulvr95rr65eLK+snmyva16s7ype7S6pnu1uaR8trikfLa4pHy2uKR8 trikfLa4pHy2uKR8trikfLa4pHy2uP+YEQH/nCYK/5w5HP+ZSDH/mU9E/5xSVPudVWPxnVpz55tf gd6ZaY/WlnKaz5N8pcqRha3FkI20w4uSuMGFlru/gJ2+vXulwbt5r8GyerDArHuxvqh7s72lfLS7 on21uaB9trigfba4oH22uKB9trigfba4oH22uKB9trigfba4oH22uP+ZEQH/nSYK/505HP+ZRzH/ m01D/55PU/ufUmPxoFZy6J9bgN+dZI7Xmm2a0Jd3pMqUga3Fkoq1wo6Qub+Hlb29gJzBu3unxLN6 rcSre6/Cpnyxv6N9sr2gfrS7nn+1uZx/tricf7a4nH+2uJx/tricf7a4nH+2uJx/tricf7a4nH+2 uP+ZEQH/niYK/504HP+aRzH/nEtC/6BNUvyiUGLyo1Nx6aNXf+ChXozYnmeY0Jtxo8qYe63FlYW0 wpKNur6Kkr+6gZvFt3ypyat8q8ekfa7DoH6wwJ1/sr2bgLO7mYG1upiBtriYgba4mIG2uJiBtriY gba4mIG2uJiBtriYgba4mIG2uP+aEQH/niYK/544HP+aRjL/nklC/6JKUf2kTWDzplBv6qdUfeGm WIrapGKW0qFrocuddavGmoCzwpiKuryOj8K2g5nLrH2mzqJ/qsmdgK3EmoGwwJiCsr6Xg7O8lYO1 upSDtriUg7a4lIO2uJSDtriUg7a4lIO2uJSDtriUg7a4lIO2uP+aEQH/nyYK/543HP+bRjL/n0dB /6RIUP6nSl/0qUxt66tQe+OsVIfcq1yT1Kllnc6mb6fIo3qww5+EuLuWi8SwjJnOoIOk0ZmEqcqW ha3FlIWvwZOFsb6ShbO8kYW0upGFtbmRhbW5kYW1uZGFtbmRhbW5kYW1uZGFtbmRhbW5kYW1uf+b EQH/nyYK/583HP+bRTL/oUVA/6ZGT/+qR132rUlr7bBMeOazT4PftFWO2bVfl9O1aaDOtXanwat8 trCfhcShlZLOlI6j0pCLqMuPiqzGjoqvwo6Jsb+OibK9joi0u46ItbmOiLW5joi1uY6ItbmOiLW5 joi1uY6ItbmOiLW5joi1uf+bEQH/oCYK/582HP+cRDH/o0M//6hDTv+tRFv4sUVo8LZIdOm7TH7j wFGH38ZbjtbIa5TGvXGmtbN4taWogcOUn43NiZyi0oeUp8yIkavHiY+uw4mOsMCJjbK+ioyzvIqL tLqKi7S6iou0uoqLtLqKi7S6iou0uoqLtLqKi7S6iou0uv+cEAH/oSYK/6A2HP+eQjH/pUA+/6tA TP+xQFn6t0Fk871Eb+7FSXflzlJ83dZif8zOaJK8xW6kq7t2tJqxf8GKqorLf6edz4CfqMyCmavH g5WtxISTr8GFkbG/ho+zvYeOtLuHjrS7h460u4eOtLuHjrS7h460u4eOtLuHjrS7h460u/+dEAH/ oiYK/6A1HP+gPzD/pz09/648Sv+1PFX6vT1g8MZCZ+bRSmze3k52zdpXh77QYpauxW6lobx5spW0 g72GrYjGe6qUynirqMl7oqvHfpytxICZr8KBlrDAgpSyvoOSs7yDkrO8g5KzvIOSs7yDkrO8g5Kz vIOSs7yDkrO8g5KzvP+eEAH/oiYK/6E0HP+iPC7/qjo7/7I4R/y7N1HyxTpY5tFBXNveQmnN4kZ8 vtdRjK7MX5uhw22omLx5spG1hLuFsYnCfK6RxXiun8V1razFeKWuxHqgr8J8nLDAfpmxvn+Wsr1/ lrK9f5ayvX+Wsr1/lrK9f5ayvX+Wsr1/lrK9f5ayvf+eEAH/oyUJ/6I0HP+lOS3/rjU4/7gzQvTD M0rn0DhO2d45WsvmPW6+4EKArtRQkKHLX52Yw22okb15sYu4g7iDtIi9fbGQwXmxmsF1saXBcq+v wnWor8F3o7DAeZ+xv3ucsr17nLK9e5yyvXucsr17nLK9e5yyvXucsr17nLK9e5yyvf+gEAH/pCQJ /6MyHP+oNCv/sy80+b8tPOnNL0DZ3i9Kyuc0X73qOnOv3kGDodNRkZfLYJ2QxG6mjL96rYa7gbN/ uIe4eraNu3e1lbx1tZ+8crSovW6zsr5xrLK+dKeyvnajsr12o7K9dqOyvXajsr12o7K9dqOyvXaj sr12o7K9dqOyvf+hEAH/pSMJ/6QxHP+tLif/uSkv7sgmM9rcJjfK5yxPvfIyY6/oOXWh3UKEltRT kI/NYpqKx3CihsN6qIC/gK17vYWxdruLtHO5krVxuZq2cLmjtW25q7ZquLS4a7K2uG6strhurLa4 bqy2uG6strhurLa4bqy2uG6strhurLa4bqy2uP+jEAH/pyIJ/6UvG/+zJyL0wiEm3dgdJMvnIzy9 8ipTr/MyZqHnO3aV3kaDjdZWjYfQZJaEy3Gcf8h4oXrFfqV2woOpcsGJq2+/j61sv5aua76drmq/ pq5ov66uZb24sGW5u7BlubuwZbm7sGW5u7BlubuwZbm7sGW5u7BlubuwZbm7sP+lEAH/qCAI/6wm F/y7HRrj0RMZzOUZKb3yIkGv/SpVofM0ZpbpP3SM4Ut/hdtZiIDVZo980W+Ud852mXPLfJxwyYGf bciHoWrHjKNoxpKkZsWZpWTFoKVkxailY8aypGDEu6ZgxLumYMS7pmDEu6ZgxLumYMS7pmDEu6Zg xLumYMS7pv+oEAD/qh4I/7MdEezJDg/O4w4VvvIYLa/+IkOh/y1VlvQ5ZIzsRW+E5VF5fuBcgHnc Z4Z02W6KcNZ0jmzTeZFp0n+TZ9CElWTPipdizo+YYM2VmV/NnJpezaKbXc2rm1zNtJpczbSaXM20 mlzNtJpczbSaXM20mlzNtJpczbSaXM20mv+rDwD/rRoH8sANCM7TCga+8A4ar/4ZMKH/JEOV/zJS i/g/XoPxS2h97FZwd+hfdnHkZXps4Wx+ad9ygWbdeIRj3H2GYduCiF/ah4ld2YyLW9iSjFnXmI1Y 1p6NV9aljlbVrI5W1ayOVtWsjlbVrI5W1ayOVtWsjlbVrI5W1ayOVtWsjv+vDQD/tw4DzckIAb7Y CQmu/RAcof8cL5X/KT+L/zdMgv5FVnz5UF519FlkbvFfaWjuZG1k62pwYepwc1/odXVd53p3W+Z/ eFnlhHlY5Il7VuOOfFXik31U4ph+UuGeflHhpX9R4aV/UeGlf1HhpX9R4aV/UeGlf1HhpX9R4aV/ UeGlf/G0CADOwAYAvc4HAa7gBwug/xIclP8gK4r/LziB/z1Dev9JS3P/UlFs/ldXZftdW2H5Y15e 92hgW/VtYlj0cmRW83dmVfJ7Z1PxgGhR8IRpUPCJak/vjmtO7pNsTO6ZbUvtn25L7Z9uS+2fbkvt n25L7Z9uS+2fbkvtn25L7Z9uS+2fbtG5AwC8xQUArdYDAZ/4CwuT/xYYif8kJID/NC95/0E3cP9I Pmj/T0Ni/1VHXf9aS1n/YE1W/2VQU/9qUVH/blNP/3JUTv92VUz+e1ZL/X9XSf2EWEj8iFlH+41a RvuTW0X6mFxF+phcRfqYXEX6mFxF+phcRfqYXEX6mFxF+phcRfqYXL29AwCtzQEAnt8AAZL/DQiH /xkSfv8pG3X/NSNs/zwqZP9DL17/SjRY/1A3VP9WOlH/WzxO/2A+S/9kQEr/aEFI/2xCRv9wQ0X/ dERE/3hFQv99RkH/gUdA/4ZIP/+MST3/kUo9/5FKPf+RSj3/kUo9/5FKPf+RSj3/kUo9/5FKPf+R Sq7FAACe1wAAj/UAAYb/DwR8/xsLcf8kEWf/LBdf/zUcWf89IVT/RSZP/0spTP9SLEj/Vy9G/10w RP9hMkL/ZjNA/2o1P/9uNj3/czc8/3c4O/98OTr/gTo4/4Y6N/+MOzb/kjw2/5I8Nv+SPDb/kjw2 /5I8Nv+SPDb/kjw2/5I8Nv+SPP+DEwH/hCIG/4U1FP+DRiT/f1U0/4FeQv+BZlD/f25c+Xx3ZvN6 gG/ud4h36nWPfedylYLkcJqF426eiOFsoovga6eN32mrjt5or5DdZ7SR3Wa6kdxlwZLcZcmS22XQ ktJn0pHOaNKRzmjSkc5o0pHOaNKRzmjSkc5o0pHOaNKRzmjSkf+DEwH/hCIG/4U1FP+DRiT/f1U0 /4FeQv+BZlD/f25c+Xx3ZvN6gG/ud4h36nWPfedylYLkcJqF426eiOFsoovga6eN32mrjt5or5Dd Z7SR3Wa6kdxlwZLcZcmS22XQktJn0pHOaNKRzmjSkc5o0pHOaNKRzmjSkc5o0pHOaNKRzmjSkf+D EwH/hCIG/4U1FP+DRiT/f1U0/4FeQv+BZlD/f25c+Xx3ZvN6gG/ud4h36nWPfedylYLkcJqF426e iOFsoovga6eN32mrjt5or5DdZ7SR3Wa6kdxlwZLcZcmS22XQktJn0pHOaNKRzmjSkc5o0pHOaNKR zmjSkc5o0pHOaNKRzmjSkf+EEwH/hSIG/4Y1FP+ERiT/gFU0/4RdQ/+FZVD/g21d+IB1aPJ9fnHs eoZ56HeNf+V1k4XicpiJ4HCdjN9uoo7dbKaQ3Gurkttpr5TaaLWV2me7ldpmw5baZsyW02jPlsxp z5XIas+WyGrPlshqz5bIas+WyGrPlshqz5bIas+WyGrPlv+FEgH/hyIG/4c1FP+FRiT/hFQ1/4hc Q/+IZFH+h2te94NyafGAfHPrfYV753qMguN3kofgdJeM3nKcj9xwoZLbbqaU2WyqltlqsJjYabaZ 12i9mddoxprTaMyazGrMmcZrzJrCbMyawmzMmsJszJrCbMyawmzMmsJszJrCbMyawmzMmv+GEgH/ iCEG/4g1FP+GRiX/h1M1/4tbQ/+MYlH+impe9odxavCEenTqgIN95X2KhOJ6kIredpaP3HSbktpx oJXYb6WY1m2rmtVrsJvVarec1Gm/ndRpyZ3Ma8qdxmzJncBtyZ29bsmdvW7Jnb1uyZ29bsmdvW7J nb1uyZ29bsmdvW7Jnf+HEgH/iSEG/4o1FP+IRiX/ilI1/45aQ/+PYVH+jmhe9otvau+HeHXphIF+ 5ICIhuB8j4zdeZSR2naaldhzn5nVcKWb1G6qntNtsZ/Sa7ig0mvCoc1sx6HGbsehwG7Hobtvx6G4 cMehuHDHobhwx6G4cMehuHDHobhwx6G4cMehuHDHof+IEQH/iiEG/4s1FP+JRiX/jVE1/5JYQ/+S XlH+kGVe9o5sa++LdXboh36A44SGiN5/jY/be5OU2HiZmdV1npzTcqSf0XCqotBusqPQbbqkzmzE pcZvxKS/cMSlunHEpbVxxKWycsSksnLEpLJyxKSycsSksnLEpLJyxKSycsSksnLEpP+JEQH/iyEG /4w0FP+KRiX/kE80/5RWQ/+UW1H+k2Fe9pFoa+6OcHboi3uA4oeDid2DipHZfpGX1XqXnNN3naDQ dKSjz3Gqps5vs6fNbr2ox3DCqL5xwam4csGptHPBqa90wqitdMKnrXTCp610wqetdMKnrXTCp610 wqetdMKnrXTCp/+KEQH/jCEG/400FP+LRib/k040/5ZTQv+XWFD+ll5e9pRkau6SbHbnj3aB4YyA ityHiJLYgo+Z032Vn9B5nKPOdaOnzHKrqstwtKvIcL+sv3O+rLd0vq2ydb6srna/rKp2v6uod8Cq qHfAqqh3wKqod8CqqHfAqqh3wKqod8CqqHfAqv+LEQH/jSAG/440FP+NRSb/lk0z/5lQQf+aVU// mlpd95hgae+VaHXoknCA4Y97ityLhJPWhoya0oCToc57mqbMd6KqynSrrshyuK/AdLyvt3W8sLB2 vLCrd7yvqHi9r6V5vq2jeb6to3m+raN5vq2jeb6to3m+raN5vq2jeb6to3m+rf+LEAH/jiAG/480 FP+PRCX/mEoz/5tNQP+dUU7/nVdb+JxcaPCaY3Tol2p/4pN1ityPgJPWiomb0YSQo81+mKnJeaKu x3WtscR0urO3drmzr3i5s6p5urOmerqyo3u7saB7vLCffL2un3y9rp98va6ffL2un3y9rp98va6f fL2un3y9rv+MEAH/jyAG/5A0FP+SQyX/mkgy/51KP/+fTk3/oFNa+aBYZvGfX3LqnGV945hviNyT epLWj4Sb0IiNo8uBlqvHe6GxxXawtbp3t7avebe2qHq4tqN8uLT/4v/iSUNDX1BST0ZJTEUABQmg fLmznn26spx+u7Gbfrywm368sJt+vLCbfrywm368sJt+vLCbfrywm368sP+NEAH/jyAG/5E0FP+U QyT/m0Yx/6BIPv+iS0v/pFBY+qRVZPOkWnDromF75J9phd6ac5DXlX6Z0I6Io8qFk6zEfaC0vXiw ua95tbmme7a4oX23tp1+uLWbf7m0mX+6s5iAurKXgLuxl4C7sZeAu7GXgLuxl4C7sZeAu7GXgLux l4C7sf+NEAH/kCAG/5E0FP+XQiT/nUMw/6JFPf+lSEn/qExV/KlRYfWqV2zuqV1356hjgeGkbYvW nnmWy5WDosCLjq22g5q2rn6qu6R8s7yefrW6moC3t5iBuLWWgbm0lYK6s5SCurKTgruxk4K7sZOC u7GTgruxk4K7sZOCu7GTgruxk4K7sf+OEAH/kSAG/5I0FP+ZQSP/n0Ev/6RCO/+oRUf/rElT/q5O XvWwU2jsslpy5LNhe9uvboTMpnaUwJx+orSSiK6pipS3oIWkvZmCsb6Vg7S7k4S2uJKEuLaRhLm0 kIS5s5CEurKQhLqykIS6spCEurKQhLqykIS6spCEurKQhLqykIS6sv+PDwH/kiAG/5M0FP+aPyL/ oT8u/6dAOv+sQkX/sEZQ+bNLWvC3UmPou1lr371kctG2bILErHOTtqN6oaqZg66ekpC3lI2fvo6L sb+MibO8jIm1uYyIt7aMiLi1jIe5tIyHurOMh7qyjIe6soyHurKMh7qyjIe6soyHurKMh7qyjIe6 sv+PDwH/kh8G/5Q0FP+cPSH/ozwt/6o9OP+vQEL/tERM9bpJVey/UVzkxlph2MVib8m8aYG7snCS rap3oKChgK2Tm4u3iZabvYOVr7+EkbO8ho61uYeNtreHjLe2iIu4tYmKubSJirqyiYq6somKurKJ irqyiYq6somKurKJirqyiYq6sv+QDwH/kx8G/5U0Ff+eOyD/pTkr/6w6Nf+zPT/7ukJH8cFITujJ UVLf0VtZz8pgbcHCZ4CyuW2QpLF0n5eqfauKpIi1f6CXu3ifrL58mrO8f5W0uoGStriDkLe3hI+4 tYSNubOFjbqyhY26soWNurKFjbqyhY26soWNurKFjbqyhY26sv+RDgH/lB8G/5YzFf+gOB//qDYp /7A4Mv+4Ojv2wD9B7MpHRePWVEXW2VdYx9Bea7jIZH6qwWuOnLpynI60eqiAroWydquUuG+rqbpy pbW6d521uXqZtrd9lre2fpO5tH+RurKAkLuxgJC7sYCQu7GAkLuxgJC7sYCQu7GAkLuxgJC7sf+S DgH/lR8G/5czFf+iNR7/qzMn/7Q0L/m+NjXtyT044tZIONngTUXN31ZWv9hcabDQYnuhyWiLk8Nv mYW+d6R4uoOtbriTs2i4qLZpsri2b6e3tnOhuLV2nLm0eJm6s3qWu7F7lbywe5W8sHuVvLB7lbyw e5W8sHuVvLB7lbywe5W8sP+TDgH/lh8F/5kzFP+lMBz/rzAj/bovKfDGMi3j1Dss1uBAOsvlSEzA 4U5cs91WbKXYXXqY0mWIis5tlH3Jdp9zxIOnbMCRrGe+oa9lvravZrS7sWuru7FupbuxcaC8sHOd va90mr2udJq9rnSava50mr2udJq9rnSava50mr2udJq9rv+UDgH/mB4F/50xEv+pLRn/tCoe9cIp IuTRLSHV4DMsyeg8P77oQ1Gx5UlhpOJPcJffVn2K2mCIgNNrknjNd5pwyIKhasWOpWbDm6hlw6yn YcK9qmO4v6tmsL+saaq/rGylv6ttosCqbaLAqm2iwKptosCqbaLAqm2iwKptosCqbaLAqv+VDQD/ mh4F/6IsEP+tKBX7uyMY6M0gF9XfJR3I6DAxvO85RLDsQFWj6kZkl+hNcYvjVX2B3GGGedVsjnLR d5VszYGaZ8qLnmTIlqBhyKOhYMizoV3Hw6NfvsSlYbbDpWSww6VlrMOlZazDpWWsw6VlrMOlZazD pWWsw6VlrMOlZazDpf+XDQD/nB4F/6YmDf+0IA/vxhcP1t0WDsjpIyK78y42r/Q2SKLyPliX8UZl i+tPcIHlWHp632SCc9ptiG3Wdo1o03+SZNCIlWDPkphezp2ZXM2pmlvOuZlZzciaWsXKnFy9yZ1e uMmeXrjJnl64yZ5euMmeXrjJnl64yZ5euMmeXrjJnv+aDAD/nx0F/6wfCPi+EwjY1gsEyOgVE7r0 Iieu+i05ovo2Spb6P1iL9Uhjgu5SbXroXHVy5GR7beBtgGjddYVk2n6IYNiGi13Wj41a1ZiPWNSi kFfUrpFW1LyQVtTNkFbN0ZJXyNGTV8jRk1fI0ZNXyNGTV8jRk1fI0ZNXyNGTV8jRk/+cCwD/ox0E /7USA9TJCgLI2gsGufQWF6z/Iyqh/y47lf84SYv/QlWC+ExfevJWZ3PuXm1r6mRyZudsd2LkdHpf 4nx9XOGDf1rfi4JX3pODVd2chVTcpYZS3K+GUty7hlHczIVS2tqFUtrahVLa2oVS2tqFUtrahVLa 2oVS2tqFUtrahf+gCgD/rRMB1MAIAMbOCAC54wsIq/8XGZ//JCqU/zA5iv86RYH/Rk96/VFYcvhY Xmv1XmNl8mVoYO9sa13tcm5a63lwV+qAclXph3RT5492UeaWd1DmnnhO5ad5TeWvek3ku3pM5MV6 TOTFekzkxXpM5MV6TOTFekzkxXpM5MV6TOTFev+kBwDYuAQAxMQGALfTBwGq8w0Lnv8aGpP/JyiJ /zM1gP8/P3n/Skdw/1FOaf9XU2L9XVde+2RbWvlqXlf3cGBU9nZiUvR8ZFDzg2VO8opnTPGRaEvw mGlK8J9qSe+na0jvsGxH7rdsR+63bEfut2xH7rdsR+63bEfut2xH7rdsR+63bN2vAADFvAQAtcoE AKjbBQKc/xALkf8dF4f/KiN+/zYtdv9BNm3/SDxm/09CYP9VRlv/W0pX/2FMU/9nT1H/bVFO/3JS TP94VEr/flVI/oRWR/2LWEX8kllE+5haQ/ufW0L6p1xB+qxcQfqsXEH6rFxB+qxcQfqsXEH6rFxB +qxcQfqsXMi2AQC1wQMAp9EBAJnrBQKP/xIJhf8gEnz/LBtz/zUjav89KmL/RDBc/0s0V/9SOFP/ WDtP/149TP9jP0r/aEBH/21CRf9yQ0T/d0RC/31FQP+DRj//ikg9/5BJPP+XSTv/nko7/6NLO/+j Szv/o0s7/6NLO/+jSzv/o0s7/6NLO/+jS7a6AgCmygAAmNwAAIz/CAGD/xQFeP8eDG7/JhJl/y8Z Xf83Hlf/PyJS/0YmTf9MKEr/UitG/1gtRP9dLkL/YS9A/2YxPv9rMjz/cDM6/3U0Of96NTf/gDY2 /4Y3Nf+MODP/lDgz/5g5M/+YOTP/mDkz/5g5M/+YOTP/mDkz/5g5M/+YOafDAACX1AAAiOQAAID/ CgFy/w4CZ/8TBV//HQlX/yYNUf8vEUz/NxVH/z4XQ/9FGUD/Sxs9/1AdO/9VHjn/WR83/14hNf9i IjT/ZyMy/2wkMf9yJS//dyYu/30nLf+EKCv/iykr/5EpK/+RKSv/kSkr/5EpK/+RKSv/kSkr/5Ep K/+RKf92FQL/cyAE/3IxDP9xQxn/cVAm/3VZM/91Yj//c2pJ/3B0U/9uflv8a4dh+WmPZ/Znlmv0 ZZxu8mOhcfFipnPvYat17mCwdu5etXftXrt47F3Deexcy3rrW9h65l3eet9e4XnYYON51WDjedVg 43nVYON51WDjedVg43nVYON51WDjef92FQL/cyAE/3IxDP9xQxn/cVAm/3VZM/91Yj//c2pJ/3B0 U/9uflv8a4dh+WmPZ/Znlmv0ZZxu8mOhcfFipnPvYat17mCwdu5etXftXrt47F3Deexcy3rrW9h6 5l3eet9e4XnYYON51WDjedVg43nVYON51WDjedVg43nVYON51WDjef92FQL/cx8E/3QxDf9yQhn/ dE8n/3hYM/95YD//d2lK/3NxVP9xfFz7boZj92uOafRplG3yZ5tx8GWgdO9kpXbtYqp47GGweetg tXvrX7x86l7EfepdzX3nXdl94V/efdpg4HzRYuF9z2Lhfc9i4X3PYuF9z2Lhfc9i4X3PYuF9z2Lh ff93FQL/dB8E/3UxDf9zQhr/d00n/3tWNP98X0D/emdL/3dvVf5zel76cYNl9m6Ma/Nrk3DwaZlz 7mefd+xlpXnrZKp76mKvfelhtX7oYL1/6F/FgOhe0IHiX9qA22HegNJi34DLY9+BymTfgcpk34HK ZN+BymTfgcpk34HKZN+BymTfgf94FAL/dR8E/3YxDf90Qhr/ekwn/39VNP+AXUD/fmVM/3puVv52 d1/5dIFm9XCKbfFtkXLua5h27GmeeetnpHzpZal+6GOvgOditoLmYb2D5mDHhOVf04TdYdqE02Pd g8xk3ITGZdyExWXchMVl3ITFZdyExWXchMVl3ITFZdyExWXchP95FAH/dh4D/3cwDf92Qhr/fksn /4JTNP+DXED/gmRM/39sVv16dGD4d39o83OIb/Bwj3TtbZZ56mudfOhoo3/nZqmC5WWvhORjtoXk Yr+H42HJh+Bh1YfVZNqHzWXaiMdm2YjBZ9mIv2fZiL9n2Yi/Z9mIv2fZiL9n2Yi/Z9mIv2fZiP96 FAH/eB4D/3kwDf94QRr/gUkn/4ZSM/+IWkD/h2JM/4NpV/x+cWH3e3tp8neFce5zjXfrcJR86G2b gOZqooPkaKiG42aviOJkt4rhY8GL4WLOi9hk1ovNZtaLxmfWjMBo1oy7adaMumnWjLpp1oy6adaM umnWjLpp1oy6adaMumnWjP97EwH/eR0D/3owDf98Pxr/hUgm/4pQM/+MWED/i19M/4hnV/yEbmH2 f3hq8XuCcu13innpc5J+5m+Zg+RsoYfiaqiK4GevjN9luI7eZMSP22TSj85n04/GaNOQv2rTkLpr 05C1bNOQtGzTj7Rs04+0bNOPtGzTj7Rs04+0bNOPtGzTj/98EwH/eh0D/3swDf9/Phr/iUYm/49O Mv+RVj//kF1L/45kVvyJa2H2hHNr8H9+c+x7h3rodpCB5HKXhuFun4rfa6eO3WiwkNxmu5LbZcqT 0GjRk8Zq0JS+a9CUuGzQlLNt0JSvbtGTrm7Rk65u0ZOubtGTrm7Rk65u0ZOubtGTrm7Rk/99EgH/ exwD/3wvDf+DPBn/jUUl/5NNMf+VUz7/lFlK/5JgVf2PaGD2inBq8IR5dOt/g3zmeoyD4nWViN9x no3dbaeR22mxlNlnv5bUZ86Xx2vNmL1szZi2bs2YsG/NmKxwzpepcc6WqHHPlqhxz5aocc+WqHHP lqhxz5aocc+WqHHPlv9+EgH/fBwD/34vDf+GOxn/kUMk/5ZLMP+YUDz/mFVI/5ZcVP2TY1/3j2tp 8Ip0c+uEf3zmfomE4XiSi91znJDabqaV2GqzmdZoxZvJa8ubvW7KnLRvypyuccqcqnLLm6Zzy5qj c8yZonTNmKJ0zZiidM2YonTNmKJ0zZiidM2YonTNmP9/EgH/fRsD/38vDf+JOhj/lEIj/5lHL/+b TDv/nFJG/5tYUv+ZX134lWZo8ZBucuuKeXvlg4SE4HyPjNx2mpPYb6aZ0mu1nc5qyJ++bsifs3HH oKxyx6CndMifo3XJnqB2yp2edsubnXbLmp12y5qddsuanXbLmp12y5qddsuanXbLmv+AEQH/fhsD /4AvDf+MOBj/l0Ai/5xELf+fSTn/oE5E/6BVT/yeW1r1nGJl7pdqb+iRdHnhin+D2YOKjM97lZXI daCcw3Cuob5vv6OzcsWjqnTFo6R2xaOgd8ahnXjHoJt4yJ6ZecqdmHnKnJh5ypyYecqcmHnKnJh5 ypyYecqcmHnKnP+AEQH/fxsD/4EvDf+PNxf/mj8h/59CLP+iRjf/pExC/6RSTPekWFfvo19h56Bm a+CacXXVk3yBy4qFjcOCj5a7e5qetXanpLB0uKeodsKnoXjDpp15xKWaesWjmHvGopZ7x6CUe8me lHzJnZR8yZ2UfMmdlHzJnZR8yZ2UfMmdlHzJnf+BEQH/gBsD/4IuDv+RNhb/nDwg/6FAKv+lRDT/ qEo/+qlQSfKqVlLqql1c4qlmZteib3LLmXiBwZCBjbiIipevgZWgqHyipqN6sqmeesGpmXzBqJZ9 w6aUfsSkkn7Fo5F+x6GQfsifkH7JnpB+yZ6QfsmekH7JnpB+yZ6QfsmekH7Jnv+CEQH/gRsD/4Qu Df+UNRb/njoe/6Q+KP+oQjL/rEc79q9NRO2xVE3ls1tV3LBlYc6obHHDn3SAuJZ8ja6PhpiliJGh nYOdp5eArauTgL+rkYHBqY+BwqeOgcOljYHFo42BxqKMgcifjIHIn4yByJ+MgcifjIHIn4yByJ+M gcifjIHIn/+CEQH/gRoD/4YtDf+WNBX/oDkd/6Y8Jv+rQC/7sEU48rRLP+m5U0bhvVxN07ZiYMat aXC7pXF/sJ15jKWVgpebj42hk4qZp4yHqauIh7+siIfAqoiGwqiIhcOmiIXFpIiExqKIhMigiITI n4iEyJ+IhMifiITIn4iEyJ+IhMifiITIn/+DEAH/ghoD/4grDP+ZMhT/ojcb/6k5JP+vPSz3tUIz 7btJOeXCUj7awlhMzLpgX7+yZ2+zq25+qKN2i52cfpeSl4mgiZKWp4KPpat+j7qsgI3AqoGLwqiC isOmg4nFpIOIxqKEh8ighIfIn4SHyJ+Eh8ifhIfIn4SHyJ+Eh8ifhIfIn/+EEAH/gxoD/4sqDP+c MRL/pTQa/6w2If6zOijzu0At6cNIMeHLUTfSx1ZLxcBeXbi4ZW6ssWx9oKpzipSke5WKn4aegJuS pXmYoqp0mLerd5XBqXqRwqd8j8OlfY3Fo36MxqF/isiff4rIn3+KyJ9/isiff4rIn3+KyJ9/isif f4rIn/+FEAH/hBoD/44oC/+fMRH/pzIX/7AzHfm5NiLuwj0m5s1HJtvTTDXLzFRJvsVcW7G+Y2yk uGp6mLJxh4yseZOBqIKcd6SPo3Cin6dsorSobp/Cp3KZw6Z1lcSkd5LGoniQx6F6jsifeo7JnnqO yZ56jsmeeo7JnnqOyZ56jsmeeo7Jnv+GEAH/hRkD/5EmCv+hLw//qy4V/7UvGfS/Mhzpyzoc39lE HdHaSjPE0lJHt8taWanGYWmcwGd4kLpuhIS2do95soCYb6+Nn2itnaNkrbKkZarFpGqixaNtncai cJnHoXKWyJ90k8mddZPKnXWTyp11k8qddZPKnXWTyp11k8qddZPKnf+HDwH/hxkD/5UkCf+kKw3/ rykR+rspE+zILBPe2DcQ0+FBHsnfSTC82lFEr9NYVqHNX2aUyGV0iMRsgHzAdIpxvX+TabuMmWK5 nJ1eurGeXbjJnmKuyJ9mpsifaaHJnmudyp1umsubbpnLm26Zy5tumcubbpnLm26Zy5tumcubbpnL m/+IDwH/iRkD/5ojB/+oJwr/tSIM8cQgDODVJAnR4TAUx+Y9JL3jRjSy4E5EptxWUpnXXWGM0mNv gM9renTMc4Rryn6LYsiMkVzInJVZyLGWV8jOllu7zZhessyZYavMmWSmzZlnos2YZ6DNl2egzZdn oM2XZ6DNl2egzZdnoM2XZ6DNl/+KDgH/ixgD/58hBf+uIAb4vRgG49ETBNDhHgnF6i4Zuuk6KbDn Qzmk5EpImOJQVozgV2KA3V9sdttodWzacn1j2H6DXNiMiFfYnYtU17CNVNjNjFXL049XwNKRWrjR k1yy0ZNfrNGTYKrRk2Cq0ZNgqtGTYKrRk2Cq0ZNgqtGTYKrRk/+MDgH/jxYC/6UeA/+1FQPaygsC 0OEOAsTrHg247ywdre43LqLsQD2X60hKjOlPVoHoVmB2515pbOdlcGTmcHde43x8WeCJgFbel4NT 3aaEUdy4hVHd1IRT0NqHVMbYiVa/14pYuNaLWbbWi1m21otZttaLWbbWi1m21otZttaLWbbWi/+O DQD/lxIB/60VAdm/CQDMzgkAw+sOBLb1HhGr9SwhofQ3MJbzQD6L80hKgfNQVHfzV11t811kZfBm al/tcG5a6npyVueFdlPlkXlR5J57T+OsfE3jvXxN49l8UNjgfFHO4H9Sxt6BU8TegVPE3oFTxN6B U8TegVPE3oFTxN6BU8Tegf+SDAD/oA0A27cGAMrDBwDA0gkAtfQQBqn7HxSf/CwjlPw3MYr8QT2B /UlHeP1RUG79V1dl+l5cYPZmYVv0b2VW8XhoU++Ca1DujG1O7JdvTOujcUrqsHJJ6sFySOrYckvj 5HJO2OZzTtXndE7V53RO1ed0TtXndE7V53RO1ed0TtXndP+WCgDerAIAy7oFAL3HBgCy2AgBp/8S CJz/IRaS/y4jif85L4D/Qjl3/0pCbf9QSWX/Vk5f/15TWv5lVlX8bVpS+nVcT/h+X0z3h2FK9ZFi SPScZEbzpmVF8rNmRPLBZ0Py1GdF7udnRuvoZ0br6GdG6+hnRuvoZ0br6GdG6+hnRuvoZ+6iAADN tAIAvL4EAK/NBACk3gcBmv8VCZD/JBWH/zAgfv87KnT/QjJr/0g5Y/9OP13/VUNY/11HU/9kSlD/ a01N/3JPSv95UUf/glNF/4tUQ/6UVkH9nldA/ahYP/yzWT78v1o++9FaPfvbWj3721o9+9taPfvb Wj3721o9+9taPfvbWtKtAAC9uAIArsUCAKHVAgCW9wsCjf8YCIT/JhF8/zEacf84Imj/Pilg/0Uv Wv9MM1T/UzdQ/1o6TP9gPEn/Zj5G/21ARP90QkH/e0M//4NFPf+MRjv/lUc6/55JOf+nSjj/sUo3 /75LN//CSzf/wks3/8JLN//CSzf/wks3/8JLN//CS7+zAACuvgAAoM0AAJLeAACJ/w0Bgf8aBXf/ Iwxt/yoTZP8xGVz/OB5V/0AiUP9IJkz/TylI/1UrRP9bLUL/YS8//2cxPf9tMjv/czM5/3o1N/+C NjX/izcz/5Q4Mv+cOTH/pDow/687MP+yOzD/sjsw/7I7MP+yOzD/sjsw/7I7MP+yO7C4AACgxwAA kdgAAITvAAB8/w0Bb/8RA2b/GQZe/yEKVv8pD1D/MhNL/zoWRv9BGUL/SBs//04dPP9THjn/WSA3 /14hNf9kIjP/aSMx/3AkL/93JS3/fiYs/4cnKv+PKCn/lyko/6AqKP+jKij/oyoo/6MqKP+jKij/ oyoo/6MqKP+jKqHCAACR0QAAguEAAHj/AABs/wgBYP8NAlf/EQNP/xgFSP8gBkP/KQg//zEKO/84 DDj/Pg41/0QPMv9JEDD/ThEu/1MSLP9YEyr/XRQp/2MVJ/9pFiX/bxck/3cXIv9+GCH/hRkf/48a H/+RGh//kRof/5EaH/+RGh//kRof/5EaH/+RGv9oGQL/ZCME/18vBv9eQBD/Y0sa/2dUJf9oXS// Zmc5/2RyQf9ifUj/YIdO/12QUv9bmFb/Wp5Z/1ikW/9Xql3+VrBf/VW1YPxUvGH8VMRi+1PNY/lS 3GP2UuZj8VPqY+xU7WPmVu9i4FfwY+BX8GPgV/Bj4FfwY+BX8GPgV/Bj4FfwY/9pGAL/ZSME/2Au Bv9fQBD/Zkka/2pTJf9rXDD/aWU6/2dwQv9ke0n/YoVP/1+OVP9dllj/W51b/1qjXf1YqV/8V69h +1a1YvpVvGT6VcRl+VTOZfdT3WbzU+Zm7lXqZudW7WXhWO5l21nvZttZ72bbWe9m21nvZttZ72bb We9m21nvZv9qGAL/ZiIE/2EuB/9gPxD/aUgb/21RJv9uWzD/bGQ6/2luQ/9neUv/ZINR/2GMVv9f lVr/XZxd/VuiYPtaqWL6Wa9k+Vi1ZflXvGf4VsVo91XPaPVU4GnwVeZp6VfqaOJZ7GjbWu1p01vu adNb7mnTW+5p01vuadNb7mnTW+5p01vuaf9qGAL/ZyIE/2IuB/9jPhD/bEYb/3FQJv9yWTH/cGI7 /2xrRP9pdkz/Z4FS/2SLWP9hk1z9X5tg+12hYvpbqGX5Wq5n+Fm1aPdYvGn2V8Zq9VbRa/JV4Wzs V+ds5Fnpa9xb62vUXOxszV3tbM1d7WzNXe1szV3tbM1d7WzNXe1szV3tbP9rFwL/aCED/2MtB/9n PBD/cEUb/3ROJv92VzH/dGA7/3BpRf9tc03/an5U/2aIWv5jkV77YZli+V+gZfhdp2j2XK1q9Vq0 bPRZvW30WMdu8lfUb+5X4m/mWeZv3VzpbtNd6m/NXutwx1/rcMdf63DHX+twx1/rcMdf63DHX+tw x1/rcP9sFwL/aSED/2UtB/9rOhD/dEMb/3lMJv96VTH/eV08/3VmRf9wcE7/bXtW/2qFXPxmj2H6 ZJdl92GfaPZfpmv0Xa1t81y0b/JavXHxWcly71jac+ha43PeXeZy017oc8tf6HTGYOh0wWHodMFh 6HTBYeh0wWHodMFh6HTBYeh0wWHodP9tFgL/aiAD/2YtB/9vOBD/eEEa/31KJf9/UjH/fls8/3tj Rv92bE//cXdX/m2CXvtqjGP4ZpVo9WSdbPNhpG/yX6xx8F20c+9cv3XuW8t26lvdd+Bd43bTYOV3 ymHleMRi5Xi+Y+V4umTleLpk5Xi6ZOV4umTleLpk5Xi6ZOV4umTleP9uFgL/ayAD/2gsB/9zNhD/ fT8a/4JHJf+EUDD/hFg7/4FgRf98aU//dnJX/nF9X/ltiGX2apJq82abb/Fjo3LvYat17V+1eOxd wXnsXNB6413fe9Rh4nvKYuJ8wmThfbxl4X23ZuJ8s2fifLNn4nyzZ+J8s2fifLNn4nyzZ+J8s2fi fP9wFQH/bB8D/2ksB/93NA//gTwZ/4dFJP+KTS//iVU6/4ddRf+CZU//fG5Y/XZ4YPhyhGf1bY5t 8WmYcu9moXbsY6t562C2fOlexH7nXth/2GHffspj34DBZd6BuWfegbRo3oGwad+ArGnff6xp33+s ad9/rGnff6xp33+sad9/rGnff/9xFQH/bR8D/2srB/97Mg//hjoY/4xDIv+PSy3/j1M4/41aQ/+J Yk3/g2lX/XxyYPh2f2f0cYpu8GyVdO1on3nqZKp96GG3gOZfyILdYduDzGTchMBm3IW4aNuFsWrb ha1r3ISpbN2DpmzdgqZs3YKmbN2CpmzdgqZs3YKmbN2Cpmzdgv9yFAH/bx4D/28pB/9/MA7/ijgX /5FBIf+USiz/lVE2/5NYQf+QYEv7i2dV9YRvX/B9emfrd4Vv53KQduNtm3zeaKaB2mWzhNVjxIbP ZNqHwWfZiLdp2Imva9iJqm3ZiKZu2oejbtqGoG/bhaBv24Wgb9uFoG/bhaBv24Wgb9uFoG/bhf9y FAH/cB4D/3IoB/+CLg3/jjYW/5VAH/+ZSCn/mU80/5hVPvqWXEn0kmRT7YxrXeeFdmbhf4Fv23iM d9Nyln7NbaGEyWqticVou4vBaNCMtmvVja5t1Y2nb9aMo3DWi59x2IqdcdmJm3Lah5ty2oebctqH m3Lah5ty2oebctqHm3Lah/9zFAH/cB0D/3UmBv+GLA3/kTYV/5lAHf+cRif/nUwx/J1SO/ScWUXt mWBP5pRoWd+Oc2PVhn1uzX+HeMZ4kYDAc5uHu2+njLZttI+zbMiRrG7SkaVw05CgctSPnHPVjZl0 1oyXdNiKlnXZiZZ12YmWddmJlnXZiZZ12YmWddmJlnXZif90EwH/cR0D/3gkBv+JKwz/lTUT/5w+ G/+gQyT/okku96NQN++iVkHnoV1K351nVNSVb2LLjXhuw4WCebt/jIK1eZaJr3Whjqpyr5KmccGU oXPQlJx00ZKYdtKRlnfTj5R31Y2Sd9aMkXjYipF42IqReNiKkXjYipF42IqReNiKkXjYiv91EwH/ chwD/3sjBv+MKQv/mDQS/588Gf+jQSL7pkYq8qhNM+qpVDziqVtE16NjU8yabGLCk3Vuuot+ebKF h4Oqf5GKpHuckJ54qpSadruWl3fPlpR50JSRetGSj3rTkI561I+NetWNjHrXi4x614uMeteLjHrX i4x614uMeteLjHrXi/91EwH/cxwD/30hBf+OKQr/mzQQ/6I5F/+mPh/3qkQm7q5KLuWxUjXcr1lB z6hhUsWgaWG7mHJusZF6eamLg4OhhY2LmoGYkZR+pZaQfLaYjX3Nl4x+z5WKftCTin7SkYl+04+J fdWNiH3Wi4h91ouIfdaLiH3Wi4h91ouIfdaLiH3Wi/92EgH/dBwD/4AgBf+RKAn/njMP/6Q3Ff6q Oxvzr0Ei6rRIKOK5UC7UtFZAya1fUb6lZ2C0nm9tqpd3eKGRgIKZjIqLkYeVkYuEopaGg7KZg4TL mISDzpaEg9CUhILSkoSB05CEgdSOhIDWjISA1oyEgNaMhIDWjISA1oyEgNaMhIDWjP93EgH/dBsD /4IeBP+UJwj/oDIN/6c0E/quOBjvtT0c5rxGIdy/TCzOuVQ/w7FdULeqZV+tpGxso510d5mYfIGR k4aKiY+SkYKMn5Z9iq+YeovHmHyJzpZ9iNCUfobSkn+F05B/hNSOgIPWjICD1oyAg9aMgIPWjICD 1oyAg9aMgIPWjP94EgH/dRsD/4UcBP+XJgf/oy8L/6swEPWzNBTruzoX4sREGNXESCvIvVM9vLZb TrGwY12mqmpqnKRxdpKfeoCJmoOJgZaOkHmTnJV0kqyXcZLDmHORz5Z2jtCUeIvSkXmK05B6iNWO e4fWjHuH1ox7h9aMe4fWjHuH1ox7h9aMe4fWjP94EgH/dhsD/4gbA/+aJQb/pisJ/q8sDPG5Lw7m wzYP3c08Fs7IRynCwlE7trxZTKq2YVufsGholatvdIumd36BooCGeZ+LjXGcmZJsm6mVaZu/lmuZ 0JRulNGScZHSkXOP1I91jdWNdovWi3aL1ot2i9aLdovWi3aL1ot2i9aLdovWi/95EQH/eBoC/4wZ A/+eIwT/qiYG+LQlCOvAKAjhzTAH1NI3FMjNRSe7yE85r8JXSqO9X1iYuGZljbNtcYOvdXt6q36D caiJimqmlo9lpaeSYqa9kmOj0pFnndOQapjUj22V1Y1uktaMcJDYinCQ2IpwkNiKcJDYinCQ2Ipw kNiKcJDYiv97EQH/fBcC/5AXAv+iIQP/riAE8rsdBOXKHgPa2yQDzNk1EsDTQyS0zk02qMlVR5zE XVWRwGRihrxrbXu4c3ZytXx+arOHhWOxlYpesKWMW7G8jVuv1Y1fp9WNY6HWjGac14tomdiKapbZ iGqW2YhqltmIapbZiGqW2YhqltmIapbZiP98EAH/gRQC/5UVAf+nHQL8tRYC68YQAdrbDwDN4CUE w982D7jbQSGs1UszoNFTQ5TNWlGJyWJdfsZpZ3TDcXBrwXt4ZL+Gfl2+lIJYvaWFVr67hlW924ZY s9qHXKvah1+m2odhoduGY53bhWOd24VjnduFY53bhWOd24VjnduFY53bhf9+EAH/hxEB/5oRAP+t FADavgoA0c0KAMvkEAHB5CUHt+M1E63hQCGj3kkvl9tSPovXWUuA1GBXdtFoYW3PcGllzXpwXsyG dVjMlXlUzKZ7Uc28fFDM4nxTweB/VbffgFix3oFaq96BXKbfgVym34Fcpt+BXKbfgVym34Fcpt+B XKbfgf+ADwH/jg4B/6INANu1CADOwQgAxtAJAL7pEgK06SUKqugzF6DmPiWW5Ucyi+NOP4DhVUl2 4F1Tbd5mW2Xdb2Fe3XpnWNyGa1PclW9Q3aZxTd67ck3f4XFO0ed0UMbmd1K+5HhTuOR5VbLjelWy 43pVsuN6VbLjelWy43pVsuN6VbLjev+DDgH/lgsA3asEAM24BgDCxAYAutQJALHvFAOn7iUNnu4z GpTtPSeK7EYzgOtOPnbrVUds6ltOZOpjVV3qbVpY6ndeU+qDYk7qkWVK66FnR+yzaUbt0GlI5uhp S9nrakzP7G1Ox+tvT8DqcE/A6nBPwOpwT8DqcE/A6nBPwOpwT8DqcP+JCwDpoAEA0LEEAMG8BQC3 yQYArtoJAKT1FwWb9ScQkvU0HIj2Pid/9kcydvZOO2z2VEJk9lpIXfZiTVf2a1FS9nVVTfeAWEj4 jVpF+JtcQvirXkH3vl9A999gQ+7sYEfj8V9I2/FhSdLyY0nS8mNJ0vJjSdLyY0nS8mNJ0vJjSdLy Y/6VAADUqQAAwrUDALXBAwCqzwUAoOcLAZj9GgaP/ikQhv81G37/QCV0/0Yta/9MNWP/Ujpc/1k/ Vv9gQ1D/aEdM/3FKR/97TEP/h05A/5RQPv+hUj3/sFQ7/8NVO/7hVTz58FVA8PRVQ+f3VEPn91RD 5/dUQ+f3VEPn91RD5/dUQ+f3VNuhAADFsAAAtboCAKjHAgCd1gQAk/wOAYv/HQaD/ysPev81F3H/ PB9o/0ImYP9JLFn/TzFT/1Y1Tv9dOEn/ZTtF/209Qf92Pz7/gEE7/4tDOf+YRTj/pEY2/7JHNf/E SDX/3Uk0//BJN/74STf++Ek3/vhJN/74STf++Ek3/vhJN/74ScmrAAC2tAAAqMEAAJvPAACO3wEA h/8RAX7/HQR1/ycLbP8vEmT/Nxhc/z4dVv9FIlD/SyVL/1IoRv9YK0H/Xy0+/2cvO/9vMTj/eDM2 /4I0M/+NNjH/mTcw/6U4L/+yOi7/wDsu/9M7Lf/rPC3/6zwt/+s8Lf/rPC3/6zwt/+s8Lf/rPLiw AACovAAAmskAAIzZAACB9QMAef8QAW7/FgNl/x8GXv8nC1f/MA9R/zcTS/8+F0b/RRlB/0wbPf9S HTn/WB82/18hNP9mIjH/biQv/3clLf+AJiv/jCgp/5cpKP+iKif/rSsm/7ksJv/JLSb/yS0m/8kt Jv/JLSb/yS0m/8ktJv/JLaq3AACaxQAAi9MAAH3iAAB1/wUAaf8MAV//EQJX/xcDUP8fBUn/JgdE /y4JP/82Czv/PQ03/0MPM/9JETD/TxIu/1UTLP9bFCr/YhUn/2kWJf9yFyP/exgh/4YZH/+RGh7/ nBse/6UcHf+wHR3/sB0d/7AdHf+wHR3/sB0d/7AdHf+wHZzAAACMzgAAfN4AAHD1AABl/wAAWv8G AVH/DQFJ/xECQ/8XAz3/HwQ4/yYFNP8tBjD/Mwct/zkHKv8+CCf/Qwgl/0kJI/9OCSH/VAkf/1oK Hf9hChv/aQsZ/3IMF/98DRb/hg0U/48OFP+aDxT/mg8U/5oPFP+aDxT/mg8U/5oPFP+aD/9cHAL/ VyYD/1EyBv9OPAj/V0UQ/1tOGf9cWCL/W2Mr/1lvMv9Xejj/VIU9/1KQQf9QmUX/T6BH/06nSf9N rkv/TLRM/0u7Tf9Kw07/Sc1P/0ndUP9I6VD/SPJQ+0n2UPZL+VDwTftP6k/7UOdP/FDnT/xQ50/8 UOdP/FDnT/xQ50/8UP9cHAL/WCYD/1IyBv9ROgj/WkMQ/19NGf9fVyP/XmEr/1xtM/9ZeTr/V4Q/ /1SOQ/9Sl0f/UJ9J/0+mS/9OrU3/TbRP/0y7UP9Lw1H/S85S/0rfUv9J6lP9SvJT+Ev2U/FN+FLr T/pS5VD6U+JR+lPiUfpT4lH6U+JR+lPiUfpT4lH6U/9dGwL/WSYD/1MxBv9UOQj/XUIQ/2JLGv9i VSP/YF8s/19rNP9cdzv/WYJA/1aMRf9UlUj/Up5L/1GlTv9QrE//T7NR/067Uv9NxFP/TM9U/0vg Vf9L61X6TPJV9E32VexQ+FTmUfhV31L5VtxT+VbcU/lW3FP5VtxT+VbcU/lW3FP5Vv9eGwL/WiUD /1QxBv9YNwj/YUAR/2VJGv9mUyP/ZF0t/2JoNf9fdDz/XH9C/1mKR/9Wk0v/VJxO/1OkUP9Rq1L/ ULNU/0+6Vf9OxFb/TdBX/03iWPxM7Vj2TvJY7lD1WOZT9ljfVPdZ11X4WdNV+FnTVfhZ01X4WdNV +FnTVfhZ01X4Wf9fGgL/WyUD/1UwBv9cNAj/ZT0R/2pHGv9rUST/aVot/2ZkNv9jcD3/X3xD/1yH Sf9ZkU3/V5pQ/1WiU/9TqlX/UrJX/1G6Wf9QxVr/T9Jb/E7kW/hP7VzwUfJb51T0W95V9VzVVvZd zlj3XctY913LWPddy1j3XctY913LWPddy1j3Xf9gGgL/XCQD/1YvBf9gMgj/ajsQ/29EGv9wTiP/ b1ct/2thNv9nbD7/Y3hF/2CDS/9cjk//WphT/1egVv9WqVn/VLFb/1O6XP5Rxl78UNZf+VDnX/JS 7l/nVfFf3VfyYNJY82HLWfVixVv1YsNb9WLDW/Viw1v1YsNb9WLDW/Viw1v1Yv9hGQL/XSMD/1ot Bf9lLwj/bzgQ/3RBGf92SyP/dVQt/3FdNv9sZz//aHNG/2R/TP9gilL/XZVW/1qeWf9Yp1z+VrBf /VS6YPxTx2L5Utxj81PoY+lV7mPeWPBk0FrxZchc8mbCXfJmvV7yZrte8ma7XvJmu17yZrte8ma7 XvJmu17yZv9iGQL/XiMD/14qBf9pLQj/dDUP/3o+GP98SCL/e1Es/3haNv9zYz//bW1H/2l6Tv9k hlT/YJFY/12cXP1apWD7WLBi+la7ZfhVymb1VOBn7FbqZ99a7WfQXO9pxl3var9f72q5YO9qtWHv arNh72qzYe9qs2HvarNh72qzYe9qs2Hvav9jGAL/YCID/2InBf9uKgf/eTIO/388F/+CRiH/gk8r /39YNf97YD7/dWlH/290TvtqgVX4Zoxb9WKXX/NfoWPwXKtm7lq2aexZxGrpWNpr4Vrqa9Bd7G3F X+xuvGHrb7Zi7G+xY+xurWTsbqtk7W2rZO1tq2Ttbatk7W2rZO1tq2Ttbf9kGAL/YSID/2YlBP9y Jwf/fjAN/4U7Fv+IRR//iE0p/4ZVM/+CXj37fWZG9nZwTvJyfFXubYdc6miSYuZknGbjYaZq4F+y bd1dv2/aXdNw0l7qcMRg6XK6Yuhzs2Toc61l6XOpZulypmfqcaRn6nCkZ+pwpGfqcKRn6nCkZ+pw pGfqcP9lFwL/YiED/2kjBP93JQb/gi8M/4o5FP+OQx3/j0wm/41TMPmKWzrzhWNE7X9sTeh5d1Xj dIJd3m6NY9lpl2nTZqFuz2OsccthuXTIYcp1xWHldrlk5newZuV3qmjmd6Vp5naiaud1n2roc55r 6XOea+lznmvpc55r6XOea+lznmvpc/9mFwH/YyED/20gBP97IwX/hy4L/484Ev+TQRr/lUoj+pRR LfORWTfsjWBB5YdpSt+BdFPWen5dz3SIZcpvkWzFa5txwWimdb1msni6ZcJ6t2Xde65o43unauN7 omvkep5s5XibbeV3mW3ndphu53WYbud1mG7ndZhu53WYbud1mG7ndf9nFgH/ZCAD/3AeA/9+IgX/ iywJ/5M3EP+YQBj9mkgg9JpOKeyYVTPllV083Y9mR9OIb1PLgXlexXuDZr91jG65cZZ0tW6heLBr rHytart+qmrSf6Rs4H6ebeF9mm/ifJdw43qVcOR5k3Dld5Nx5neTceZ3k3Hmd5Nx5neTceZ3k3Hm d/9oFgH/ZCAD/3McA/+BIAT/jisI/5c1Dv+dPhX4n0Qc76BLJeefUi3fnVo305VjRsqObFPDh3Ve u4F+Z7V7iG+vd5F1qnOceqVwqH6hb7aBnm/Kgptw3oGWcd+Ak3LhfpFz4nyQc+N6jnPkeY5z5XiO c+V4jnPleI5z5XiOc+V4jnPleP9pFgH/Zh4D/3YaA/+EHwP/kioH/5s0DP6gOxLzo0EY6qZIIOKn TyfYolY2zJpgRcOTaVK7jXJes4Z6Z6yBhG+mfY12oHmYfJt2o4CXdLGDlHTFhJF13YOPdt6BjXbg f4t34X2Kd+J7iXbkeol25HmJduR5iXbkeYl25HmJduR5iXbkef9pFQH/aR0D/3gZAv+HHgP/lSgG /54yCvqkNw/vqD0U5qxEGt2tSyTQplQ1xp9eRLyZZlK0km9drIx3Z6SHgG+egop3mH6UfZJ7oIGN eq2EinnAhYh63ISHet2ChnrfgIZ64H6FeuJ8hXnjeoV55HmFeeR5hXnkeYV55HmFeeR5hXnkef9q FQH/axsC/3sXAv+KHAL/mCYF/6IwCPWoMwzrrjkQ4rNBFNaxRyPKq1I0wKRcQ7aeZFGtmGxcpZJ0 Zp2NfW+WiIZ2j4WRfYqCnIKFgKqFgX+8hoCA24WAgN2DgH/egYB+4H+AfeF9gH3je4B85HqAfOR6 gHzkeoB85HqAfOR6gHzkev9rFQH/bRkC/34VAv+NGwL/myQD/qUsBvGsLwjnszQL3bo6ENC1RiHF r1EyuqlaQrCjYk+nnWpbnphyZZaTem6Pj4N2iIuOfIKImYF8hqeFeYa5hneH14V4hd2DeoPegXqC 4H97geF9fIDje3x/43p8f+N6fH/jenx/43p8f+N6fH/jev9rFAH/cBgC/4EUAf+QGQH/nyIC+qkm BO2xKQXiui8G1r82D8q6RCC/tE8xtK5YQKqoYE6ho2damJ5vZI+ad22IloB1gJKLe3qPloB0jqSE cY22hW+O0YVxi92Dc4nfgXWH4H52heF9d4Tje3eD5Hp3g+R6d4PkeneD5Hp3g+R6d4Pkev9sFAH/ cxYC/4UTAf+UFgH/oh4B9a0gAue4IQLdwyYC0MM0DcS+Qh65uU0vrrNWPqSuXkyaqWVXkaVtYomh dWuAnX5yeZqIeXKXlH5tlqKCaZWzhGeWzYNpk96CbI/fgG+M4X5wiuJ8cojjenKH5Hlyh+R5cofk eXKH5Hlyh+R5cofkef9tEwH/dhMB/4gSAf+YEwD/pxkB77MWAeLAFQDVyh4ByccyDL7DQByzvkss qLpUPJ61XEmUsGNViqxrX4Gpcmh5pXtvcqOFdmugkXtmn59/Yp+xgWCfyoBinOB/ZZfhfmiT4nxq kON7bI3keW2M5XhtjOV4bYzleG2M5XhtjOV4bYzleP9uEwH/exEB/40QAP+dEAD6rBEA2rsLANXJ CwDNzhsBwswvCrfJPRmsxUkpocBSOJe8WkaNuGFRg7VoW3qycGRyr3lra6yDcWSrj3ZfqZ56W6mv fFmqyXxap+J7XqDje2Gb43pjl+R5ZpTld2aS5ndmkuZ3ZpLmd2aS5ndmkuZ3ZpLmd/9wEgH/gA4B /5IOAPKjCwDZswkAz74JAMvMCQDE0xcAutIsB7DPOxalzEYmmshQNY/EWEGFwV9NfL5nVnO8b15r uXdlZLiCa162jnBZtZ1zVbWudVS2yHVTs+d2V6vmdlqk5nZcoOd1X5zndGCa6HRgmuh0YJrodGCa 6HRgmuh0YJrodP9yEgH/hgwA+5gJANmpBgDOtQcAxsEHAMDPCQC62xMAsdopBafYNxKc1EQhktFN MIfOVTx9y11HdMllUGzHbVdlxXZeXsSBY1nDjmhUw51rUcOubE/EyG1Owu1tULjrb1Ow63BVq+pw WKbrcFmj63BZo+twWaPrcFmj63BZo+twWaPrcP93DwH/jQgA3qACAM+uBQDEuQUAu8UGALXTCgCu 4RYBpuEpBp3gNxGT3kIdidxMKX/aVDV111w/bdVkSGXTbE9f0nZUWdKBWVTRjl1Q0Z1gTdKwYkvT yWJK0u1iS8jyZk2/8WhPuPBpUbLwaVKv72lSr+9pUq/vaVKv72lSr+9pUq/vaf9/CgDtlgAA0qYB AMSyAwC5vAMAsMkGAKnYCgCh5xkCmecqCZDnNxSH5kIffeVKKXTkUTNr41k6ZOJhQV7ia0dY4nVL U+GAT0/ijVNL4ptVSeOsV0fkxFdG4+lXRt32WUfQ91xJyPdeSsH2YEu99mBLvfZgS732YEu99mBL vfZgS732YP+JAADZngAAx6wBALm2AgCuwQMApc4GAJzkDACV7x0Dje8sC4XvORV870Eec+9JJ2ru UC9i7lc1XO5fOlbuaD9S7nFCTe98RknviUlG8JZLQ/CmTUDxuU4/8ttPPvD3TkLm+09D3ftRRNT8 U0XP/FRFz/xURc/8VEXP/FRFz/xURc/8VOGVAADLpgAAu7AAAK67AQCiyAIAmNUFAJD4DwGJ+CAE gvguC3n5NxNw+T8baPlGImD6TSha+lQtVPpcMU/7ZTVL+204R/x3O0P8gz0//ZA/PP2fQTr+r0M4 /8ZEN//qRTb8/UU78v9EPur/RD7m/0Y+5v9GPub/Rj7m/0Y+5v9GPub/RtCfAAC9rAAArrUAAKLC AACVzwAAit0DAIT/EgF7/x4DdP8qCWz/Mw9k/zsWXf9DG1f/SiBR/1EkTP9YJ0j/YCpE/2gsQP9x Ljz/ezE5/4gyNf+WNDP/pDYx/7Y3L//QOC7/7zkt//85Mf//OTP8/zkz/P85M/z/OTP8/zkz/P85 M/z/OcGoAACvsQAAor0AAJTKAACH2AAAffMHAHb/EgFt/xoDZf8kBV7/LQpY/zYPUv89E0z/RRZI /0wZQ/9TGz//Wh48/2EgOP9pITX/ciMx/30lLv+KJiv/mSgp/6cpJ/+5Kyb/0iwl/+8sJP//LST/ /y0k//8tJP//LST//y0k//8tJP//LbGuAACjuQAAlMYAAIbTAAB54QAAcf8IAGf/DwFf/xUCV/8e A1H/JgVL/y4HRv82CkH/PQw9/0QOOf9LEDb/URIy/1gTL/9fFSz/ZxYp/3EXJv98GCP/iRog/5gb H/+mHB3/tx0c/8oeHP/mHxv/8B8b//AfG//wHxv/8B8b//AfG//wH6S1AACVwgAAhs8AAHfeAABr 9AAAYv8DAFn/CwFR/xEBSv8XAkT/HwM//yYEOv8tBTb/NAYy/zoHLv9ACCv/Rggo/0wJJf9SCSL/ WQog/2ILHf9rDBr/dg0X/4QOFf+SDxT/oBAT/60RE/+6ERP/wxIT/8MSE//DEhP/wxIT/8MSE//D Epe+AACGzAAAd9sAAGnnAABc/QAAVP8AAEv/BQBD/wwBPf8RAjf/FwIy/x4DLv8kAyr/KgQl/y8E Iv81BR//OgUd/z8FGv9FBhj/SwYW/1IGFP9aBxL/YgcQ/2wHD/93CA3/hAgM/5AIDP+cCAz/oggM /6IIDP+iCAz/oggM/6IIDP+iCP9QIAL/SyoD/0Q2Bf9HOgb/Sj8I/05JD/9PVBf/T2Ae/01sJP9K eSr/SIUu/0aQMv9EmjT/Q6I3/0KqOP9BsTr/QLk7/0DBPP8/yz3/Ptw+/z7oPv898z7/Pfs//z7/ Pv9A/z76Q/899ET/Pu5G/z/uRv8/7kb/P+5G/z/uRv8/7kb/P/9QIAL/SyoD/0U1Bf9KOAb/TT0I /1FID/9SUhf/UV4e/09qJf9Ndyv/SoMv/0iOM/9GmDb/RKE4/0OpOv9CsDz/Qrg9/0HBPv9Ayz// QNxA/z/pQP8/9ED/Pv1B/0D/QP1C/0D2Rf9A8Eb/QelI/0HpSP9B6Uj/QelI/0HpSP9B6Uj/Qf9R HwL/TCkD/0c0Bf9NNgb/UTsI/1VGEP9WUBj/VVwf/1JoJv9QdCz/TYAx/0qMNf9Ilzj/RqA7/0Wo PP9EsD7/Q7g//0PBQf9CzEH/Qd5C/0HrQ/9A9UP/QP1D/0P/Q/hG/0LwSP9D6kn/RONK/0XjSv9F 40r/ReNK/0XjSv9F40r/Rf9SHwL/TSkD/0oyBP9QMwb/VTkI/1lDEP9aTRj/WVgg/1ZkJ/9TcS3/ UH0z/02JN/9LlDr/SZ49/0emP/9GrkH/RbdC/0TBRP9EzEX/Q99F/0LtRv9C90b/Q/1G+Ub/RvBJ /0bpS/9H4kz/SNtN/0jbTf9I203/SNtN/0jbTf9I203/SP9THgL/TigD/04vBP9UMAb/WjYI/15A EP9gShj/XlUg/1tgKP9YbS//VHk0/1GFOf9OkT3/TJtA/0qkQv9JrUT/SLZG/0fBR/9GzUj/ReFJ /0TvSv9F+Er7R/1K8Ur/SehN/0vfTv9M10//TM9R/0zPUf9Mz1H/TM9R/0zPUf9Mz1H/TP9UHQL/ UCcD/1IsBP9ZLQX/XzII/2Q8EP9mRxj/ZFIg/2FcKP9daDD/WnU2/1aBO/9SjT//T5hD/02iRf9M q0j/SrVJ/0m/S/9IzEz/SOFN/0juTfxI+U7yS/xN5079T91Q/VDSUv5QzFP/UcZU/1HGVP9RxlT/ UcZU/1HGVP9RxlT/Uf9VHQL/UScD/1YpBP9eKgX/ZC8I/2o6D/9sRRf/bE8g/2hZKP9kYzD/YHA3 /1x8Pf9YiEL/VZNG/1OdSf9Rpkv/T7BN/066T/1NxlD6TdlR9kzqUfJN91HnUPpS21L7VM5U/FXH Vv1VwVf+VbxY/lW8WP5VvFj+VbxY/lW8WP5VvFj+Vf9XHAL/UiYD/1omBP9iJgT/aiwH/3E3Dv9z Qhb/c0wf/3BWKP9rYDD/Zms4/2N3Pv5fg0T7W45I+ViYTPdWoU/1VatR81O1U/FSwVTvUdBV61Hn VeZS9lbaVPlYzFb6WcNY+1q8Wvtat1v7WbNc+1mzXPtZs1z7WbNc+1mzXPtZs1z7Wf9YGwL/UyUD /14jA/9nIwT/cCoG/3c1Df96QBX/ekod/3hTJv9zXC/8bmY3+GlyP/RlfkXxYYlK7l6TTutcnVLo WaZV5liwV+RXvFjiVsxZ3lbkWdhW9FvKWPddwFr4Xrhc+F6zXfherl74Xatf+VyrX/lcq1/5XKtf +VyrX/lcq1/5XP9ZGwL/ViMD/2IgA/9sIAP/dSgF/30zC/+APRP/gUcb/39QJPl7WS30dmI27nFt PupseUXmaIRL4mSOUd5hmFXbXqJZ1lysW9NbuF7QWsZfzVrfYMha8mG+XPVitV70Yq5g9WKqYfVh pmL2YaNj91+jY/dfo2P3X6Nj91+jY/dfo2P3X/9aGgL/WSEC/2YdAv9wHgP/eiYE/4IxCf+GOxD/ iEQZ+YZNIfKDVivrfl405XlpPeB0dEXab39M02qJU89mkljLY5xdx2GmYMRfsWPBXr9kvl7SZbpf 7GayYPJmq2LyZqVk8mWhZfNkn2X0Y5xm9WKcZvVinGb1Ypxm9WKcZvVinGb1Yv9bGgL/XB8C/2kb Av91HAL/fiQD/4cuCP+MOA77jkIW8o5KHuuLUifkh1sw3YFmOtN6cEXNdXpOyHCDVcNsjVu+aZZg umagZLdkq2e0Y7hpsWLKaq5j5mqoZO9qombvaZ1n8GiaaPFnmGnyZpZp82SWafNklmnzZJZp82SW afNklmnzZP9bGQL/XxwC/2wYAv95GwL/gyED/4wsBv+RNgv1lD8S7JVHGeSTTyLcjlgt0odiOsqB bEXDe3VOvnZ/VrhyiF20bpFir2ubZqtppmqoZ7NspWfDbqJn4G6eae1tmWrubJZr72qTbPBpkmzx Z5Bs8maQbPJmkGzyZpBs8maQbPJmkGzyZv9cGQH/YhoC/3AWAv98GQL/hh8C/5ApBPqWMwnwmjwO 55tEFd+aSx3TlFUsyo1fOcKHaUW7gXFPtXx7V694hF6qdI1jpXGXaKFuomydbK5vmmy+cJhs2XGV betvkW7sbo9v7WyNb+9qjG/waYtv8WeLb/Fni2/xZ4tv8WeLb/Fni2/xZ/9dGQH/ZBkC/3IUAf9/ GAH/ih0B/5QmA/abMAbrnzgK4qI/ENifRxzNmVIrxJJdObuMZkS0h25OrYJ3V6d9gF6ieYlknXaT aZhznm2UcapxkHG6co5x0XOMcupxinPrb4hz7W2Hc+5rh3PvaoZy8GiGcvBohnLwaIZy8GiGcvBo hnLwaP9eGAH/ZxcB/3UTAf+DFgH/jhoB/pgjAvGfLATnpTMH3ag5DNGjRRvHnVAqvpdaOLWSY0St jGxOpod0V6CDfF6af4ZklXyPapB5mm6Ld6ZyiHa2dIV2zHSEd+lyg3fqcIJ37G6Cdu1sgnbvaoF2 8GmBdvBpgXbwaYF28GmBdvBpgXbwaf9eGAH/aRUB/3gSAf+GFAH/kRgB+pwfAe2kJwLiqiwE1qw0 C8unQxrBok4puJxYNq+XYUOnkWlNoI1xVpmIeV6ThYJkjYGMaoh/l2+DfaRyf3yzdH18yHV8fehz fHzqcXx77G99eu1tfXnua3158Gl9efBpfXnwaX158Gl9efBpfXnwaf9fGAH/axMB/3sRAf+JEwD/ lRUA9aAaAeipIAHdsCQB0LAyCsasQRi8pkwns6FWNaqcX0Gil2dMmpJvVZOOd12Mi4BkhoiKaYGF lW58g6Fyd4KwdHWCxXV0g+dzdYHqcXZ/6293fu1teH3ua3h88Gl4fPBpeHzwaXh88Gl4fPBpeHzw af9gFwH/bhIB/34QAP+MEQD/mREA8aQTAOOuFgDWthwBy7QwCMGwPxe3q0slraZUM6ShXUCcnWVK lJhsU4yVdFuGkX1if46HaHmMkm10ip5xcIitdG2IwXRtieRzb4fqcXCE7G9yg+1tc4Hua3SA8Gl0 gPBpdIDwaXSA8Gl0gPBpdIDwaf9hFwH/cRAB/4IOAP+QDgD1nQ0A46kMANm1DADPuRoAxbguB7u0 PRWxsEkjp6tSMZ6nWz6Wo2NIjp9qUYabcll/mHpgeJWEZnKTj2xtkZxvaZCqcmaQvnNlkeFyaI7r cGqK7G5siO1sbYbva26E8GluhPBpboTwaW6E8GluhPBpboTwaf9jFQH/dQ4B/4YNAPiUCwDcoggA 1K0JAM+4CgDJvRcAv7wrBrW5OxOrtkchobFQL5itWTuPqmFGh6ZoT3+jcFd4oHhecp6BZGubjGlm mpltYpmob1+ZvHBemd9vYJbsbmOR7W1mju5rZ4vvammJ8GhpifBoaYnwaGmJ8GhpifBoaYnwaP9n EgH/eQwA/4oKAN+aBADTpgcAzLEIAMe7CADBwhMAuMIoBK6/OBClvEQem7hOLJG1VziIsV5CgK5m S3irbVNxqXZaa6d/YGWlimRgo5doW6Oma1mjumxYo9xrWaDua1ya72pflvBpYZLxaGOP8WZjj/Fm Y4/xZmOP8WZjj/FmY4/xZv9rEAH/fgkA8ZAEANaeAwDMqgYAxLQGAL6+BQC4yBAAsMgkA6fGNQ2d w0Ibk8BMKIq9VDOBulw+ebdkRnG1a05rs3RUZLF+Wl+wiV9ar5ZiVq6lZVOuuWZSr9tlUqvyZlWk 8mZYn/JmWpvzZVyX82Rcl/NkXJfzZFyX82Rcl/NkXJfzZP9wDQD/hAQA3ZYAAM6jAwDErgQAu7cE ALTCBQCuzQwAp84gAp7NMQqVyz4Wi8hJI4LGUi56w1o4csFiQGvAakdkvnNNXr18U1m8iFdUu5Vb ULulXU67uV5NvNtdS7n3X06x9mBRqvZgU6X2YFWh9mBVofZgVaH2YFWh9mBVofZgVaH2YP93CADr jAAA05sAAMaoAgC7sQIAsrsCAKrHBgCi0woAndYaAZXWLAaM1DoRg9JGHXrQTydyzlgxas1gOGTL aD9eynJFWMp8SVTJiE1PyZVRTMmlU0rJuVRJytxTR8j3VUjA/FhKuPtZTLL7Wk6t+lpOrfpaTq36 Wk6t+lpOrfpaTq36Wv9/AADckwAAyqIAALysAQCxtQAAqMADAJ/LBgCW2QsAkeAbAYrfLAaC3zkO ed5DF3HdTSBq3FYoY9tfL13aZzVY2XE6U9l7Pk/ZiEJL2ZZFSNmmR0baukhF29tHRNj0SULT/01E yf9PRcL/UEe7/1JHu/9SR7v/Uke7/1JHu/9SR7v/UuaKAADPmwAAv6cAALKwAACnuwAAnMYDAJPR BgCL6g4AhegfAn7oLQZ26DgObuhBFmbnSh1f51IjWedbKVXnZC1Q520xTOd4NUnnhDhG6JE6Q+ig PEDpsj4/6ss+PujvPj3m/z894P9CP9f/REDO/0ZAzv9GQM7/RkDO/0ZAzv9GQM7/RtaTAADEowAA tKwAAKe2AACbwQAAkMwCAIbZBgCA8hIAefIfAnHyKwZq8jYMY/M/El3zRxhX808dUvNXIU30YCRJ 9GkoRvRzKkL1fi0/9YsvPPaZMTr2qTM49740NvjhNTb1+TU18/80N+z/Njnl/zg55f84OeX/ODnl /zg55f84OeX/OMieAAC2qQAAqLIAAJu9AACPyAAAg9QAAHnoBwBz/BIBa/0dAmT9JwRe/jEIWP47 DVP/QxFN/0sVSf9TGEX/WhpB/2MdPv9sHzv/diE3/4IjNP+QJTL/nycw/7AoLv/IKS3/6ios//8q LP//Ki/5/yov+f8qL/n/Ki/5/yov+f8qL/n/KrmmAACqrgAAnLkAAI7FAACB0QAAdd4AAG36CQBl /xEBXv8aAlf/IwNS/ywFTP80B0j/PApD/0QMP/9MDjz/UxA4/1sSNf9jFDL/bBYv/3cXLP+EGSn/ kxon/6IcJf+0HST/zB4j/+0eIv/9HyL//x8i//8fIv//HyL//x8i//8fIv//H6yrAACdtgAAj8IA AIDOAABz3AAAZ+kAAF//BgBY/w4AUf8VAUv/HQJG/yYDQf8tBDz/NQU4/zwGNP9CBzH/SQgu/1AJ K/9XCij/Xwol/2kMI/90DSD/gg4d/5IPG/+iEBr/shEZ/8gSGP/lExf/+hQX//oUF//6FBf/+hQX //oUF//6FJ+zAACQvwAAgMwAAHLaAABk5AAAWPUAAFH/AQBK/wsARP8QAT7/FwE5/x4CNP8lAjD/ LAMs/zIEKP84BCX/PgUi/0QFH/9KBRz/UQYa/1kGF/9jBxT/bgcS/3wIEP+MCA//nAgO/6wJDv+7 CQ3/0wkN/9MJDf/TCQ3/0wkN/9MJDf/TCZG8AACByQAActcAAGTkAABU6wAAS/8AAET/AAA9/wQA N/8MADH/EAEs/xYBKP8cAST/IgIg/ycCHP8sAhn/MQMW/zYDE/88AxH/QgMP/0kEDf9RBAv/WgQJ /2YEBv9zBQP/gQUC/5AFAf+cBQH/qwUB/6sFAf+rBQH/qwUB/6sFAf+rBf9EJAL/Py4D/zw2BP9A OAT/QT0G/0FFCP9BUQ3/QF0T/z9qGP88dxz/OoQg/zeRI/82myX/NaQn/zSsKP80tSr/M74r/zLI K/8y1Sz/MeUt/zHxLf8x+y3/MP8t/zD/Lf8z/y3/Nv8s/jj/Lfk6/y72O/8u9jv/LvY7/y72O/8u 9jv/Lv9FIwL/Py4D/z40A/9CNgT/RDsG/0RDCP9FTw3/RFsT/0FoGf8/dR3/PIIh/zqPJP84mif/ N6Mp/zasKv82tCz/Nb0t/zTILv801i7/M+Yv/zPyL/8y/DD/Mv8w/zP/L/82/y//Of8v+Tv/MPQ9 /zHxPf8x8T3/MfE9/zHxPf8x8T3/Mf9GIwL/QC0D/0EyA/9GMwT/SDgG/0hACP9JTA7/SFgU/0Vl Gv9Cch//QH8j/z2MJv87mCn/OqEr/zmqLf84sy7/N70v/zbHMP821TH/NuYy/zXxMv81+zL/Nf8y /zb/Mv86/zH6Pf8z8z7/NO1A/zTqQf806kH/NOpB/zTqQf806kH/NP9HIgL/QSwD/0UvA/9JMAT/ TDUG/009CP9OSA7/TVQV/0thG/9IbiD/RXsl/0KIKP8/lCv/Pp4u/z2nL/88rzH/PLgy/zvDM/86 zzT/OuE1/zruNf86+DX/Ov81/zr/Nfs+/zXyQf8360L/OOVE/zjhRf844UX/OOFF/zjhRf844UX/ OP9IIgL/QywD/0gsA/9OLQT/UTEF/1M5CP9VRQ7/U1EV/1FdHP9OaiH/S3cm/0iDK/9Fjy7/RJkw /0KiM/9BqzT/QbQ2/0C9N/8/yTj/P9s4/z/qOf8/9Tn/P/85+0D/OPFD/zroRf884Uf/PNpI/z3V Sf891Un/PdVJ/z3VSf891Un/Pf9JIQL/RCoD/00oA/9TKQT/Vy0F/1k2CP9cQg7/W04V/1hZHP9V ZSL/UnIo/09+Lf9MijD/SpQz/0ieNv9Hpjj/Rq85/0W4O/9FxDz/RNI8/ETlPfhE8j31Rf488UX/ PuZI/0DcSv9B0kv/QcxN/0HJTf9ByU3/QclN/0HJTf9ByU3/Qf9KIAL/SCcC/1ElA/9YJQP/XSoE /2AzB/9jPw7/YkoV/2BVHP9cYSP/WW0p/1V5Lv9ShDP/UI82/U6ZOftMojv6S6o9+Eq0P/dKvkD1 ScxA8UnhQe1K8EHqSvxC5Er/RNhM/0XMT/9GxlD/RsBR/0a+Uf9GvlH/Rr5R/0a+Uf9GvlH/Rv9M IAL/TCQC/1UhAv9dIQP/YycE/2cxBv9qPAz/akcU/2dSG/9jXCP/X2gq+1x0MPdZfzX1Voo58lSU PPBSnT/uUaZB7FCvQ+pPukToTsdE5k/dReFP7kXdTvtI1E//SchR/0rAU/9KulT/SrZV/0q0Vv9K tFb/SrRW/0q0Vv9KtFb/Sv9NHwL/UCEC/1oeAv9iHgL/aSUD/20tBf9xOQv/cUQS/29OGvtrWCL1 ZmMp8WNvMO1gejbpXIU75lqPP+RYmELhVqJE31WrRtxTtkjaUsNK1lLYStFT7EvMU/pNxVT/TrxW /0+1V/9PsFj/TqxZ/02qWv9Nqlr/Tapa/02qWv9Nqlr/Tf9OHgL/Ux4C/14bAv9nGwL/biID/3Mq BP93NQn/eEAQ+XdKGPJzVCDsb14o52tqMOJndTbeY4A82V+KQdRdk0bRW51JzlmmTMtYsE7IV7xQ xlbNUcNX5lG+V/dSuFj/U7Ba/1OrXP9Sp13/UqNd/1GiXf9Qol3/UKJd/1CiXf9Qol3/UP9PHgL/ VxsC/2IXAf9sGQL/dCAC/3knA/9+Mgf5gDwN8X9GFep7UB3kd1sm3XNmLtVtcDfQaXo+y2WERMdi jknEYJdNwF6gUL1dqlO7W7ZVuFvFVrVb31ayXPNXrF39V6Ze/VahYP5VnmD/VJxh/1OaYf9TmmH/ U5ph/1OaYf9TmmH/U/9QHQL/WhkB/2UVAf9wFwH/eB0B/38kAv2ELgXzhjgK6oZCEeOESxnbf1cj 0XliL8t0bDjFb3ZAwGx/RrxoiEu4ZpFQtWObU7FhpVauYLBZq1+/Wqlf1FumYO9bomH6Wp1j+1mZ ZPxYlmT9V5Vl/lWUZf5VlGX+VZRl/lWUZf5VlGX+Vf9QHQL/XRcB/2kSAf90FQH/fRoB/4QhAfeJ KgPtjTQH5I09DdyLSBbRhVQjyX9eLsJ6aDi8dXFAt3F6R7JuhE2ua41SqmiWVqdmoFmjZatcoGS5 Xp5kzV6bZOpemGb4XZRn+VySaPtakGj8WY5o/VeOaP1Wjmj9Vo5o/VaOaP1Wjmj9Vv9SHAH/XxQB /2wRAf94EwH/gRcB/4gdAfKPJQLnky8E3pU4CdOQRRXKi1EiwoVbLruAZTi0e25Br3d3SKp0f06l cIhToW6SV51rnFuZaqdelmm1YJRoyGGSaeZgj2r3X41r+F2La/lciWz7Wohs/FiIa/xYiGv8WIhr /FiIa/xYiGv8WP9UGgH/YhMB/28QAf97EgD/hRQA+o0ZAO2THwHimSgC2JkzCMyVQhTEkE4hvItZ LbSFYjeugWtAqHxzSKJ5fE6ddoVUmXOOWJVxmFyRb6RgjW6xYottw2OJbuJih2/2YYZv91+Fb/ld hG/6W4Nv+1mDb/xYg2/8WINv/FiDb/xYg2/8WP9WGAH/ZBEB/3IOAP9+EAD/iBEA9ZEUAOiYGQDd niAB0Z4xB8eaQBO+lUwgtpBWLK6LYDenhmhAoYJwSJx+eU6We4JUkniLWY12lV2JdKBhhXOuY4Jy v2SAc95kgHT1Yn909mB/c/hefnP5XH5y+lp+cvtZfnL7WX5y+1l+cvtZfnL7Wf9YFwH/ZxAB/3UO AP+BDgD/jA4A8ZUQAOOdEQDWoxsAy6EvBsKePhK5mUoesJRUK6mQXTaii2Y/m4duR5WEdk6QgH9U i36IWYZ7kl2BeZ5hfXirZHp4vGV5eNlleHn0Ynl49mB5d/heeXb5XHl1+lp5dftaeXX7Wnl1+1p5 dftaeXX7Wv9aFQH/aQ4A/3gMAP+EDADvkAsA3ZoKANmiCwDQphgAxqUsBb2iPBC0nkgdq5lSKaOV WzSckWM+lY1rRo+Jc02JhnxThISFWH+BkF16f5thdn6oZHN9uWVxftNlcX7yY3J99mBze/dedHr5 XHR5+lt1eftadXn7WnV5+1p1eftadXn7Wv9dEwH/bA0A/3sLAPaICQDckwYA1Z0JANGlCgDKqhUA wakqBLemOg+uokYbpp5QKJ6aWTOWlmE8j5NpRImPcUyDjXlSfYqDV3iIjVxzhplgb4SmY2yEt2Rq hM9kaoTwYmyC9mBtgPdeb3/5XG99+ltwfPtacHz7WnB8+1pwfPtacHz7Wv9fEQH/bwoA/34IAOOM AwDWlwUAz6AHAMqoCADErhMAu60nA7KrNw2pp0QZoKROJpigVzGRnF86iplnQ4OWb0p9k3dQd5GA VnKPilptjZZeaIujYWWLtGNji8xjY4vuYWWJ919nhvheaYT5XGqC+lprgftaa4H7WmuB+1prgfta a4H7Wv9iEAD/cgcA+IIDANuPAgDPmgUAyaMGAMOsBgC9shAAtbIkAqywNQujrUIXm6pMI5KmVS6K o104g6BlQH2dbEd2m3RNcJl9U2uWiFhmlZRcYpShX1+TsmBdk8lgXZPtX16Q+F5hjPlcY4r6W2SH +1plhvtZZYb7WWWG+1llhvtZZYb7Wf9mDQD/dwMA44cAANOTAQDKngQAwqcEALuvBAC1tg0Arrch AqW2Mgmdsz8VlLBKIIytUyuEqls0fahjPHalakNwo3JKaqF7T2WghlRgnpFYW52fW1idsF1Wncdd Vp3rXFea+ltalfpaXJH7WV6O/FhfjfxXX438V1+N/FdfjfxXX438V/9qCgD/fAAA3IwAAM2YAADD owMAuqoCALOzAQCsvAoApr0dAZ68LwaWujwRjbhHHIW1UCd9s1kwdrFgOG+vaD9prXBFY6t5Sl6q hE9aqZBSVaieVVKnr1dRqMZXUKfqV1Cl/FdTn/1XVZr9VleW/lZYlf5VWJX+VViV/lVYlf5VWJX+ Vf9vBADmggAA0pEAAMadAAC7pgEAsq4AAKq3AQCiwgUAnMQYAJXDKgSNwjkNhcBEGH2+TiF1vFYq brpeMmi5Zjhit24+XbZ4Q1i1gkdUtI9LULSdTk2zrlBLtMVQS7PqUEqx/1FMq/9STqX/UlCh/1JR nv9RUZ7/UVGe/1FRnv9RUZ7/Uf92AADdiQAAypcAAL6iAACzqgAAqbMAAKC8AgCYxgYAkcwSAIvM JQKEyzQJfMlAEnXIShttx1MjZ8VcKmHEZDBcw202V8J2OlPCgT9PwY5CS8GdRUjBrkZHwcVGR8Hq RkS+/0lFuf9KR7P/S0mt/0xKq/9MSqv/TEqr/0xKq/9MSqv/TOl/AADRkAAAwp4AALWnAACqrwAA oLgAAJbBAgCMywcAhNUNAIDVHgF51S4FctQ8DGzTRxRl0lAbX9FZIVrRYidV0GssUdB1ME3PgTRJ z443Rs+dOUTQrjtC0MY7Q9DqOkDN/T4+y/9AQMP/QkG9/0NCuf9EQrn/REK5/0RCuf9EQrn/RN2I AADHmAAAuKMAAKurAACgtAAAlb4AAIvIAwCA0QcAeOENAHThHQFu4SsDaOA3CGHgQg5c4E0UV+BW GVPgXx1P4GkiS+BzJUfgfihE4IsrQuCaLT/hqy8+4sEvPuLlLzzf+jE53v80Odn/NjrQ/zg7zP85 O8z/OTvM/zk7zP85O8z/Oc2SAAC8oAAAragAAKGxAACVuwAAicUAAH7PAgB02gYAbusRAGjrHgFi 6yoDXew1BlfsPwtS7EgPTexRE0rtWhZG7WMZQ+1tHEDteB497oUhOu6TIzjvoyQ28LYmNfHSJjTv 8yY07P8mMuv/KDLn/ysz5P8sM+T/LDPk/ywz5P8sM+T/LMGcAACwpgAAo64AAJa4AACJwwAAfc0A AHHYAABn5gYAYvYRAFz3HQFX9ycCUvcxBE34OgZI+UIJRPlLC0H6VA4++lwQO/tlEjj7bxQ1+3sW MvyJGDD9mBku/aobLP6/HCv/4x0q/PodKvr/HSr3/xwq9/8dKvf/HSr3/x0q9/8dKvf/HbOjAACk qwAAl7YAAInBAAB7ywAAb9YAAGPfAABb9QYAVf8QAFD/GQFL/yMCRv8sA0L/NAQ+/zwFOv9DBjf/ Swc0/1MIMf9bCS7/ZAor/28MKP98DSb/iw4k/5wQIv+uESH/xRIg/+kTH//8Ex7//xMe//8THv// Ex7//xMe//8THv//E6apAACYswAAir8AAHvKAABu1QAAYN8AAFTnAABO/wQASf8OAEP/FAA//x0B Ov8lAjb/LAIy/zMDL/86Ayv/QQQo/0gEJf9PBSL/VwUg/2AGHf9sBxr/eQcY/4oIFv+bCBX/rQkU /8MJE//jCRP/+AkT//8KE///ChP//woT//8KE///CpqxAACLvQAAfMgAAG3UAABf4AAAUeYAAEf1 AABB/wAAPP8JADf/EAAy/xUBLv8dASr/IwEm/ykBIv8vAh//NQIc/zsCGf9CAxb/SQMT/1EDEf9a Aw//ZgQN/3QEC/+FBAr/lgUJ/6gFCP+5BQf/0AUH/+MFB//jBQf/4wUH/+MFB//jBY26AAB9xwAA bdMAAF/gAABQ5wAAQu0AADr/AAA1/wAAL/8CACr/CgAm/w8AIv8UAB7/GgEa/x8BFv8jARP/KAEQ /y0BDv8zAQz/OQIK/0ECB/9JAgP/UwIA/14CAP9sAgD/fAMA/40DAP+dAwD/rAMA/7UDAP+1AwD/ tQMA/7UDAP+1A/85JwL/MzIC/zU0A/84NgP/ODsE/zZDBf8zTgf/MVsJ/y9oDf8tdhH/K4QU/ymR Fv8pmxj/KKQZ/yitGv8otRv/J74c/yfIHP8n1B3/J+Qd/yfvHv8n+R7/J/8e/yf/Hv8n/x3/KP8d /yv/Hv8t/x/8L/8f/C//H/wv/x/8L/8f/C//H/86JwL/NDEC/zgxA/87NAP/OzkE/zpBBf83Swf/ NVgK/zNlDv8xcxL/L4EV/y2OF/8tmBn/LKEb/yyqHP8rsh3/K7se/yvEH/8r0B//KuEg/yrtIP8q 9yD/Kv8g/yv/IP8r/x//LP8f/y//Ifwx/yL3M/8i9zP/Ivcz/yL3M/8i9zP/Iv87JgL/NTAC/zsv Av8+MQP/PzYE/z49Bf88SAf/O1UL/zliD/83bxP/NX0X/zOKGf8ylRv/MZ4d/zCnHv8wrx//MLcg /y/AIf8vyyL/L9wi/y/qI/8v9SP/L/4j/y//Iv8w/yL/MP8j+zP/JfU1/yXwN/8m8Df/JvA3/ybw N/8m8Df/Jv88JgL/OS0C/z8sAv9DLQP/RDIE/0M5Bf9DRQf/QlIL/0BfEP8+axX/O3gY/zmFG/83 kB7/N5og/zajIf81qyL/NbMj/zS8JP80xiX/NNQl/zTmJv808Sb/NPsm/zX/Jf41/yb6Nv8o8zj/ Kew6/ynmPP8q5jz/KuY8/yrmPP8q5jz/Kv89JQL/PSoC/0MoAv9HKQP/SS0E/0o2Bf9KQQf/SU0M /0daEf9FZxb/QnQa/0CAHf8+jCD/PZUi/zyeJP87pib/O64n/zq3KP86wSj/Os0p/zrhKf467in7 Ovkp9zv/KfY6/yvwO/8t6D3/LuE//y7bQf8u20H/LttB/y7bQf8u20H/Lv8+JQL/QSYC/0gkAv9M JQL/TykD/1IzBf9RPgf/UUkM/09WEv9MYhf/Sm8c/0d7IP9FhiP/Q5El/0KaJ/9Boin/Qaoq/UCy K/xAvCz7P8gt+D/bLfRA6y3wQPct7UD/L+s//zHkQf8y20P/M9FE/zPLRv8zy0b/M8tG/zPLRv8z y0b/M/9AJAL/RSMC/0wgAv9SIQL/ViYD/1kvBP9ZOgf/WUYM/1ZREv9UXRj/UWod/k51IfxMgSX5 Soso90mVK/VHnSzzR6Yu8kauL/BFuDDvRcQx7UXTMehG6DHlRvYy4kX/Nd9E/zbTR/83ykj/OMRK /zi/S/83v0v/N79L/ze/S/83v0v/N/9BIwH/SR8B/1EcAf9XHAL/XCMC/2AsA/9gNgb/YEEL/15N Ef1bWBj4WGQd9FVwI/FTfCfuUIYr60+QLulNmTDnTKEy5UyqM+NLtDTiS8A14EvPNdtL5jbVSvQ4 0Ur/Os5K/zzETP88vU3/PLhP/zy0T/87tE//O7RP/zu0T/87tE//O/9CIgH/TBwB/1UYAf9cGQH/ YyAC/2YoA/9oMgX/aD0J+mZIEPRjUxfuYF8d6l1rI+ZadijiV4Et31WLMNxTlDPZUZ021VCmONNP rzrQT7s7zk7JPMtP4T3HT/I+w0//QMBP/0G3Uf9BsVL/QK1T/0CqVP8/qlT/P6pU/z+qVP8/qlT/ P/9GHwH/UBkB/1kVAf9iFwH/aB0B/2wkAv9vLgP5bzgH8W5EDutrThXlaFsc32RnI9pgcSrUXXsv 0FuFNMxYjjjJV5c7x1WgPcRUqT/CU7RBv1PCQr1T1kO5U+1EtlP9RbNU/0WsVv9Ep1f/RKRY/0Oh WP9CoVj/QqFY/0KhWP9CoVj/Qv9IHQH/UxYB/10SAf9mFAH/bRkB/3IhAft1KQLydjMF6XY+C+Jz ShLbb1ca0mtiI81nbCvIZHYxxGF/N8BeiTu9XJI+uluaQbdZpES1WK5Gsle7R7BXzUitWOhIqlj6 SadZ/0ihWv9InVv/R5tc/0aZXP9FmVz/RZlc/0WZXP9FmVz/Rf9LGgH/VxMB/2EQAP9rEgD/chYA /3gcAfV7JAHrfS0D4n45B9l7RhDQdlMayXFeJMNtaCy+anEzumd7OLZkgz2yYoxBr2CVRaxen0ep XalKply2S6Rcx0yiXOJNn133TJxe/0yYX/9KlWD/SZNg/0iRYP9HkWD/R5Fg/0eRYP9HkWD/R/9O GAH/WhEB/2QOAP9vEAD/dhMA/H0XAO+BHgHkhCcC24Q0BdCBQw/IfE8ZwXhaI7tzZCy1cG0zsWx2 Oq1qfz+pZ4hDpWWRR6Jjm0qfYqVNnGGxT5lgwVCXYNxQlWHzT5Ni/06QY/9MjmT/S4xk/0qLZP9I i2T/SItk/0iLZP9Ii2T/SP9QFgH/XBAA/2gNAP9yDgD/ehAA9oESAOmGFwDeiiAB0oowBMmGQA7B gk0Zun1XI7R5YSyudWo0qXJyOqRve0CgbIREnWqNSJlol0yVZ6FPkmatUZBlvVKOZdRTjGbwUYtn /1CIZ/9Oh2j/TIZo/0uFZ/9JhWf/SYVn/0mFZ/9JhWf/Sf9SFAH/Xw4A/2sLAP91DAD5fg0A8IUO AOOLEADWjxoAzI4uBMOLPQ27h0oYtINVIq1+Xiune2czondvOp10eECZcoBFlW+JSZFtk02NbJ5Q imqqU4dquVSFas9UhGvuU4Ns/1GCbP9PgWv/TYBr/0yAa/9KgGv/SoBr/0qAa/9KgGv/Sv9UEgH/ YQwA/24KAP14CQDogggA3IkJANiPCwDQkxcAxpMrA76QOwy2jEgXrohSIaeEXCuhgGQznHxtOpd5 dUCSd31FjnWGSopykE6GcZtRgm+nVH9vtlV9b8tWfG/rVHxw/1J7cP9Qe2//Tntv/017bv9Le27/ S3tu/0t7bv9Le27/S/9XEQD/YwoA/3AHAPB8BQDchQUA1IwIANCTCQDKlhQAwZcpA7mUOQuxkEYW qY1QIKKJWiqchWIyloJqOZF/cj+MfHpFh3qDSoN4jU5/dphRe3WkVHh0s1Z2dMhWdXToVXV1/VN1 dP9RdXP/T3Zy/012cf9MdnH/THZx/0x2cf9MdnH/TP9ZEAD/ZgcA/3MEAOF/AQDWiAQAz5AGAMqW CADEmhIAvJsmArSYNwmslUQUpJFOH52OVyiWimAxkIdoOIuEcD+GgnhEgX+BSX19i014e5ZRdHqi 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 ABj/KwEV/zIBEv84ARD/QAEO/0gBDP9SAQn/XQIG/2sCBP99AgL/kAIB/6MCAP+2AgD/zQMA/+wD AP/sAwD/7AMA/+wDAP/sA4i5AAB4xAAAadAAAFvdAABL4wAAPukAADLuAAAr/wAAJv8AACH/AAAd /wgAGv8NABb/EQAT/xYAEP8aAA7/HwAL/yQACf8qAAb/MAAC/zcBAP9AAQD/SgEA/1YBAP9kAQD/ dQEA/4gBAP+aAQD/qgEA/7sBAP+7AQD/uwEA/7sBAP+7Af8vKwH/KzIC/y8xAv8wNAL/LzkD/ytB A/8nTAT/I1gF/yFmBv8gdAf/HoIJ/x6OC/8emAz/HqEN/x6pDv8esA//HbgP/x3BEP8dyxD/HdsR /x3oEf8d8hH/HfwR/x7/Ef8e/xD/Hv8Q/x//Ef8f/xL/If8T/yL/E/8i/xP/Iv8T/yL/E/8vKwH/ LjAC/zIvAv8zMQL/MjYD/y8+A/8rSQX/KVYG/ydjB/8lcQj/JH4L/yOKDP8jlQ7/Ip4P/yKmEP8i rRH/IrUR/yK9Ev8ixxL/ItQT/yLlE/8i8BP/IvoT/yL/E/8j/xL/I/8S/yP/FP8k/xX+Jv8W/Cf/ Fvwn/xb8J/8W/Cf/Fv8wKgH/MS0C/zUrAv83LQL/NjID/zQ6A/8yRQX/L1IG/y1gB/8sbQr/KnoM /ymGDv8okRD/KJoR/yiiEv8nqhP/J7EU/ye5FP8nwxX/J88V/yfhFf8n7RX/J/gV/yj/Ff8o/xX/ KP8W/yf/F/wp/xj2K/8Z9Cz/GfQs/xn0LP8Z9Cz/Gf8xKQH/NCkB/zkoAv87KgL/PC4C/zo2A/85 QgX/N08G/zVcCP8zaQv/MXYO/zCCEP8vjRL/LpYU/y6eFf8tphb/La0W/y21F/8tvhj/LcoY/y3c GP8t6hj/LfUY/S7/GPou/xj5Lf8a+S3/HPMv/xztMf8d6jL/Heoy/x3qMv8d6jL/Hf8zKQH/OCYB /z0kAf9AJQL/QSkC/0IzA/9BPgX/P0oG/z1XCf87ZAz/OXAP/zd9Ev82iBT/NZEW/zWaF/80ohn/ NKkZ/zOxGv8zuhv/M8Ub/TPTG/oz5hv3NPMb8zX+G/E0/x3wM/8f7jP/IOc2/yHhN/8h3jj/Id44 /yHeOP8h3jj/If81JwH/PSIB/0IgAf9GIAH/SCUC/0ovA/9JOgT/R0YG/0VSCf9DXw3/QWsR/z93 FP89ghf+PIwZ/DyVGvs7nRz5O6Ud+DqtHvY6th71OsAf8zrOH/A64x/rO/Ef6Dr9IeY6/yPkOv8l 4Tr/Jdg8/ybQPf8mzT7/Js0+/ybNPv8mzT7/Jv85JAH/QR4B/0cbAf9LGwH/TyIB/1ErAv9RNgT/ T0EG/0xNCf9LWg78SWYS+EdyFvVFfRnzQ4cb8UKRHe9CmR/tQaEg7EGpIepAsiLoQLwi50DKI+RB 3yPgQe8k3ED8J9hA/ynUP/8qz0D/KsdC/yrCQ/8qwEP/KsBD/yrAQ/8qwEP/Kv88IAH/RRoB/0sX Af9RFwH/Vh8B/1gnAv9YMQP/VzwF/FVICfZSVA7yUGET7k5tF+pMeBvnSoIe5UmMIOJIlSLgR50k 3kelJdxGribaRbkn2EXGKNRF3CnPRu4qy0X7LchF/y7FRf8vwEb/L7pI/y+1Sf8utEn/LrRJ/y60 Sf8utEn/Lv9AHQH/SRYB/1ATAf9WFAD/XBsB/18jAf9gLAL6XzcE811CCO1aTw3nWFwT4lZoGN5T chzaUX0g1k+GJNJOjyfQTZgpzUygK8tLqS3JSrMux0q/L8VK0DDCS+gwvUv4MrpK/zO4S/8zs0z/ M65N/zOqTv8yqU7/MqlO/zKpTv8yqU7/Mv9DGgH/TBMA/1QQAP9cEgD/YRcA/2UeAftmJwHyZjED 6mU9BuNjSgvcYFcS1V1iGdBabR/MV3cjyFWAJ8VUiSvCUpIuwFGaML5QozK7T600uU+5NbdPyDa0 T+I2sU/0N65Q/zisUP84p1H/N6NS/zagU/81n1P/NZ9T/zWfU/81n1P/Nf9GFwH/UBEA/1gNAP9g EAD/ZhMA/2oZAPRsIQHqbSsC4Ww3BNlqRQrQZ1ISymNeGsVgaCDBXnImvVx7KrpahC63WIwxtFeV NLFVnjavVKg4rVSzOqpTwjuoU9o7pVTwPKJV/zyhVf87nVb/OppX/zmXV/84l1f/N5dX/zeXV/83 l1f/N/9JFAD/Uw4A/1wMAP9lDQD/aw8A+m8TAOxyGQDidCMB2HMyA85xQgnHbU8SwWpaGrtnZCG3 ZG0ns2J2LK9ffzCsXoc0qVyQN6dbmTqkWaM8oVmuPp9YvT+dWNFAmlnsP5hZ/j+XWv8+lFv/PJFb /zuPW/86j1v/Oo9b/zqPW/86j1v/Ov9MEgD/Vg0A/2AJAP9oCgD6bwwA83MOAOV3EQDaeRsAz3ku Asd3Pgm/dEsRuXBWGrNtYCGvamkoqmdyLadlejKjY4M2oGGMOZ1glTyaXp8/l12qQZVduEKTXctD kF3oQ49e/EGOX/9Ai1//Popf/z2IX/88iF//O4hf/zuIX/87iF//O/9OEQD/WAoA/2MHAPpsBgDn cwYA3XgIANp7CwDRfhcAyH4rAsB8Owi5eUgRsnZTGaxyXSGnb2Yoo21uLp9qdzObaH83mGaIO5Vl kT6RY5tBjmKnQ4xhtEWJYcdFiGLlRYZi+kOGY/9ChGP/QINj/z6CY/89gmP/PIJj/zyCY/88gmP/ PP9QDwD/WwcA/2YDAOxvAgDcdgMA1HwHANGACQDKghQAwoMoArqBOQezfkYQrHtRGaZ3WiGhdGMo nHJrLphvczOUbXw3kWuEO41qjj+KaJhChmejRIRmsUaBZsNHf2bhR39n+EV+aP9Dfmj/QX1n/z98 Z/8+fGf/PXxn/z18Z/89fGf/Pf9SDgD/XQMA/WkAAOFyAADWegIAzn8FAMqDCADFhhIAvIcmAbWG Ngaug0MPp4BOGKF8WCCbeWAnlndpLZJ0cDOOcnk3inCBPIZuiz+DbZVDf2yhRXxrrkd6a79IeGvd SHhs9kZ4bP9Ed2z/Qndr/0B3av8/d2r/Pndq/z53av8+d2r/Pv9UDAD/XwAA8mwAAN12AADQfQIA yYMEAMSHBgC/ihAAt4wjAbCKNAWpiEEOooVMF5yBVR+Wf14mkXxmLYx5bjKId3Y3hHV/O4B0iD98 cpJDeHGeRnVwrEhzb71JcXDZSXFw9Edxcf9EcnD/QnJv/0Fybv8/cm7/PnJu/z5ybv8+cm7/Pv9W CgD/YgAA5m8AANd5AADMgQEAxYcDAL+LBAC5jg4AspAgAauPMQWkjD8NnYpKFpaHUx6RhFwli4Fk LIZ/azGCfXM2fnt8O3p5hj92d5BCcnacRW91qUhsdbpJa3XUSWt18kdrdf9FbHX/Q21z/0Ftcv8/ bXL/P21y/z9tcv8/bXL/P/9ZBwD/ZQAA4nIAANF8AADHhAAAwIoCALmPAgCzkgwArJQdAKaTLwSe kTwLmI9IFJGMURyLiVokhodiKoGFaTB8gnE1eIF6OnR/gz5wfY5CbHyaRWl7p0dmerhIZHvQSGR7 8Edle/9EZnr/Q2d4/0Fodv8/aHb/P2h2/z9odv8/aHb/P/9bBAD3aQAA3XYAAM2AAADDiAAAu44A ALSTAQCtlwkAp5gaAKCYLAOZljoKkpRFEoySTxqGj1cigI1fKHuLZy52iW8zcod3OG2FgTxphItA ZoKXQ2KBpUZggbZHXoHNR16B70Zfgf9EYH//QmF9/0Fie/8/Y3r/P2N6/z9jev8/Y3r/P/9eAADp bQAA1nkAAMiEAAC+jAAAtpMAAK6XAACmmwQAoJ0XAJqdKQKTnDcIjJpDEIaYTRiAllUfepRdJnWS ZSxwkGwxbI51NmeNfjpji4k+X4qVQVyJo0RaibRFWInLRViI7URYiP9DWYb/QVuD/0Bdgf8+XYD/ Pl2A/z5dgP8+XYD/Pv9iAADkcQAAz34AAMOIAAC5kQAAsJcAAKebAACeoQAAmKMTAJOjJQGNojQG hqFADYCfShV5nVMcdJtaI2+ZYihqmGouZpZyMmGVfDddlIY6WZKTPlaSoUBTkbJBUpLJQlKR60FS kP9AUo//P1WL/z5WiP89V4f/PVeH/z1Xh/89V4f/PflnAADddgAAyYMAAL2NAACzlQAAqZsAAKCg AACWpwAAj6kPAIuqIQGFqTAEf6g8CninRxJzpVAYbaNYHmiiYCRkoWcpX6BwLlueeTJXnYQ2U5yR OVCcnztOm7A9TJzHPUyb6jxMmf88TJj/PE2V/zxPkf87UI//O1CP/ztQj/87UI//O+ttAADTfAAA w4kAALeTAACsmgAAop8AAJmlAACOqwAAhbALAIGxGwB8sSsCd7A4B3GvQw1rrk0UZq1VGWGsXR5d q2UjWapuJ1WpdytRqIIvTaePMkqnnjVIp682R6fGNkam6TZFpP43RaP/N0ag/zdInP83SZr/N0ma /zdJmv83SZr/N+J0AADKgwAAvI8AALCYAAClngAAm6QAAJCrAACFsQAAergEAHa5FAByuSUBbbkz BGi4PwhjuEkOXrdSE1q2WhhWtmIcUrVrIE60dSRLtIAnSLOOKkWznSxCs64tQbPFLkGz6S1AsP4v P6//MT6t/zJAqP8yQab/MkGm/zJBpv8yQab/MtV8AADCigAAtZYAAKidAACdowAAkqoAAIexAAB8 twAAcL4DAGjCDgBmwx0AY8MtAV7DOQRaw0QIVsJODFLCVxBPwV8US8FpF0jBcxpFwH4dQsCMID/A myI9wK0jPMHEIzzA6SM6vv4mOLz/KDe7/yk4uP8qOLb/Kzi2/ys4tv8rOLb/K8mFAAC5kwAArJwA AKCiAACUqgAAiLEAAHy4AABxvgAAZsUDAFvLCABXzRMAVs4jAFPOMgFQzj4DTc9IBUnPUghGz1sL Q89lDkDPbxA+z3sTO8+JFTnPmRc3z6sYNtDDGDbP6Bg0zfsbMsv/HTHK/x8wyf8hL8j/IS/I/yEv yP8hL8j/Ib6PAACvmgAAoqEAAJapAACKsAAAfbgAAHG/AABmxgAAW8wCAFDSBwBH2gwARtwYAEXc JwBE3TUBQd1AAj/eSwM93lUEOt9fBjjfaQc133YJM+CECzHglAwv4aYNLuG8Di3i4A4t3vgPK93/ Eirc/xQp2v8WKNr/Fija/xYo2v8WKNr/FrOYAACloAAAmacAAIuwAAB+uAAAccAAAGXIAABZzgAA TtMAAETbBAA/6Q0APekXADvqIwA56i4ANus4ATTrQgEx7EsCL+1VAy3tXwMq7msEKO54BSbviAYl 75oHI/CuByLxyAci8O0HIez/ByHr/wgg6/8KH+r/Cx/q/wsf6v8LH+r/C6ifAACbpgAAja8AAH+4 AABxwQAAZMoAAFjQAABM1gAAQd0AADjkAAA19gwAM/cUADD3HgAu+CcAK/kwACj5OAEm+kABI/tJ ASH7UgEe/F0CHP1pAhr9eQMY/osDF/+eAxX/swQU/9MEFP70BBP8/wMT+v8DE/n/AxP5/wMT+f8D E/n/A52lAACPrgAAgLgAAHLCAABkywAAVtMAAEnaAAA+3wAANOQAAC70AAAr/woAKP8QACX/FwAi /x8AH/8mABz/LQAZ/zQAF/88ABT/RAES/04BEP9ZAQ7/ZwEM/3cBC/+KAgr/nwIJ/7UCCP/VAgf/ 9AIH//8CB///Agf//wIH//8CB///ApGtAACCuAAAc8IAAGTMAABW1QAASN0AADviAAAw5wAAJ+4A ACP/AAAg/wQAHP8MABn/EQAW/xYAE/8bABH/IQAO/ycADf8uAAr/NgAH/z4ABP9IAAD/VAAA/2IB AP9zAQD/hwEA/50BAP+yAQD/ygEA/+oBAP/zAQD/8wEA//MBAP/zAYS3AAB0wQAAZcwAAFbYAABH 3wAAOeUAAC3qAAAj7gAAHP0AABj/AAAV/wAAEf8EAA//CwAN/w4ACf8RAAb/FQAD/xoAAP8gAAD/ JgAA/y4AAP83AAD/QQAA/00AAP9cAAD/bQAA/4IAAP+WAAD/qAAA/7oAAP/DAAD/wwAA/8MAAP/D AP8kLwH/JS8B/ygvAf8nMQH/JDYC/yA+Av8aSQP/F1YD/xVkA/8TcgT/En8E/xKKBP8SlAT/Ep0F /xKkBf8SrAb/ErMG/xK6Bv8Swwb/E84H/xPfB/8T6wf/E/YH/xP/B/8T/wb/E/8G/xT/B/8U/wj/ E/8I/xX/Cf8V/wn/Ff8J/xX/Cf8lLgH/KS0B/yssAf8rLgH/KTMC/yQ7Av8fRgP/HVMD/xthBP8Z bgT/F3sE/xeHBf8XkQX/F5oG/xehBv8XqQf/F7AH/xe3CP8XwAj/GMoI/xjbCP8Y6Aj/GPQI/xj9 CP8Z/wj/Gf8I/xn/Cf8Z/wr/GP8L/xr/C/8a/wv/Gv8L/xr/C/8mLQH/LCkB/y4oAf8vKgH/LS8C /yk3Av8nQwP/JFAD/yJdBP8gagX/HncF/x6DBv8ejQf/HpYH/x6eCP8epQn/HqwJ/x6zCf8evAr/ HsYK/x7TCv8e5Qr/HvEK/x/8Cv4f/wr9H/8L/B//DPwe/w38H/8O9yH/Dvch/w73If8O9yH/Dv8q KgH/LyYB/zIkAf8zJQH/MioB/zE0Av8vPwP/LUwD/ypZBP8oZgX/JnIG/yV+B/8liQj/JZIJ/yWa Cv8loQv/JagL/ySwDP8kuAz/JcEM/yXODf8l4Q38Je8N+Sb6DPYm/w31Jv8P9CX/EPQl/xHyJv8S 7Sf/Eu0n/xLtJ/8S7Sf/Ev8uJgH/NCIB/zcgAf85IQH/OCUB/zkvAv84OwL/NUcD/zNUBf8xYQb/ L20H/y55Cf8thAr/LY0M/yyWDf8snQ3/LKUO/SysD/wstA/7LL0P+SzJEPYs3RDzLewP7y34D+0t /xLrLP8U6iz/Feks/xblLf8W4C7/FuAu/xbgLv8W4C7/Fv8yIwH/OB0B/zwbAf8+GwH/QCIB/0Er Af9ANgL/PkID/zxPBf85XAb/OGgI/TZzC/s1fgz4NYgO9zSRD/U0mRDzNKAR8jOoEvAzsBLvM7kT 7jPFE+s01xPnNOoS4zT3FOE0/xfeM/8Z3DP/Gtsz/xrUNP8azjX/Gs41/xrONf8azjX/Gv82HwH/ PBkB/0EWAP9EFgD/Rx4B/0knAf9IMgL/Rj0D/0RJBfpCVgf2QGIJ8j9uDO89eQ/tPIMQ6jyMEug7 lBPnO5wU5TukFeM6rRXiOrYW4DvCFt870hbaO+gX1Dr2GtA6/xzNOv8eyzr/Hso6/x/EO/8fwDz/ HsA8/x7APP8ewDz/Hv85GwH/QBUA/0URAP9KEwD/ThkA/1AiAf9QLAH9TjcC9ktDBPBJUAfrSF0K 50ZpDeNFdBDgRH4T3UOHFdtCkBfYQZgY1UCgGdNAqRvRQLIcz0C9Hc1AzB3KQeQexkD0IMJA/yK/ QP8jvUD/I7tA/yO2Qf8js0L/IrNC/yKzQv8is0L/Iv89FwD/RBEA/0oOAP9QEAD/VBUA/1YdAP1W JgHzVTEB61M9A+VSSwbfUFgK2k5jDtRMbhPQSngWzUmBGctIihvIR5IdxkeaH8RGoyHCRqwiwEW3 I75FxSS8RdwkuEbwJbVG/yeyRv8nsEb/J65G/yeqR/8mp0j/JqdI/yanSP8mp0j/Jv9AFAD/SA4A /04LAP9VDgD/WREA/1wWAPRdHwDqXCoB4ls3AtpaRgXSV1MLzFVeEMhTaBXEUXIZwVB7HL5PhB+8 TYwiuU2VJLdMnSa1S6cns0uxKbFKvyqvStEqrEvrK6lL/CymS/8spUz/K6NM/yqfTf8qnU3/KZ1N /ymdTf8pnU3/Kf9DEQD/SwwA/1MIAP9aCwD/Xg0A+WAQAOthFgDhYiEA1mIxAc5hQQXHX04LwlxZ Eb1aZBe5WG0btlZ2H7NVfiKwU4clrlKPKKtRmCqpUKIsp1CsLaVPuS+jT8svoFDmL55Q+TCcUP8v mlH/LphR/y2WUv8slFL/K5RS/yuUUv8rlFL/K/9GEAD/TgkA/1YFAP5eBgDvYgcA52UKAORmDgDW ZxkAzWgtAcVnPQW/ZUoLuWNVErRgXxewXmkcrFxxIalaeiSmWYIopFiLK6FWlC2fVZ0vnFWoMZpU tDOYVMUzllThNJNV9jOSVf8ykVb/MY9W/zCNVv8ujFf/LYxX/y2MV/8tjFf/Lf9JDgD/UQUA/1oB AO5iAADfZwMA2GoGANVrCgDNbRUAxW4pAb5tOQS3a0cLsWhSEaxmXBioZGUdpGJtIqFgdSaeXn4p m12GLZhcjy+VWpkyk1mkNJBZsDaOWcA2jFnbN4pZ8zaJWv80iFv/M4db/zGGW/8whVv/L4Vb/y+F W/8vhVv/L/9LDAD/VAAA+14AAOJlAADYawEAz24FAMxwCADGchIAvnMmAbdzNgSxcEQKq25PEaZr WRihaWEdnWdqIpllcieWY3oqk2KDLpBgjDGNX5U0il6gNoderTiFXbw5g13UOYJe8DiBX/82gF// NIBf/zN/X/8xfl//MH5f/zB+X/8wfl//MP9NCQD/VgAA7mEAAN1pAADRbwAAynMDAMV1BgDAdhAA uHgjALF4MwOrdkEJpXNMEJ9wVhebbl8dlmxnIpNqbyePaHcrjGd/L4lliDKFZJI1gmOdN4Biqjl9 Yrk6e2LPO3pi7jl6Y/84emP/Nnlj/zR5Y/8yeWL/MXli/zF5Yv8xeWL/Mf9PBwD/WQAA5mQAANds AADMcwAAxHcCAL95BAC5eg4AsnwgAKx8MQOlej4Jn3hKEJp1UxeVc1wdkXFkIo1vbCeJbXQrhWx8 L4JqhTJ/aY81fGibOHlnpzp2ZrY7dGbMPHNn6ztzZ/84c2j/NnNo/zVzZ/8zc2b/MnNm/zJzZv8y c2b/Mv9RBAD/XAAA4mcAANJwAADHdgAAwHoAALp9AgC0fwwArYEdAKeBLgKgfzwImn1HD5V6URaQ eFoci3ZiIYd0aSaDcnErf3F6L3xvgzJ4bo01dW2YOHJspTtwa7Q8bmvJPG1r6TttbP45bWz/N25s /zVua/80bmr/Mm5q/zJuav8ybmr/Mv9TAAD0XwAA3moAAM1zAADDegAAu34AALWBAACugwkAqIUa AKKFKwKbhDoHlYJFDpB/TxWKfVgbhntfIIF5ZyV9d28qenZ3LnZ0gDJzc4s1b3KWOGxxozppcLI8 aHDGPGdw5ztncfw5aHH/N2hw/zVpb/80aW7/M2lu/zNpbv8zaW7/M/9WAADrYgAA2G4AAMl2AAC/ fQAAt4IAALCFAACohwYAookXAJyKKQGWiTcGkIdDDIuFTROFglUZgIBdH3x/ZSR4fW0pdHt1LXB6 fjFteYg0aXeUN2Z2oTpjdrA7YXbEPGF25Tthdvs5Ynb/N2N1/zVjc/80ZHL/M2Ry/zNkcv8zZHL/ M/9YAADmZgAA0nEAAMV6AAC7gQAAsocAAKuKAACijAIAnI4UAJePJgGRjjQFi4xAC4WKShGAiFMY e4ZbHXaFYyJyg2onboJyK2qAey9nf4YzY36RNmB9njldfK46W3zBO1t84zpbfPo4XHv/N117/zVe ef80X3f/M193/zNfd/8zX3f/M/5cAADhagAAzXUAAMB+AAC2hgAArosAAKWOAACbkQAAlZMRAJCU IgGLkzEDhZI9CX+RSA96j1EWdY1ZG3GMYCBsimglaIlwKWSHeS1hhoMxXYWPNFqEnDZXg6w4VYO/ OVWD4ThVgvk3VoL/NVaB/zRYf/8zWX3/Mll9/zJZff8yWX3/Mu9gAADbbgAAx3oAALuDAACyiwAA qJAAAJ+TAACUlgAAjZkOAImaHgCEmi4Cfpk6B3mXRQ10lk4Tb5VWGGqTXh1mkmUhYpFtJl6Pdipb joEtV42NMFSMmjNRjKo1T4y9NU+M3jVPi/c0T4r/M1CJ/zJRhv8xUoT/MVKE/zFShP8xUoT/Mepl AADScwAAwn8AALaIAACskAAAopQAAJiYAACMnAAAhJ8KAICgGQB8oSkBd6A2BXKfQQptnksPaJ1T FGScWxlgm2MdXJprIViZdCVVmH4pUZeKLE6WmC5LlqgwSpa8MUmW3DBJlPYwSZP/MEmS/zBKkP8v S43/L0uN/y9Ljf8vS43/L+JrAADKeQAAvIUAALGPAACmlAAAm5kAAJGdAACGogAAeqYDAHanEwBz qCQAbqgyA2qoPQZlp0cLYaZQD12lWBRZpGAYVaNoHFKjcR9OonwjS6GIJkihlihFoKYqRKG6K0Oh 2ipDn/UrQp3/K0Kc/yxCm/8sRJf/K0SX/ytEl/8rRJf/K9dyAADDgAAAtowAAKqUAACfmQAAlJ4A AImjAAB+qAAAcK4AAGqwDgBosR0AZbEsAWGxOANdsEMGWbBMClWvVA5Sr10RTq5lFUuubxhIrXkb Ra2GHkKslSA/rKUiPq25Iz2t2CI9q/UjPKn/JTun/yY7pv8mO6T/Jjuk/yY7pP8mO6T/Jsx6AAC7 iAAArpIAAKKZAACXngAAjKQAAICqAAB1rwAAabQAAF65BgBbuhQAWbskAFa7MQFTuz0DULtHBU27 UAdKulkKR7piDUS6bBBBuncTPrmEFTy5kxc5uaMYOLm3GTe61hk3uPQaNbb/HDS0/x4zs/8fM7L/ IDOy/yAzsv8gM7L/IMGDAAC0kQAAppgAAJueAACPpQAAgqsAAHaxAABrtgAAX7wAAFTBAwBMxQ0A S8UZAEnGKABIxjUARcdAAUPHSgNAx1MEPsddBjvHZwg5x3MKN8eADDTHkA0yx6EOMci1DzDI0w8w xvQQLsT/Ey3C/xUswf8WK8D/FyvA/xcrwP8XK8D/F7iNAACqlwAAnp4AAJGlAACErAAAeLIAAGu5 AABgvwAAVMMAAErIAgBAzQcAOtIOADnSGwA40ygAN9M1ADbUQAA01UsBM9VVATHWYAIv1mwDLdd6 BCvYiwUq2J0FKNmxBifazQYn1+8GJtT/CSXS/wsk0f8MI9D/DSPQ/w0j0P8NI9D/Da6WAACgnQAA lKQAAIasAAB5tAAAbLsAAGDCAABUxgAASMsAAD7QAAA11QQALd0KACzhEwAr4h8AKeMqACjkNQAn 5D8AJuVKACTmVQAj5mEBIeduASDnfgIe6JACHemkAhvpvAIa6uICGub8Ahnl/wMZ5P8EGOP/BRjj /wUY4/8FGOP/BaOdAACWpAAAiKwAAHq1AABsvQAAX8QAAFPKAABHzgAAPNMAADLaAAAq3wAAJe4J ACPwEQAh8RkAH/EiAB3yKwAb8zQAGfQ+ABf0SAAV9VIAE/ZfABL2bgER94ABEPiUAQ/5qgEO+cYB DvntAQ32/wEN9P8BDfP/AQ3z/wEN8/8BDfP/AZmjAACLrAAAfLUAAG2+AABfxgAAUs0AAEXSAAA5 2AAAL94AACbiAAAf6gAAHPsGABn/DgAX/xMAFP8aABL/IQAQ/ygADv8wAA3/OQAL/0MACf9OAAb/ XAAE/2wAAv+AAAH/lgAA/60AAP/KAAD/8AAA//8AAP//AAD//wAA//8AAP//AI2rAAB9tQAAbr8A AGDIAABS0AAAQ9cAADfdAAAr4gAAIuYAABnqAAAV+QAAEv8AABD/CAAO/w4ADP8RAAn/FgAG/xwA A/8iAAD/KgAA/zMAAP89AAD/SQAA/1cAAP9pAAD/fgAA/5UAAP+sAAD/xwAA/+gAAP/6AAD/+gAA //oAAP/6AIC1AABwvwAAYckAAFLTAABD2wAANeEAACnmAAAe6gAAFe4AABD4AAAO/wAAC/8AAAj/ AAAE/wYAAP8KAAD/DgAA/xEAAP8VAAD/GwAA/yMAAP8rAAD/NgAA/0MAAP9TAAD/ZQAA/3oAAP+R AAD/pgAA/7gAAP/PAAD/zwAA/88AAP/PAP8cLwH/ICwB/yEsAf8eLgH/GjMB/xQ8Af8PRgH/DVQC /wthAv8JbwL/CXsC/wmGAv8JkAL/CZkC/wmgAv8JpwL/Ca0C/wm0Av8JvAH/CcUB/wnRAv8J4wL/ Ce8C/wn5Af8K/wH/Cv8B/wr/Av8K/wL/Cv8C/wv/A/8L/wP/C/8D/wv/A/8fLQH/IykB/yQpAf8i KwH/HjAB/xg4Af8UQwH/EVAC/xBeAv8OawL/DncC/w6DAv8OjQL/DpUC/w6dAv8OpAL/DqoC/w6x Av8OuQL/DsEC/w7NAv8O3wL/DuwC/w74Av8O/wL/Dv8C/w//A/8P/wP/D/8E/xD/BP8Q/wT/EP8E /xD/BP8jKgH/JiYB/yglAf8nJwH/IysB/x4zAf8bQAH/GU0C/xZaAv8UZwL/E3MC/xN+Av8TiQP/ E5ED/xOZA/8ToAL/E6cD/xOuA/8TtQP/E74D/xPJA/8T2gP/FOkD/hT2A/sU/wP5Ff8D+RX/BPgV /wX4Ff8G+BX/BvgV/wb4Ff8G+BX/Bv8mJgH/KiIB/ywgAP8rIgH/KCYB/ycwAf8kPAH/IkkC/x9V Av8dYgL/G24D/xt6A/8ahAP/Go0D/xqVA/8anAT/GqME/xuqBP8bsgT/G7oE/xvFBPwb0wT5G+cE 9Rz0BPIc/wXxHP8G8Bz/B+8d/wjvHf8J7xz/Ce4c/wnuHP8J7hz/Cf8qIgH/Lh0A/zAbAP8wHAD/ MCIA/zAsAf8uNwH/K0QC/yhRAv8mXQP/JGkD/yN1BP8jfwT+I4gE/SORBfsjmAX6I6AF+COnBvcj rgb1I7cG9CPBBvIkzwbuJOQG6iXyBugl/gjmJP8K5CX/C+Ml/wzjJP8M4iT/DOEk/w3hJP8N4ST/ Df8uHgD/MxgA/zUWAP81FQD/OB0A/zgnAf83MwH/ND8B/zJLAv8vWAP7LmQE+C1vBPUsegXzLIMG 8SyMBu8slAftLJwI7CyjCOosqwjpLLMI5yy+CeYszAniLeII3i3xCtss/gzWLf8O1Cz/D9Is/xDR LP8Qzyz/EM4t/xDOLf8Qzi3/EP8yGQD/NxQA/zoRAP88EgD/PxkA/0AiAP8+LQH/PDkB+jpFAvQ4 UgPwN14E7DZqBek1dAbmNX4I5DSHCOI0kAngNJgK3jSfCtwzpwvaM7AM2DO7DNUzyQ3SNN8NzjTw D8o0/RLHNP8TxTT/FMM0/xXDM/8VwDT/Fb80/xS/NP8UvzT/FP82FQD/OxAA/z4NAP9DDwD/RhQA /0YcAP9GJgD2RDIB70I/AelATAPkP1kE3z5kBts9bwjYPHkK1DyCDNE7iw3PO5MPzTqaEMs6ohHJ OqsSyDq1E8Y6whPEOtUUwDvrFbw6+xe5Ov8Ytzr/GbY6/xm1Ov8Ysjv/GLE7/xixO/8YsTv/GP85 EgD/Pw0A/0MJAP9IDAD/SxAA/0wVAPVMHwDrSioA5Ek3Ad1JRgLVR1ME0EZfCMxFaQvJRHMNxkN8 EMNChBLBQowTv0GVFb1BnRa7QKYXukCwGLhAvBm2QMwas0HmGq9B9xytQf8dq0H/HalB/xypQf8c pkH/G6VB/xulQf8bpUH/G/89EAD/QgkA/0gFAP9NCAD/UAsA+VEPAOtQFQDhTyAA2FAxAM9QQQLJ T04FxE5aCcBMZA29S20Qukp2E7dJfhW1SIcXs0ePGbFHlxuvRqAcrUaqHqtFth+pRcYfp0bgIKRG 9CChRv8hn0f/IJ5H/yCeR/8fm0f/HppH/x6aR/8emkf/Hv9ADQD/RgQA/0wAAPhSAgDoVQQA4VUI AOJVDQDVVRkAzFcsAMVXPAK/VkoGulVVCrZTXw6yUmgSr1BxFaxPeRiqToEaqE2KHaVMkh+jTJwg oUumIp9LsSOdS8Akm0vYJZlL8CWWTP8klUz/JJRM/yOTTP8ikU3/IZFN/yGRTf8hkU3/If9CCgD/ SQAA/1EAAOZXAADdWwEA1VwFANJbCQDLXBQAw14oALxeOAK2XUYGsVtRCq1ZWw+pWGQTplZsF6NV dBqgVH0dnlOFH5tSjiKZUZckl1ChJpVQrSeSULwokVDQKI5Q7CiNUf4ni1H/JotR/yWKUv8kiVL/ I4hS/yOIUv8jiFL/I/9FBwD/SwAA8FUAAN9bAADTYAAAzGEDAMhhBgDDYREAu2QkALVkNAKvY0IF qmFOCqVfVw+hXWAUnlxoGJtbcBuYWXgelViBIZNXiiSQVpMmjlWeKItVqSqJVLcrh1TLK4VV6SuE Vfwqg1b/KINW/yeCVv8lgVb/JIFW/ySBVv8kgVb/JP9HAwD/TwAA51gAANlgAADNZAAAxmYBAMFm BAC7Zg4AtGkgAK5pMQKoaD8Fo2ZKCp9lVA+aY10Ul2FlGJNgbRyQXnUfjl19IotchiWIW5AohVqa KoNZpiyAWbQtf1nHLn1Z5i18Wvose1r/Kntb/yh7W/8ne1r/Jnpa/yV6Wv8lelr/Jf9JAAD7UgAA 41wAANJjAADHaAAAwGsAALprAgC1aw0Arm0dAKhuLgGjbTwFnWtICplqUQ+UaFoUkGZiGI1lahyK Y3Igh2J6I4RhgyaBYIwpfl+XK3teoy15XrEvd13EL3Ve4i91XvktdV//K3Vf/yl1X/8odV7/JnVe /yZ1Xv8mdV7/Jv9LAADwVQAA3l8AAM1nAADDbAAAu28AALVwAACvbwoAqHEaAKNyKwGdcjkEmHBF CZNuTw6PbVgUi2tgGIdpZxyEaG8ggWd3I31mgCZ6ZIopd2OULHVjoS5yYq8vcGLBMG9i3zBuY/cu b2P/LG9j/ypvY/8ob2L/J29i/ydvYv8nb2L/J/9NAADrWAAA2WMAAMlqAAC/cAAAt3MAALB0AACp dAcAo3YXAJ53KAGYdjcEk3VCCI5zTA6JcVUThXBdGIFuZRx+bWwfe2x0I3hqfSZ0aYcpcWiSLG5n ni5sZ6wwame+MWln3DBpZ/UuaWf/LGln/ypqZ/8pamb/KGpm/ydqZv8namb/J/9QAADnWwAA02YA AMVuAAC7cwAAs3cAAKt5AACkeAMAnXoUAJh7JQGTezQDjnpAB4l4Sg2EdlMSgHVbF3xzYht4cmof dXFyInJveyZvboUpbG2QLGlsnC5mbKowZGy8MWNs2TBjbPQvY2z/LWRs/ytka/8pZWr/KGVq/yhl av8oZWr/KP1TAADjXwAAzmkAAMFxAAC3dwAAr3sAAKd9AACefQAAmH4RAJOAIgCOgDECiX8+BoR9 SAx/fFERe3pZFnd5YBpzd2geb3ZwIWx1eCVpdIIoZnOOK2Nymi5gcagvXnG6MF1x1DBdcfIuXnH/ LF5w/ytfcP8pYG//KGBu/yhgbv8oYG7/KPFVAADeYgAAym0AAL11AACzewAAq4AAAKKCAACYgQAA kYMPAI2FHwCIhS4Cg4Q7BX6DRQp6gU4PdYBWFHF/XhhufWYcanxtIGd7diNjeoAnYHmLKl14mCxa d6YuWHe4L1d30S9Xd/EuWHb/LFh2/ypZdf8pWnT/KFp0/ydadP8nWnT/J+1ZAADXZgAAxXEAALl6 AACvgAAApoQAAJ2GAACRhwAAiokMAIaKGwCCiysBfYo4BHiJQgh0iEwNb4dUEmyFWxZohGMaZINr HmGCdCFdgX0kWoCJKFd/lipVfqQsUn62LVF+zi1Rfe8sUn3/K1J8/ylTe/8oVHr/J1R6/ydUev8n VHr/J+heAADQawAAwHYAALR+AACrhQAAoYkAAJeLAACJjQAAg48IAH6QFwB7kScBdpE0A3KQPwZt j0kLaY5RD2WNWRNijGAXXotoG1uKcR5XiXshVIiGJFGHlCdPhqIpTYa0KkuGzCpLhe4pTIT/KUyD /yhMg/8nTYH/Jk6B/yZOgf8mToH/JuFjAADJcAAAu3sAALCEAACmigAAm44AAJGRAACEkwAAepUC AHWXEgBymCIAb5gwAmqXOwRml0UIYpZODF+VVg9blF0TWJNlF1WTbhpRkngdTpGEIEuQkSNJkKEk R5CyJkWQyiZFj+0lRY3/JUWM/yVGi/8kRor/JEaK/yRGiv8kRor/JNhpAADDdgAAtYEAAKuKAACf jwAAlZMAAIqWAAB+mgAAcJ0AAGufDgBonxwAZqAqAWKgNwJfn0EFW59KCFieUgtUnloOUZ1iEk6c axVLnHUYSJuBGkWbjx1Cmp8fQJqwID+ayCA/mesfP5j/ID6W/yE+lf8hP5T/IT+U/yE/lP8hP5T/ Ic1wAAC8fQAAsIgAAKSPAACZlAAAjpgAAIOdAAB3oAAAaaQAAGCnCABdqBQAW6kkAFmpMQFWqTwC U6lFBFCoTgZNqFcJSqhfDEenaA5Ep3MRQaZ/FD6mjRY8pp0XOqavGDmmxxg5peoYOKP/Gjeh/xs3 oP8cN5//HDef/xw3n/8cN5//HMR4AAC1hQAAqY8AAJ2VAACSmgAAhp8AAHqjAABuqAAAYqwAAFWw AABQsg4ATrIbAE2zKABLszUASbM/AUazSQJEs1IEQbNbBj+zZAg8s28KOrN7DDezig41spoPM7Ot EDKzxRAysukQMbD+EjCu/xQvrf8VL6z/Fi+s/xYvrP8WL6z/FruBAACujgAAoZUAAJaaAACJoAAA faYAAHGrAABlrwAAWbQAAE63AABDvAUAQL0RAD+9HgA+visAPL42ADu/QQA5v0sBN79UAjXAXwIz wGoEMcB3BS/AhgYtwJcHK8CqCCrBwggqwOcHKb39Cii8/wwnuv8NJ7n/Die5/w4nuf8OJ7n/DrKM AACllAAAmZoAAI2hAAB/pwAAcq0AAGazAABauAAAT7sAAES/AAA6xAIAMMkIAC7KEQAtyh0ALMsp ACvLNQArzEAAKs1KACjNVgAnzmEAJs5vASTOfwEjz5ECIc+lAiDQvQIgz+QCH836Ax7L/wQeyv8F Hcn/Bh3J/wYdyf8GHcn/BqiUAACcmgAAkKEAAIKoAAB0rwAAZ7YAAFu8AABOwAAAQ8MAADnHAAAv zAAAJ9AEAB/WCgAb2hAAG9saABrbJgAa3DEAGd08ABjdSAAY3lUAF99iABbgcgAV4IUAFOGaABPi sQAS488AEuD0ABLe/wER3f8BEdv/AhHb/wIR2/8CEdv/Ap6aAACSoQAAhKkAAHaxAABouAAAW78A AE7EAABCyAAAN8wAAC3QAAAk1QAAHNsAABXfBQAU6Q4AEuoUABHrHQAQ6yYADuwwAA7tOgAN7kYA C+5TAArvYgAJ8HQACPGJAAfyoAAF8roABPHkAALx/QAC7/8AA+3/AAPt/wAD7f8AA+3/AJWhAACG qQAAeLIAAGm6AABbwgAATcgAAEDMAAA00QAAKtYAACHbAAAZ4AAAEuQAAA/wAQAN+QoAC/oPAAn7 FQAH+xwABPwkAAH8LAAA/DcAAPxCAAD8UAAA/GEAAP11AAD8jAAA/KQAAPzBAAD86wAA/P8AAP3/ AAD9/wAA/f8AAP3/AImpAAB5sgAAarsAAFzEAABOzAAAP9EAADLXAAAn3QAAHeEAABXlAAAO6AAA CvEAAAj9AAAF/wMAAf8JAAD/DgAA/xIAAP8XAAD/HwAA/ycAAP8xAAD/PgAA/00AAP9fAAD/dQAA /40AAP+mAAD/wgAA/+cAAP/8AAD//wAA//8AAP//AHyzAABsvAAAXcYAAE7PAAA/1gAAMd0AACXi AAAa5gAAEeoAAAzuAAAF8gAAAP8AAAD/AAAA/wAAAP8AAAD/BQAA/woAAP8OAAD/EgAA/xgAAP8h AAD/KwAA/zkAAP9KAAD/XQAA/3MAAP+MAAD/pAAA/7kAAP/UAAD/3gAA/94AAP/eAP8YLAD/GSkA /xkoAP8VKwD/EDAA/ws4Af8DRAH/AFEB/wBeAf8AbAH/AHgB/wCCAf8AjAH/AJQB/wCcAP8AogD/ AKgA/wCvAP8AtgD/AL4A/wDIAP8A1wD/AOcA/wDzAP8A/QD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A /wD/AP8A/wD/AP8bKQD/HSYA/xwlAP8ZJwD/EywA/w40AP8LQAH/CE4B/wVbAf8DaAH/AnQB/wJ/ Af8CiAH/ApEB/wKYAf8CnwH/AaUA/wGsAP8BsgD/AboA/wHEAP8B0QD/AOQA/wDxAP8A/AD8Af8A /AL/APwD/wD8BP8B/AX/AfwF/wH8Bf8B/AX/Af8fJgD/ISIA/yAhAP8eIwD/GCcA/xMwAP8RPAH/ DkoB/w1XAf8LYwH/Cm8B/wp6Af8KhAH/Co0B/wqUAf8KmwH/CqIB/wqoAf8KrwH/CrcB/wrAAP8K zAD/CuAA+wrvAPcK+gD1C/8B9Qz/AfQN/wH0Df8C9A3/AvQN/wL0Df8C9A3/Av8iIgD/JB0A/yQc AP8iHQD/HiIA/xwsAP8ZOAD/FkUB/xNSAf8SXgH/EGoB/xB1Af8QfwH/EIgB/xCQAf8QlwH/EJ4B /xClAf0QrAH8ELMB+hC9AfkRyQH1Ed0B8RHtAe4R+QHsEv8C6xP/AuoT/wPpE/8D6RP/A+kT/wPp E/8D6RP/A/8mHQD/KBgA/ygWAP8mFgD/Jh0A/yYoAP8jNAD/IEAA/x1NAf8bWQH/GWUB/hlwAfwY egH5GIMB9xiMAfYYkwH0GJoB8xihAfEZqAHwGbAC7hm6Au0ZxgLqGtkC5hrrAeIb+QLgG/8D3hz/ BN0c/wXcHP8F3Bz/Bdsc/wXbHP8F2xz/Bf8qGQD/LRMA/y0RAP8tEQD/LhkA/y0iAP8sLgD/KToA /yZHAfokVAH2I2AB8iJrAe8idQLtIn4C6yKHAukijwLnIpYC5SKeAuQipQLiIq0C4SO3At8jwwLd I9YC2CTqA9Ik+QXPJf8GzSX/B8sl/wjKJf8IyiT/CMok/wjKJP8IyiT/CP8uFAD/MRAA/zINAP80 DgD/NRQA/zUcAP8zJwD6MTQA8y9BAO4tTgHpLFoB5SxlAuIscALfK3kC3SuCA9oriwPYK5IE1Sua BNMrogTRK6oFzyuzBc0rvwbMLM8GyC3nB8Qt9wnBLf8Kvy3/C70t/wy8Lf8MvCz/DLss/wy7LP8M uyz/DP8xEQD/NQwA/zYHAP86CwD/PBAA/zsVAPg5HwDvNysA5zY5AOE1RwDcNVQB1TVgAtE1agPO NHMEzDR8Bco0hQbINI0HxjOUCMQznAnCM6UJwTOuCr8zuQu9M8gLuzThC7c08w20NP8PsTT/D7A0 /xCvNP8QrjT/D640/w+uNP8PrjT/D/81DgD/OAcA/zwCAP9ABgD/QQsA+kEPAO0/FgDjPCIA2j0x ANI+QQDMPk8CyD5aA8Q9ZAXBPW4Hvzx2CLw8fgq6O4cLuDuPDLc7lw21Op8OszqpD7E6tBCvOsIR rjrZEao77xKnO/8TpTv/FKQ7/xOjO/8Tojv/E6I7/xKiO/8Sojv/Ev84CgD/PAAA/0EAAPVFAADm RgIA4UUHAONCDQDVQxkAzEUsAMZHPAHBR0kCvEZVBLlFXwa1RGgJs0NxC7BDeQ2uQoEPrEKJEKpB kRKoQZoTp0CkFKVArxWjQLwWoUDQFp5B6hecQfwXmkH/F5hB/xeYQf8Wl0H/FZdB/xWXQf8Vl0H/ Ff87BgD/PwAA+UYAAOVLAADcTgAA000EANFKCQDKShQAwk0nALxONwG3TkUCsk1QBa9MWgirS2MK qEpsDaZJdA+kSXwRoUiEE59HjBWdR5UXm0afGJlGqhmXRrgalkbKG5NG5huRR/kbj0f/Go5H/xmO R/8YjUf/GI1H/xeNR/8XjUf/F/8+AgD/QwAA60sAAN1RAADRVAAAylQBAMZSBQDBUREAuVMiALNV MwGuVEECqlRMBaZTVgiiUV8Mn1BnD51PbxGaTncUmE5/FpZNiBiTTJEZkUybG49Lph2NS7Mei0vF HolL4h6HTPcehkz/HYVM/xyFTf8ahUz/GYVM/xmFTP8ZhUz/Gf9AAAD8RwAA5VAAANVWAADKWQAA wloAAL1YAwC4Vw4AsVkeAKxaLwGnWj0CollJBZ5YUwmbV1sMl1ZkEJVVaxKSVHMVj1N7F41ShBqL UY0ciFGXHoZQox+EULAgglDBIYBQ3SF+UfQgfVH/H31R/x19Uf8cfVH/G31R/xp9Uf8afVH/Gv9C AADwSgAA31QAAM5aAADEXgAAvF8AALZeAACxXAsAq14aAKVgKwCgYDoCnF9FBZdeUAmUXFgMkFtg EI1aaBOLWXAWiFh3GIVXgBuDVokdgFaUH35VnyF7Va0ieVS9I3hV1yN3VfIidlb/IHZW/x92Vv8d dlb/HHZW/xt2Vv8bdlb/G/9FAADsTgAA2lgAAMleAAC/YgAAt2QAALFjAACrYQgApGMXAJ9kKACa ZTcClmRDBZFjTQiOYVUMimBdEIdfZROEXmwWgV10GX5cfRx8W4YeeVqRIHdanSJ0Waokclm6JXFZ 0iVwWvAjb1r/Im9a/yBwWv8ecFr/HXBa/xxwWv8ccFr/HP9IAADnUgAA01sAAMViAAC7ZgAAs2gA AKxoAAClZgUAn2cUAJppJQCVaTQCkGhABIxnSgiIZlMMhGVbEIFkYhN+Y2oWe2JyGXhhehx2YIQe c1+OIXBemiNuXqglbF24JWpeziZpXu4kaV7/Impe/yBqXv8fal7/Hmpe/x1qXv8dal7/HflKAADj VQAAz18AAMFlAAC3agAAr2wAAKdsAACfagEAmWsRAJRtIgCQbjEBi209BIdsRweDa1ALf2pYD3xo YBN4Z2cWdmdvGXNmeBxwZYEebWSMIWpjmCNoYqYlZmK2JmRizCZkYuwlZGL/I2Ri/yFlYv8fZWL/ HmVi/x1lYv8dZWL/HfJMAADfWAAAymIAAL1pAACzbgAAq3AAAKJwAACZbgAAk3AQAI9yHwCKci4B hnI7A4JxRQd9cE4Lem5WDnZtXhJzbGUVcGttGG1qdRtqaX8eZ2mKIWVoliNiZ6QlYGe0Jl9nySZe Z+olXmf+I19n/yFfZv8fYGb/HmBm/x5gZv8eYGb/Hu9PAADaXAAAxmUAALptAACwcgAAp3UAAJ10 AACUcwAAjXQNAIl2HACFdysBgXc4A3x2QwZ4dUwJdHRUDXFzWxFucmMUa3FrF2hwcxplb3wdYm6H IF9tlCJdbKIkWmyyJVlsxyVYbOglWWz9I1lr/yFaa/8fW2v/Hltq/x5bav8eW2r/HutTAADTYAAA wmkAALZxAACsdgAAo3kAAJl5AACNdwAAh3kLAIN7GAB/fCgAe3w1And7QAVzekkIb3lRDGx4WQ9o d2ETZXZoFmJ1cBlfdHocXHSFH1pzkSFXcqAjVXKwJFNyxSRTcuckU3H8IlRx/yBUcP8fVXD/HlVv /x1Vb/8dVW//HeVXAADNZAAAvm0AALJ1AACoewAAn34AAJN9AACHfQAAgH8HAHyAFQB4gSQAdYIy AXGBPQRtgEYHaYBPCmZ/Vg1jfl4RYH1mFF18bhdae3caV3qCHVR6jx9ReZ0hT3muIk55wyJNeOUi TXf7IU53/x9Odv8eT3X/HU91/x1Pdf8dT3X/Hd9cAADIaAAAuXIAAK56AAClgAAAmoIAAI6CAACA gwAAeYUCAHSGEQBxiCAAboguAWqIOQJnh0MFY4dMCGCGUwtdhVsOWoRjEVeEaxRUg3UXUYKAGk6B jRxLgZseSYGsH0iAwSBHgOMfR3/6Hkh+/x5Iff8dSXz/HEl8/xxJfP8cSXz/HNZhAADCbgAAtHgA AKqAAACfhQAAlIcAAIiHAAB7iQAAcIwAAGuODQBojxoAZo8pAGKQNQFfjz8DXI9IBVmOUAhWjlgL U41gDlCMaBBNjHITSot9FkiKihhFipkaQ4qqG0KKvxtBiuEbQYj5G0GG/xtBhf8bQoX/GkKE/xpC hP8aQoT/Gs1nAAC8dAAAr34AAKWGAACaigAAjowAAIKNAAB1kAAAZ5QAAGGVCABelxQAXJcjAFqY LwBXmDoBVJhEA1KXTAVPl1QHTJdcCUmWZQxHlm8ORJV6EUGViBM/lJcVPZSoFjuUvRY7lN8WOpL4 FzqQ/xc6j/8XOo7/FzqO/xc6jv8XOo7/F8VuAAC2ewAAqoUAAJ6LAACUjwAAiJIAAHuUAABulwAA YpsAAFeeAABSoA4AUaAbAE+hKABNoTQAS6E+AUmhRwJHoVADRKFYBUKhYQc/oGsJPaB3CzqghQ04 oJQONqCmDzWguxA0oN0PNJ33EDOc/xIzmv8SM5n/EzOZ/xMzmf8TM5n/E713AACvgwAAo4sAAJiR AACNlQAAgZkAAHOcAABnnwAAW6IAAE+mAABHqQgARKoSAEOqHwBBqysAQKs3AD+sQQA9rEoBO6xT AjmsXAM3rGcENaxzBTKsgQYwrJEHLqyjCC2suAksrNkILKr1Ciuo/wsqpv8MKqX/DSql/w0qpf8N KqX/DbWAAACoiwAAnJEAAJGWAACFnAAAeKAAAGulAABfqAAAU6wAAEivAAA9sgAANrULADS1FQAz tiEAMrYsADG3NwAwt0EAL7hLAC64VQAsuGABKrhtASm5ewInuY0CJbmfAyS5tAMjudIDI7f0BCK1 /wUhtP8GIbP/ByGy/wchsv8HIbL/B62KAACgkQAAlZcAAIidAAB7owAAbqgAAGGtAABVsQAASrQA AD+3AAA0uwAAK74DACTCDAAiwhQAIsMfACHDKgAgxDQAH8Q/AB7FSgAdxlYAHMZjABvHcwAax4UA GceZABjIrgAXyMsAF8bxARfE/wEWw/8CFsH/AxbB/wMWwf8DFsH/A6ORAACYmAAAi54AAH2lAABw qwAAYrEAAFa2AABKuQAAPr0AADTAAAAqxAAAIsgAABnMBAAT0AoAEdIRABDSGgAQ0yUAD9MwAA7U PAAO1EgADdVWAA3VZQAM1ngADNaNAAvYpAAK2L4ACdnmAArW/gAL1P8AC9L/AAvS/wEL0v8BC9L/ AZqYAACOnwAAgKYAAHKtAABktAAAV7oAAEm/AAA9wgAAMsYAACjJAAAfzQAAF9EAABHWAAAM2wUA CN4LAAbfEQAF3xoABOAkAALhLgAB4joAAONHAADkVgAA5GcAAOV7AADmkgAA5qoAAOfIAADn8AAA 6P8AAOj/AADo/wAA6P8AAOj/AJGfAACCpwAAdK8AAGW3AABXvgAAScMAADzHAAAwywAAJc8AABzU AAAU2QAADt0AAAnhAAAC5QAAAOkGAADpDQAA6REAAOoYAADrIQAA7SsAAO83AADxRQAA8lYAAPNo AADzfgAA9JcAAPWwAAD20AAA9/MAAPf/AAD3/wAA9/8AAPf/AIWnAAB2sAAAZrgAAFjBAABKyAAA O8wAAC7RAAAj1gAAGdwAABHgAAAM4wAABOcAAADqAAAA9QAAAPQAAAD1BQAA9QsAAPYPAAD2FAAA +B0AAPonAAD8NAAA/0MAAP9VAAD/aQAA/4EAAP+aAAD/sgAA/88AAP/tAAD/+QAA//kAAP/5AHiw AABougAAWcMAAEvLAAA70QAALdgAACHdAAAW4gAADuYAAAjqAAAA7QAAAPAAAAD4AAAA/wAAAP8A AAD/AAAA/wAAAP8GAAD/DAAA/xAAAP8YAAD/IgAA/zAAAP9AAAD/UwAA/2kAAP+BAAD/mQAA/68A AP/DAAD/1QAA/9UAAP/VAP8TKAD/EyUA/xElAP8NJwD/Bi0A/wA1AP8AQQD/AE8A/wBcAP8AaQD/ AHQA/wB+AP8AiAD/AJAA/wCXAP8AnQD/AKQA/wCqAP8AsAD/ALcA/wDAAP8AzAD/AN8A/wDsAP8A +AD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8WJQD/FiIA/xQhAP8QIwD/CigA/wAw AP8APQD/AEsA/wBYAP8AZAD/AHAA/wB6AP8AhAD/AIwA/wCTAP8AmgD/AKAA/wCmAP8ArQD/ALQA /wC8AP4AyAD9ANkA+wDpAPoA9gD5AP8A+AD/APgA/wD4AP8A+AD/APkA/wD5AP8A+QD/AP8aIgD/ Gh4A/xgdAP8THgD/DiIA/wosAP8HOQD/A0YA/wBTAP8AYAD/AGsA/wB2AP8AfwD/AIgA/wCPAP8A lgD/AJ0A/wCjAP4AqQD8ALAA+gC5APcAxAD1ANIA8wDmAPIA9ADxAP8A8AD/AO8A/wDvAP8A7wD/ APAA/wDwAP8A8AD/AP8eHQD/HhkA/xwXAP8XGAD/Ex4A/xEoAP8ONAD/DEEA/wpOAP8IWwD/B2YA /wZxAP8GegD/BoMA/gaLAPwGkgD6BpkA+AafAPYGpgD0Bq0A8ga1APAFwADtBc4A6wXkAOkG8wDm CP8A5Qr/AOQL/wDkC/8B5Av/AeQL/wHkC/8B5Av/Af8hGAD/IRMA/yARAP8bEgD/HBoA/xokAP8W LwD/EzwA/xFJAP8QVQD8DmEA+Q5rAPYOdQD0Dn4A8g6GAPAOjgDuDpUA7Q6bAOsOogDqDqoA6A6z AOYPvQDlD8wA4Q/jAN0Q8wDZEf8B1hL/AdQT/wHTE/8C0hP/AtIT/wLSE/8C0hP/Av8lEwD/JRAA /yQNAP8jDgD/IxQA/yIeAP8fKQD/HDUA+RlDAPQYTwDvF1sA7BdmAOkXcADmF3kA5BeBAOIXiQDg F5EA3xeYAN0XnwDbF6cA2RixANYYuwDUGcoA0BrhAcwb8wHJHP8Cxhz/AsQc/wPDHP8Dwxz/A8Mc /wPDHP8Dwxz/A/8oEAD/KQsA/ygGAP8rCwD/KxAA/ykXAP0mIgD0Iy4A7CE7AOYgSQDiIFUA3iBg ANohagDWIXQA0yF8AdAhhAHPIowBzSKTAcsimwHJIqMByCOsAsYjtgLEI8QCwiTbAr4l7gO7Jf4E uCX/BbYl/wW1Jf8GtSX/BrUl/wW1Jf8FtSX/Bf8sDQD/LQUA/y4BAP8xBQD/MQsA/S8QAPErGADn KSUA3ygzANgoQgDRKk8AzStaAMkrZQHHK24BxCx2AsIsfgLALIYDviyOA70slgO7LJ4EuSynBLgs sQW2LL8FtS3RBbEt6gauLvsHqy7/CKku/wioLv8IqC3/CKgt/wioLf8IqC3/CP8vCAD/MQAA/zUA APY3AADqNgIA5zMIAOQvDwDZLhsAzzEsAMkzPADENEkAwDVVAbw1XwK6NWgCtzVwA7U0eASzNIAF sTSIBrA0kAauNJkHrDSiCKs0rAmpNLkJpzTKCqU15QqhNfgLnzX/DJ01/wydNf8LnDX/C5w1/wuc Nf8LnDX/C/8zAgD/NQAA9joAAOU+AADcQAAA1D0EANI3CQDLOBUAwzomAL09NgC4PkQBtD5QAbE9 WgOuPWMErD1rBak8cwanPHsIpjyDCaQ7iwqiO5QLoDudDJ47qA2dO7QOmzvFDpk74A6WO/QPlDz/ D5I8/w+SPP8OkTz/DZE8/w2RPP8NkTz/Df81AAD/OQAA6kEAAN1GAADQRwAAyUYAAMZBBQDAQBEA uUIhALNEMgCvRUABq0VLAqdFVQOkRF4FoURmB59DbgidQ3YKm0J+C5lChg2XQY8OlUGZD5NBpBGR QbASkEHAEo5B2RKLQfESiUL/EohC/xGIQv8Qh0L/EIdC/w+HQv8Ph0L/D/84AADzPQAA40cAANJM AADITgAAwE0AALtKAgC2Rw4AsEkdAKtLLQCmTDsBokxHAp5LUQSbS1oGmUpiCJZJagqUSXEMkkh5 Do9Igg+NR4sRi0eVEolGoBSHRqwVhUa7FoRG0RaCR+4WgEf/FX9H/xR/R/8Sf0f/EX9H/xF/R/8R f0f/Ef87AADuQwAA3EwAAMxRAADBVAAAuVQAALRRAACuTQsAqE8ZAKNRKQCeUjcBmlJDApdRTgSU UVYGkVBeCY5PZguMTm0NiU51D4dNfhGFTYcTgkyRFYBMnBZ+S6kXfEu4GHtLzRh5TOsYeEz+F3dM /xV3TP8Ud0z/E3dM/xJ3TP8Sd0z/Ev8+AADoRwAA1VAAAMZWAAC8WAAAtFkAAK1WAACnUwcAoVQV AJxWJQCYVzQBlFdAApBXSgSNVlMGilVbCYdUYwuEVGoOglNyEIBSehJ9UoMUe1GOFnhQmRh2UKYZ dFC1GnNQyRpxUOgacFH8GHBR/xdwUf8VcFH/FHFQ/xNxUP8TcVD/E/VAAADkSwAAz1QAAMFaAAC3 XQAAr14AAKdbAAChWAMAm1kSAJZbIgCSXDEBjlw9AopcRwSHW1AGg1pYCYFZYAx+WWcOe1hvEHlX dxN2VoAVdFaLF3JVlhlvVaMabVSyG2xUxhtqVeYbalX7GWpV/xdqVf8WalX/FWtV/xRrVf8Ua1X/ FPJDAADfTwAAy1gAAL1dAACzYQAAq2IAAKJgAACbXAAAlV4QAJBgHwCMYS4AiGE6AoRgRQSBYE4G fl9WCXteXQt4XWUOdlxsEHNcdBNwW30VblqIF2talBlpWaEbZ1mwHGVZwxxkWeMcZFn6GmRZ/xhk Wf8XZVn/FWVZ/xRlWf8UZVn/FO9GAADaUgAAxlsAALphAACwZQAApmYAAJ1jAACVYQAAj2IOAItk HACHZSsAg2U3AX9lQgN8ZEsGeGNTCHVjWwtzYmIOcGFqEG1gchNrYHsVaF+GF2ZekRljXp8bYV2u HGBdwRxfXeEcX134Gl9d/xhfXf8XYF3/FmBd/xVgXf8VYF3/FetKAADUVgAAw14AALZlAACsaQAA omkAAJhnAACPZQAAiWYMAIVoGQCBaSgAfmo1AXppPwN2aUkFc2hRCHBnWQptZ2ANa2ZnEGhlcBJl ZHkVY2SDF2BjjxleYp0bXGKsHFpivxxZYt8cWWL3Glpi/xlaYf8XW2H/Flth/xVbYf8VW2H/FedN AADPWQAAv2IAALNoAACpbQAAnm0AAJNrAACJaQAAg2sJAH9tFQB8biUAeG4yAXVuPQJxbkYEbm1P B2tsVglobF4MZWtlD2NqbRFgaXYUXWmBFltojRhYZ5saVmeqG1VnvRxUZ9wcVGf2GlRm/xhVZv8X VWX/FlZl/xVWZf8VVmX/FeJRAADKXQAAu2YAAK9sAACmcQAAmXAAAI5vAACDbgAAfXAFAHhyEgB1 cyEAcnMvAW9zOgJsc0QEaXJMBmZyVAhjcVsLYHBjDV1waxBbb3QTWG5/FVVuixdTbZkZUW2oGk9t uxtObdkaTmz0GU9r/xhPa/8XUGr/FlBq/xVQav8VUGr/Fd1VAADFYQAAt2oAAKxxAACidQAAlHQA AIl0AAB8cwAAdnUAAHF3EABveB0AbHkrAGl5NwFmeUADY3lJBWB4UQddd1gJW3dgDFh2aA5VdXER UnV8E1B0iBZNdJcXS3OmGElzuRlIc9UZSXLzGElx/xdKcf8WSnD/FUtw/xRLcP8US3D/FNRaAADA ZgAAs28AAKh2AACdeQAAj3gAAIR4AAB3eQAAb3wAAGp9DQBnfhkAZH8mAGKAMgFfgD0CXIBGA1p/ TgVXf1UHVH5dCVJ9ZQxPfW8OTHx5EUp8hhNHe5QVRXukFkR7txZDe9IWQ3ryFkN5/xVDeP8URHf/ FER2/xNEdv8TRHb/E81fAAC7awAArnQAAKR8AACXfgAAin0AAH9+AAByfwAAZoMAAGGECABehhMA XIchAFqHLgBYhzgBVYdCAlOHSgNQh1IFToZaB0uGYglJhWwLRoV3DUOEgw9BhJIRP4SiEj2EtRM8 hM8TPILwEjyB/xI9gP8SPX//Ej1+/xE9fv8RPX7/EcVmAAC1cQAAqnsAAJ+CAACSggAAhYIAAHmD AABthgAAX4oAAFiNAQBUjg8AUo8bAFCPJwBPkDMATZA9AUuQRQJJkE4DRpBWBESPXwVCj2gHP49z CT2OgAs6jo8MOI6gDTeOsw42jswONo3vDjWL/w41if8PNYj/DzaH/w82h/8PNof/D75tAACweQAA pYIAAJmHAACMiAAAf4gAAHKKAABmjQAAWpEAAFCVAABJlwkAR5gTAEWYIABEmSsAQ5k2AEGaQABA mkgBPppRAjyaWgI6mmQDN5pvBTWZfQYzmYwHMZmdCC+ZsAgumcoILpjtCC6W/wotlP8KLZP/Cy2S /wstkv8LLZL/C7Z1AACqgQAAnogAAJONAACGjgAAeI8AAGuSAABflQAAVJkAAEmdAABAoAAAOqIN ADijFwA3oyIANqQtADWkNwA0pEEAM6VLADGlVAEwpV4BLqVqASyleAIqpYgDKKWaAyelrQQmpcYD JqTrBCWi/wUloP8GJJ//BiSe/wcknv8HJJ7/B69+AACjiAAAl44AAI2TAAB+lQAAcJgAAGObAABX nwAATKIAAEKmAAA4qQAAL6wDACquDgAprhgAKK8jACevLQAmsDcAJbBBACSwSwAjsVYAIrFjACGx cQAfsYIAHrKUARyyqQEbssEBG7HnARuv/gIarf8CGqz/Axqr/wMaq/8DGqv/A6iIAACbjwAAkZQA AISaAAB2nwAAaKIAAFulAABPqQAARK0AADmwAAAvswAAJrYAAB65BQAYuw4AF7sWABe8IAAWvCoA Fb01ABS9QAATvksAEr5YABK+ZwARv3gAEL+MABDAogAOwLoADsDhAA+9+wAPvP8AELr/ARC6/wEQ uv8BELr/AZ+PAACUlQAAh5sAAHmhAABrpwAAXqwAAFKxAABFtAAAOrYAAC+5AAAlvAAAHb8AABXD AAAPxgUAC8oNAAnKFAAIyh0AB8onAAfKMgAGyz4ABctLAATMWgADzGoAAsx+AAHMlAAAzKsAAM3I AADM7QAAzP8AAMv/AAHK/wAByv8AAcr/AJeWAACKnAAAfKMAAG6qAABgsAAAUrYAAEW5AAA5vAAA Lr8AACPDAAAbxgAAE8oAAA3NAAAI0QAAAdQJAADUDgAA1RUAANYeAADYJwAA2TEAANs+AADcSwAA 3VsAAN5uAADehAAA35sAAN+0AADe2QAA3/cAAN//AADf/wAA3/8AAN//AI2dAAB/pQAAcKwAAGGz AABTugAARb8AADjCAAAsxgAAIckAABjNAAAQ0QAAC9UAAATaAAAA3gAAAOABAADhCQAA4g4AAOQT AADlGwAA5yQAAOkvAADrPAAA7UsAAO5dAADucQAA74kAAPCiAADwvAAA8OMAAO/5AADw/wAA8P8A APD/AIGlAAByrQAAY7UAAFS9AABGxAAAN8gAACrMAAAf0AAAFdUAAA7aAAAH3gAAAOIAAADmAAAA 6QAAAOoAAADsAAAA7gUAAO8MAADxEAAA8xcAAPUgAAD4KwAA+zkAAP1KAAD+XgAA/3QAAP+NAAD/ pgAA/8AAAP/hAAD/9QAA//UAAP/1AHSuAABltwAAVsAAAEfIAAA4zQAAKtIAAB3YAAAT3QAADOIA AAPmAAAA6QAAAOwAAADwAAAA8wAAAPQAAAD2AAAA+AAAAPoAAAD9BwAA/w0AAP8SAAD/GwAA/ygA AP83AAD/SgAA/14AAP92AAD/jwAA/6YAAP+6AAD/0QAA/9EAAP/RAP8PJAD/DiIA/wshAP8DJAD/ ACkA/wAyAP8APgD/AEwA/wBZAP8AZQD/AHAA/wB6AP8AhAD/AIwA/wCSAP8AmQD/AJ8A/wClAP8A qwD/ALIA/wC6AP8AxQD/ANMA/wDnAP8A9AD/AP8A/gD/AP8A/wD+AP8A/gD/AP4A/wD+AP8A/gD/ AP8RIQD/EB4A/w0dAP8HHwD/ACMA/wAtAP8AOgD/AEgA/wBVAP8AYQD/AGwA/wB2AP8AfwD/AIcA /wCOAP8AlQD/AJsA/wChAP8ApwD+AK4A/QC2APwAwAD7AM0A+QDiAPgA8AD3APwA9gD/APUA/wD1 AP8A9QD/APUA/wD1AP8A9QD/AP8VHQD/ExoA/xAZAP8LGQD/AB0A/wApAP8ANgD/AEMA/wBQAP8A XAD/AGcA/wBxAP8AegD+AIMA/ACKAPoAkQD5AJcA+ACdAPcAowD1AKoA9ACyAPIAuwDxAMgA7wDc AO4A7ADtAPoA6wD/AOoA/wDqAP8A6gD/AOoA/wDqAP8A6gD/AP8YGQD/FhUA/xMTAP8OEwD/CxoA /wckAP8CMAD/AD4A/wBLAP8AVwD/AGIA/ABsAPgAdQD1AH4A8gCFAPEAjADvAJMA7gCZAOwAoADr AKYA6QCuAOcAtwDmAMMA5ADUAOIA6QDhAPcA3wD/AN0A/wDdAP8A3QD/AN0A/wDdAP8A3QD/AP8b EwD/GhAA/xYOAP8SDgD/EhUA/w8fAP8MKwD/CTgA/wZFAPsDUQD3AlwA8gJmAO4CcADqAngA5wKA AOYDhwDkA44A4gOVAOEDnADfBKMA3QSrANsEtADYBcAA1gXQANMG5wDQCPgAzgr/AMwL/wDLDP8A ywz/AMsL/wDLC/8Aywv/AP8fEAD/HgsA/xoHAP8ZCwD/GBEA/xYZAP8SJAD6EDAA8w4+AO4NSgDp DFYA5QxhAOIMagDeDXMA2w17ANkNgwDWDYoA1A2RANINmQDQDqAAzw6pAM0OswDLDr8Ayg/QAMYR 6QDCEvkAvxP/AL0T/wG8E/8BvBP/AbwT/wG7E/8BuxP/Af8iDAD/IQQA/yAAAP8hBQD/HwwA/xwR APYYHADsFSgA5RM2AN8SQwDZE08A0xRaANAVZADNFm0AyxZ1AMkXfQDHF4UAxRiMAMQYlADCGZwA wBmlAL4ZrwC9GrsAuxrLALgb5QG0HPYBsh3/ArAd/wKvHf8Crh3/Aq4d/wKuHf8Crh3/Av8mBgD/ JQAA/yYAAPsnAADxJQMA8CELAOgcEgDeGR0A1BstAM0dPADIH0kAxSBVAMEhXwC/ImgAvCJwALoj eAC5I38BtyOHAbUjjwG0JJcBsiSgAbEkqgKvJLYCrSXGAqsl3wKoJvMDpSb/A6Mm/wOiJv8EoSb/ A6Em/wOhJv8DoSb/A/8pAAD/KAAA9i0AAOcwAADfLwAA2SsEANYiCgDOIxYAxiYnAMAoNgC7KkQA uCtPALUsWQCyLGIBsCxqAa4tcgGsLXoCqi2BAqktigKnLZIDpS2bA6QtpQSiLbEEoC3ABJ8t2ASc Lu8FmS7/Bpcv/waWL/8GlS7/BZUu/wWVLv8FlS7/Bf8sAAD/LgAA6jUAAN05AADROQAAyjYAAMcv BgDBLREAujAhALQyMQCwND4ArDVKAKk1VAGnNV0BpDVlAqI1bQKgNXQDnzV8BJ01hASbNY0FmjSX Bpg0oQaWNK0HlDW7CJM10AiQNewIjjb+CIw2/wiLNv8Iizb/B4o1/weKNf8HijX/B/8vAADyNAAA 4jwAANJBAADHQgAAwEAAALs6AQC2Ng4AsDkcAKo7LACmPDoAoz1GAJ89UAGdPVkCmj1hA5g9aASW PHAFlDx3BpI8gAeRPIgHjzuSCI07nQmLO6kKiTu3C4g7yguFPOgLgzz7C4I8/wqBPP8KgTz/CYE8 /wiBPP8IgTz/CP8zAADsOgAA2kMAAMpHAAC/SQAAt0cAALFCAACtPgoApkAXAKJCJwCeQzUAmkRC AZdETAGURFUCkUNdA49DZAWNQ2sGi0JzB4lCewiHQoQKhUGOC4NBmQyBQaUNf0GzDn5Bxg58QeQO ekL5DXlC/wx4Qv8LeEL/C3hC/wp4Qf8KeEH/CvY2AADmQAAA0UgAAMNNAAC5TgAAsU0AAKlJAACk RQYAn0YTAJpIIwCWSTIAkko+AY9KSAKMSlEDiklZBIdJYAWFSWgHg0hvCIFIdwp/R4ALfUeKDXpH lQ54RqIPdkawEHVGwhBzRuAQckf3D3FH/w5xR/8NcUf/DHFH/wtxRv8LcUb/C/M5AADgRAAAzEwA AL5RAAC0UwAAqlIAAKJOAACdSgEAl0sRAJNNIACPTy4AjE86AYhPRQKFT04Dg09WBIBOXQZ+TmQH fE1sCXlNdAt3TH0MdUyHDnNMkg9xS58Rb0utEm1LvxJsS9wSa0z1EWpM/w9qTP8Oakv/DWpL/wxq S/8Makv/DPA9AADbSAAAx1AAALpVAACwWAAApVYAAJxTAACXTwAAkVAOAIxSHACJVCsAhVQ3AIJU QgF/VEsDfFRTBHpTWgZ4U2IIdVJpCXNScQtxUXoNblGED2xQkBBqUJwSaFCrE2ZQvBNlUNgTZFDz EmRQ/xBkUP8PZFD/DmVP/w1lT/8MZU//DOxBAADUTAAAw1QAALZZAACsXAAAoFoAAJdXAACRVAAA i1UMAIZXGQCDWCcAgFk0AH1ZPwF6WUgDd1hQBHRYWAZyV18Hb1dmCW1WbgtrVncNaFWBD2ZVjRFk VJoSYlSpE2BUuhRfVNMUXlTyE15U/xFfVP8PX1T/Dl9T/w1fU/8NX1P/DedEAADPUAAAv1gAALNd AACoXwAAnF0AAJJbAACLWAAAhVoKAIFbFgB9XCQAel0xAHddPAF0XUYCcV1OBG9cVQVsXF0Halxk CWhbbAtlWnUNY1p/D2FZixFeWZgSXFinFFtYuBRZWdAUWVjwE1lY/xFaWP8QWlj/DlpX/w1aV/8N Wlf/DeNIAADLUwAAu1sAALBhAACkYgAAl2EAAI5fAACFXAAAf14HAHtfEwB4YSEAdWIuAHJiOQFv YkMCbGFLA2phUwVnYVoHZWBiCWNgagtgX3MNXl59D1teiRFZXZYSV12lE1VdthRUXc4UVF3uE1Rd /xFVXP8QVVz/DlVb/w5WW/8NVlv/Dd5MAADHVgAAuF8AAK1kAACgZQAAk2QAAIljAAB/YQAAeWID AHVkEQByZR4Ab2YrAGxnNwFqZ0ACZ2ZJA2VmUQRiZVgGYGVgCF1kZwpbZHAMWWN7DlZjhhBUYpQS UmKjE1BitBNPYswTT2LtEk9h/xFPYf8QUGD/DlBg/w5QYP8NUGD/DdlPAADDWgAAtGMAAKlpAACb aAAAj2cAAIRnAAB5ZQAAc2cAAG9pDgBsahsAaWsoAGdsNABkbD0BYmxGAl9rTgRda1YFWmpdB1hq ZQlWaW4LU2l4DVFohA9OaJIQTGehEktnshJJZ8kSSWfrEklm/xBKZv8PSmX/Dktl/w1LZP8NS2T/ DdFUAAC+XgAAsWcAAKZtAACXbAAAimsAAH9rAABzawAAbW0AAGhuDABlcBcAYnEkAGBxMABecToB XHFDAllxSwNXcVMEVXBaBlJwYgdQcGsJTm91C0tvgg1Jbo8PR26fEEVusBFEbscRQ23qEERs/w9E a/8ORWv/DUVq/w1Fav8NRWr/DctYAAC6YwAArWwAAKFxAACScAAAhW8AAHpvAABucAAAZXMAAGB1 BwBddhIAW3cfAFl4KwBXeDYAVXg/AVN4SAJReE8DT3dXBEx3XwVKd2gHSHZzCUV2fwtDdY0MQXWd Dj91rg4+dcUOPXXoDj5z/Q0+cv8NPnH/DD9x/ww/cP8MP3D/DMVeAAC1aQAAqXEAAJx1AACNdAAA gHQAAHV0AABpdgAAXnkAAFh8AQBUfQ4AUn4aAFF/JgBPfzEATYA7AEyAQwFKgEsCSH9UAkZ/XARD f2UFQX9wBj9+fAg8fooJOn6aCjl+rAs3fsMLN33mCzd7/As3ev8LN3n/Cjh4/wo4eP8KOHj/Cr5k AACwbwAApXgAAJZ5AACHeQAAe3kAAHB6AABkfAAAWIAAAFCDAABLhQoASIYUAEeHIABFiCsARIg1 AEOIPgBBiUcBQIlPAT6IWAI8iGEDOohsBDeIeAU1iIcGM4iYBzKHqgcwiMAHMIfkBzCF+wgwg/8I MIL/CDCB/wgwgf8IMIH/CLdrAACqdgAAoH8AAJB+AACCfgAAdn8AAGqAAABegwAAU4cAAEqLAABB jgIAPZAOADuQGAA6kSMAOZEtADiSNwA3kkAANpJJADSTUgAzk1wBMZNnAS+TdAItkoMDK5KUAyqS pwMokr0EKJLhAyeQ+gQnjv8FJ43/BSeM/wUnjP8FJ4z/BbF0AAClfgAAmYUAAIqEAAB9hAAAb4UA AGOIAABYiwAATY8AAEOTAAA6lwAAMpoHAC6bEAAtmxoALJwkACucLgAqnTgAKZ1BACidSwAnnlUA Jp5hACWebgAjnn4BIp6QASCeowEfnrkBHp7dAR6c+AIemv8CHpn/Ax6X/wMel/8DHpf/A6p9AACe hQAAk4sAAIWKAAB1iwAAaI4AAFuRAABQlQAARpkAADudAAAyoAAAKqMAACKmCQAfpxEAHqcaAB2o JAAcqC0AG6g3ABqpQQAZqUwAGKlYABeqZgAWqnYAFaqJABSqngATq7QAEqvTABKo9QATp/8BE6X/ AROl/wETpP8BE6T/AaOGAACXjAAAjZEAAH2SAABtlQAAYJgAAFScAABIoAAAPqQAADSnAAAqqwAA Ia4AABmxAAASswcAD7UQAA61FwAOtSEADbUrAA21NgAMtkEAC7ZOAAq2XAAJtmwACLZ/AAe2lAAG tqoABbbFAAa26gAHtf8ACLT/AAiz/wAJsv8ACbL/AJqNAACQkwAAhJgAAHScAABloAAAV6QAAEuo AABArAAANbAAACqzAAAhtQAAGLgAABG7AAAMvgIABsALAALAEQABwRkAAMEiAADCKwAAwjYAAMNC AADDUAAAxF8AAMRxAADEhwAAxJ0AAMS1AADE2gAAxPYAAMP/AADD/wAAw/8AAMP/AJOUAACHmgAA eKAAAGqmAABcrAAAT7EAAEG1AAA1twAAKboAAB+9AAAWwAAAEMMAAArGAAADygAAAMwFAADMDAAA zREAAM4YAADOIQAA0CoAANE1AADTQwAA1FIAANRjAADVeAAA1Y8AANWnAADWwgAA1ukAANb9AADW /wAA1v8AANb/AIqbAAB7ogAAbKkAAF6wAABQtgAAQroAADS9AAAowQAAHcQAABTHAAANywAABs4A AADSAAAA1wAAANkAAADaBQAA3AsAAN0QAADfFQAA4R0AAOMnAADlMwAA50IAAOhUAADoZwAA6X4A AOmXAADqrwAA6s4AAOvvAADr/gAA6/8AAOv/AH2jAABuqwAAX7IAAFG6AABCwAAANMMAACfHAAAb ywAAEs8AAAvTAAAC2AAAAN0AAADhAAAA5AAAAOUAAADnAAAA6QAAAOsHAADtDQAA7xEAAPEZAAD0 JAAA9zEAAPlBAAD6VQAA+moAAPuEAAD7nQAA/LYAAPzSAAD97QAA/fQAAP30AHGsAABhtQAAUr0A AETEAAA0yQAAJs0AABrSAAAQ2AAACN0AAADhAAAA5QAAAOgAAADsAAAA7wAAAPEAAADzAAAA9QAA APcAAAD5AQAA+wgAAP4OAAD/FQAA/yEAAP8vAAD/QQAA/1YAAP9tAAD/hwAA/6AAAP+2AAD/ygAA /9QAAP/UAP8LIAD/Bx4A/wAdAP8AIAD/ACUA/wAuAP8AOwD/AEkA/wBWAP8AYgD/AG0A/wB2AP8A fwD/AIcA/wCOAP8AlAD/AJoA/wCgAP8ApgD/AK0A/wC1AP8AvgD/AMsA/wDhAP8A8AD+AP0A/QD/ AP0A/wD9AP8A/QD/APwA/wD5AP8A+QD/AP8NHQD/CxoA/wQZAP8AGgD/AB8A/wAqAP8ANwD/AEUA /wBRAP8AXgD/AGgA/wByAP8AegD/AIIA/wCJAP8AkAD/AJYA/wCcAP4AogD8AKkA+wCwAPkAuQD4 AMYA9gDZAPUA6wD0APkA8wD/APIA/wDzAP8A8wD/APMA/wDzAP8A8wD/AP8QGQD/DhUA/wgUAP8A FAD/ABkA/wAlAP8AMgD/AEAA/wBMAP8AWQD/AGMA/gBtAPwAdQD6AH0A+QCEAPcAiwD2AJEA9ACX APMAngDyAKQA8ACsAO4AtADtAMAA6wDPAOkA5gDoAPUA5gD/AOcA/wDmAP8A5QD/AOUA/wDlAP8A 5QD/AP8SFAD/EBAA/wwPAP8DEAD/ABUA/wAgAP8ALAD/ADoA/wBHAPoAUwD3AF4A9ABnAPEAcADv AHgA7QB/AOsAhgDqAIwA6ACTAOcAmQDlAKAA4wCnAOEAsADfALoA3QDJANsA4ADYAPAA1wD+ANUA /wDUAP8A0wD/ANMA/wDTAP8A0wD/AP8VEAD/EgwA/w4JAP8LDAD/CRIA/wMaAP8AJgD9ADMA9ABA AO8ATQDrAFgA6ABhAOUAagDiAHIA4AB6AN4AgADcAIcA2gCOANgAlQDUAJwA0gCjANAArADOALYA zADEAMoA2QDIAO0AxwD7AMUA/wDEAf8AwwH/AMQB/wDEAf8AxAH/AP8YCwD/FQUA/xAAAP8QBgD/ Dw0A/wwUAPwHHwDxAysA5wA5AOIARgDeAVEA2gJbANUCZADSA2wAzwN0AM0EewDLBIIAygSJAMgF kADGBZgAxAWgAMIGqQDBBrQAvwbBAL0I1QC7CewAuAv9ALYM/wC1Df8AtA3/ALQN/wC0Df8AtA3/ AP8bBQD/GAAA/xcAAP8WAAD7EwYA+hAOAO4MFgDjCSIA2gkwANMKPgDOC0oAygxVAMcNXgDFDWcA wg5vAMEOdgC/Dn4AvQ+FALwPjQC6EJUAuBCdALcQpwC1EbIAsxHAALIR1QCuE+4AqxT+AKkV/wCn Ff8ApxX/AKYU/wGmFP8BphT/Af8fAAD/HAAA+h4AAOseAADjHAAA3xUFAN4ODQDTDhgAyxEoAMUT NwDAFEQAvBZPALkXWQC3F2EAtBhpALMZcQCxGXgArxqAAK4aiACsG5AAqxuZAKkbowCnHK4Aphy8 AKQdzwChHuoBnh78AZwf/wGbH/8Bmh//AZoe/wGZHv8BmR7/Af8iAAD/IQAA7CcAAOAqAADUKQAA zSQAAMocCADEGRIAvRwiALceMQCzID4AryFJAK0iUwCqI1wAqCRkAKYkbACkJHMAoyR6AKElggGg JYsBniWUAZ0lngGbJqoBmSa3AZgmyQKVJ+YCkif5ApAo/wKPKP8Cjif/Ao4n/wKOJ/8Cjif/Av8m AADyKQAA4zEAANI0AADINAAAwDAAALspAgC4Iw4AsSYcAKwoKwCoKjgApCtEAKEsTgCfLVcAnS1f AJstZwGZLW4BmC51AZYufQKULoYCky6QApEumgOPLqYDjS6zA4wuxQOKL+EEhy/2BIUv/wSEL/8D hC//A4Mv/wODL/8Dgy//A/spAADrMQAA2TgAAMk8AAC/PAAAtjkAALAyAACsLQsApy8XAKIxJgCe MzQAmjRAAJg1SgCVNVMAkzVbAZE1YgGPNWkCjTVxAow1eQOKNYIDiDWLBIY1lgSENaIFgjWvBYE1 wAZ/NtwGfTb0Bns2/wV7Nv8Fejb/BHo2/wR6Nf8EejX/BPUtAADkNwAA0D8AAMJDAAC3RAAArUAA AKc6AACjNgYAnTcTAJk5IgCVOi8Akjw7AI88RgCMPE8BijxXAYg8XgKGPGUChDxtA4I8dQSAPH0E fzyHBX08kgZ7O54HeTusB3c7vAh2PNUIdDzxCHM8/wdyPP8Gcjz/BXI8/wVyO/8Fcjv/BfEyAADe PQAAyUQAALxIAACwSQAApkYAAJ9BAACbPQEAlT0QAJE/HQCNQSsAikI4AIdDQgCEQ0sBgkNTAYBD WwJ+QmIDfEJpBHpCcQV4QnoGdkGEB3RBjwhyQZsIcEGpCW9BuQptQdAKbEHuCWtC/whqQv8HakH/ BmpB/wZqQf8FakH/Be03AADWQgAAxEkAALdNAACrTQAAoEoAAJhHAACTQgAAjkMNAIlFGgCGRigA g0c0AIBIPwB+SEgBe0hQAnlIVwJ3SF8DdUhmBHNHbgVxR3YGb0eAB21GjAlrRpgKaUamC2dGtgtm RswLZUbsC2RH/wlkRv8IZEb/B2RG/wZkRf8GZEX/Bug7AADQRgAAv00AALNRAAClUQAAmk4AAJJL AACNRwAAh0gLAINKFgB/SyQAfUwxAHpNPAB3TUUBdU1NAnNNVQJxTVwDb01jBG1MawVrTHMHaUt9 CGZLiQlkS5YKYkukC2FLtAxfS8oMXkvqC15L/gpeS/8JXkr/CF5K/wdeSv8HXkr/B+M/AADLSQAA vFEAALBVAAChVAAAllIAAI1QAACHTAAAgU0IAH1PEwB6UCEAd1EuAHRSOQByUkIBb1JLAW1SUgJr UVkDaVFhBGdRaAZlUHEHY1B7CGFQhgpfT5MLXU+hDFtPsg1ZT8cNWU/oDFhP/QtYT/8JWU//CFlO /wdZTv8HWU7/B99DAADHTQAAuFQAAKxZAACdVwAAkVUAAIhUAACBUAAAe1IEAHdTEQB0VB4AcVUr AG9WNgBsVkABalZIAWhWUAJmVlcDZFZeBGJVZgVgVW8HXVV4CFtUhApZVJELV1SgDFVTsA1UU8UN U1PmDFNT/AtTU/8JVFL/CFRS/whUUv8HVFL/B9pGAADDUAAAtVgAAKhbAACZWgAAjVgAAIRXAAB7 VAAAdlYBAHFXDwBuWRsAbFooAGlaMwBnWz0BZVtFAWNbTQJhWlUDX1pcBF1aZAVbWWwGWFl2CFZZ gglUWI8LUlieDFBYrg1PWMMNTljkDE5Y+wtPV/8JT1f/CE9W/whQVv8HUFb/B9NKAADAVAAAslwA AKNeAACVXQAAiVwAAH9bAAB2WQAAcFoAAGtcDQBoXRgAZl4kAGRfMABiXzoAYF9DAV5fSwJcX1IC Wl9aA1hfYQVVXmoGU150B1FdfwlPXY0KTV2cC0tdrAxKXcEMSV3jDElc+gpJW/8JSlv/CEpa/whK Wv8HSlr/B85OAAC8WAAArmAAAJ9hAACRYAAAhV8AAHtfAABwXQAAal8AAGVhCgBiYhQAYGMhAF5k LQBcZDcAWmRAAVhkSAFWZFACVGRXA1JkXwRQZGcFTmNxBkxjfQhJYosJR2KaCkZiqgtEYr8LRGLh C0Rh+QpEYP8JRGD/CEVf/wdFX/8HRV//B8hSAAC4XAAAq2QAAJtkAACMYwAAgGMAAHZjAABqYgAA Y2QAAF9mBgBbZxEAWWgdAFdpKQBWajMAVGo8AFJqRQFQakwBTmpUAkxqXANKamUESGlvBUZpegdE aYgIQmiYCUBoqQo/aL0KPmjeCT5n9wk+Zv8IP2X/Bz9l/wc/ZP8HP2T/B8NXAACzYQAAp2kAAJZo AACHZwAAe2cAAHFnAABlaAAAXGoAAFhsAQBUbg4AUm8YAFBvJABOcC4ATXA4AEtxQQBKcUkBSHFR AUZxWQJEcGIDQnBsBEBweAU+cIYGPG+VBzpvpgg4b7sIOG/bBzhu9gc4bf8HOGz/Bjlr/wY5av8G OWr/Br1cAACvZgAAom0AAJFsAACCawAAd2sAAGxsAABhbgAAV3AAAFBzAABMdQoASXYTAEd3HwBG dykARXgzAEN4PABCeEQAQXhNAT94VQE9eF4CO3hoAjl4dAM3eIIENXiTBTN3pAUyd7kFMXjXBTF2 9QUxdP8FMXP/BTFy/wUycv8FMnL/BbdjAACqbQAAnHEAAItwAAB9cAAAcnAAAGdxAABccwAAUXcA AEp6AABCfQMAP34OAD1/GAA8fyMAO4AtADqANgA5gT8AOIFIADaBUAA1gVoBM4FkATGBcAEvgX8C LYGPAyyBoQMqgbYDKYHSAyl/8wMpff8DKXz/Ayl7/wMpe/8DKXv/A7FqAACldAAAlXYAAIV1AAB4 dQAAbXUAAGF3AABXegAATH4AAEOBAAA7hQAANYgJADKJEQAxiRsAMIklAC+KLwAuijgALYtBACyL SgAqi1QAKYtfACiLawAmi3oBJIuLASOLngEii7MBIYzOASGK8QEgiP8CIIb/AiCF/wIhhf8CIYX/ AqtyAAChfAAAj3sAAIB6AABzegAAZnwAAFt/AABQggAARoYAADyKAAA0jQAALJEAACaTDAAklBMA I5QcACKVJgAhlS8AIJU4AB+WQgAelkwAHZZYAByWZAAal3QAGZeGABiXmQAXl64AFZfJABaV7gAW k/8BFpL/ARaR/wEWkP8BFpD/AaV7AACZgwAAiYEAAHuAAABsggAAX4QAAFSIAABJiwAAP5AAADWU AAAtlwAAJZoAAB2eAQAWoAwAFKESABShGwAToSUAEqEuABGiOAARokMAEKJPAA+iXAAOo2sADaN9 AA2jkgAMo6cACqLAAAui5gAMoP4ADZ//AA2e/wANnf8ADZ3/AJ6EAACSiQAAg4gAAHOIAABliwAA WI4AAEySAABBlwAAN5sAAC6eAAAkogAAHKUAABWoAAAPqwQACq4MAAetEgAGrRsABa0kAASuLgAC rjkAAa5FAACuUgAArmEAAK5zAACuhwAArp0AAK60AACu1QAArfQAAK3/AACs/wAAq/8AAKv/AJaL AACMkAAAe5AAAGuSAABdlgAAUJoAAESfAAA5owAAL6cAACWrAAAcrgAAFLEAAA60AAAJtwAAAbgJ AAC4DgAAuRQAALkcAAC6JQAAui8AALs6AAC8RwAAvFYAALxnAAC8ewAAvJEAALypAAC8xAAAvOsA ALv+AAC7/wAAu/8AALv/AJCSAACDmAAAc5sAAGOfAABVowAAR6gAADutAAAwsQAAJbQAABu3AAAS ugAADL0AAAW/AAAAwwAAAMQCAADFCgAAxQ4AAMYUAADHGwAAyCQAAMouAADMOgAAzUkAAM1ZAADN bAAAzoMAAM6bAADNtQAAztoAAM72AADN/wAAzf8AAM3/AIaZAAB3oAAAaaYAAFqsAABMsgAAPrYA ADC5AAAkvAAAGb8AABHCAAAKxQAAAskAAADMAAAA0AAAANEAAADSAQAA0wgAANUNAADXEQAA2hgA ANwhAADfLAAA4ToAAOJKAADjXQAA5HIAAOSLAADlpQAA5cAAAOXmAADl+AAA5f8AAOX/AHqhAABr qQAAXK8AAE22AAA/vAAAML8AACPDAAAXxwAAD8oAAAfOAAAA0QAAANYAAADcAAAA3wAAAOAAAADi AAAA5AAAAOYDAADoCQAA6Q4AAOwVAADuHgAA8SsAAPQ6AAD1TQAA9mEAAPd5AAD4kwAA+K0AAPnG AAD55AAA+fMAAPnzAG2qAABesgAAT7oAAEDBAAAxxQAAIskAABbOAAAN0gAABNgAAADdAAAA4QAA AOQAAADoAAAA6wAAAO0AAADvAAAA8QAAAPMAAAD2AAAA+AMAAPoLAAD9EQAA/xsAAP8pAAD/OwAA /08AAP9mAAD/fwAA/5kAAP+vAAD/wwAA/9YAAP/WAP8EHAD/ABkA/wAZAP8AHAD/ACIA/wArAP8A OAD/AEYA/wBTAP8AXgD/AGkA/wByAP8AegD/AIIA/wCJAP8AjwD/AJUA/wCbAP8AoQD/AKgA/wCv AP8AuQD/AMUA/wDZAP4A7AD9APsA+wD/APsA/wD7AP8A+gD/APQA/wDwAP8A8AD/AP8HGAD/ARUA /wAUAP8AFgD/ABsA/wAmAP8ANAD/AEIA/wBOAP8AWgD/AGQA/wBtAP8AdQD/AH0A/wCEAP8AigD9 AJAA/ACWAPoAnQD5AKMA+ACrAPcAtAD1AL8A9ADOAPMA5gDxAPYA8AD/AO8A/wDvAP8A7gD/AO4A /wDqAP8A6gD/AP8LFAD/BhEA/wAQAP8AEAD/ABYA/wAiAP8ALgD/ADwA/wBJAP8AVAD+AF8A+wBo APkAcAD3AHgA9QB/APMAhQDyAIsA8ACSAO8AmADtAJ8A7ACmAOoArgDoALkA5wDHAOUA3gDjAPAA 4gD+AOAA/wDgAP8A4QD/AOEA/wDhAP8A4QD/AP8NEAD/CQ0A/wEMAP8ADAD/ABIA/wAcAP8AKAD8 ADYA+QBDAPYATgDyAFkA7wBiAOwAawDqAHIA6AB5AOYAgADkAIYA4gCMAOEAkwDfAJoA3QChANsA qgDYALQA1QDAANIA0wDQAOoAzgD6AM0A/wDNAP8AzQD/AMwA/wDMAP8AzAD/AP8QDAD/DAcA/wMC AP8ACAD/AA4A/wAWAPYAIgDwAC8A7AA8AOkASADlAFMA4QBcAN4AZQDbAGwA1wBzANQAegDSAIAA 0ACHAM4AjgDMAJUAygCdAMgApQDGAK8AxAC7AMIAywDAAOUAvgD1AL0A/wC8AP8AvAD/ALwA/wC8 AP8AvAD/AP8RBQD/DgAA/woAAP8IAQD/BAoA+AAQAOkAGgDjACgA3gA1ANkAQQDTAEwAzwBWAMsA XwDJAGYAxgBuAMQAdADCAHsAwQCCAL8AiQC9AJAAvACYALoAoQC4AKsAtgC3ALQAxwCyAOAAsQHy AK8C/wCuA/8ArQT/AK0E/wCtBP8ArQT/AP8UAAD/EAAA/w8AAPINAADqCgAA6QMJAN0AEgDUAB8A zQEtAMgCOgDEA0UAwANQAL0EWQC7BWEAuQVoALcGbwC1BnYAtAd9ALIHhACxCIwArwiVAK0JngCr CagAqgq1AKgKxQCmC98ApA30AKIO/wCgDv8Anw7/AJ8O/wCfDv8Anw7/AP8XAAD/EwAA7xgAAOQZ AADbFgAA0hACAM8JCwDICBYAwQokALwMMgC3DT4AtA5JALEOUwCvEFsArRBjAKsQagCpEXEAqBF4 AKYRgAClEYgAoxKRAKESmwCgE6YAnhOzAJwTwwCbFN4Alxb0AJUW/wCUF/8Akxf/AJIX/wCSFv8A khb/AP8aAAD0HQAA5SMAANUlAADKJAAAwh0AAL4WBAC7EBAAtBMdAK8VKwCrFjgApxhDAKUZTQCi GVYAoBpdAJ4bZQCdG2wAmxxzAJocewCYHIMAlx2NAJUdlwCTHqIAkh6vAJAevwCPH9gAjCDxAYkg /wGIIP8BhyD/AYcg/wGGIP8BhiD/AfoeAADrJgAA2i0AAMowAAC+LgAAtSgAALAiAACuGwwAqB0X AKMfJgCfITMAnCI+AJkjSACXJFEAlSRZAJMlYACSJWcAkCZuAI4mdgCNJn8AiyaIAYonkwGIJ54B hierAYQnuwGDKNEBgCjuAX4p/wF9Kf8BfCj/AXwo/wF8KP8BfCj/AfUkAADjLgAAzzUAAME4AAC0 NgAAqzEAAKUsAACiJgYAniYTAJkoIQCVKi4Akis5AI8sRACNLUwAiy1UAIkuXACHLmMAhi5qAYQu cgGCLnoBgS+EAX8vjwJ9L5oCey+nAnovtwJ4L8wCdjDqAnUw/gJzMP8CczD/AnMv/wJzL/8Ccy// AvAqAADcNQAAxzsAALo/AACsPAAAojgAAJwzAACYLwAAlS4QAJAwHACMMikAiTM1AIY0PwCENUkA gjVRAIA1WAB+NV8BfTVmAXs2bgF5NXYCeDWAAnY1iwN0NZcDcjakA3A2tARvNsgEbTbnBGw2/ANr Nv8Dazb/Amo2/wJqNf8CajX/AuowAADTOgAAwkEAALNDAAClQQAAmz4AAJU6AACQNgAAjDUNAIg3 GACEOCUAgToxAH87PAB8O0UAejxNAHg8VQF3PFwBdTxjAXM8agJxPHMCcDx8A247hwNsO5QEajuh BGg7sQVnPMUFZTzlBWQ8+gRkPP8DYzv/A2M7/wNjO/8CYzv/AuU1AADNPwAAvUYAAK5HAACfRQAA lUMAAI5AAACJPAAAhDwKAIA9FAB9PiIAej8uAHhAOAB1QUIAc0FKAHJBUQFwQVkBbkFgAmxBZwJq QXADaEF5A2dBhARlQZEFY0GfBWFBrgZgQcIGXkHiBl5B+QVdQf8EXUD/A11A/wNdQP8DXUD/A985 AADIQwAAuUoAAKlLAACbSQAAkEcAAIhEAACDQQAAfkEGAHpCEQB2Qx4AdEUqAHFFNQBvRj8AbUZH AGtGTwFqRlYBaEZdAmZGZQJkRm0DYkZ2BGBGggReRo4FXEWcBltFrAZZRr8HWEbfBlhG9wVXRf8E V0X/BFdE/wNYRP8DWET/A9o9AADERwAAtU4AAKROAACWTAAAi0sAAINJAAB9RQAAeEYCAHRHEABw SBsAbkknAGtKMgBqSzwAaEtEAGZLTAFkS1MBYktaAmBLYgJfS2oDXUt0BFtKfwVZSowFV0qaBlVK qgdUSr0HU0rcB1JK9gZSSv8FUkn/BFJJ/wNSSP8DU0j/A9RBAADASwAAslEAAKBQAACSTwAAh04A AH5MAAB4SAAAckoAAG5LDQBrTRgAaE4kAGZOLwBkTzkAYk9CAGFQSQFfUFEBXVBYAltPYAJZT2gD V09yBFVPfQVTT4oFUk6YBlBOqAdOTrsHTU7ZB01O9QZNTv8FTU3/BE1N/wROTP8DTkz/A85EAAC8 TgAArlQAAJxTAACOUgAAg1EAAHpQAAByTQAAbE8AAGhQCwBlURUAY1IhAGFTLABfUzYAXVQ/AFtU RwBaVE4BWFRWAVZUXQJUVGYDUlNvA1BTewROU4gFTFOXBktTpwdJU7oHSFPVB0hS8wZIUv8FSFH/ BElR/wRJUP8DSVD/A8pIAAC5UgAAqlcAAJhWAACKVQAAf1QAAHZTAABsUQAAZ1MAAGJUCABfVhIA XVceAFtXKQBZWDMAWFg8AFZZRABVWUwBU1lTAVFZWwJPWGQCTVhtA0tYeARJWIYFR1eVBkVXpQZE V7gGQ1jSBkNX8gZDVv8FQ1X/BERV/wREVP8DRFT/A8ZMAAC1VgAApVoAAJRZAACGWAAAe1gAAHFX AABmVgAAYVgAAF1ZBABZWhAAV1sbAFVcJgBTXTAAUl05AFFeQQBPXkkATV5RAUxeWAFKXmECSF1r A0ZddgNEXYMEQl2SBUBdowY/XbYGPl3QBj1c8QU+W/8EPlr/BD5a/wM+Wf8DP1n/A8FQAACxWgAA oV0AAJBcAACCWwAAdlsAAG1bAABhWwAAW10AAFZeAABSYA0AUGEXAE5iIgBNYiwATGM1AEpjPgBJ Y0YAR2NOAEZjVgFEY14BQmNoAkBjcwM+Y4EDPGOQBDpioQQ5YrQFOGPNBThi7wQ4Yf8EOGD/Azhf /wM5Xv8DOV7/A7xVAACtXwAAnGAAAItfAAB9XwAAcl8AAGhfAABdYAAAVWIAAE9kAABLZgoASWcS AEdoHQBFaCcARGkxAENpOQBCakIAQGpKAD9qUgA9alsBPGplATpqcAI4an4CNmmNAzRpnwMzabID MWnLAzFo7QMxZ/8DMWb/AzJl/wMyZP8DMmT/A7dbAACpZAAAlmQAAIZjAAB4YwAAbWMAAGRkAABZ ZQAAUGgAAElrAABDbQQAQG4OAD5vGAA9byIAPHArADpwNAA5cT0AOHFFADdxTgA2cVcANHFhATJx bQExcXoBL3GKAi1xnAIrca8CKnHIAipw6wIqb/8CKm3/Aips/wIrbP8CK2z/ArFhAACkaQAAkGgA AIBnAAB0ZwAAaWcAAF9oAABVawAAS24AAENxAAA8dAAAN3YKADR3EgAzeBwAMnglADF5LgAweTcA L3k/AC55SAAselIAK3pcACp6aAAoenYAJnqHASV6mQEjeqwBInrFASJ56QEid/8BInb/ASJ1/wIi dP8CI3T/AqxoAACdbgAAim0AAHtsAABvbAAAZWwAAFpuAABQcQAARXUAAD14AAA2fAAALn8CACmB DQAnghQAJoIeACWCJwAkgi8AI4M4ACKDQgAhg0sAIIRWAB+EYgAehHEAHISCABuElQAahKkAGITB ABiD5gAYgf0AGYD/ARl//wEZfv8BGX7/AaZwAACVcwAAhHIAAHZxAABrcQAAXnMAAFR2AABJeQAA P30AADeBAAAvhAAAJ4gAACCLBQAbjQ4AGo0VABmNHgAYjicAF44wABaOOQAVjkMAFI9PABOPWwAS j2oAEY97ABCPjwAPj6QADo+7AA2P4AAOjfoAD4v/ABCK/wAQif8AEIn/AKF6AACOeQAAfncAAHJ3 AABkeAAAWHsAAE1+AABCggAAOYYAAC+KAAAnjgAAIJEAABiVAAASmAUADpoOAA2aFAAMmh0AC5om AAuaMAAKmjsACZpGAAiaUwAGm2EABZpyAASahgACmpsAAJqxAAGZzwACmfAAApj/AASX/wAFlv8A BZb/AJmBAACHfwAAen4AAGt+AABdgQAAUIUAAEWJAAA7jQAAMZIAACiWAAAfmQAAGJ0AABGgAAAM owIABqUKAAGlEAAApRYAAKYfAACmKAAApjIAAKc9AACnSgAAp1gAAKdoAACnfAAAp5EAAKaoAACm wwAApekAAKX8AACl/wAApP8AAKT/AJGHAACChgAAcoYAAGOIAABVjAAASZEAAD2WAAAymgAAKJ4A AB+iAAAXpgAAEKkAAAusAAAErwAAALEGAACxDAAAshEAALIXAACzHwAAsygAALQyAAC1PwAAtU0A ALVdAAC1cAAAtYYAALWdAAC1tgAAtdwAALT3AAC0/wAAtP8AALT/AIuPAAB6jgAAapEAAFuVAABN mgAAQJ8AADWkAAAqqAAAIKwAABawAAAPtAAACbcAAAG5AAAAvQAAAL4AAAC+BgAAvwwAAMAQAADB FgAAwh0AAMMnAADFMgAAxkAAAMZRAADHYwAAx3gAAMeRAADHqQAAx8cAAMfsAADH/gAAx/8AAMf/ AIOXAABxmgAAYZ4AAFKjAABFqQAAOK4AACyzAAAgtwAAFroAAA69AAAGwAAAAMMAAADHAAAAyQAA AMoAAADMAAAAzQMAAM4JAADQDgAA0hMAANQbAADYJQAA2zIAAN1CAADdVAAA3mkAAN6BAADenAAA 37UAAN/ZAADf8wAA3/8AAN//AHefAABopgAAWa0AAEqzAAA7uAAALbsAAB+/AAAUwgAADMYAAAPJ AAAAzAAAANAAAADVAAAA2QAAANoAAADcAAAA3gAAAOAAAADiBQAA5AsAAOcQAADqGAAA7SQAAPAy AADxRAAA8lgAAPNvAAD0igAA9KQAAPS/AAD03wAA9PMAAPT0AGqoAABbrwAATLcAAD29AAAtwQAA H8YAABPKAAALzgAAANIAAADXAAAA3AAAAOAAAADlAAAA5wAAAOkAAADrAAAA7QAAAO8AAADxAAAA 8wAAAPYHAAD5DgAA/BYAAP8iAAD/MwAA/0cAAP9dAAD/dgAA/5EAAP+pAAD/vgAA/9gAAP/bAP8A GAD/ABYA/wAVAP8AGAD/AB4A/wAnAP8ANgD/AEMA/wBPAP8AWgD/AGQA/wBtAP8AdQD/AH0A/wCE AP8AigD/AJAA/wCWAP8AnAD/AKMA/wCrAP8AtAD+AL8A/QDPAPsA5wD6APgA+QD/APkA/wD5AP8A 9QD/AO4A/wDpAP8A5wD/AP8AFAD/ABEA/wARAP8AEgD/ABcA/wAjAP8AMQD/AD4A/wBKAP8AVgD/ AGAA/wBoAP8AcAD/AHgA/QB+APwAhQD6AIsA+QCRAPgAmAD3AJ4A9QCmAPQArgDyALkA8QDHAO8A 4ADuAPIA7AD/AOwA/wDsAP8A6wD/AOUA/wDgAP8A3gD/AP8DEAD/AA4A/wANAP8ADQD/ABMA/wAe AP8AKwD/ADgA/wBFAP4AUAD7AFoA+ABjAPUAawDzAHIA8QB5AO8AfwDuAIYA7ACMAOoAkgDpAJkA 5wCgAOYAqQDkALMA4QDAAOAA0wDeAOsA3AD7ANsA/wDaAP8A2gD/ANkA/wDUAP8A0gD/AP8HDQD/ AAkA/wAGAP8ACQD/AA8A/wAYAPsAJQD4ADIA9QA/APIASgDtAFQA6gBdAOcAZQDkAGwA4gBzAOAA egDeAIAA3ACGANoAjQDXAJQA1ACbANIApADPAK0AzQC5AMsAyQDJAOQAyAD2AMYA/wDFAP8AxgD/ AMcA/wDHAP8AxwD/AP8KBgD/AQAA/wAAAP8ABAD/AAsA9AASAO8AHwDqACwA5QA4AOIAQwDdAE4A 2QBXANQAXwDRAGcAzgBtAMwAdADKAHoAyACAAMYAhwDFAI4AwwCWAMEAngC/AKgAvQCzALoAwgC5 ANsAtwDwALUA/wC2AP8AtQD/ALUA/wC1AP8AtQD/AP8MAAD/BAAA/wAAAP4AAAD2AAMA6AANAOAA FwDZACQA0QAxAM0APADKAEcAxgBRAMMAWQDAAGAAvgBnALwAbgC6AHQAuQB7ALcAggC1AIkAswCR ALIAmgCwAKQArgCvAKwAvQCqANAAqADrAKcA+wCmAP8ApgD/AKUA/wClAP8ApQD/AP8NAAD/BwAA 9AkAAOoJAADiBAAA2gAHAM8AEQDIABwAwgApAL4ANQC7AEAAtwBKALQAUwCyAFsAsABiAK4AaACs AG8AqwB1AKkAfQCoAIQApgCNAKQAlgCjAKAAoQCrAJ8BuQCdA8wAnAToAJoG+QCZB/8AmAj/AJcI /wCXCP8Alwj/AP8QAAD3EAAA6BQAANwVAADOEQAAxg0AAMIECwC8ABQAtwEhALIDLgCuBToAqwZE AKgITQCmCFUApAlcAKIKYwCgCmoAnwtxAJ0LeACcC4AAmgyJAJkMkwCXDJ4AlQ2qAJQNuACSDcwA kA7qAI4Q/ACMEP8AixD/AIsQ/wCLEP8AihD/APsTAADtGgAA3SAAAMwhAAC/HQAAtxcAALMRAACy Cw0Aqw0ZAKcOJgCjDzMAnxA+AJ0RRwCaEVAAmBJXAJYSXgCVE2UAkxNsAJITcwCQFHwAjxSFAI0V jwCLFZoAihWnAIgWtQCGFskAhBfnAIIY+wCAGf8Afxn/AH8Z/wB/GP8Afxj/APUaAADkIwAAzykA AMAqAACzJgAAqiIAAKUcAACkFQgAoBQTAJsWIQCXGC0AlBk4AJEaQgCPG0sAjRxSAIscWQCJHWAA iB1nAIYebwCFHncAgx+AAIIfiwCAH5cAfiCjAH0gsgB7IMUAeSHkAHci+QB2Iv8AdSL/AHQh/wB0 If8AdCH/AO8hAADbKwAAxzEAALYxAACpLgAAoCoAAJsmAACYIQEAlR4QAJAgGwCNISgAiSMzAIck PQCFJEYAgyVOAIEmVQB/JlwAfiZjAHwnawB7J3MAeSd8AHgohwB2KJMAdCigAXIorwFxKcEBbyng AW0p9wFsKf8Bayn/AWsp/wFrKP8Bayj/AegoAADQMgAAwDgAAK43AAChNQAAmDIAAJItAACOKQAA iycMAIcoFwCDKiMAgCsvAH4sOQB8LEIAei1KAHguUQB3LlgAdS5gAHMvZwByL28AcC95AW8vgwFt L5ABay+dAWkvrAFoML4BZzDbAWUw9QFkMP8BYzD/AWMv/wFjL/8BYy//AeIuAADKOAAAuj0AAKg8 AACaOgAAkTcAAIozAACGMAAAgy4JAH8vEwB7MB8AeDIrAHYzNQB0Mz4AcjRGAHA0TgBvNVUAbTVc AGw1ZABqNWwBaDV1AWc1gAFlNYwBYzWaAmE2qQJgNrsCXzbWAl028wJdNv8CXDb/AVw1/wFcNf8B XDT/AdwzAADFPAAAtEEAAKJAAACVPgAAizwAAIQ5AAB/NgAAezQEAHc1EAB0NxwAcTgnAG85MgBt OTsAazpDAGo6SwBoO1IAZztZAGU7YQFjO2kBYjtyAWA7fQFeO4oCXDuXAls7pwJZO7gDWDv/4v/i SUNDX1BST0ZJTEUABgnSA1c78QJWO/8CVjv/AlY6/wFWOv8BVjn/AdQ3AADAQQAAr0QAAJ1DAACQ QgAAhUAAAH4+AAB5OwAAdDoAAHE6DgBtPBgAaz0kAGk+LwBnPzgAZT9AAGRASABiQE8AYUBXAF9A XgFdQGYBXEBvAVpAegJYQIcCVkCVAlRApANTQLYDUkDPA1FA7wNQQP8CUD//AlA//wJRPv8BUT7/ Ac87AAC9RQAAqkcAAJlGAACLRQAAgUQAAHlCAAB0PgAAbz8AAGtADABnQRUAZUIhAGNDKwBhQzUA X0Q+AF5ERQBdRU0AW0VUAFlFXAFYRWQBVkVtAVRFeAJSRYUCUUSTA09EowNNRbQDTEXMA0tF7QNL RP8CS0T/AktD/wJMQv8CTEL/Aso/AAC5SAAApkoAAJVJAACHSAAAfUcAAHVFAABuQgAAaUMAAGVE CQBiRRMAX0YeAF1HKABcSDIAWkg7AFlJQwBXSUoAVklSAFRJWQFTSWEBUUlrAU9JdgJNSYICS0mR A0pJoQNISbMDR0nKA0ZJ7ANGSP8CRkj/AkdH/wJHRv8CR0b/AsZDAAC2TAAAokwAAJFMAACESwAA eUoAAHBJAABpRgAAZEcAAF9JBgBcShAAWksbAFhMJQBWTC8AVU04AFNNQABSTUgAUU5PAE9OVwBO Tl8BTE5pAUpOcwJITYACRk2PA0VNnwNDTbEDQk3IA0FN6gNBTP8CQUz/AkJL/wJCSv8CQkr/AsJH AACzTwAAnk8AAI1OAACATgAAdU0AAGxMAABjSgAAXkwAAFpNAgBWTg4AVE8YAFJQIgBRUSwAT1E1 AE5SPQBNUkUATFJNAEpSVABJUl0BR1JmAUVScQFDUn4CQVKNAj9SnQM+Uq8DPVLGAzxS6QI8Uf4C PFD/Aj1P/wI9T/8CPU7/Ar5LAACuUwAAmlIAAIlRAAB8UQAAcVAAAGhQAABeTgAAWFEAAFRSAABR UwwATlQUAExVHwBLVikASVYyAEhWOgBHV0IARldKAERXUgBDV1oAQVdkAUBXbgE+V3sCPFeLAjpX mwI4V60CN1fEAjdX5wI3Vv0CN1X/AjdU/wI3U/8COFP/ArpPAACpVgAAlVUAAIVUAAB4VAAAbVQA AGRUAABYVAAAUlYAAE5XAABKWQkAR1oRAEZaGwBEWyUAQ1suAEJcNgBBXD4AP1xGAD5dTwA9XVcA O11hADpdbAE4XXkBNl2IATRdmQIzXasCMV3CAjFc5QIxW/wCMVr/AjFZ/wIyWf8BMlj/AbZUAACk WQAAkFgAAIBYAABzVwAAaVcAAGBYAABUWQAATlsAAEhdAABDXwQAQGAOAD5hFwA9YSAAO2IpADpi MgA5YjoAOGNCADdjSwA2Y1QANGNdADNjaAAxY3YBL2OFAS5jlgEsY6kBK2O/ASpj4wEqYvsBKmD/ AStf/wErX/8BK17/AbFZAACeXAAAi1wAAHtbAABvWwAAZVsAAFxcAABRXgAASWAAAENiAAA8ZQAA OGcKADVoEgA0aBsAM2kkADJpLQAxaTUAL2o9AC5qRgAtak8ALGpZACtrZQApa3IAKGuCACZrkwAk a6cAI2u9ACJq4AAjafkBI2f/ASNm/wEjZv8BJGX/AaxgAACYYAAAhWAAAHZfAABqXwAAYWAAAFdg AABNYwAARGYAAD1oAAA2awAAMG4EACxwDgAqcRUAKXEeAChxJgAnci8AJnI3ACVyQAAkckoAInJU ACFzYAAgc20AHnN9AB1zkAAbc6MAGnO5ABlz3AAacfcAGnD/ABtv/wAbbv8BG23/AaZmAACRZQAA f2QAAHFkAABmZAAAXWQAAFJmAABIaQAAP2wAADdvAAAwcwAAKXYAACJ5CAAfexAAHnsXABx7HwAb eygAGnswABl8OQAYfEMAF3xOABZ8WgAVfGcAFH14ABJ9iwARfZ8AEH21AA991QAQe/UAEXn/ABF4 /wASd/8AEnf/AJ5rAACKagAAemkAAG1pAABiaQAAV2oAAExtAABDcAAAOXQAADF4AAApewAAIn8A ABuCAAAUhQkAEYYQABGGFwAQhx8AEIcoAA6HMQAOhzsADYdGAAyHUwALh2EACodxAAmHhAAHh5gA BoauAAWGyQAGhewAB4T/AAiD/wAJgv8ACYL/AJVxAACDbwAAdG4AAGluAABcbwAAUHIAAEZ1AAA8 eQAAMn0AACqBAAAihQAAG4kAABSMAAAPjwMACpILAAaSEQAEkhgAApIgAAGSKQAAkjMAAJM+AACT SwAAk1kAAJNpAACTewAAkpAAAJKmAACRvwAAkeUAAJD6AACP/wAAj/8AAI//AI13AAB9dQAAcHQA AGJ1AABVeAAASXwAAD+AAAA0hAAAK4kAACKNAAAakQAAE5QAAA6XAAAJmwAAAZ0IAACdDgAAnRMA AJ4aAACeIgAAnysAAJ81AACgQgAAoFAAAKBfAACgcQAAoIcAAJ+dAACftQAAntoAAJ32AACd/wAA nP8AAJz/AIZ9AAB4fAAAaXwAAFt/AABOgwAAQYgAADaMAAAskQAAI5YAABqaAAASngAADaEAAAak AAAApwAAAKkDAACpCgAAqg4AAKsTAACsGQAArSIAAK4rAACvNwAAr0UAAK9UAACvZgAAr3sAAK6U AACuqwAArskAAK7vAACt/wAArf8AAK3/AIGEAABxhAAAYYcAAFOLAABGkAAAOZYAAC6bAAAjoAAA GqQAABKoAAAMrAAABK8AAACyAAAAtgAAALcAAAC3AgAAuAgAALkNAAC6EgAAuxgAAL0hAAC+KwAA wDgAAMBIAADAWgAAwW4AAMGGAADBoAAAwboAAMHjAADA+QAAwP8AAMD/AHmNAABokAAAWZQAAEua AAA9oAAAMaUAACWrAAAarwAAEbMAAAu4AAACuwAAAL4AAADBAAAAxAAAAMUAAADGAAAAxwAAAMgF AADKCwAAzA8AAM4VAADQHwAA0ysAANU6AADVTAAA1mAAANh3AADYkgAA2KwAANnJAADZ7AAA2fsA ANj/AHCZAABgngAAUaQAAEOqAAA1sAAAKLYAABy6AAARvgAACcEAAADFAAAAyAAAAMsAAADPAAAA 0gAAANMAAADWAAAA2AAAANsAAADdAAAA3wcAAOINAADlEwAA6B0AAOwqAADtPAAA7VEAAO5nAADv gQAA75wAAPC3AADw0wAA8OwAAPD0AGemAABYrQAASbQAADq6AAAqvgAAHMIAABDGAAAHygAAAM4A AADSAAAA1gAAANwAAADgAAAA4wAAAOQAAADmAAAA6AAAAOsAAADtAAAA7wAAAPICAAD1CgAA+BEA APwcAAD/LAAA/z8AAP9VAAD/bgAA/4oAAP+kAAD/ugAA/9EAAP/hAP8AFAD/ABIA/wASAP8AFAD/ ABkA/wAlAP8AMgD/AD8A/wBLAP8AVgD/AGAA/wBoAP8AcAD/AHgA/wB/AP8AhQD/AIsA/wCRAP8A mAD/AJ4A/gCmAP0ArgD8ALkA+gDIAPkA4gD4APQA9wD/APYA/wD2AP8A7wD/AOcA/wDiAP8A3gD/ AP8AEQD/AA4A/wAOAP8ADwD/ABQA/wAgAP8ALQD/ADoA/wBGAP8AUQD/AFsA/wBjAP4AawD8AHMA +gB5APkAgAD3AIYA9gCMAPUAkgDzAJkA8gCgAPAAqQDuALMA7QDBAOsA1gDqAO4A6QD+AOcA/wDn AP8A5QD/AN0A/wDVAP8A0QD/AP8ADQD/AAoA/wAIAP8ACQD/ABAA/wAbAP8AKAD/ADUA/wBAAPoA SwD2AFUA8wBeAPEAZgDuAG0A7AB0AOsAegDpAIAA5wCGAOYAjQDkAJMA4gCbAOAAowDeAK0A3AC5 ANoAygDXAOYA1AD4ANIA/wDSAP8A0gD/AM4A/wDJAP8AxgD/AP8ACAD/AAMA/wAAAP8AAwD/AA0A /AAWAPcAIgDzAC4A7wA6AOwARQDoAE8A5ABYAOEAYADeAGcA2wBtANkAdADVAHoA0wCAANEAhwDP AI4AzQCVAMsAngDJAKcAxwCzAMUAwgDDANwAwQDxAL8A/wC/AP8AvgD/AL4A/wC9AP8AuwD/AP8A AAD/AAAA/wAAAP8AAAD2AAgA7gARAOcAGwDhACcA3QAzANkAPgDTAEkAzwBSAMsAWQDIAGEAxgBn AMQAbQDCAHMAwAB6AL8AgAC9AIgAuwCQALkAmAC4AKIAtQCtALMAuwCxAM4AsADqAK8A/ACtAP8A rQD/AK4A/wCuAP8ArgD/AP8CAAD/AAAA/QAAAPIAAADoAAAA3gAMANMAFQDMACEAyAAsAMQAOADB AEIAvQBLALoAUwC4AFoAtgBhALQAZwCyAG0AsAB0AK8AegCtAIIArACKAKoAkwCoAJ0ApgCoAKQA tQCiAMYAoQDjAJ8A9gCeAP8AngD/AJ4A/wCeAP8AngD/AP8GAAD7AAAA7gUAAOIEAADVAAAAywAG AMMADwC9ABkAuAAlALQAMQCxADsArgBFAKwATQCpAFUApwBbAKUAYgCkAGgAogBuAKEAdQCfAHwA ngCFAJwAjgCaAJgAmACkAJYAsACVAMEAkwDcAJIA8gCRAP8AkAD/AJAA/wCPAP8AjwD/AP0KAADw DgAA4REAAM4QAADCDQAAuwcAALcACgCxABIArAAeAKgAKQClADQAogA+AJ8ARwCdAE8AmwBWAJkB XACXAWMAlgJpAJQCcACTA3gAkQOAAJAEigCOBJUAjAWhAIoFrgCJBr4AhwjYAIYJ8ACECv8Agwv/ AIML/wCDC/8Agwv/APYQAADmFwAA0hwAAMAaAACzFgAArBIAAKgNAACmBw0AogUWAJ0HIgCZCS4A lgo4AJQLQQCSDEoAkAxRAI4NWACMDV4Aiw1lAIkNbACIDnQAhg59AIUOhwCDDpMAgQ+fAIAQrQB+ EL4AfRDbAHoR9AB4Ev8AdxL/AHcS/wB3Ev8AdxL/AO8XAADbIQAAxiQAALQjAACoIAAAoBwAAJsX AACZEQQAmA4QAJMQGwCPEScAjBIyAIkTPACHE0QAhRRMAIMUUwCBFVoAgBVgAH4WaAB9Fm8AexZ4 AHkXgwB4F48AdhicAHQYqgBzGbsAchnUAG8a8QBuG/8AbRv/AG0a/wBtGv8AbRr/AOcgAADQKQAA vCsAAKsqAACeKAAAliQAAJAgAACNHAAAjBcMAIgYFgCEGiIAgRstAH4cNwB8HUAAeh1IAHkeTwB3 HlUAdh9cAHQfYwBzH2sAcSB0AHAgfwBuIYsAbCGYAGshpwBpIrgAaCLPAGYi7gBlI/8AZCP/AGQi /wBkIv8AZCH/AOAmAADILwAAtDEAAKMwAACWLgAAjSsAAIcoAACEJAAAgiAIAH4gEgB7Ih4AeCMp AHUkMwBzJTwAcSVDAHAmSwBuJlIAbSdZAGsnYABqJ2gAaShxAGcoewBlKIgAZCmVAGIppABgKbUA XynLAF4q7ABcKv8AXCn/AFwp/wBcKf8AXCj/ANgsAADDNQAArTUAAJ00AACQMwAAhjEAAIAtAAB8 KwAAeSgDAHYnEAByKRoAcColAG0rLwBrLDgAaixAAGgtRwBnLU4AZS5VAGQuXQBjLmUAYS9uAF8v eABeL4QAXC+SAFovoQFZL7IBWDDIAVYw6QFVMP4BVS//AFUv/wBVLv8AVS7/ANAxAAC9OgAAqDkA AJc4AACKNwAAgDYAAHoyAAB1MAAAci4AAG4uDQBrLxYAaTAhAGYxKwBkMjQAYzI9AGEzRABgM0sA XzRSAF00WgBcNGIAWjRrAFk1dQBXNYIAVTWQAVQ1nwFSNbABUTXGAVA15wFPNf0BTzX/AU80/wFP NP8BTzP/Acs2AAC4PQAAozwAAJI8AACFOwAAezoAAHQ3AABvNQAAbDMAAGg0CgBlNRMAYjYeAGA3 KABeNzEAXTg6AFs4QQBaOUgAWTlQAFc5VwBWOl8AVDpoAFM6cwBROn8BTzqNAU46nQFMOq4BSzrD AUo65QFJOvwBSTn/AUk5/wFJOP8BSjj/Acc6AACzQAAAnj8AAI4/AACBPgAAdz0AAHA7AABqOAAA ZjgAAGI5BwBfOhEAXDsbAFo7JQBZPC4AVz03AFY9PgBUPkYAUz5NAFI+VQBRPl0ATz9mAE0/cABM P30BSj+LAUg/mwFHP6wBRT/BAUQ/4wFEPvsBRD7/AUQ9/wFEPf8BRTz/AcM+AACvQwAAmkIAAIpC AAB9QQAAc0AAAGs/AABlPAAAYDwAAFw+BABZPg8AVz8YAFVAIgBTQSsAUkE0AFBCPABPQkMATkJL AE1DUgBLQ1oASkNkAEhDbgBHQ3sBRUOJAUNDmQFCQ6sBQEPAAT9D4QE/Q/kBP0L/AT9B/wFAQf8B QED/Ab9BAACqRQAAlkUAAIZFAAB5RAAAb0QAAGdCAABgPwAAW0EAAFdCAABUQw0AUUQVAE9FHwBO RSgATEYxAEtGOQBKR0EASUdIAEhHUABGR1gARUdhAENIbABCSHgBQEiHAT5IlwE8SKkBO0i+ATpI 3wE6R/gBOkb/ATpF/wE7Rf8BO0T/AbtFAACmSAAAkkcAAIJHAAB2RwAAa0cAAGNGAABbQwAAVkUA AFJHAABOSAoATEkSAEpJHABISiUAR0ouAEZLNgBFSz4AQ0tGAEJMTQBBTFYAQExfAD5MagA8THYA O0yFATlMlQE3TKcBNky8ATVM3QE1S/cBNUv/ATVK/wE2Sf8BNkn/AbhJAACiSwAAjkoAAH5KAABy SgAAaEoAAF9JAABVSAAAUEoAAExLAABJTAcARk0QAEROGQBCTyIAQU8rAEBQMwA/UDsAPlBDADxR SgA7UVMAOlFcADhRZwA3UXMANVGCADNRkwEyUaUBMFG6AS9R2gEvUPYBL0//ATBO/wEwTv8BME3/ AbRNAACdTQAAik0AAHpNAABuTQAAZE0AAFtNAABRTQAAS08AAEZQAABCUgMAP1MNAD1UFQA8VB4A OlUnADlVLwA4VTcAN1Y/ADZWRwA1VlAAM1ZZADJXZAAwV3EAL1eAAC1XkQArV6MAKle4AClX1gAp VvUAKVX/ACpU/wEqU/8BKlL/Aa9RAACYUQAAhVEAAHZQAABqUAAAYFAAAFhRAABOUgAAR1MAAEFV AAA7WAAAOFkKADVaEQA0WhoAM1siADJbKwAxWzMAL1w7AC5cQwAtXEwALFxWACtdYAApXW0AKF18 ACZdjgAkXaEAI121ACJd0gAiXPMAIlv/ACNa/wAjWf8AJFj/AKhVAACSVAAAgFQAAHFUAABmVAAA XFQAAFRVAABKVgAAQ1gAADxbAAA2XQAAMGAFAC1hDgArYRUAKmIdACliJQAoYi4AJ2M2ACZjPgAl Y0cAI2NRACJkXAAhZGkAH2R5AB5kigAcZJ4AG2SzABlkzgAaY/EAG2H/ABtg/wAcYP8AHF//AKFZ AACMWAAAe1gAAG1YAABiWAAAWVgAAFBZAABHWwAAPl4AADdgAAAxYwAAKmYAACRpCQAhahAAIGoX AB9qIAAeaygAHWswABxrOQAba0IAGmxMABlsWAAXbGUAFmx0ABRshgATbJoAEmyvABFsygARa+8A Emn/ABNo/wATaP8AE2f/AJldAACFXQAAdVwAAGhcAABeXAAAVVwAAEteAABCYQAAOWQAADJnAAAr agAAJG0AAB5wAQAXcwsAFXQRABR0GAATdCEAEnUpABF1MgARdTsAEHVGAA91UgAOdV8ADXVuAAx1 gQALdZUACnWqAAh0wwAJdOcACnP9AAtx/wAMcf8ADHD/AJFiAAB/YQAAcGEAAGRhAABaYQAAT2IA AEVlAAA8aAAAM2wAACtvAAAkcgAAHXYAABd5AAARfAQADX8MAAt/EgAKfxkACX8iAAh/KgAGfzQA BX8/AAR/SwACf1gAAX9nAAB/eQAAf44AAH+jAAB+uwAAfeAAAH33AAB8/wAAe/8AAHv/AIlnAAB4 ZwAAa2YAAGFmAABUZwAASWkAAD9tAAA1cQAALHUAACR5AAAdfAAAFoAAABCDAAAMhgIABokKAAGJ DwAAiRQAAIobAACKIwAAiywAAIs3AACLQwAAi1AAAItfAACLcQAAi4YAAIucAACKswAAidMAAIjz AACI/wAAh/8AAIf/AIJtAABzbAAAaGwAAFptAABObwAAQnMAADh3AAAuewAAJYAAAB2EAAAViAAA EIwAAAuPAAAEkgAAAJQGAACVDAAAlRAAAJYVAACXHAAAmCQAAJguAACZOQAAmUcAAJlWAACZaAAA mX0AAJmUAACYqwAAl8gAAJbuAACW/wAAlf8AAJX/AHt0AABvcwAAYXMAAFN2AABGegAAO38AADCE AAAmiAAAHY0AABSSAAAOlgAACZkAAAGcAAAAoAAAAKEAAACiBgAAogwAAKQQAAClFAAApRwAAKck AACoLwAAqD0AAKlMAACpXgAAqXIAAKiJAACoogAAqLwAAKflAACm+wAApv8AAKX/AHd7AABoewAA WX4AAEuCAAA+hwAAMo0AACeSAAAdlwAAFJwAAA6gAAAHpAAAAKgAAACrAAAArgAAAK8AAACwAAAA sQQAALMKAAC0DgAAtRMAALYbAAC4JAAAujEAALpAAAC6UgAAu2UAALt9AAC6lwAAurEAALrSAAC6 8wAAuf8AALn/AG+DAABfhgAAUYsAAEOQAAA2lwAAKp0AAB+iAAAVpwAADawAAAWwAAAAtAAAALcA AAC7AAAAvgAAAL8AAADAAAAAwQAAAMMBAADEBwAAxQ0AAMcRAADKGQAAzSQAAM4zAADPRAAA0FgA ANBuAADRiAAA0KQAANDBAADR5gAA0fgAANH/AGePAABXlAAASZoAADuhAAAupwAAIa0AABazAAAO uAAABrwAAADAAAAAwwAAAMYAAADLAAAAzQAAAM4AAADQAAAA0QAAANQAAADWAAAA2gIAANwJAADf DwAA4xcAAOYkAADnNgAA6EkAAOlfAADqeAAA65QAAOuvAADrzAAA7OgAAOz2AF+eAABQpAAAQqsA ADSyAAAmuQAAGb4AAA7CAAAExQAAAMoAAADNAAAA0QAAANgAAADbAAAA3wAAAOAAAADiAAAA5AAA AOYAAADpAAAA6wAAAO4AAADxBQAA9Q0AAPkWAAD8JQAA/TkAAP5PAAD/ZwAA/4IAAP+dAAD/tQAA /8sAAP/kAP8AEQD/AA8A/wAPAP8AEQD/ABYA/wAiAP8ALwD/ADsA/wBHAP8AUgD/AFsA/wBkAP8A bAD/AHMA/wB6AP8AgAD/AIYA/wCMAP4AkwD9AJkA+wChAPoAqQD4ALQA9wDCAPYA2gD1APEA9AD/ APMA/wDzAP8A6QD/AOAA/wDYAP8A0wD/AP8ADgD/AAsA/wAKAP8ACwD/ABEA/wAdAP8AKgD/ADYA /wBBAP8ATAD/AFYA/gBfAPsAZgD5AG0A9wB0APUAegD0AIAA8gCGAPAAjQDvAJQA7QCbAOwApADq AK4A6QC6AOcAzQDlAOkA5AD7AOMA/wDiAP8A3gD/ANEA/wDMAP8AyAD/AP8ACQD/AAQA/wABAP8A BAD/AA4A/wAYAP8AJAD9ADAA+wA7APcARgDzAFAA7wBZAOwAYADqAGcA5wBuAOYAdADkAHoA4gCA AOAAhwDeAI4A3ACVANoAngDWAKgA1ACzANEAwwDPAN8AzgD0AMwA/wDLAP8AywD/AMUA/wC/AP8A vAD/AP8AAgD/AAAA/wAAAP8AAAD9AAsA9wATAPEAHgDtACoA6gA1AOcAQADiAEoA3QBSANkAWgDV AGEA0gBnANAAbQDOAHMAzAB6AMoAgADIAIcAxgCPAMQAmADCAKEAwACtAL4AuwC8ANAAugDtALkA /gC4AP8AuAD/ALcA/wCzAP8AsAD/AP8AAAD/AAAA/wAAAPkAAADuAAUA5QAOAN4AGADYACMA0gAu AM8AOQDLAEMAxwBMAMQAVADBAFsAvwBhALwAZwC7AG0AuQBzALcAegC1AIEAtACJALIAkgCwAJsA rwCnAKwAtACrAMYAqQDkAKcA+ACmAP8ApgD/AKUA/wClAP8ApAD/AP8AAAD/AAAA9QAAAOoAAADe AAAA0AAKAMgAEgDCAB0AvgAoALsAMwC5AD0AtQBGALIATQCwAFUArQBbAKwAYQCqAGcAqABtAKcA cwClAHoApACCAKIAjACgAJYAnwChAJ0ArgCbAL4AmQDYAJcA8QCWAP8AlgD/AJcA/wCXAP8AlwD/ AP8AAAD1AAAA5wEAANQAAADJAAAAwAAEALgADgCzABYArwAhAKsALACoADYApgA/AKMARwChAE8A nwBVAJ0AWwCbAGEAmgBnAJgAbgCXAHUAlQB9AJQAhgCSAJEAkACcAI4AqQCMALgAiwDNAIkA6wCI AP0AiAD/AIgA/wCIAP8AiAD/APkGAADpDAAA1A4AAMMMAAC3CQAAsAIAAKsACQCmABAAogAaAJ4A JQCbADAAmAA5AJYAQQCUAEkAkgBQAJAAVgCOAFwAjQBiAIsAaQCKAHAAiAB4AIcAgQCFAIwAhACY AIIApQCAALQAfgDIAH0B5wB8AvkAewP/AHsE/wB7BP8AewT/APEOAADeFQAAxRUAALQUAACpEQAA oQ4AAJ4KAACbAwwAlwATAJMAHgCQASkAjQIzAIoDPACIBEMAhgVLAIUGUQCDBlcAggdeAIAHZAB/ CGwAfQh0AHwIfgB6CYkAeAmWAHcKowB1CrMAcwvHAHIM5gBwDfsAcA3/AG8N/wBvDf8Abw3/AOgW AADQHgAAuR0AAKkcAACdGgAAlRYAAJATAACPDgMAjgoOAIkLFwCGDCMAgw0tAIANNgB+Dj4AfA5G AHsOTQB5D1MAeBBaAHYQYQB1EGgAcxBxAHERewBwEYcAbhGUAGwRogBrErIAaRLHAGgT5wBmE/0A ZRT/AGUU/wBlE/8AZRP/AN8eAADGJAAAsCQAAKAjAACUIQAAix8AAIYbAACDFwAAghIIAH8REgB8 Eh0AeRQoAHYUMQB0FToAchZBAHEWSABvF08AbhdWAGwXXQBrGGQAaRhtAGgZdwBmGYMAZBmQAGMa nwBhGq8AYBrEAF4b5ABdHPsAXBz/AFwb/wBcG/8AXBv/ANUlAAC9KgAAqCkAAJgpAACMKAAAgyUA AH0iAAB5HwAAeBsDAHYZDwByGhgAbxwjAG0dLQBrHTUAaR49AGgeRABmH0sAZR9SAGMgWQBiIGEA YSBpAF8hcwBdIX8AXCGNAFoinABZIqwAVyLAAFYj4QBVI/kAVCP/AFQi/wBUIv8AVCL/AM0rAAC2 LgAAoi4AAJIuAACFLQAAfCsAAHYoAAByJgAAbyMAAG0hDABqIhUAZyMfAGUkKQBjJDEAYiU5AGAm QQBfJkgAXSZPAFwnVgBbJ10AWSdmAFgocABWKHwAVCiKAFMpmQBRKaoAUCm+AE8p3gBOKfcATSn/ AE0p/wBNKP8ATij/AMgwAACwMgAAnDIAAIwyAACAMQAAdjAAAHAtAABrKwAAaCkAAGYoCQBjKBEA YCkcAF4qJQBcKy4AWys2AFksPQBYLEQAVy1MAFUtUwBULVsAUy1jAFEubgBQLnoATi6IAEwvlwBL L6gASS+7AEgv2wBIL/YARy//AEcu/wBHLf8ASC3/AMQ0AACrNQAAlzUAAIc1AAB7NQAAcjQAAGsy AABmLwAAYi4AAF8tBQBcLhAAWi8YAFgwIgBWMCsAVTEzAFMxOgBSMkIAUTJJAFAyUABOM1gATTNh AEszawBKM3cASDSFAEc0lQBFNKYAQzS5AEI01gBCNPQAQjT/AEIz/wBCMv8AQjL/AMA4AACnOAAA kzgAAIM4AAB3OAAAbTcAAGY2AABhMwAAXTIAAFkyAgBXMw0AVDQVAFI1HwBRNSgATzYwAE42OABM Nz8ASzdGAEo3TgBJOFYARzhfAEY4aQBEOHUAQziDAEE5kwBAOaQAPjm4AD050wA8OfMAPDj/AD03 /wA9N/8APTb/ALs7AACiOwAAjzsAAH87AABzOwAAajoAAGI5AABdNwAAWDYAAFQ3AABROAsATzkT AE05HABLOiUASjotAEg7NQBHOzwARjxEAEU8SwBEPFMAQjxcAEE9ZwA/PXMAPj2BADw9kQA6PaMA OT22ADg90QA3PfIANzz/ADg7/wA4O/8AODr/ALY9AACePgAAiz4AAHw+AABvPgAAZj0AAF49AABY OwAAUzoAAE87AABMPAgAST0RAEc+GQBGPyIARD8qAEM/MgBCQDoAQUBBAEBASQA+QVEAPUFaADxB ZAA6QXAAOEF/ADdBjwA1QqEANEK0ADJCzgAyQfAAMkD/ADNA/wAzP/8AND7/ALFAAACaQAAAh0AA AHhBAABsQQAAYkAAAFtAAABUPwAATj8AAEpAAABGQQUAREIOAEJDFgBAQx8AP0QnAD5ELwA8RDcA O0U+ADpFRgA5RU4AOEZYADZGYgA1Rm4AM0Z8ADFGjQAwRp8ALkazAC1GzAAtRu8ALUX/AC5E/wAu Q/8ALkP/AKxDAACWQwAAg0MAAHRDAABoQwAAX0MAAFdDAABQQwAASEMAAERFAABBRgEAPkcMADxI EwA6SBwAOUkkADhJLAA2STQANUo7ADRKQwAzSkwAMkpVADBLXwAvS2sALUt6ACxLiwAqS50AKEux ACdLygAnS+0AJ0r/AChJ/wAoSP8AKUf/AKdGAACRRgAAf0YAAHBGAABlRgAAW0YAAFRGAABMRwAA REgAAD9KAAA7SwAAN0wJADVNEAAzThgAMk4gADFPKAAwTzAAL084AC5PQAAsUEgAK1BSACpQXAAo UGgAJ1B3ACVQiAAkUJsAIlCvACFQyAAgUOsAIU//ACJO/wAiTf8AI03/AKFJAACMSQAAekkAAGxK AABhSgAAWEoAAFBKAABJSwAAQEwAADtOAAA1UAAAMVIEAC1TDQAsVBQAKlQcAClVJAAoVSwAJ1Uz ACZVPAAlVkUAJFZOACJWWQAhVmUAH1Z0AB5WhQAcVpgAG1asABlWxQAZVukAGlX/ABtU/wAbU/8A HFL/AJtNAACGTQAAdU0AAGhNAABdTQAAVE0AAE1OAABFTwAAPFEAADZTAAAxVQAAK1gAACZaCQAj WxAAIlsXACFcHwAgXCcAH1wuAB1cNwAcXUAAG11KABpdVQAYXWEAF11wABVdgQAUXZUAE12qABFd wgARXecAElv+ABNa/wATWv8AFFn/AJRRAACAUQAAcFEAAGRRAABZUQAAUVEAAElSAABBUwAAOFYA ADJZAAArWwAAJV4AAB9hAwAaYwwAGGQRABdkGQAWZCEAFWQpABRlMQATZToAEmVEABFlUAAQZV0A D2VrAA5lfQANZZEADGWlAApkvAAKZOAAC2P5AAxi/wANYf8ADWH/AI1VAAB6VQAAa1UAAF9VAABW VQAATlUAAERXAAA8WQAANFwAACxfAAAmYgAAH2UAABloAAATawUAEG0NAA5uEgANbhoADG4iAAxu KwALbjQACm4+AAhuSgAHblcABm5lAARudgACbooAAG2fAABttgAAbNYAAGzzAAFr/wACav8AA2r/ AIVaAAB0WgAAZloAAFxZAABTWQAASFoAAD9dAAA2YAAALmMAACZnAAAfagAAGW0AABNxAAAOdAMA CncKAAV3EAABdxUAAHccAAB3JAAAeC0AAHg3AAB4QwAAeFAAAHheAAB4bwAAeIQAAHiZAAB3sAAA ds0AAHXwAAB1/wAAdP8AAHT/AH5fAABuXwAAYl4AAFleAABNXwAAQmIAADllAAAwaAAAJ2wAAB9w AAAYdAAAEncAAA17AAAIfgAAAoAIAACBDQAAgREAAIIXAACDHgAAgyYAAIQwAACEOwAAhEgAAIRX AACEaAAAhHwAAISTAACDqgAAgsUAAIHrAACB/gAAgP8AAID/AHdlAABpZAAAX2MAAFJkAABHZwAA PGsAADFvAAAocwAAIHcAABh8AAARfwAADIMAAAaHAAAAigAAAIwDAACMCQAAjQ4AAI4RAACPFwAA kB4AAJEnAACSMgAAkj8AAJJOAACSXwAAknMAAJKLAACRogAAkbwAAJDlAACP/AAAjv8AAI7/AHFr AABmagAAWGsAAEttAAA/cQAANHYAACp7AAAggAAAF4UAABCJAAALjQAABJEAAACVAAAAmAAAAJkA AACaAwAAmwgAAJwNAACeEQAAnxYAAKAeAACiKAAAojUAAKNEAACjVQAAo2kAAKKAAACimgAAobMA AKDYAACg9gAAn/8AAJ//AG5xAABfcgAAUXUAAER5AAA3fgAALIQAACGKAAAXjwAAEJQAAAqZAAAB nQAAAKAAAACkAAAApwAAAKgAAACpAAAAqgAAAKwGAACtCwAArxAAALAVAACyHgAAtCkAALQ5AAC0 SgAAtV0AALVzAAC1jgAAtagAALTGAACz7QAAsv8AALL/AGZ6AABXfQAASYIAADyHAAAvjgAAI5QA ABiaAAAQnwAACaQAAACpAAAArQAAALAAAAC0AAAAtwAAALgAAAC5AAAAuwAAALwAAAC+AgAAwAgA AMIOAADEFAAAxx4AAMgsAADJPQAAylAAAMpmAADKfwAAypsAAMq4AADK3QAAyvUAAMr/AF6GAABP iwAAQZEAADOYAAAnnwAAG6UAABGrAAAJsAAAALUAAAC5AAAAvQAAAMEAAADGAAAAyAAAAMkAAADL AAAAzAAAAM4AAADQAAAA0gAAANQFAADZDAAA3RIAAOEeAADiLgAA40IAAORXAADlbwAA5owAAOao AADlxQAA5ecAAOb2AFaUAABImwAAOqIAACypAAAfsAAAE7YAAAu8AAAAwQAAAMUAAADJAAAAzQAA ANIAAADWAAAA2gAAANsAAADeAAAA4AAAAOIAAADkAAAA5wAAAOkAAADtAAAA8AoAAPQRAAD4HwAA +TIAAPpIAAD7XwAA/HoAAP2XAAD9rwAA/ccAAP3kAP8ADgD/AA0A/wAMAP8ADgD/ABMA/wAeAP8A KgD/ADYA/wBCAP8ATQD/AFcA/wBfAP8AZwD/AG4A/wB0AP8AegD/AIEA/QCHAPwAjQD6AJQA+QCc APcApQD1AK8A9AC8APMAzwDxAOwA8AD+AO8A/wDvAP8A4wD/ANcA/wDOAP8AygD/AP8ACgD/AAYA /wAEAP8ACAD/ABAA/wAZAP8AJQD/ADEA/wA9AP8ARwD+AFEA+wBZAPkAYQD2AGgA9ABuAPMAdADx AHoA7wCBAO4AhwDsAI4A6gCWAOgAnwDmAKkA4wC1AOIAxgDgAOMA3wD4AN0A/wDdAP8A1AD/AMkA /wDCAP8AvgD/AP8AAwD/AAAA/wAAAP8AAQD/AA0A/wAUAP0AIAD6ACsA9wA2APMAQQDvAEsA7ABU AOgAWwDmAGIA4wBoAOEAbgDfAHQA3AB6ANoAgQDYAIgA1ACQANIAmADPAKIAzQCuAMsAvADJANMA xwDwAMYA/wDEAP8AxAD/ALsA/wC2AP8AswD/AP8AAAD/AAAA/wAAAP8AAAD3AAgA8AAQAOsAGgDn ACUA5AAwAOEAOwDcAEUA1QBNANEAVQDOAFsAywBiAMkAZwDHAG0AxQBzAMMAegDBAIEAvwCJAL0A kgC7AJwAuQCnALcAtQC1AMgAswDmALIA+wCxAP8AsAD/AK4A/wCqAP8ApwD/AP8AAAD/AAAA/gAA APEAAADlAAIA3AANANMAFADNAB8AygAqAMcANADEAD4AwABHALwATgC6AFUAtwBbALUAYQCzAGcA sgBtALAAcwCuAHoArACCAKoAiwCoAJUApwCgAKUArQCjAL4AoQDbAKAA9ACfAP8AngD/AJ8A/wCd AP8AmwD/AP8AAAD8AAAA7gAAAOAAAADQAAAAxQAIAL4AEAC5ABkAtQAjALMALgCwADcArQBAAKoA SACoAE8ApQBVAKMAWwCiAGAAoABmAJ8AbACdAHMAmwB7AJoAhACYAI4AlgCaAJUApwCTALcAkQDM AJAA7ACPAP8AjgD/AI4A/wCOAP8AjwD/APwAAADvAAAA2wAAAMkAAAC9AAAAtQACAK4ADACpABMA pQAdAKIAJwCgADEAnQA6AJoAQgCYAEkAlgBPAJQAVQCTAFsAkQBgAJAAZwCOAG0AjQB1AIsAfgCJ AIkAiACVAIYAogCFALEAgwDEAIEA5ACAAPkAfwD/AIAA/wCAAP8AgAD/APQCAADgCQAAxwgAALcH AACsAwAApgAAAKAABwCbAA8AmAAXAJUAIQCSACoAjwAzAI0APACLAEMAiQBJAIcAUACGAFUAhABb AIMAYQCBAGgAgABwAH4AeQB8AIQAewCQAHkAnQB4AKwAdgC+AHUA3QBzAPQAcwD/AHMA/wBzAP8A cwD/AOkNAADPEAAAuRAAAKkQAACeDgAAlwsAAJMGAACQAAsAjAARAIkAGgCGACQAgwAuAIEANgB/ AD4AfQBEAHwASwB6AFEAeQBXAHcAXQB2AGQAdABsAHMBdQBxAYAAbwKNAG4CmgBsA6oAawO7AGkE 1gBoBvEAaAf/AGcH/wBnB/8AZwf/AN8UAADDFwAArhcAAJ4WAACTFQAAixIAAIYQAACEDAIAgwYN AIADFAB8BR4AeQcoAHcIMAB1CDgAcwlAAHIJRgBwCkwAbwpTAG0LWQBsC2EAagtpAGkMcgBnDH4A ZgyLAGQNmQBiDakAYQ27AGAN2ABeDvMAXQ7/AF0O/wBdDv8AXQ7/ANQcAAC5HQAApB4AAJUdAACJ HAAAgRoAAHsXAAB4EwAAeBAGAHcNDwBzDhgAcA4iAG4PKwBsEDMAahA7AGkQQgBnEUkAZhFPAGQR VgBjEl0AYRJmAGASbwBeEnsAXBOIAFsTlwBZE6cAVxS6AFYU1QBVFfMAVBX/AFQV/wBUFf8AVBT/ AMoiAACwIgAAnSMAAI0jAACBIgAAeSEAAHMeAABvGwAAbhcAAG0TDABqFBQAZxUeAGUWJwBjFi8A YRc3AGAXPgBeGEUAXRhLAFwZUgBaGVoAWRliAFcabABWGncAVBqFAFIblABRG6QATxu3AE4b0ABN HPEATBz/AEwc/wBNHP8ATRv/AMMmAACqJwAAlicAAIcoAAB7JwAAciYAAGwkAABoIQAAZh4AAGQb CABiGxEAXxwaAF0dIwBbHisAWh4zAFgfOgBXH0EAViBIAFQgTwBTIFcAUSFfAFAhaQBOIXQATSGC AEsikQBJIqIASCK0AEcizQBGI+8ARSP/AEUi/wBGIv8ARiH/ALwqAACkKwAAkSsAAIIsAAB2KwAA bSoAAGYpAABiJgAAXyQAAF0iBABbIQ4AWCIWAFYjHwBUJCgAUyQwAFIlNwBQJT4ATyZFAE4mTABM JlQASydcAEknZgBIJ3EARid/AEUojwBDKKAAQSiyAEAoywA/KO0APyj/AD8o/wBAJ/8AQCf/ALct AACfLgAAjC8AAH0vAABxLwAAaC4AAGEtAABdKwAAWigAAFcnAABUJwwAUigTAFApHABOKSUATSos AEsqNABKKzsASStCAEgsSQBGLFEARSxaAEQsZABCLW8AQC19AD8tjQA9LZ4APC2wADotyAA6LesA Oi3/ADot/wA6LP8AOiz/ALIwAACbMQAAiDIAAHkyAABtMgAAZDIAAF0xAABYLwAAVSwAAFEsAABP LQkATC0RAEouGQBJLyIARy8qAEYwMQBFMDgAQzA/AEIxRwBBMU8AQDFXAD4xYQA9Mm0AOzJ7ADky iwA4MpwANjKvADUyxwA0MukANDL/ADUx/wA1Mf8ANTD/AK0zAACWNAAAhDUAAHU1AABpNQAAYDUA AFk0AABUMwAAUDAAAEwxAABJMQYARzIPAEUzFgBDMx8AQjQnAEA0LgA/NTYAPjU9AD01RAA8NkwA OjZVADk2XwA3NmsANjZ4ADQ3iQAyN5oAMTetAC83xQAvN+gALzb+ADA1/wAwNf8AMDT/AKk2AACS NgAAgDcAAHI4AABmOAAAXTcAAFY3AABQNgAASzQAAEc1AABENgMAQTcNAD84FAA+OBwAPDkkADs5 LAA6OTMAOTo6ADg6QgA2OkoANTpTADQ7XQAyO2gAMDt2AC87hwAtO5kALDusACo7wwApO+YAKjr9 ACo6/wArOf8ALDj/AKQ4AACOOQAAfDoAAG46AABjOgAAWjoAAFM6AABNOgAARjgAAEI6AAA/OwAA PDwLADo8EQA4PRkANz0hADY+KQA0PjAAMz43ADI/PwAxP0cAMD9QAC4/WgAtQGYAK0B0AClAhAAo QJcAJkCqACVAwQAkQOUAJD/8ACU+/wAmPf8AJj3/AJ87AACKPAAAeD0AAGo9AABfPQAAVj0AAE89 AABJPQAAQj0AADw+AAA5PwAANkEIADRBDwAyQhYAMUIeAC9DJQAuQy0ALUM0ACxEPAArREQAKkRN AChEWAAnRWMAJUVxACNFggAiRZUAIEWoAB9FvwAeROMAH0T7AB9D/wAgQv8AIUH/AJo+AACFPwAA dEAAAGdAAABcQAAAU0AAAExAAABGQAAAPkEAADhDAAA0RQAAMEYDAC1HDQArSBIAKkgaAClIIgAo SSkAJ0kxACVJOQAkSUEAI0pKACJKVQAgSmEAH0pvAB1KfwAbSpIAGkqmABhKvQAXSuAAGEn6ABlI /wAaR/8AGkf/AJVCAACAQgAAcEMAAGNDAABYQwAAUEMAAElDAABCRAAAO0UAADVHAAAwSQAAK0sA ACZNCQAkThAAIk4WACFPHQAgTyUAH08sAB5PNQAdTz0AHFBHABpQUQAZUF0AF1BrABZQfAAUUI8A E1CkABFQugARUN4AEU/4ABJO/wATTf8AFE3/AI9FAAB7RgAAa0YAAF9HAABVRwAATUcAAEZHAAA/ RwAAN0oAADFMAAArTgAAJlAAACBTAwAcVQwAGlYRABlWGAAXViAAFlYnABVWMAAUVjkAE1dCABJX TQARV1kAEFdoAA9XeQAOV4wADVegAAtXtgALVtQAC1b0AAxV/wANVP8ADlP/AIhJAAB2SgAAZ0oA AFtKAABRSgAASkoAAENKAAA7TAAAM04AACxRAAAmVAAAIVYAABtZAAAVXAcAEV4NABBeEwAQXhoA Dl4iAA5eKgANXjMADF49AAteSAAKXlQACF5iAAdecwAFXoYAA16bAAJesQACXcwAAl3uAANc/wAE W/8ABVv/AIFOAABwTgAAYk4AAFdOAABOTgAAR04AAD5PAAA2UQAALlQAACdXAAAhWgAAG10AABVg AAAQYwMADGYLAAhnEAAGZxUABWccAARnJAACZy0AAWc3AABnQgAAZ04AAGdcAABnbQAAZ4AAAGaV AABmrAAAZccAAGXrAABk/AAAZP8AAGP/AHpSAABqUwAAXVIAAFRSAABLUgAAQlMAADlVAAAwWAAA KFsAACFfAAAaYgAAFGUAABBoAAAMawEABm4JAABvDgAAbxIAAG8YAABwHwAAcCcAAHEwAABxOwAA cUgAAHFWAABxZgAAcXkAAHGPAABwpwAAb8EAAG/nAABu/AAAbf8AAG3/AHNYAABlVwAAWlcAAFFW AABGVwAAPFoAADJdAAAqYQAAImQAABpoAAAUbAAADm8AAApyAAAEdgAAAHgFAAB4CwAAeQ4AAHoT AAB7GQAAfCAAAH0pAAB9MwAAfUAAAH1OAAB9XgAAfXIAAH2IAAB8oQAAfLoAAHviAAB6+gAAef8A AHj/AG1dAABgXAAAV1wAAEtdAABAXwAANWMAACtnAAAjawAAGm8AABNzAAAOdwAACHsAAAJ+AAAA ggAAAIMBAACEBgAAhQsAAIYPAACIEwAAiRkAAIohAACLKwAAizcAAIxGAACLVgAAi2kAAIuAAACL mQAAirMAAInYAACI9wAAiP8AAIf/AGhjAABeYgAAUWIAAERlAAA4aQAALm4AACRzAAAaeAAAE30A AA2BAAAGhQAAAIkAAACNAAAAkAAAAJIAAACSAAAAlAUAAJUKAACXDgAAmBIAAJoYAACbIQAAnC0A AJ08AACdTAAAnF8AAJx2AACbkQAAm6sAAJrJAACa8AAAmf8AAJj/AGVpAABXaQAASWwAAD1xAAAw dgAAJXwAABuBAAAShwAADIwAAASRAAAAlQAAAJkAAACdAAAAoAAAAKEAAACiAAAApAAAAKUBAACn BwAAqQwAAKoRAACtGAAAryIAAK8wAACvQQAAr1QAAK9rAACuhQAArqEAAK6+AACt5gAArPwAAKz/ AF5xAABPdAAAQnkAADV/AAAohQAAHYwAABOSAAAMmAAAA50AAACiAAAApgAAAKoAAACuAAAAsAAA ALEAAACzAAAAtAAAALYAAAC4AAAAugQAALwKAAC+EAAAwRcAAMMkAADDNQAAxEkAAMReAADFdwAA xZMAAMWvAADF0QAAw/IAAMP/AFZ8AABHggAAOogAACyPAAAglgAAFJ0AAA2jAAADqQAAAK4AAACy AAAAtwAAALsAAAC/AAAAwgAAAMIAAADFAAAAxgAAAMgAAADKAAAAzQAAAM8AAADSCAAA1Q4AANsY AADdJwAA3joAAN9QAADgaAAA4IQAAOGhAADhvQAA4eIAAOD0AE6LAABAkgAAMpkAACWhAAAYqAAA Dq8AAAW1AAAAugAAAL8AAADEAAAAyAAAAM4AAADRAAAA1AAAANUAAADYAAAA2gAAAN0AAADfAAAA 4gAAAOQAAADnAAAA6wUAAO8OAAD0GQAA9SsAAPZBAAD3WAAA+HIAAPmQAAD5qwAA+MQAAPjhAP8A CwD/AAgA/wAJAP8ADAD/ABIA/wAaAP8AJgD/ADIA/wA+AP8ASAD/AFIA/wBaAP8AYgD/AGkA/wBv AP8AdQD+AHsA/ACBAPsAiAD5AI8A9wCXAPUAoADzAKoA8gC3AO8AyQDtAOYA7AD7AOsA/wDrAP8A 3QD/AM4A/wDGAP8AwgD/AP8ABAD/AAAA/wAAAP8ABQD/AA0A/wAVAP8AIQD/ACwA/wA4AP8AQwD9 AEwA+QBUAPcAXAD0AGMA8gBpAPAAbwDuAHUA7AB7AOoAggDoAIkA5wCRAOQAmgDiAKQA4ACwAN0A wADaANwA2AD0ANUA/wDTAP8AywD/AMEA/wC7AP8AtwD/AP8AAAD/AAAA/wAAAP8AAAD/AAoA/QAR APkAGwD2ACcA9AAyAPAAPADsAEYA6ABOAOQAVgDhAFwA3gBjANwAaADZAG4A1QB0ANIAewDQAIIA zQCKAMsAkwDIAJ0AxgCoAMQAtwDBAMwAwADrAL4A/wC9AP8AvQD/ALQA/wCuAP8AqwD/AP8AAAD/ AAAA/wAAAPoAAADyAAUA6gAOAOUAFgDgACEA3QArANsANgDTAD8AzgBIAMoATwDHAFYAxABcAMIA YQDAAGcAvgBtALwAcwC6AHoAuACCALYAiwC0AJYAsgChALAArwCuAMEArQDgAKsA9wCqAP8AqQD/ AKYA/wChAP8AnwD/AP8AAAD/AAAA9wAAAOgAAADcAAAA0AAKAMoAEQDFABsAwgAlAL8ALwC8ADgA uABBALUASACyAE8AsABVAK4AWwCsAGEAqgBmAKgAbACnAHMApQB7AKMAhAChAI4AnwCaAJ0ApwCb ALgAmgDQAJkA7wCYAP8AlwD/AJYA/wCUAP8AkgD/AP8AAAD2AAAA5AAAANIAAADFAAAAuwAFALUA DgCwABUArAAfAKoAKQCoADIApQA6AKIAQgCgAEkAngBPAJwAVQCaAFoAmABgAJYAZgCVAGwAkwB0 AJIAfQCQAIcAjgCTAIwAoQCLALAAigDFAIgA5gCHAPsAhgD/AIcA/wCHAP8AhgD/APgAAADlAAAA zQAAAL0AAACzAAAAqgAAAKMACgCfABEAmwAZAJkAIwCXACwAlQA0AJIAPACQAEMAjgBJAIwATwCK AFQAiQBaAIcAYACGAGYAhABuAIMAdwCBAIEAfwCNAH4AmwB8AKoAewC8AHoA2wB4APUAeAD/AHgA /wB4AP8AeAD/AO0AAADRAgAAuwIAAKwBAACiAAAAmwAAAJYABQCRAA0AjQAUAIsAHQCIACYAhgAu AIQANgCCAD0AgABDAH4ASQB9AE8AfABVAHoAWwB5AGEAdwBpAHUAcQB0AHwAcgCIAHEAlgBvAKUA bgC2AG0AzgBsAO4AawD/AGsA/wBrAP8AawD/AN8LAADCDAAArgwAAJ4MAACTCwAAjAcAAIgCAACF AAkAgQAQAH8AFwB8ACAAegAoAHgAMAB2ADgAdAA+AHMARABxAEoAcABQAG4AVgBtAF0AbABkAGoA bQBoAHcAZwCEAGUAkgBkAKEAYwCyAGEAyQBgAOkAYAD8AGAA/wBgAP8AYAD/ANAQAAC2EQAAohIA AJMSAACIEQAAgA8AAHwNAAB5CQEAeAMLAHUAEQBzABoAcAAjAG4BKwBsATMAagI5AGkDQABnA0YA ZgRMAGUEUgBjBVkAYgVhAGAFagBfBnQAXQaBAFwHjwBaB58AWQewAFcHxgBWCecAVgr7AFUK/wBV Cv8AVgr/AMYVAACtFwAAmRgAAIoYAAB/FwAAdhYAAHETAABuEAAAbQ0FAG0JDQBqCRQAZwodAGUK JgBjCy4AYgw1AGAMPABfDEIAXg1IAFwNTwBbDVYAWQ1eAFgOaABWDnMAVQ6AAFMOjwBRDp8AUA6x AE4OyABNEOoATRD9AE0Q/wBNEP8ATRD/ALwbAAClHAAAkh0AAIMeAAB3HQAAbxwAAGkaAABmFwAA ZBQAAGQQCABiDxAAXxAYAF0QIQBbESkAWhExAFgSOABXEj4AVhJFAFQSTABTE1MAURNbAFATZQBO FHAATBR9AEsUjABJFJwARxWuAEYVxQBFFegARRb+AEUW/wBFFf8ARRX/ALUfAACeIQAAiyIAAHwi AABxIgAAaCEAAGIfAABfHQAAXBoAAFsXAgBaFQ0AVxYUAFUWHQBUFyUAUhgtAFEYNABPGDsAThlC AE0ZSABLGlAAShpYAEgaYgBHGm0ARRt6AEMbiQBCG5oAQBusAD8bwgA+HOUAPRz8AD4c/wA+G/8A Phv/AK8jAACYJAAAhiUAAHcmAABsJgAAYyUAAF0kAABZIgAAVh8AAFQdAABTHAsAURwSAE4dGgBN HSIASx4pAEoeMQBJHzcARx8+AEYgRQBFIE0AQyBVAEIgXwBAIWoAPyF3AD0hhwA7IZgAOSGqADgi wAA3IuMANyL7ADci/wA4If8AOCH/AKomAACUJwAAgSkAAHMpAABnKQAAXykAAFgoAABUJgAAUSMA AE8iAABMIgcASiIQAEgiFwBHIx8ARSQmAEQkLgBCJDQAQSU7AEAlQwA/JUoAPSZTADwmXAA6JmcA OSZ1ADcnhAA1J5YANCeoADInvgAxJ+EAMSf5ADIm/wAyJv8AMyX/AKUpAACPKgAAfSwAAG8sAABk LQAAWywAAFUrAABQKgAATCgAAEomAABHJwQARCcNAEIoFABBKBwAPykjAD4pKwA9KTIAPCo5ADsq QAA5KkgAOCtQADYrWgA1K2UAMytyADErggAwLJQALiynACwsvAArLN4ALCz4ACwr/wAtKv8ALSr/ AKEsAACLLQAAeS4AAGsvAABgLwAAWC8AAFEuAABMLgAASCwAAEUrAABBKwAAPywLAD0sEQA7LRkA Oi4hADkuKAA3Li8ANi82ADUvPgA0L0UAMy9OADEwWAAwMGMALjBwACwwgAAqMJIAKTClACcwugAm MNwAJjD3ACcv/wAoL/8AKC7/AJwuAACHMAAAdjEAAGgyAABdMgAAVTIAAE4xAABIMQAARDAAAEAv AAA8MAAAOjEJADcxEAA2MhYANTIeADMzJQAyMywAMTMzADA0OwAvNEMALTRMACw0VgAqNWEAKTVu ACc1fgAlNZAAIzWjACI1uQAhNdkAITT2ACI0/wAjM/8AIzL/AJgxAACDMwAAcjQAAGU0AABaNQAA UTUAAEs0AABFNAAAQDQAADozAAA3NAAANDUGADI2DgAwNxMALzcbAC43IgAtOCkAKzgxACo4OAAp OUAAKDlJACY5UwAlOV8AIzlsACE6fAAgOo4AHjqiABw6twAbOdUAHDn1AB04/wAdOP8AHjf/AJM0 AAB/NgAAbjcAAGE3AABXNwAATjcAAEg3AABCNwAAPDcAADU4AAAyOQAALzoCACw7CwAqPBEAKTwY ACg9HwAmPSYAJT0uACQ9NQAjPj0AIj5GACA+UAAfPlwAHT9pABs/eQAaP4wAGD+gABY/tQAVPtIA Fj7zABc9/wAYPP8AGDz/AI43AAB6OAAAajkAAF46AABTOgAASzoAAEU6AAA/OgAAOToAADI8AAAu PgAAKUAAACZBCAAkQg4AIkIUACFCGwAgQyMAH0MqAB5DMgAcQzoAG0RDABpETQAYRFkAF0RnABVE dwATRIoAEkSeABFEswAQRNAAEEPyABFC/wASQv8AE0H/AIk7AAB2PAAAZj0AAFo9AABQPQAASD0A AEI9AAA8PQAANj4AAC9AAAAqQgAAJUQAACFGAwAdSAwAG0kRABlJFwAYSR4AF0kmABZJLgAVSjYA FEpAABNKSgARSlYAEEpkAA9KdAAOSocADUqbAAxKsAAKSsoAC0nsAAxI/wANR/8ADUf/AIM+AABx PwAAYkAAAFZAAABNQAAARUAAAD9AAAA5QQAAMkIAACtFAAAmRwAAIUkAABxLAAAWTgcAE1AOABJQ EwARUBkAEFAhAA9QKQAOUDEADVA7AA1RRgALUVEAClFfAAlRbwAHUIEABVCWAANQqwACUMUAA0/o AANP+wAFTv8ABk3/AH1CAABrQwAAXUQAAFJEAABKRAAAQ0MAADxEAAA1RQAALkcAACdKAAAhTAAA HE8AABdRAAASVAMADlcKAAtYEAAKWBUACFgcAAdYJAAGWCwABVg2AANYQAABWEwAAFhaAABYaQAA WHwAAFiRAABXpwAAV8AAAFblAABW+QAAVf8AAFX/AHZHAABmRwAAWUgAAE9HAABHRwAAQEcAADhI AAAwSgAAKU0AACJQAAAcUwAAFlUAABFYAAANWwIACV4JAARfDgAAXxIAAF8YAABgHwAAYCcAAGAw AABgOwAAYEcAAGBUAABgYwAAYHYAAGCLAABfogAAX7sAAF/iAABe+QAAXf8AAF3/AG9LAABhTAAA VUwAAExLAABESwAAO0wAADJOAAArUQAAI1QAABxXAAAWWwAAEV4AAA1gAAAIYwAAAmYHAABnDAAA Zw8AAGgTAABpGQAAaiEAAGopAABqNAAAakAAAGpNAABqXQAAam8AAGqFAABqnQAAabYAAGjdAABo 9wAAZ/8AAGb/AGlRAABcUAAAUlAAAEpPAAA/UAAANVMAAC1WAAAkWQAAHV0AABZgAAAQZAAADGcA AAZqAAAAbgAAAG8DAABwCAAAcQ0AAHIQAAB0FAAAdRsAAHYjAAB3LAAAdzgAAHZGAAB2VgAAdmgA AHZ+AAB2lwAAdbEAAHTTAABz9QAAc/8AAHL/AGNWAABYVQAAUFQAAERVAAA5WAAAL1sAACZfAAAd YwAAFWcAABBsAAAKcAAABHMAAAB2AAAAegAAAHwAAAB8AwAAfggAAH8MAACBEAAAghQAAIQbAACF JAAAhi8AAIY9AACGTQAAhV8AAIV1AACFjwAAhKkAAIPJAACC8QAAgf8AAID/AF9bAABWWgAASVsA AD1eAAAyYQAAJ2YAAB5rAAAVcAAADnUAAAl5AAABfgAAAIEAAACFAAAAiAAAAIoAAACLAAAAjQEA AI4GAACQCwAAkQ8AAJMUAACVGwAAlyYAAJc0AACXRAAAl1YAAJZsAACVhgAAlaIAAJTBAACT6gAA kv8AAJL/AF1hAABPYQAAQmQAADZpAAAqbgAAH3QAABV5AAAOfwAAB4QAAACJAAAAjgAAAJIAAACW AAAAmAAAAJoAAACbAAAAnQAAAJ8AAAChAwAAowgAAKUNAACnEwAAqRwAAKooAACqOQAAqksAAKph AACpegAAqJkAAKi1AACn3QAAp/gAAKb/AFZoAABIbAAAOnAAAC52AAAifQAAF4QAAA6KAAAHkAAA AJYAAACaAAAAnwAAAKMAAACnAAAAqgAAAKsAAACtAAAArwAAALEAAACzAAAAtQAAALgFAAC6DAAA vRIAAMAcAADALQAAwEAAAL9VAAC/bgAAvosAAL6oAAC+yQAAve8AALz+AE50AABAeQAAMn8AACWH AAAZjgAAEJUAAAecAAAAogAAAKcAAACsAAAAsAAAALUAAAC5AAAAvAAAAL0AAAC/AAAAwQAAAMMA AADGAAAAyAAAAMoAAADNAgAA0AsAANUSAADWIQAA1zQAANhJAADZYAAA2nwAANqaAADbtQAA29kA ANvyAEaCAAA4iQAAK5AAAB2YAAASoAAACqcAAACuAAAAtAAAALkAAAC+AAAAwgAAAMgAAADLAAAA zgAAAM8AAADSAAAA1AAAANYAAADaAAAA3QAAAN8AAADiAAAA5gAAAOoKAADvEwAA8CUAAPI6AADz UQAA9GsAAPSJAAD1pQAA9b8AAPXdAP8ABgD/AAMA/wAFAP8ACwD/ABAA/wAXAP8AIgD/AC0A/wA5 AP8ARAD/AE0A/wBVAP8AXQD/AGQA/wBqAP8AcAD9AHYA+wB8APkAgwD3AIoA9QCSAPMAmwDwAKYA 7gCzAOsAxADpAOQA5wD5AOYA/wDlAP8A0wD/AMcA/wC/AP8AuwD/AP8AAAD/AAAA/wAAAP8AAgD/ AAsA/wASAP8AHQD/ACgA/wAzAP8APgD8AEcA+ABPAPQAVwDxAF0A7gBjAOwAaQDqAG8A6AB1AOYA fADkAIMA4gCLAN8AlQDcAJ8A2QCrANUAuwDSANQAzwDyAM0A/wDMAP8AxQD/ALoA/wC0AP8AsAD/ AP8AAAD/AAAA/wAAAP8AAAD/AAYA+QAPAPUAFwDzACIA8QAtAO0ANwDnAEAA4gBJAN8AUADbAFcA 1wBdANQAYwDRAGgAzwBuAMwAdQDKAHwAyACEAMUAjQDCAJgAwACkAL0AsgC7AMYAuQDoALgA/QC3 AP8AtgD/AK0A/wCnAP8AowD/AP8AAAD/AAAA/wAAAPUAAADrAAEA5AAMAN4AEwDZABwA0wAmANEA MADMADoAyABCAMQASgDAAFAAvQBWALsAXAC5AGEAtwBnALUAbQCzAHQAsQB8AK8AhQCtAJAAqgCc AKgAqgCmALsApQDaAKMA9QCjAP8AogD/AJ4A/wCaAP8AlwD/AP8AAAD+AAAA7wAAAN8AAADQAAAA xwAHAMEADwC8ABcAuQAgALcAKgC1ADMAsAA7AK0AQwCrAEkAqABPAKYAVQCkAFoAowBgAKEAZgCf AG0AnQB0AJwAfQCaAIgAmACUAJYAogCUALIAkgDJAJEA6wCRAP8AkAD/AJAA/wCMAP8AigD/APwA AADsAAAA2QAAAMcAAAC6AAAAsQACAKsADACnABIApAAbAKEAJACgACwAngA1AJsAPACYAEMAlgBJ AJQATwCSAFQAkABaAI8AXwCNAGYAiwBtAIkAdgCIAIAAhgCMAIQAmgCCAKoAgQC+AIAA4ACAAPkA fwD/AH8A/wB/AP8AfgD/APEAAADYAAAAwgAAALMAAACoAAAAoAAAAJkABwCVAA4AkgAVAJAAHgCO ACYAjQAuAIoANgCHAD0AhQBDAIQASQCCAE4AgQBUAH8AWQB+AGAAfABnAHoAbwB5AHoAdwCGAHUA lAB0AKMAcgC1AHIAzwBxAPEAcAD/AHAA/wBwAP8AcQD/AOEAAADEAAAAsAAAAKIAAACXAAAAkQAA AIsAAgCGAAsAgwARAIEAGAB/ACEAfQApAHwAMAB5ADcAeAA9AHYAQwB0AEkAcwBOAHIAVABwAFoA bwBiAG0AagBrAHQAagCAAGgAjgBnAJ0AZQCvAGUAxgBkAOgAZAD9AGMA/wBjAP8AZAD/AM8FAAC2 BwAAowgAAJQIAACJBwAAggMAAH4AAAB7AAYAdwAOAHUAEwByABsAcQAjAG8AKwBtADIAbAA4AGoA PgBpAEQAZwBJAGYATwBlAFYAYwBdAGIAZQBgAG8AXwB7AF0AiQBcAJkAWwCqAFkAvwBZAOEAWAD4 AFgA/wBYAP8AWQD/AMIMAACqDQAAlw4AAIkOAAB9DgAAdg0AAHEKAABvBgAAbQAKAGsAEABpABYA ZwAeAGUAJgBjAC0AYQAzAGAAOQBfAD8AXQBFAFwASwBbAFIAWgBZAFgAYgBXAGwAVQB4AFMAhgBS AJYAUQCnAFAAuwBPAdsATgL0AE4D/wBOBP8ATgP/ALgQAAChEgAAjhMAAH8TAAB0EwAAbBIAAGcQ AABlDgAAYwsDAGMGDABhBBEAXgMZAFwEIQBbBSgAWQYvAFgGNQBWBzsAVQdCAFQHSABTCE8AUQhW AFAJXwBOCWkATQl2AEsKhABJCpQASAqmAEcKugBGCtgARQvzAEUM/wBFDP8ARQz/ALAUAACZFgAA hxgAAHgZAABtGAAAZRcAAF8WAABcEwAAWhEAAFoOBgBaDA0AVwwUAFUMHABTDSQAUg0rAFANMQBP DjgATg4+AE0ORQBLDk0ASg5VAEgPXgBHD2gARQ91AEMQhABBEJUAQBCmAD4QuwA9ENwAPRH2AD0R /wA9EP8APhD/AKkZAACSGwAAgRwAAHIdAABnHQAAXxwAAFkbAABVGQAAUxYAAFITAABSEQoAUBAQ AE4RGABMESAAShInAEkSLgBIEzQARxM7AEUTQgBEE0kAQxRSAEEUWwA/FGUAPhVyADwVgQA6FZIA OBWkADcVuQA1FdgANRb1ADYW/wA2Fv8ANxX/AKMcAACNHgAAeyAAAG0hAABiIQAAWiEAAFQfAABQ HgAATRsAAEwZAABLFgYASRYOAEcXFQBFFxwARBgkAEIYKgBBGDEAQBk4AD8ZPwA9GUYAPBpPADoa WAA5GmMANxtvADUbfgAzG5AAMhuiADAbtwAvG9MALxzzAC8b/wAwG/8AMBv/AJ0fAACIIgAAdyMA AGkkAABeJAAAViQAAFAjAABLIgAASCAAAEYdAABFHAIAQxwMAEEcEgA/HRkAPh0hADweJwA7Hi4A Oh81ADkfPAA3H0QANh9MADQgVgAzIGAAMSBtAC8gfAAtIY4ALCGgACohtQApIdAAKSHyACkh/wAq IP8AKyD/AJkiAACEJQAAcyYAAGUnAABbJwAAUycAAEwmAABHJQAARCQAAEIhAAA/IQAAPSEJADsh EAA5IhYAOCIeADYjJQA1IysANCQyADMkOQAyJEEAMCRKAC8lUwAtJV4AKyVrAColegAoJYwAJiWf ACQlswAjJc4AIyXwACQl/wAlJP8AJST/AJQlAACAJwAAbykAAGIqAABXKgAATyoAAEkpAABEKAAA QCcAAD0mAAA6JQAANyYGADUmDgA0JxQAMicbADEoIgAwKCkALygwAC0pNwAsKT8AKylHACkpUQAo KlwAJippACQqeAAjKooAISqdAB8qsgAeKswAHirvAB8p/wAgKf8AISj/AJAoAAB8KgAAbCsAAF8s AABULAAATCwAAEYsAABBKwAAPCsAADgqAAA1KgAAMisDADArDAAuLBEALSwYACwsHwAqLSYAKS0t ACgtNAAnLjwAJi5FACQuTwAjLloAIS9nAB8vdgAdL4gAHC+bABovsAAYL8oAGC7tABku/wAbLf8A Gy3/AIwrAAB4LQAAaC4AAFsvAABRLwAASS8AAEMvAAA+LgAAOS4AADQuAAAwLgAALS8AACswCgAp MRAAJzEVACYxHAAlMiMAJDIqACMyMQAhMzkAIDNCAB8zTAAdM1cAGzNkABo0dAAYNIYAFjSaABQz rgATM8gAEzPsABQz/wAVMv8AFjH/AIcuAAB0LwAAZTEAAFgxAABOMgAARjIAAEAxAAA7MQAANjEA ADExAAArMwAAKDQAACU1BgAjNg0AITYSACA3GQAfNyAAHjcnAB04LgAbODYAGjg/ABk4SQAXOVUA FTliABQ5cQASOYQAETmYABA5rQAOOMcADjjrABA4/wAQN/8AETb/AIMxAABwMgAAYTQAAFU0AABL NAAARDQAAD00AAA4NAAAMzQAAC01AAAoNwAAJDkAACA6AgAdOwsAGzwQABk9FQAYPRwAFz0jABY9 KwAVPjMAFD48ABI+RgARPlIAED5fAA8+bwAOPoEADD6VAAs+qQAKPsEACj3kAAs9+wAMPP8ADTv/ AH00AABrNgAAXTcAAFE3AABINwAAQTcAADs3AAA1NwAAMDcAACo5AAAlOwAAID0AABw/AAAXQQYA FEMNABJDEgARQxgAEUMfABBEJwAPRC8ADkQ5AA1EQwAMRE4AC0RbAAlEagAHRHwABkSQAARDpQAC Q70AA0PgAAND9gAEQv8ABkH/AHg4AABnOQAAWToAAE46AABFOgAAPjoAADg6AAAzOgAALTsAACc9 AAAhQAAAHEIAABdEAAATRgMAD0kKAA1KDwAMShQAC0obAAlKIwAISisAB0o0AAVKPgAESkkAAkpW AABKZQAASncAAEqLAABKoQAASbkAAEndAABJ9QAASP8AAEj/AHI8AABiPQAAVT4AAEo+AABCPQAA PD0AADY9AAAvPgAAKUAAACNCAAAdRQAAF0cAABNKAAAPTAIAC08JAAdQDQADUREAAFEXAABRHgAA USYAAFEvAABROQAAUUQAAFJRAABSYAAAUXIAAFGHAABRnQAAUbUAAFDYAABQ9QAAT/8AAE//AGxA AABdQQAAUUEAAEdBAABAQAAAOUAAADJBAAAqQwAAJEYAAB5IAAAXSwAAEk4AAA5RAAALUwEABlYH AABXDAAAWBAAAFgTAABZGQAAWiEAAFopAABaMwAAWj8AAFpMAABaWgAAWmwAAFqBAABZmQAAWbEA AFjRAABY9AAAV/8AAFf/AGVFAABYRQAATUUAAEVEAAA+RAAANUUAAC1HAAAlSgAAHk0AABhQAAAS UwAADlYAAApZAAAEXAAAAF4EAABfCQAAYA0AAGEQAABiFQAAYxsAAGQjAABkLQAAZDgAAGRFAABk VAAAZGYAAGR7AABjkwAAY60AAGLMAABh8gAAYf8AAGD/AF9KAABTSgAASkkAAENIAAA5SQAAL0wA ACdPAAAfUgAAGFUAABJZAAANXQAACGAAAAJjAAAAZgAAAGgBAABpBQAAagoAAGsNAABtEQAAbhYA AHAdAABxJgAAcTEAAHA+AABwTgAAcF8AAHBzAABvjQAAb6cAAG7GAABt7wAAbP8AAGz/AFpPAABQ TgAASE0AAD1OAAAzUQAAKVQAACBYAAAYXAAAEWAAAAxkAAAGaAAAAGsAAABvAAAAcgAAAHQAAAB1 AAAAdwQAAHgJAAB6DQAAfBAAAH0WAAB/HgAAgCgAAIA1AACARQAAf1YAAH9rAAB/hAAAfqAAAH2+ AAB86QAAe/8AAHr/AFZUAABOUwAAQlQAADdWAAAsWgAAIl8AABhjAAARaAAAC20AAANyAAAAdgAA AHoAAAB9AAAAgAAAAIMAAACEAAAAhgAAAIcCAACJBwAAiwwAAI0QAACQFgAAkh8AAJIsAACSOwAA kk0AAJFiAACRegAAj5cAAI+0AACO4QAAjPsAAIz/AFVZAABIWgAAO10AAC9hAAAkZgAAGWwAABFy AAAKdwAAAn0AAACCAAAAhgAAAIsAAACOAAAAkQAAAJMAAACVAAAAlwAAAJkAAACbAAAAnQQAAJ8K AACiDwAApBYAAKYhAACmMQAApkMAAKVXAACkcAAAo44AAKOrAACh0AAAoPUAAJ//AE5hAABAZAAA M2kAACduAAAbdQAAEXwAAAuDAAAAiQAAAI4AAACTAAAAmAAAAJ0AAAChAAAApAAAAKUAAACnAAAA qQAAAKsAAACtAAAAsAAAALIAAAC1CAAAuA4AALwWAAC8JQAAvDcAALtMAAC6ZAAAuYEAALeiAAC3 wAAAt+oAALf8AEZrAAA5cAAAK3cAAB9/AAAThgAAC44AAAGVAAAAmwAAAKEAAACmAAAAqwAAALAA AACzAAAAtwAAALcAAAC6AAAAvAAAAL8AAADBAAAAxAAAAMcAAADKAAAAzQUAANEOAADUGQAA1CsA ANRAAADTWAAA03QAANOSAADSsAAA0tMAANLyAD55AAAxgAAAI4gAABeRAAANmQAAA6AAAACnAAAA rgAAALMAAAC4AAAAvQAAAMIAAADGAAAAygAAAMoAAADNAAAAzwAAANIAAADVAAAA2QAAAN0AAADf AAAA4wAAAOcFAADrDwAA7B8AAO0zAADuSwAA72QAAO+CAADwnwAA8bkAAPHYAP8AAAD/AAAA/wAE AP8ACQD/AA4A/wAVAP8AHgD/ACkA/wA0AP8APwD/AEgA/wBQAP8AWAD/AF4A/wBlAP0AawD7AHEA +QB3APgAfgD2AIUA8wCNAPEAlwDuAKIA6wCvAOgAwADmAOAA4wD4AOIA/wDbAP8AywD/AMEA/wC5 AP8AtAD/AP8AAAD/AAAA/wAAAP8AAAD/AAkA/wAQAP8AGQD/ACMA/wAuAP0AOQD5AEIA9QBKAPIA UgDuAFgA6wBeAOkAZADmAGoA5ABwAOIAdgDfAH0A3QCGANkAjwDVAJoA0QCnAM4AtgDLAM4AyQDw AMcA/wDFAP8AuwD/ALQA/wCtAP8AqQD/AP8AAAD/AAAA/wAAAP8AAAD7AAIA9gANAPEAEwDtAB4A 7AAoAOkAMgDjADsA3QBEANgASwDTAFEA0ABYAM0AXQDLAGMAyQBoAMYAbwDEAHYAwgB+AL8AhwC8 AJIAugCfALcArQC1AMEAsgDkALEA/QCvAP8ArAD/AKUA/wCgAP8AnAD/AP8AAAD/AAAA+wAAAO4A AADkAAAA3AAIANMAEADPABgAywAiAMkAKwDGADQAwQA9AL0ARAC6AEsAtwBRALUAVgCyAFwAsABh AK4AZwCsAG4AqgB2AKgAfwCmAIoAowCWAKEApQCfALYAnQDRAJwA8wCbAP8AnAD/AJYA/wCTAP8A kAD/AP8AAAD2AAAA5wAAANMAAADGAAAAvQADALgADQCzABMAsQAcAK8AJQCuAC4AqQA2AKYAPQCj AEQAoQBKAJ8ATwCdAFUAmwBaAJoAYACYAGYAlgBuAJQAdwCSAIEAkACOAI4AnACMAK0AigDDAIkA 6ACIAP8AiQD/AIcA/wCFAP8AggD/APMAAADjAAAAzAAAALwAAACwAAAApwAAAKEACACeAA8AmwAW AJkAHwCYACcAlgAvAJMANwCRAD0AjgBDAIwASQCLAE4AiQBUAIcAWQCFAGAAhABnAIIAbwCAAHoA fgCGAHwAlAB6AKQAeQC4AHgA2AB3APcAeAD/AHgA/wB3AP8AdQD/AOYAAADLAAAAtwAAAKgAAACe AAAAlgAAAI8ABACLAAwAiAASAIcAGQCFACEAhAApAIIAMAB/ADcAfQA9AHwAQwB6AEgAeQBNAHcA UwB2AFkAdABhAHIAaQBxAHMAbwB/AG0AjQBsAJ0AagCvAGkAyABoAO0AaQD/AGkA/wBpAP8AaQD/ ANIAAAC4AAAApQAAAJcAAACNAAAAhgAAAIEAAAB8AAgAeQAOAHcAFAB2ABwAdAAjAHMAKwBxADEA bwA3AG4APQBsAEMAawBIAGoATgBoAFQAZwBbAGUAYwBjAG0AYgB4AGAAhwBfAJYAXQCoAF0AvgBc AOQAXAD7AFwA/wBcAP8AXAD/AMIAAACqAQAAmAMAAIkEAAB/AgAAeAAAAHQAAABwAAQAbQAMAGsA EQBpABcAaAAeAGYAJQBlACwAYwAyAGIAOABgAD0AXwBDAF4ASQBcAE8AWwBWAFoAXgBYAGgAVwBz AFUAgQBUAJEAUgCjAFEAtwBRANYAUQD1AFEA/wBRAP8AUgD/ALYHAACfCQAAjQsAAH4MAABzCwAA bAoAAGgHAABlAwAAYwAHAGEADQBfABMAXQAaAFwAIQBbACcAWQAtAFgAMwBWADkAVQA/AFQARQBT AEsAUQBSAFAAWgBPAGQATQBvAEwAfQBKAI0ASQCfAEgAsgBHAMwARwDvAEYA/wBHAP8ARwD/AKwM AACVDgAAgxAAAHUQAABrEAAAYw8AAF4OAABbDAAAWgkCAFkECgBXAA8AVQAVAFMAHABSACMAUQAp AE8ALwBOADUATQE7AEwBQQBKAkgASQJPAEgCVwBGA2EARQNtAEMDegBCA4sAQAOcAD8DrwA+A8gA PQTqAD0F/AA9Bv8APgb/AKQQAACOEgAAfBMAAG4UAABkFAAAXBMAAFYSAABTEQAAUQ4AAFAMBQBQ CQwATwcRAE0HFwBLCB8ASQglAEgJKwBHCTEARgk4AEQKPgBDCkUAQgpNAEALVQA/C18APQtrADwL eQA6DIoAOAycADcMrwA1DMcANQzpADUN/QA1Df8ANgz/AJ0TAACHFQAAdhcAAGkYAABeGAAAVhgA AFAXAABNFQAAShMAAEkRAABJDgcASA0OAEYNEwBEDRoAQw4hAEIOKABADi4APw41AD4PPAA9D0MA OxBLADoQVAA4EF4ANhBrADQQeQAyEIoAMRCcAC8QsAAtEMkALRHsAC0R/wAuEf8ALxD/AJcWAACC GQAAcRsAAGQcAABZHAAAURwAAEwbAABHGgAARBgAAEMVAABCEwIAQRILAEAREAA+EhcAPBIeADsT JQA6EysAOBMyADcTOQA2FEAANBRIADMUUQAxFFwAMBVoAC4VdwAsFYgAKhWaACgVrgAnFccAJhXq ACcV/wAoFf8AKRX/AJEaAAB9HAAAbR4AAGAfAABWHwAATh8AAEgeAABDHQAAQBwAAD4aAAA9GAAA OxcHADkWDgA4FxQANhcbADUYIgAzGCgAMhgvADEZNgAwGT0ALhlGAC0aTwArGlkAKhpmACgadAAm GoYAJBqZACIarQAhGsUAIBroACEa/gAiGv8AIxr/AI0dAAB5HwAAaSEAAFwiAABSIgAASiIAAEQh AAA/IQAAPCAAADkeAAA4GwAANRwEADQcDQAyHBIAMB0YAC8dHwAuHSUALR4sACseMwAqHjsAKR9D ACcfTQAmH1cAJB9kACIfcgAgH4QAHx+XAB0fqwAbH8MAGx/nABsf/QAdH/8AHh7/AIkgAAB1IgAA ZSMAAFkkAABPJQAARyUAAEEkAAA8IwAAOCMAADUiAAAzIAAAMCABAC4hCgAsIRAAKyEVACoiHAAo IiMAJyIpACYjMAAlIzgAIyNBACIkSgAhJFUAHyRhAB0kcAAbJIIAGSSVABckqgAWJMEAFSTlABYk /AAXI/8AGSP/AIUiAABxJAAAYiYAAFYnAABMJwAARCcAAD4nAAA5JgAANSYAADElAAAuJAAAKyUA ACklBwAnJg4AJSYTACQnGQAjJyAAIicnACEoLgAgKDYAHig+AB0oSAAbKVMAGSlfABgpbgAWKYAA FCmUABIpqAARKcAAESjkABEo+wATKP8AFCf/AIAlAABuJwAAXygAAFMpAABJKgAAQikAADspAAA2 KQAAMigAAC4oAAAqKAAAJikAACQqBAAiKwwAICsRAB8sFgAdLB0AHCwkABstKwAaLTMAGC08ABct RQAWLlAAFC5dABIubAARLn4AEC6SAA4upwANLb0ADS3fAA0t+QAOLP8AECz/AHwoAABqKgAAWysA AFAsAABGLAAAPywAADksAAA0KwAALysAACsrAAAmLAAAIi4AAB8vAAAcMAkAGjEOABkxEwAXMRoA FjIhABUyKAAUMjAAEzI5ABIzQwARM04AEDNbAA4zaQANM3oADDOOAAozogAIMrkACDLZAAgy9AAK Mf8ACzH/AHcrAABmLQAAWC4AAE0vAABDLwAAPC4AADYuAAAxLgAALS4AACkuAAAjMAAAHzIAABsz AAAXNQUAFDYMABI3EQARNxYAETcdABA4JAAPOCwADjg1AA04PwAMOEoACzhXAAk4ZQAHOHYABTiK AAM4nwABN7UAATfTAAI38QADNv8ABTb/AHMuAABiMAAAVDEAAEkxAABBMQAAOTEAADQxAAAvMAAA KzAAACUyAAAgMwAAGzYAABc4AAATOgIAEDwJAA09DgAMPRMACz0ZAAo9IQAJPSkACD0xAAY+OwAF PkYAAz5SAAE+YQAAPnIAAD6GAAA9nAAAPbIAAD3QAAA88AAAPP8AADz/AG0yAABdMwAAUDQAAEY0 AAA+NAAANzQAADIzAAAtMwAAJzQAACI2AAAdOAAAGDoAABQ9AAAQPwIADUEIAAlDDQAGRBEAA0QW AAJEHQAARCQAAEQtAABENgAAREEAAEROAABEXAAARG0AAESBAABEmAAAQ68AAEPNAABC8AAAQv8A AEL/AGg2AABYNwAATDgAAEM4AAA7NwAANTYAADA2AAApNwAAIzkAAB47AAAYPQAAE0AAABBCAAAN RQEACEcHAANJDAAASQ8AAEoTAABLGQAASyAAAEsoAABLMgAASz0AAExJAABMVwAAS2gAAEt9AABL lAAASqwAAErKAABJ7wAASf8AAEn/AGI6AABUOwAASTsAAEA7AAA5OgAAMzkAACw6AAAlPAAAHz8A ABlBAAATRAAAEEcAAAxJAAAITAAAAk8FAABQCgAAUA0AAFEQAABSFQAAVBsAAFQjAABULAAAVDcA AFREAABUUgAAVGMAAFR3AABUjwAAU6gAAFLGAABS7QAAUf8AAFH/AFw/AABPPwAART8AAD4+AAA3 PQAALz4AACdAAAAgQwAAGUYAABNJAAAPTAAAC08AAAZSAAAAVAAAAFcCAABYBwAAWQsAAFoOAABb EQAAXRYAAF4dAABfJgAAXzEAAF49AABeTAAAXl0AAF5xAABdiQAAXaMAAFzBAABb6wAAWv8AAFr/ AFZEAABLQwAAQ0IAADxBAAAyQgAAKUUAACFIAAAaSwAAE04AAA5SAAAKVQAAA1kAAABbAAAAXgAA AGAAAABiAgAAYwYAAGUKAABmDgAAaBEAAGoXAABrHwAAaykAAGs2AABrRQAAa1YAAGpqAABqggAA aZ0AAGi7AABn5wAAZv8AAGX/AFFIAABISAAAQUYAADdHAAAsSgAAI00AABtRAAATVQAADlkAAAhd AAABYQAAAGQAAABnAAAAagAAAGwAAABuAAAAcAAAAHIFAABzCQAAdQ0AAHcRAAB6GAAAeyEAAHsu AAB6PQAAek4AAHliAAB5eQAAeJYAAHezAAB14AAAdPwAAHP/AE5NAABHTAAAO00AADBPAAAmUwAA HFgAABNcAAANYQAABmYAAABqAAAAbwAAAHIAAAB2AAAAeQAAAHwAAAB9AAAAfwAAAIEAAACDAgAA hgcAAIgMAACLEQAAjhgAAI4kAACOMwAAjUQAAIxYAACLbwAAiowAAImqAACIzwAAhvcAAIX/AE1R AABBUwAANFUAAClaAAAeXwAAFGUAAA1qAAAFcAAAAHYAAAB7AAAAfwAAAIMAAACHAAAAigAAAI0A AACOAAAAkQAAAJMAAACVAAAAmAAAAJoFAACdDAAAoBEAAKMaAACjKAAAojoAAKFOAACgZQAAoIEA AJ6gAACdwQAAm+4AAJr/AEZZAAA5XAAALWEAACFnAAAWbgAADnUAAAV7AAAAgQAAAIcAAACNAAAA kgAAAJYAAACaAAAAnQAAAJ8AAAChAAAApAAAAKYAAACoAAAAqwAAAK4AAACxAwAAtAsAALgRAAC5 HgAAuS8AALhDAAC3WgAAtXYAALSXAAC0tQAAseIAALD8AD9kAAAxaQAAJW8AABh3AAAPfwAABocA AACOAAAAlAAAAJoAAACgAAAApQAAAKoAAACuAAAAsQAAALIAAAC1AAAAtwAAALoAAAC8AAAAvwAA AMMAAADGAAAAyQAAAM4KAADSEwAA0iMAANE3AADQTwAAzmoAAM2KAADKqwAAy8sAAMvvADdxAAAp eAAAHYAAABGJAAAIkQAAAJoAAAChAAAApwAAAK0AAACzAAAAuQAAAL4AAADCAAAAxQAAAMYAAADJ AAAAzAAAAM4AAADSAAAA1QAAANoAAADeAAAA4QAAAOUAAADqCwAA6xcAAOorAADqQwAA6l4AAOp6 AADrmQAA67UAAOvVAP8AAAD/AAAA/wABAP8ABwD/AA0A/wASAP8AGwD/ACUA/wAvAP8AOgD/AEMA /wBLAP8AUwD/AFoA/QBgAPsAZgD6AGsA+AByAPYAeAD0AIAA8QCJAO8AkgDsAJ0A6QCqAOYAvADj ANwA3wD3AN0A/wDMAP8AvgD/ALUA/wCwAP8ArQD/AP8AAAD/AAAA/wAAAP8AAAD/AAYA/wANAP8A FAD/AB8A/wApAPsAMwD3AD0A8wBFAO8ATQDsAFMA6ABZAOUAXwDjAGUA4ABqAN0AcQDaAHgA1gCA ANIAigDPAJUAzACiAMgAsgDFAMkAwgDtAMAA/wC7AP8AsAD/AKgA/wCkAP8AoQD/AP8AAAD/AAAA /QAAAPoAAAD4AAAA8AAJAOwAEQDoABkA5wAjAOUALQDeADYA1gA+ANEARgDNAEwAygBSAMgAWADF AF0AwwBjAMAAaQC+AHAAvAB4ALkAgQC3AI0AtACaALEAqQCuALwArADhAKoA/ACoAP8AoAD/AJkA /wCWAP8AlAD/AP8AAAD5AAAA8gAAAOcAAADbAAAA0QAEAMoADQDHABQAxAAdAMIAJgC/AC8AuwA3 ALcAPwC0AEUAsQBLAK4AUQCsAFYAqgBcAKgAYQCmAGgAowBwAKEAeQCfAIQAnQCRAJoAoACYALEA lgDMAJUA8QCUAP8AkQD/AIsA/wCIAP8AhgD/APcAAADsAAAA3gAAAMkAAAC8AAAAtAAAAK8ACgCr ABAAqQAXAKgAIACnACgAogAwAJ8AOACcAD4AmgBEAJgASgCWAE8AlABVAJMAWgCRAGEAjwBoAI0A cQCLAHsAiQCIAIcAlwCFAKgAgwC+AIEA5ACAAP8AgAD/AHwA/wB7AP8AeQD/AOkAAADXAAAAwQAA ALEAAACmAAAAnQAAAJcABQCUAA0AkgASAJAAGgCPACIAjgAqAIsAMQCJADgAhwA+AIUAQwCDAEgA gQBOAH8AVAB+AFoAfABhAHoAaQB4AHMAdgB/AHUAjgBzAJ8AcQCzAHAA0ABvAPYAbwD/AG8A/wBt AP8AbAD/ANoAAAC/AAAArAAAAJ4AAACTAAAAjAAAAIUAAACCAAkAfwAPAH4AFQB9ABwAfAAkAHoA KwB3ADEAdQA3AHQAPQByAEIAcQBIAG8ATQBuAFMAbABaAGsAYgBpAGwAZwB4AGYAhgBkAJcAYgCq AGEAwgBgAOsAYQD/AGEA/wBhAP8AYAD/AMUAAACtAAAAmwAAAI0AAACDAAAAfAAAAHcAAAByAAUA cAAMAG4AEQBsABcAbAAeAGsAJQBpACwAZwAxAGYANwBkAD0AYwBCAGIASABgAE4AXwBVAF0AXQBc AGYAWgByAFkAgABXAJAAVgCjAFUAuQBUAN4AVAD7AFQA/wBVAP8AVQD/ALYAAACfAAAAjQAAAH8A AAB1AAAAbgAAAGkAAABmAAEAYwAJAGEADgBgABMAXwAZAF4AIABdACYAWwAsAFoAMgBYADcAVwA9 AFYAQwBVAEkAUwBQAFIAWABRAGEATwBsAE4AegBMAIoASwCcAEoAsQBJAM4ASQDzAEkA/wBJAP8A SgD/AKoBAACUBQAAggcAAHQIAABqCAAAYwYAAF4EAABbAAAAWQAFAFcADABWABAAVAAVAFMAGwBS ACIAUQAoAFAALQBOADMATQA4AEwAPgBLAEUASgBMAEgAVABHAF0ARgBoAEQAdQBDAIUAQQCYAEAA qwBAAMUAPwDqAD8A/wBAAP8AQAD/AKAIAACKCwAAeQ0AAGwNAABhDQAAWg0AAFULAABSCQAAUAYA AE8CCABOAA0ATAASAEsAFwBKAB4ASQAjAEcAKQBGAC8ARQA0AEQAOgBCAEEAQQBIAEAAUAA+AFoA PQBkADwAcgA6AIIAOQCUADgApwA3AL4ANgDjADYA+QA2AP8ANwD/AJgNAACDDgAAchAAAGURAABb EQAAUxAAAE4QAABKDgAASA0AAEcKAwBHBwoARQQOAEQCEwBCAhoAQQIgAEADJQA+AysAPQQxADwE NwA7BD4AOgVFADkFTgA3BVcANgViADQGcAAyBoAAMQaSADAGpQAvBbsALgXdAC4G9QAtB/8ALgf/ AJEQAAB9EQAAbBMAAF8UAABVFAAAThQAAEgTAABEEgAAQRAAAEAOAABADQYAQAoMAD4JEAA8CRYA OwocADkKIgA4CigANwsuADYLNQA1CzsAMwtDADIMTAAwDFYALwxhAC0MbwArDH8AKgySACgMpQAn DLsAJQzdACUN9QAmDf8AJw3/AIsSAAB3FAAAZxYAAFsXAABRGAAASRcAAEMXAAA/FQAAPBQAADoS AAA5EQEAOQ8IADgODQA3DhIANQ4YADQOHwAyDiUAMQ8sADAPMgAvEDoALRBCACwQSwAqEFUAKBBh ACYQbwAkEIAAIxCTACEQpwAfEL0AHhDgAB4R9wAfEP8AIBD/AIYUAABzFwAAYxkAAFcaAABNGwAA RRoAAEAaAAA7GQAAOBgAADUWAAA0FAAAMxIEADISCwAxEhAALxIVAC0SHAAsEyIAKxMpACoTMAAo EzcAJxQ/ACYUSAAkFFMAIhRfACAVbQAfFX4AHRWRABsVpQAZFbsAGBXeABgV+AAZFP8AGhT/AIIX AABvGgAAXxwAAFMdAABKHQAAQh0AADwdAAA3HAAANBsAADEaAAAvGQAALhYAACwXCAArFg4AKRcT ACgXGQAnGCAAJRgmACQYLQAjGDQAIhk9ACAZRgAeGVEAHRldABsaawAZGnwAFxqPABUaowAUGboA EhnbABMZ9gAUGf8AFRj/AH0aAABrHQAAXB8AAFAgAABHIAAAPyAAADkfAAA0HwAAMR4AAC0dAAAr HAAAKRsAACcbBQAlGwwAJBwRACIcFgAhHB0AIB0jAB8dKgAeHTIAHB46ABseRAAZHk4AFx5bABYe aQAUH3oAEh6NABEeogAQHrgADh7YAA8e9QAQHf8AER3/AHodAABnHwAAWSEAAE0iAABEIgAAPCIA ADYiAAAyIQAALiEAACogAAAnIAAAJB8AACIgAgAgIAoAHiEPAB0hFAAcIRoAGyIhABkiJwAYIi8A FyI4ABUjQQAUI0wAEiNYABEjZwAQI3gADiOLAA0jnwAMI7QACyPQAAsi8AAMIv8ADSH/AHYfAABk IgAAViMAAEskAABBJAAAOiQAADQkAAAvIwAAKyMAACgjAAAkIwAAICMAAB0kAAAbJQcAGSYNABcm EQAWJhcAFSceABQnJQATJywAEic1ABEoPwAQKEoADihWAA0oZAAMKHQACiiHAAkomwAHJ7EABSfM AAYn7AAHJv4ACCb/AHEiAABgJAAAUyYAAEgnAAA/JwAANyYAADEmAAAtJgAAKSUAACUlAAAiJQAA HScAABkoAAAWKgQAFCsLABIsEAARLBQAECwbABAsIgAOLCkADi0yAA0tOwALLUYACi1SAAgtYAAG LXAABC2DAAItmAAALK4AACzJAAAs6wABK/wAAiv/AG0lAABdJwAATygAAEUpAAA8KQAANSkAAC8o AAArKAAAJycAACMnAAAfKAAAGyoAABcsAAATLgIAEDAIAA4xDQANMRIADDEXAAsxHgAKMSYACDIu AAcyNwAFMkIAAzJOAAEyXAAAMmwAADJ/AAAylQAAMawAADHHAAAw6gAAMPwAADD/AGgpAABYKgAA TCsAAEEsAAA5LAAAMisAAC0rAAApKgAAJSoAACArAAAcLAAAFy4AABMwAAAQMgIADjQHAAo3DAAH NxAABTcUAAM3GwACNyIAADcqAAA4MwAAOD4AADhKAAA4WAAAOGgAADh8AAA3kgAAN6kAADbFAAA2 6gAANv0AADX/AGMsAABULgAASC8AAD4vAAA2LgAAMC4AACstAAAnLQAAIi0AAB0vAAAYMQAAFDMA ABA1AAAONwEACjoHAAY7CwACPA4AAD0SAAA+FwAAPh4AAD4mAAA+LwAAPjoAAD5GAAA+VAAAPmQA AD53AAA+jwAAPacAAD3DAAA86QAAPP0AADv/AF4wAABQMQAARDIAADsyAAA0MQAALjAAACkvAAAk MAAAHjIAABk0AAAUNgAAEDkAAA07AAAKPQAABUAFAABBCgAAQg0AAEMQAABEFAAARRoAAEYiAABG KwAARjUAAEZBAABGTwAARl8AAEZzAABFigAARaQAAETAAABD6AAAQ/4AAEL/AFg0AABLNQAAQTUA ADk1AAAyNAAALTMAACY0AAAgNQAAGjgAABQ6AAAQPQAADUAAAAlCAAAERQAAAEcDAABIBwAASgsA AEsOAABMEQAAThUAAE8cAABPJQAATy8AAE88AABPSgAAT1oAAE5tAABOhQAATaAAAEy8AABL5wAA S/4AAEr/AFM5AABHOQAAPjkAADc4AAAxNwAAKTcAACE5AAAbPAAAFT8AABBCAAAMRQAAB0gAAAJK AAAATQAAAE8AAABRBAAAUgcAAFQLAABVDgAAVxEAAFkXAABaHwAAWSkAAFk2AABZRAAAWVQAAFhn AABYfwAAV5oAAFa3AABV4wAAVP0AAFT/AE49AABDPQAAPDwAADU7AAAsPAAAJD4AABxBAAAVRAAA EEgAAAtLAAAFTgAAAFEAAABUAAAAVwAAAFkAAABbAAAAXQIAAF4GAABgCwAAYg4AAGQSAABnGAAA ZyIAAGYuAABmPAAAZk0AAGVgAABldwAAZJMAAGOxAABh3QAAYPwAAF//AElCAABBQQAAOj8AADBA AAAmQwAAHkYAABVKAAAQTgAAClIAAANWAAAAWgAAAF0AAABgAAAAYwAAAGUAAABnAAAAaQAAAGsB AABtBQAAbwoAAHIOAAB1EgAAdxsAAHYmAAB2NQAAdUYAAHRZAAB0bwAAc4sAAHKpAABwzQAAb/cA AG7/AEZGAABARQAANUYAACpIAAAgTAAAF1EAABBWAAAJWgAAAV8AAABjAAAAaAAAAGsAAABvAAAA cgAAAHUAAAB3AAAAeQAAAHsAAAB9AAAAgAMAAIMIAACGDQAAiRMAAIodAACKKwAAiTwAAIhPAACG ZgAAhYEAAISgAACCwgAAgfAAAH//AEZLAAA6TAAALk8AACNTAAAYWAAAEF4AAAlkAAAAaQAAAG8A AAB0AAAAeAAAAHwAAACBAAAAhAAAAIcAAACIAAAAiwAAAI4AAACQAAAAkwAAAJYAAACZBwAAnQ0A AKEUAACgIQAAoDEAAJ5EAACdWwAAnHYAAJmWAACZtQAAluUAAJX+AD9SAAAyVQAAJloAABtgAAAR ZwAACW0AAAB0AAAAewAAAIEAAACGAAAAiwAAAJAAAACUAAAAlwAAAJkAAACcAAAAnwAAAKEAAACk AAAApwAAAKoAAACtAAAAsQYAALUNAAC4FgAAtyYAALY5AAC1UAAAtGoAALKJAACwqgAArs8AAK31 ADdcAAArYQAAHmgAABNwAAALeAAAAIAAAACHAAAAjgAAAJUAAACaAAAAnwAAAKQAAACoAAAArAAA AK0AAACwAAAAswAAALUAAAC4AAAAuwAAAL8AAADDAAAAxwAAAMsFAADRDgAA0RsAANAuAADPRQAA zV8AAMt+AADJngAAyL4AAMXpAC9pAAAjcAAAFnkAAA2BAAABiwAAAJMAAACbAAAAogAAAKgAAACu AAAAtAAAALgAAAC9AAAAwAAAAMIAAADFAAAAyAAAAMsAAADOAAAA0QAAANYAAADbAAAA3wAAAOQA AADoBgAA6xEAAOojAADqOgAA6VQAAOdyAADlkwAA47MAAOPUAP8AAAD/AAAA/wAAAP8ABAD/AAsA /wAQAP8AFwD/ACEA/wArAP8ANQD/AD4A/wBHAP8ATgD/AFUA/ABbAPoAYQD4AGYA9gBtAPQAcwDy AHsA7wCEAO0AjgDqAJkA5gCnAOMAuQDfANUA2wD3ANYA/wDAAP8AsgD/AKoA/wClAP8AogD/AP8A AAD/AAAA/gAAAPwAAAD8AAMA/gALAP8AEQD/ABoA/QAkAPkALgD0ADgA8ABAAOwASADpAE4A5gBU AOIAWgDfAF8A3ABlANgAawDUAHIA0AB7AM0AhQDKAJEAxwCeAMMArgDAAMUAvQDrALsA/wCwAP8A pAD/AJwA/wCYAP8AlQD/AP8AAAD6AAAA9AAAAPEAAADyAAAA6gAFAOcADgDiABUA4QAeAOEAKADY ADEA0AA5AMsAQADIAEcAxQBNAMIAUwC/AFgAvQBeALsAZAC5AGsAtgBzALQAfACxAIgArgCVAKsA pACoALgApgDcAKMA+wCfAP8AlQD/AI8A/wCLAP8AiQD/APkAAADvAAAA5wAAAN8AAADPAAAAyAAA AMEACgC/ABEAvAAYALsAIQC5ACoAtAAyALEAOgCuAEAAqwBGAKgATACmAFEAowBWAKEAXACfAGMA nQBqAJsAcwCZAH4AlgCMAJQAmwCSAK0AkADHAI4A8ACNAP8AhgD/AIAA/wB9AP8AfAD/AO0AAADg AAAA0QAAAL8AAACzAAAAqgAAAKYABQCiAA0AoQATAKAAGwCfACMAmwArAJgAMgCVADkAkwA/AJEA RACPAEoAjgBPAIwAVQCKAFsAiABjAIYAawCEAHYAggCCAIAAkgB+AKMAfAC6AHoA4QB5AP8AdwD/ AHIA/wBwAP8AbwD/AN0AAADLAAAAtgAAAKcAAACdAAAAlAAAAI4AAQCLAAoAiQAQAIgAFQCHAB0A hwAlAIQALACCADIAfwA4AH0APQB7AEMAeQBIAHgATgB2AFQAdQBbAHMAYwBxAG4AbwB6AG0AiQBs AJoAagCuAGkAzABoAPYAZwD/AGUA/wBkAP8AYwD/AMoAAAC0AAAAoQAAAJMAAACJAAAAggAAAHsA AAB4AAUAdgAMAHUAEQB0ABgAcwAfAHIAJQBwACwAbgAyAGwANwBqADwAaQBCAGgASABmAE4AZQBV AGMAXQBiAGYAYAByAF4AgABdAJIAWwClAFoAvgBZAOkAWQD/AFkA/wBYAP8AWAD/ALkAAACiAAAA kAAAAIMAAAB5AAAAcQAAAG0AAABpAAEAZgAJAGUADgBkABMAYwAZAGMAIABhACYAYAAsAF4AMQBc ADcAWwA8AFoAQgBYAEgAVwBPAFYAVwBUAGAAUwBsAFEAeQBQAIoATwCeAE4AtABNANoATQD7AE0A /wBNAP8ATQD/AKoAAACUAAAAggAAAHUAAABrAAAAZAAAAGAAAABdAAAAWgAFAFgADABXABAAVgAV AFYAGwBVACEAUwAnAFIALABRADEATwA3AE4APQBNAEMATABKAEoAUgBJAFsASABmAEYAcwBFAIQA RACXAEMArABCAMkAQgDxAEIA/wBDAP8AQwD/AJ4AAACJAAAAeAMAAGoEAABhBAAAWgMAAFUBAABS AAAAUAACAE4ACQBNAA0ATAARAEsAFwBKABwASQAiAEgAJwBHAC0ARQAyAEQAOABDAD4AQgBFAEEA TQA/AFYAPgBhAD0AbgA7AH4AOgCRADkApgA4AL8AOADoADgA/wA5AP8AOQD/AJUDAACABwAAbwkA AGIKAABYCwAAUQoAAEwIAABJBgAARwMAAEYABgBEAAsAQwAPAEIAEwBBABgAQQAeAD8AIwA+ACkA PQAuADsANAA6ADoAOQBBADgASQA3AFIANgBdADQAagAzAHoAMgCMADEAoQAwALgALwDeAC8A+QAv AP8AMAD/AIwJAAB4DAAAaA0AAFwOAABSDgAASw4AAEUNAABBDAAAPwoAAD4IAgA9BAgAPAENADsA EAA6ABUAOQAaADgAIAA2ACUANQArADQAMAAzADcAMgA+ADEARgAvAFAALgBaAC0AZwArAHcAKgCJ ACkAnQAoALMAJwDRACcA8gAnAP8AJwD/AIYMAAByDgAAYxAAAFYRAABNEQAARREAAEAQAAA8DwAA OQ4AADcNAAA2CwQANggKADUGDgA0BRIAMgQXADEFHAAwBSIALwUoAC4GLgAtBjQAKwY8ACoGRAAp B04AJwdZACYHZQAkB3UAIweHACIHmwAgBrAAIAbLAB8F7QAfBv4AHwf/AIAOAABtEQAAXhIAAFIT AABIEwAAQRMAADsTAAA3EgAANBEAADIQAAAwDwEAMA0GADALCwAvChAALQoUACwLGQAqCx8AKQsl ACgMKwAnDDIAJgw6ACQMQwAjDE0AIQ1YACANZQAeDXUAHA2IABoNnAAZDbEAGAzKABcM6wAXDfwA GAz/AHsRAABpEwAAWhUAAE4WAABFFgAAPRYAADgVAAAzFQAAMBQAAC0TAAArEgAAKhADACoPCAAp Dg0AKA4RACYOFgAlDx0AJA8jACMPKQAhEDEAIBA5AB4QQgAdEEwAGxBYABkQZgAXEHYAFRCJABQQ ngASELMAERDOABEQ7gASEP4AEhD/AHcTAABlFQAAVxcAAEsYAABCGQAAOhkAADQYAAAwFwAALBcA ACkWAAAnFQAAJhQBACUSBAAjEgsAIhIPACESFAAgEhoAHhMgAB0TJwAcEy4AGhM2ABkUQAAXFEoA FhRWABQUZAASFHQAERSHABAUnAAOFLEADRTKAA0U6wAOE/4ADhP/AHMVAABhGAAAUxoAAEgbAAA/ GwAANxsAADIaAAAtGgAAKRkAACYYAAAkGAAAIhcAACAWAQAeFggAHRYNABsXEgAaFxcAGRcdABgY JAAWGCsAFRg0ABQYPQASGUgAERlUABAZYgAOGXIADRmEAAwZmAAKGa0ACRjGAAkY5wAJGPoAChf/ AG8YAABeGgAAUBwAAEUdAAA8HQAANR0AAC8dAAAqHAAAJhsAACMbAAAhGgAAHhoAABwaAAAaGwUA GBsMABYcEAAVHBUAFBwbABMcIgASHSkAER0xABAdOwAOHUUADR5RAAweXgAKHm0ACR6AAAcelAAF HaoAAx3CAAMd5gAEHPgABRz/AGsaAABbHQAATR4AAEIfAAA6HwAAMh8AAC0fAAAoHgAAJB4AACEd AAAeHQAAHB0AABgeAAAVHwIAEyAJABIhDgAQIRIAECEYAA4hHwAOIiYADSIuAAwiNwAKIkEACSJN AAciWgAFImkAAyJ8AAEikQAAIqgAACHAAAAh5QAAIPgAACD/AGcdAABXHwAASiEAAEAhAAA3IgAA MCEAACohAAAmIAAAIiAAAB8fAAAcHwAAGSAAABYhAAASIwIAECQHAA4mDAAMJhAACyYVAAomHAAJ JiIACCYqAAYnMwAEJz0AAydJAAEnVgAAJ2YAACd5AAAnjwAAJqYAACa/AAAl5AAAJfkAACT/AGMg AABUIgAARyMAAD0kAAA0JAAALiMAACgjAAAkIgAAISIAAB4hAAAaIgAAFyMAABMkAAAQJgIADigH AAsqCwAIKw4ABisTAAQrGAACKx8AASwnAAAsMAAALDoAACxFAAAsUwAALGMAACx2AAAsjAAAK6QA ACu+AAAq5AAAKvoAACn/AF8jAABQJQAARCYAADomAAAyJgAAKyYAACYlAAAjJAAAHyQAABskAAAX JQAAFCcAABEpAAAOKwIACy0GAAcvCwAEMA4AADARAAAxFQAAMRwAADEjAAAyLAAAMjYAADJCAAAy TwAAMl8AADJyAAAxiQAAMaIAADC8AAAw5AAAL/sAAC//AFonAABMKAAAQCkAADcpAAAvKQAAKSgA ACUnAAAhJgAAHCcAABgoAAAUKgAAESwAAA4uAAALMAEABzIFAAM0CQAANQwAADYPAAA3EgAAOBgA ADggAAA4KAAAODIAADk9AAA5SwAAOVsAADhuAAA4hQAAN58AADe6AAA25AAANfwAADX/AFUqAABI LAAAPSwAADQsAAAtKwAAKCoAACQpAAAeKgAAGSsAABQtAAARLwAADTEAAAo0AAAHNgAAAjgEAAA6 BwAAOwoAAD0NAAA+EAAAQBQAAEAbAABAJAAAQC4AAEA5AABARwAAQFYAAEBpAABAgAAAP5sAAD63 AAA94wAAPPwAADz/AFAvAABDLwAAOS8AADIvAAAsLQAAJywAACAtAAAaLwAAFTEAABEzAAANNgAA CTgAAAU7AAAAPQAAAEABAABBBAAAQwcAAEULAABGDgAASBEAAEoWAABKHgAASigAAEo0AABJQgAA SVEAAElkAABIewAASJcAAEe0AABG4AAARfwAAET/AEozAAA/MwAANjMAADAxAAAqMAAAIzEAABwz AAAWNQAAETgAAA07AAAIPgAAA0EAAABDAAAARgAAAEgAAABKAAAATAQAAE4HAABPCwAAUQ4AAFQS AABVGQAAVSIAAFQuAABUPAAAVEsAAFNeAABTdAAAUpAAAFGuAABQ1wAAT/sAAE7/AEU3AAA8NwAA NTYAAC80AAAmNQAAHjcAABc6AAARPQAADEEAAAdEAAAASAAAAEoAAABNAAAAUAAAAFMAAABVAAAA VwAAAFgCAABbBgAAXQsAAF8OAABiEwAAYhsAAGInAABiNAAAYUUAAGBXAABgbQAAX4kAAF2nAABc zAAAWvgAAFn/AEE8AAA6OwAANDkAACo6AAAhPAAAGEAAABFDAAAMRwAABksAAABPAAAAUwAAAFYA AABZAAAAXAAAAF8AAABhAAAAYwAAAGUAAABnAQAAagUAAG0KAABwDgAAcxUAAHIgAAByLQAAcT0A AHBPAABvZQAAboAAAG2fAABrwQAAafEAAGj/AD9AAAA5PgAALj8AACRCAAAaRgAAEkoAAAxPAAAE VAAAAFgAAABdAAAAYQAAAGUAAABoAAAAawAAAG4AAABxAAAAcwAAAHUAAAB4AAAAewAAAH4DAACB CgAAhQ8AAIcXAACGJAAAhTQAAIRGAACCXQAAgXYAAH+WAAB+tgAAfOcAAHr/AD9EAAAzRQAAKEgA AB1MAAATUgAADFcAAANdAAAAYwAAAGgAAABtAAAAcQAAAHYAAAB6AAAAfgAAAIEAAACDAAAAhgAA AIkAAACLAAAAjgAAAJIAAACVAQAAmQkAAJ4QAACeGgAAnSkAAJw8AACaUgAAmGwAAJaLAACUqgAA ktQAAJD6ADhLAAAsTgAAIFMAABVZAAANYAAAA2cAAABuAAAAdAAAAHoAAACAAAAAhAAAAIoAAACO AAAAkgAAAJUAAACXAAAAmgAAAJ0AAACgAAAAowAAAKcAAACrAAAArwAAALQJAAC4EAAAtx4AALUw AACzRgAAsWAAAK9+AACsoAAAq8EAAKnuADFVAAAkWwAAGGEAAA5pAAAFcQAAAHkAAACBAAAAiAAA AI8AAACUAAAAmgAAAJ8AAACkAAAAqAAAAKkAAACsAAAArwAAALMAAAC1AAAAuQAAAL0AAADBAAAA xgAAAMsAAADRCgAA0xQAANElAADQOwAAzVQAAMpxAADIkgAAxbMAAMPeACliAAAcaQAAEXEAAAd7 AAAAhAAAAI0AAACVAAAAnQAAAKMAAACpAAAArwAAALQAAAC5AAAAvAAAAL4AAADCAAAAxQAAAMgA AADMAAAA0AAAANQAAADaAAAA3wAAAOQAAADqAAAA7gwAAO0aAADsLwAA6kkAAOhlAADmhgAA5KUA AOLGAP8AAAD/AAAA/wAAAPwAAQD8AAgA/gAOAP8AFAD/AB0A/wAmAP8AMAD/ADoA/wBCAP8ASQD+ AFAA+wBWAPkAXAD2AGIA9ABoAPIAbwDwAHYA7QB/AOoAiQDnAJUA5ACjAOAAtQDbANAA1QD2AMoA /wC2AP8AqAD/AJ8A/wCaAP8AlgD/AP8AAAD7AAAA9gAAAPMAAADzAAAA9gAJAPoADgD9ABYA+wAg APcAKgDyADMA7QA7AOkAQwDmAEkA4gBPAN4AVQDbAFsA1gBgANIAZwDPAG4AzAB2AMkAgADGAIwA wgCaAL8AqgC7AMEAuADpALYA/wCnAP8AmgD/AJIA/wCNAP8AigD/APoAAADxAAAA6gAAAOcAAADn AAAA5AABAOAACwDbABEA2gAaANsAIwDRACwAygA0AMYAOwDCAEIAvwBIALwATgC6AFMAuABZALYA XwCzAGYAsQBuAK4AdwCsAIMAqQCRAKYAoQCjALUAoADYAJ4A+wCVAP8AiwD/AIUA/wCAAP8AfgD/ AO8AAADjAAAA2gAAANMAAADGAAAAvwAAALkABgC3AA4AtAAUALQAHQCzACUArgAtAKsANACnADsA pABBAKEARgCfAEwAnQBRAJsAVwCZAF4AlwBlAJUAbgCTAHkAkACHAI4AlwCMAKkAiQDEAIgA7wCF AP8AfAD/AHYA/wBzAP8AcgD/AOAAAADQAAAAxgAAALYAAACpAAAAoQAAAJ0AAQCZAAoAmAAQAJgA FgCXAB4AlAAmAJEALQCPADQAjAA6AIoAPwCIAEUAhwBKAIUAUACDAFYAgQBeAIAAZgB+AHEAfAB9 AHkAjQB3AKAAdQC2AHMA3wByAP8AbgD/AGkA/wBnAP8AZQD/AMwAAAC+AAAAqwAAAJ0AAACTAAAA igAAAIUAAACCAAUAgAANAH8AEQB/ABgAgAAgAH0AJgB6AC0AdwAzAHUAOAB0AD4AcgBDAHAASQBv AE8AbQBWAGwAXgBqAGgAaAB1AGcAhABlAJYAZACrAGIAyQBhAPYAYAD/AFwA/wBbAP8AWgD/AL0A AACpAAAAlwAAAIkAAAB+AAAAeAAAAHMAAABvAAEAbQAJAGwADgBrABMAawAZAGoAIABoACYAZgAs AGUAMgBjADcAYgA8AGAAQgBfAEgAXQBPAFwAVwBaAGEAWQBtAFcAewBWAI4AVQCiAFMAuwBSAOkA UgD/AFAA/wBPAP8ATwD/AK0AAACYAAAAhgAAAHgAAABuAAAAZwAAAGMAAABgAAAAXQAFAFwACwBb ABAAWwAVAFsAGwBaACEAWAAmAFYALABUADEAUwA2AFIAPABRAEIATwBJAE4AUQBNAFsASwBmAEoA dABJAIUASACZAEcAsQBGANgARgD8AEUA/wBFAP8ARQD/AJ8AAACJAAAAeAAAAGwAAABiAAAAWwAA AFYAAABTAAAAUQACAE8ACABPAA0ATgARAE4AFgBNABwATAAhAEoAJgBJACwASAAxAEcANwBFAD0A RABEAEMATABCAFUAQABgAD8AbgA+AH4APQCSADwAqQA7AMcAOwDzADsA/wA7AP8APAD/AJMAAAB+ AAAAbgAAAGEAAABYAAAAUQAAAEwAAABJAAAARwAAAEUABQBEAAsAQwAOAEMAEgBDABcAQgAdAEAA IgA/ACcAPgAsAD0AMgA7ADgAOgA/ADkARwA4AFAANwBbADUAaAA0AHgAMwCMADIAogAxALwAMQDn ADEA/wAyAP8AMwD/AIkAAAB2AwAAZgUAAFkHAABQBwAASQYAAEMFAABAAwAAPgEAADwAAwA7AAgA OgANADoAEAA5ABQAOQAZADcAHgA2ACMANQAoADQALgAzADQAMgA7ADAAQwAvAEwALgBXAC0AZAAs AHMAKwCHACoAnAApALUAKQDcACkA+wApAP8AKgD/AIEEAABuCAAAXwoAAFMLAABKCwAAQgsAAD0K AAA5CQAANggAADUFAAA0AgYAMwAKADIADgAxABEAMQAVADAAGgAvAB8ALgAkACwAKgArADAAKgA3 ACkAPwAoAEkAJwBUACYAYAAkAG8AIwCCACIAlwAhAK4AIQDMACEA8wAhAP8AIgD/AHsJAABoDAAA Wg0AAE4OAABFDgAAPQ4AADgNAAAzDQAAMAwAAC4LAAAtCQMALQYIACwEDAArAg8AKgESACkBFwAo ARwAJwAhACYAJwAlAC0AJAA0ACMBPQAiAUYAIQFRAB8BXQAeAWwAHAF/ABsAlAAaAKoAGgDFABoA 6wAZAP8AGgD/AHUMAABkDgAAVQ8AAEoQAABAEAAAORAAADMQAAAvDwAALA4AACkOAAAnDQEAJwwF ACcKCgAmCA0AJQcQACQGFAAiBhkAIQYfACAHJAAfBysAHgcyAB0HOgAcCEQAGghPABkIXAAXCGsA Fgh9ABUHkQAUB6cAEwa/ABIF5AASBfoAEgX/AHEOAABfEAAAUREAAEYSAAA9EgAANhIAADASAAAr EQAAKBEAACUQAAAjEAAAIg4EACENBwAhDAsAIAsOAB8LEgAdCxcAHAwcABsMIgAaDCkAGQwxABgM OQAWDUMAFQ1PABMNXAASDWsAEA1+AA8NkgAODacADQy+AA0M4AANDPUADQz/AG0QAABcEQAAThMA AEMUAAA6FAAAMhQAAC0UAAAoEwAAJRMAACISAAAgEQAAHhEDABwQBQAcDwgAGw8MABoOEAAZDxQA Fw8aABYPIQAVECgAFBAwABIQOQAREEQAEBBQAA4QXQANEGsADBB8AAsQkAAJEKUACBC8AAcQ3wAH EPQABw//AGkRAABYFAAASxUAAEAWAAA3FgAAMBYAACoWAAAmFQAAIhUAAB8UAAAdEwAAGhMCABkS BAAXEgYAFhIKABUSDgAUEhIAEhIYABETHgAREyUAEBMuAA4TNwANFEAADBRLAAsUWAAJFGcABxR4 AAYUjQAEFKMAAxO7AAIT3QABEvQAAhL/AGUTAABVFgAASBcAAD0YAAA0GAAALRgAACgYAAAjFwAA IBcAAB0WAAAaFQAAGBUCABYVBAAUFQUAEhYIABEWDQAQFxAADhcVAA4XGwANFyIADBcpAAsYMgAJ GDwABxhHAAUYVAAEGGMAAhh1AAEYiwAAF6EAABe5AAAX3QAAFvUAABb/AGEWAABSGAAARRoAADsa AAAyGgAAKxoAACUaAAAhGQAAHhgAABsYAAAYFwAAFhcCABQXAwASGAUAEBkHAA4bCwAMGw8ACxsT AAobGAAIHB8ABxwmAAUcLwAEHDgAAhxEAAAdUQAAHWAAAB1yAAAciAAAHKAAABu5AAAb3gAAGvYA ABr/AF4YAABPGgAAQhwAADgcAAAvHQAAKRwAACMcAAAfGwAAHBoAABkZAAAXGQEAFBkCABIaAwAQ GwQADh0HAAweCwAJHw4ABiARAAUgFgADIBwAASEjAAAhKwAAITUAACFAAAAhTgAAIV0AACFvAAAh hgAAIJ4AACC4AAAf3gAAHvgAAB7/AFobAABLHQAAPx4AADUfAAAtHwAAJx4AACIdAAAeHQAAGxwA ABgbAAAVGwAAEhwAABAdAgAOHwQADCEGAAkiCgAFIw0AAiQQAAAlEwAAJRkAACYgAAAmKAAAJjIA ACY9AAAmSgAAJloAACZsAAAmgwAAJZwAACW3AAAk3wAAI/kAACP/AFUeAABHIAAAPCEAADIhAAAr IQAAJSAAACAfAAAdHgAAGh0AABYeAAATHgAAECAAAA4hAAAMIwIACCUFAAUnCQAAKAsAACoOAAAr EQAALBYAACwdAAAsJQAALC4AACw6AAAsRwAALFYAACxpAAAsgAAAK5oAACq1AAAp3wAAKfsAACj/ AFEiAABEIwAAOCQAAC8kAAAoIwAAIyIAAB8hAAAcIAAAFyAAABMhAAAQIwAADiQAAAsmAAAIKAAA BCoEAAAsBwAALgkAADAMAAAxDwAAMxMAADMZAAAzIQAAMyoAADM1AAAzQwAAM1IAADNlAAAyewAA MpcAADGzAAAw3gAAL/sAAC7/AEwlAAA/JgAANScAAC0mAAAnJQAAIiQAAB4jAAAZIwAAFCQAABEm AAAOKAAACyoAAAcsAAADLwAAADECAAAzBAAANQcAADcKAAA5DQAAOhAAADsVAAA7HQAAOyYAADsx AAA7PgAAO04AADtgAAA6dwAAOZIAADiwAAA32wAANvwAADX/AEcpAAA7KgAAMioAACspAAAlJwAA ISYAABsnAAAVKAAAESoAAA4sAAAKLwAABjEAAAE0AAAANgAAADgAAAA7AQAAPQQAAD8HAABBCgAA Qw4AAEURAABFGAAARSEAAEUsAABEOQAAREgAAERbAABDcQAAQo0AAEGrAABA0gAAP/oAAD7/AEIt AAA4LgAALy0AACkrAAAkKgAAHSoAABcsAAARLgAADTEAAAk0AAAENwAAADoAAAA8AAAAPwAAAEEA AABEAAAARgAAAEgDAABKBwAATAsAAE4OAABQEwAAUBwAAFAnAABPNAAAT0MAAE9VAABOagAATYYA AEykAABKygAASfgAAEj/AD4yAAA1MQAALi8AACkuAAAgLgAAGTEAABIzAAAONwAACToAAAI9AAAA QAAAAEQAAABHAAAASQAAAEwAAABPAAAAUQAAAFMAAABVAQAAWAYAAFoLAABdDgAAXxUAAF4gAABe LAAAXTwAAFxOAABbYwAAWn4AAFidAABXwAAAVfIAAFT/ADo2AAAzNAAALTIAACQzAAAbNgAAEzkA AA49AAAIQQAAAEUAAABJAAAATAAAAFAAAABTAAAAVgAAAFkAAABbAAAAXQAAAGAAAABiAAAAZQAA AGgFAABrCwAAbxAAAG8YAABuJQAAbTQAAG1GAABrWwAAanUAAGiUAABmtgAAZOkAAGL/ADg5AAAy NwAAKDkAAB47AAAVPwAADkQAAAdJAAAATQAAAFIAAABWAAAAWgAAAF4AAABiAAAAZQAAAGgAAABr AAAAbQAAAHAAAABzAAAAdgAAAHkAAAB9BAAAgQsAAIURAACEHQAAgiwAAIA+AAB+VAAAfmsAAHuK AAB6qgAAd9YAAHX9ADg9AAAsPgAAIkEAABdGAAAPSwAAB1EAAABXAAAAXAAAAGIAAABmAAAAawAA AG8AAAB0AAAAeAAAAHsAAAB+AAAAgAAAAIMAAACGAAAAigAAAI0AAACRAAAAlgMAAJsMAACdEwAA myEAAJozAACXSQAAlGIAAJN/AACQoAAAjsUAAIzzADFEAAAlSAAAGk0AABBTAAAIWgAAAGEAAABo AAAAbgAAAHQAAAB5AAAAfwAAAIQAAACJAAAAjQAAAJEAAACTAAAAlgAAAJkAAACdAAAAoAAAAKQA AACoAAAArAAAALIDAAC3DQAAtxcAALUoAACyPgAAsFYAAKxzAACqlAAAqbQAAKXlACpPAAAeVAAA ElsAAApiAAAAagAAAHMAAAB7AAAAggAAAIkAAACOAAAAlAAAAJoAAACfAAAApAAAAKYAAACpAAAA rQAAALAAAACzAAAAtwAAALsAAADAAAAAxQAAAMsAAADRBAAA1Q4AANMdAADQMgAAzUsAAMpmAADG hwAAwqkAAMHLACJbAAAWYgAADGsAAAF0AAAAfQAAAIcAAACQAAAAlwAAAJ4AAACkAAAAqwAAALEA AAC2AAAAugAAALwAAADAAAAAxAAAAMgAAADLAAAAzwAAANQAAADaAAAA4AAAAOYAAADrAAAA8QYA APATAADuJwAA7D8AAOpbAADnegAA5JsAAOC7AP8AAAD7AAAA9gAAAPMAAAD0AAUA9gAMAPoAEQD/ ABkA/wAiAP8ALAD/ADUA/wA9AP8ARQD8AEwA+gBSAPcAWAD1AF4A8wBkAPEAagDuAHIA7AB6AOkA hQDlAJEA4QCgAN0AsgDYAM4A0gD2AMEA/wCtAP8AngD/AJYA/wCQAP8AjAD/APoAAADyAAAA7AAA AOkAAADpAAAA7AAFAPIADAD4ABIA9wAbAPUAJQDwAC4A6wA3AOYAPgDiAEUA3QBLANgAUADTAFYA 0ABcAM0AYgDKAGoAyAByAMUAfADCAIgAvgCWALoAqAC3AL8AtADoAK4A/wCdAP8AkAD/AIgA/wCD AP8AgAD/APAAAADlAAAA3gAAANoAAADbAAAA3AAAANgABwDRAA4A0QAVANIAHgDLACcAxQAvAMAA NwC9AD0AugBEALcASQC1AE8AsgBVALAAWwCuAGEArABpAKkAcwCnAH8ApACNAKEAngCeALIAmwDV AJkA/ACMAP8AggD/AHsA/wB2AP8AdAD/AOIAAADTAAAAygAAAMcAAAC8AAAAtgAAALAAAQCvAAsA rAARAK0AGACtACAAqAAoAKQALwCgADYAnQA8AJsAQgCZAEcAlwBNAJUAUwCTAFkAkQBhAI8AagCM AHUAigCDAIgAlACGAKcAgwDCAIIA8AB8AP8AcwD/AG0A/wBqAP8AaAD/AM8AAADBAAAAuQAAAK0A AACgAAAAmAAAAJQAAACRAAYAkAANAJAAEgCPABkAjgAhAIsAKACIAC8AhgA1AIQAOgCCAEAAgABF AH4ASwB8AFIAegBZAHgAYgB2AGwAdAB5AHIAiQBxAJ0AbwC0AG0A3wBsAP8AZQD/AGAA/wBeAP8A XAD/AL4AAACxAAAAoAAAAJIAAACJAAAAggAAAHwAAAB6AAEAeAAJAHcADgB4ABQAdwAaAHQAIQBy ACcAcAAtAG4AMwBsADgAawA+AGkARABoAEoAZgBRAGQAWgBjAGQAYQBwAF8AfwBeAJMAXQCpAFwA yABbAPcAVwD/AFQA/wBSAP8AUQD/ALAAAACfAAAAjQAAAH8AAAB0AAAAbgAAAGoAAABmAAAAZQAE AGMACwBjABAAYwAVAGMAGwBhACEAXwAnAF0ALABcADIAWgA3AFkAPQBXAEMAVgBLAFUAUwBTAFwA UgBoAFAAdwBPAIkATgCfAE0AugBMAOkASwD/AEkA/wBHAP8ARwD/AKIAAACNAAAAfAAAAG4AAABl AAAAXgAAAFkAAABXAAAAVQABAFQABwBTAA0AUwARAFQAFgBSABsAUQAhAE8AJgBOACsATAAxAEsA NwBKAD0ASQBEAEcATABGAFYARABhAEMAcABCAIEAQQCXAEAArwA/ANcAPwD/AD4A/wA9AP8APgD/ AJQAAAB/AAAAbwAAAGMAAABZAAAAUQAAAE0AAABKAAAASAAAAEcABABHAAoARgAOAEYAEQBHABYA RQAcAEQAIQBCACYAQQArAEAAMQA+ADcAPQA+ADwARwA6AFAAOQBbADgAaQA3AHoANgCPADUApwA1 AMYANAD1ADQA/wA0AP8ANQD/AIgAAAB0AAAAZQAAAFgAAABPAAAASAAAAEMAAAA/AAAAPQAAADwA AgA8AAcAOwAMADsADwA7ABIAOgAXADkAHAA3ACEANgAmADUALAA0ADIAMwA5ADEAQQAwAEsALwBW AC4AYwAtAHMALACIACwAoAArALsAKwDqACsA/wArAP8ALAD/AH8AAABsAAAAXQEAAFECAABIAwAA QAMAADsCAAA3AAAANAAAADMAAAAyAAUAMgAJADIADQAxABAAMQATADAAGAAvAB0ALQAiACwAKAAr AC4AKgA1ACkAPQAoAEYAJwBRACYAXgAlAG4AJACCACMAmQAjALMAIgDeACIA/wAjAP8AJAD/AHcA AABlBAAAVgYAAEsHAABCCAAAOggAADUHAAAwBgAALQUAACwDAAArAAMAKgAHACkACwApAA4AKQAR ACgAFQAnABkAJgAeACUAJAAkACoAIwAxACIAOQAhAEMAIABOAB8AWgAeAGkAHQB8ABwAkwAbAKwA GwDNABsA9gAbAP8AHAD/AHAFAABfCAAAUQoAAEYLAAA9CwAANQsAADALAAArCgAAKAkAACUIAAAk BwIAIwQGACMCCQAiAQwAIgAPACEAEgAgABYAHwAbAB4AIAAdACYAHAAuABsANgAaAD8AGQBKABgA VwAXAGYAFgB4ABUAjwAVAKYAFADDABQA7gAUAP8AFQD/AGsIAABbCwAATQwAAEINAAA5DQAAMQ0A ACwNAAAnDQAAIwwAACEMAAAfCwEAHgoFAB0ICAAdBgsAHAUNABwEEAAbBBQAGQQYABkEHgAYBCMA FwQrABYEMwAVBDwAFARHABMDVAASA2MAEQN1ABACigAQAaIADwC8AA8A5QAPAP4AEAD/AGcLAABX DQAASQ4AAD4PAAA1DwAALg8AACgPAAAkDgAAIA4AAB0OAAAbDQEAGQ0EABgMBwAYCwkAFwkMABcJ DgAWCRIAFQkWABQJGwATCSEAEgkoABIJMAARCToAEAlFAA8JUgAOCWEADQlzAAwIiAALCJ8ACge3 AAoG2wAKBfYACgT/AGMNAABTDgAARhAAADsRAAAyEQAAKxEAACUQAAAhEAAAHRAAABoPAAAYDwEA Fg4EABUOBwAUDQkAEw0LABMMDQASDBAAEQwUABAMGQAQDB8ADwwnAA4NLwANDTkADA1FAAsNUQAJ DWAACA1xAAYNhgAFDZ0ABAy0AAMM0gACDPEAAgv/AF8OAABQEAAAQxEAADgSAAAvEgAAKBIAACMS AAAeEQAAGxEAABgRAAAVEAIAFBAFABIQBwARDwkAEA8KABAODAAODg4ADg8SAA0PFwAMEB0ADBAk AAoQLAAJEDYACBBBAAYQTgAFEF0AAxBvAAEQhAAAEJwAAA+0AAAO1AAADvMAAA7/AFwQAABNEgAA QBMAADYUAAAtFAAAJhQAACETAAAcEwAAGRIAABYSAAAUEQMAEhEGABERCAAQEAoADhALAA0RCwAM EQ0ACxIRAAoSFQAJEhoACBIhAAYTKQAFEzMAAxM+AAITSwAAE1oAABNsAAATggAAEpsAABK0AAAR 1wAAEfUAABH/AFgSAABJFAAAPRUAADMWAAArFgAAJBUAAB8VAAAaFAAAFxQAABQTAQATEgQAERIH ABASCQAOEgkADRIJAAsTCgAJFA0ABxUPAAYWEwAEFhgAAxYfAAIWJwAAFzAAABc7AAAXSAAAF1gA ABdqAAAWgAAAFpkAABW0AAAV2QAAFPcAABP/AFUUAABGFgAAOhcAADAYAAAoGAAAIhcAAB0WAAAZ FgAAFhUAABMUAwASEwYAEBMHAA8TBwANFAcACxUIAAkWCQAGGAwAAxoOAAEaEQAAGhYAABscAAAb JAAAGy0AABs4AAAbRgAAHFUAABtnAAAbfQAAG5cAABqzAAAZ2wAAGPkAABf/AFEWAABDGAAANxkA AC4aAAAmGgAAIBkAABsYAAAYFwAAFRYBABMVBQARFQQADxUEAA0WBAALFwUACRkGAAYaCAACHAoA AB4NAAAgEAAAIBMAACAZAAAgIQAAISoAACE1AAAhQgAAIVIAACBkAAAgegAAH5UAAB+xAAAe2wAA HfoAABz/AE0ZAAA/GwAANBwAACscAAAkHAAAHhsAABoaAAAXGAAAFBcCABIXAgAQGAEADRkBAAsa AgAIHAMABR0EAAIfBgAAIQgAACMLAAAlDgAAJhEAACYWAAAmHgAAJycAACcyAAAnPwAAJk4AACZg AAAmdwAAJZIAACSvAAAj2gAAIvsAACH/AEgdAAA8HgAAMR8AACgeAAAiHgAAHRwAABkbAAAWGgAA EhoAABAbAAANHAAACx0AAAgfAAAEIQAAASMCAAAlBAAAJwYAACkJAAAsDAAALg8AAC4TAAAuGgAA LiMAAC4uAAAuOwAALkoAAC1cAAAtcgAALI4AACusAAAq1AAAKfsAACj/AEQgAAA4IQAALiEAACYh AAAgIAAAHB4AABgdAAAUHQAAEB4AAA4fAAALIQAAByMAAAMlAAAAJwAAACkAAAAsAQAALgMAADAG AAAzCgAANQ0AADYRAAA2FwAANh8AADYpAAA2NgAANkUAADVXAAA1bQAANIkAADKoAAAxzwAAMPoA AC//AD8kAAA0JAAAKyQAACQjAAAfIQAAGyAAABYgAAARIQAADiMAAAolAAAGKAAAAioAAAAtAAAA LwAAADIAAAA0AAAANwAAADkDAAA7BgAAPgoAAEAOAABBEgAAQRoAAEAlAABAMQAAQEAAAD9SAAA+ ZwAAPYIAADyiAAA6xwAAOfgAADj/ADooAAAwKAAAKScAACMlAAAfIwAAGCQAABIlAAAOKAAACioA AAUtAAAAMAAAADMAAAA2AAAAOAAAADsAAAA+AAAAQAAAAEIAAABFAgAARwYAAEoKAABNDgAATRUA AEwfAABMKwAASzoAAEpMAABJYQAASHwAAEebAABFvwAAQ/MAAEL/ADYsAAAtKwAAJykAACMnAAAb KAAAFCoAAA4tAAAKMAAABDMAAAA3AAAAOgAAAD0AAABAAAAAQwAAAEYAAABIAAAASwAAAE0AAABQ AAAAUwEAAFYGAABZCwAAWxAAAFsZAABaJQAAWTQAAFhGAABXWgAAVXQAAFSTAABStQAAUOoAAE// ADMwAAAsLgAAJywAAB4tAAAWLwAAEDIAAAo2AAADOgAAAD8AAABCAAAARgAAAEkAAABMAAAATwAA AFIAAABVAAAAWAAAAFoAAABdAAAAYAAAAGMAAABnBgAAawwAAGwSAABrHgAAaywAAGk9AABnUgAA ZmoAAGSJAABhqwAAX9wAAF3/ADEzAAAsMQAAIjIAABk1AAAROQAACj0AAAJCAAAARwAAAEwAAABQ AAAAVAAAAFgAAABbAAAAXwAAAGIAAABlAAAAaAAAAGsAAABuAAAAcQAAAHUAAAB5AAAAfQYAAIIN AACCFgAAgCQAAH41AAB8SQAAe2EAAHh/AAB2nwAAc8YAAHD3ADE2AAAmOAAAHDsAABJAAAALRQAA AksAAABRAAAAVgAAAFsAAABgAAAAZQAAAGkAAABuAAAAcgAAAHYAAAB5AAAAfAAAAH4AAACCAAAA hQAAAIkAAACOAAAAkwAAAJgGAACcDgAAmxoAAJgrAACWQAAAklkAAJFzAACNlQAAi7UAAIjoACs+ AAAgQQAAFUcAAA1NAAACVAAAAFsAAABhAAAAaAAAAG4AAABzAAAAeQAAAH4AAACDAAAAiAAAAIwA AACPAAAAkgAAAJUAAACZAAAAnQAAAKEAAAClAAAAqgAAALAAAAC3BwAAuBEAALUhAACyNQAAr00A AKppAACoiAAApqgAAKLRACNIAAAYTgAADlQAAARcAAAAZAAAAG0AAAB1AAAAfAAAAIMAAACJAAAA jwAAAJUAAACbAAAAoAAAAKMAAACmAAAAqQAAAK0AAACxAAAAtQAAALkAAAC+AAAAxAAAAMoAAADS AAAA2goAANYWAADSKQAAzkEAAMpcAADFfAAAwp0AAMG9ABxVAAARXAAAB2UAAABuAAAAdwAAAH8A AACIAAAAkAAAAJgAAACfAAAApQAAAK0AAACzAAAAuAAAALoAAAC+AAAAwgAAAMYAAADKAAAAzgAA ANMAAADaAAAA4AAAAOcAAADtAAAA8wAAAPQOAADyHgAA7zYAAOxRAADobgAA5JAAAN+xAAAAAAAA AAAAAAAAAAAAAAABAwQFBggJCgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7 PD0+QEFCREVGR0lKS01OT1BSU1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKD hYaHiIqLjI6PkJGTlJWWmJmanJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvM zc/Q0dLU1dbX2drb3d7f4OLj5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////// //////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAQMEBQYICQoLDQ4PERITFBYX GBobHB0fICEiJCUmKCkqKy0uLzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJSktNTk9QUlNUVVdYWVtcXV5g YWJjZWZnaWprbG5vcHFzdHV3eHl6fH1+gIGCg4WGh4iKi4yOj5CRk5SVlpiZmpydnp+hoqOkpqeo qqusra+wsbO0tba4ubq7vb6/wcLDxMbHyMnLzM3P0NHS1NXW19na293e3+Di4+Tm5+jp6+zt7vDx 8vT19vf5+vv8/v//////////////////////////////////////////////////////AAAAAAAA AAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQlJigpKistLi8wMjM0Njc4OTs8 PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xub3Bxc3R1d3h5enx9foCBgoOF hoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2uLm6u72+v8HCw8TGx8jJy8zN z9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7///////////////////////// /////////////////////////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEi IyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpb XF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOU lZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zN zs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9tZnQxAAAA AAMEIQAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAQIDBAUGBwgJCgsMDQ4P EBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdI SUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CB goOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6 u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz 9PX29/j5+vv8/f7/AAEBAgIDAwQEBQYGBwcICAkJCgsLDAwNDQ4PDxAQERESExMUFBUWFhcXGBkZ GhobHBwdHh4fICAhIiIjJCQlJiYnKCkpKissLS0uLzAxMjIzNDU2Nzg5Ojs8PT4/QEJDREVGSElK TE1PUFJTVVdYWlxeYGJkZmhqbW9xdHZ5fH6Bg4aJi46QkpWXmZudn6Gjpaeoqqytr7Cys7W2t7m6 u7y9v8DBwsPExcbHyMnKy8zNzc7P0NHS0tPU1dbW19jZ2drb29zd3d7f3+Dh4eLj4+Tl5ebm5+jo 6enq6+vs7O3u7u/v8PDx8vLz8/T09fb29/f4+Pn5+vv7/Pz9/f7+/wABAQICAwMEBAUGBgcHCAgJ CQoLCwwMDQ0ODw8QEBEREhMTFBQVFhYXFxgZGRoaGxwcHR4eHyAgISIiIyQkJSYmJygpKSorLC0t Li8wMTIyMzQ1Njc4OTo7PD0+P0BCQ0RFRkhJSkxNT1BSU1VXWFpcXmBiZGZoam1vcXR2eXx+gYOG iYuOkJKVl5mbnZ+ho6WnqKqsra+wsrO1tre5uru8vb/AwcLDxMXGx8jJysvMzc3Oz9DR0tLT1NXW 1tfY2dna29vc3d3e39/g4eHi4+Pk5eXm5ufo6Onp6uvr7Ozt7u7v7/Dw8fLy8/P09PX29vf3+Pj5 +fr7+/z8/f3+/v//pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOr dre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a 8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+m Ohj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9 pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRl cOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/ sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnC t6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTC bIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj /7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9 y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbX unCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tL Mv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/ pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7Gd gtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZ zLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleal l5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/B VUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV 5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/pSUG /6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0qsOrdre9pnnCt6F9y7GdgtOr moncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWX leall5XmpZeV5qWXleb/pSUG/6QwDv+mOhj/sUMj/7tLMv/BVUX+w15a8sRlcOTCbIbXunCZzLJ0 qsOrdre9pnnCt6F9y7GdgtOrmoncpZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleall5Xm pZeV5qWXleall5XmpZeV5qWXleall5XmpZeV5qWXleb/piUG/6QwDv+nOhj/skMi/7xLMv/DVEX8 xl1a8chkcePGaofWwG+by7hyrMKxdLq7rXfEtKl7zaujf9SinoXbmZqO4ZmajuGZmo7hmZqO4Zma juGZmo7hmZqO4ZmajuGZmo7hmZqO4ZmajuGZmo7hmZqO4ZmajuGZmo7hmZqO4ZmajuH/piUG/6Uw Dv+oOhf/s0Mi/75LMf/FVEX5yVxb781jcePMaYjVxm2cyb9wrr22crq0sHXDq6p4yqKlfNGZoYHY kJ2J3ZCdid2QnYndkJ2J3ZCdid2QnYndkJ2J3ZCdid2QnYndkJ2J3ZCdid2QnYndkJ2J3ZCdid2Q nYndkJ2J3ZCdid3/piUG/6UwDv+qOhf/tUMi/8BLMf3IU0X2zVtb7dFhcuHQZ4nRy2udwsBurba3 cbissXPBo6x2yJqoec6SpH7UiaCF2ImghdiJoIXYiaCF2ImghdiJoIXYiaCF2ImghdiJoIXYiaCF 2ImghdiJoIXYiaCF2ImghdiJoIXYiaCF2Imghdj/pyUG/6UwDv+rOhf/tkMh/8FLMfrLUkTz0Vpa 6tlgct7WZYnLzGqcu8Ftq6+5cLaltHK+nK90xJSrd8qLp3vPhKSB1ISkgdSEpIHUhKSB1ISkgdSE pIHUhKSB1ISkgdSEpIHUhKSB1ISkgdSEpIHUhKSB1ISkgdSEpIHUhKSB1ISkgdT/pyUG/6YwDv+t Ohb/uEIh/sRKMPfOUkTw1lha5+BectbaZIjEzWmatMNsqKi7b7KetnC6lrJywI6udsaGqnrKf6d/ zn+nf85/p3/Of6d/zn+nf85/p3/Of6d/zn+nf85/p3/Of6d/zn+nf85/p3/Of6d/zn+nf85/p3/O f6d/zn+nf87/qCUG/6cwDv+uORb/ukIg+8ZKL/TTUUPr3Vda4+Zccc7bZIe9z2mYrsVrpaK+bq+Y uW+2kLVxvIixdMGBrnjFe6x9yXusfcl7rH3Je6x9yXusfcl7rH3Je6x9yXusfcl7rH3Je6x9yXus fcl7rH3Je6x9yXusfcl7rH3Je6x9yXusfcn/qCQG/6cwDf+wORX/vUIf98lKL+/YUELm41VZ3Ohb cMbdY4W20WiVp8hroZzBbaqTvG+xirlxtoS1dLt9sne/d7B8wnewfMJ3sHzCd7B8wnewfMJ3sHzC d7B8wnewfMJ3sHzCd7B8wnewfMJ3sHzCd7B8wnewfMJ3sHzCd7B8wnewfML/qSQF/6gwDf+zORT+ wEIe881KLendT0Dh6VNZ0+pbb7/fY4Kv02eRoctqnZbFbaWNwG+rhr1xsH+6c7V6t3e4dLV7u3S1 e7t0tXu7dLV7u3S1e7t0tXu7dLV7u3S1e7t0tXu7dLV7u3S1e7t0tXu7dLV7u3S1e7t0tXu7dLV7 u3S1e7v/qiQF/6kvDf+2OBP5xEEd7dJJK+LjTUDb71JYyu1abbfhYn+o1meNm89ql5HJbZ+IxW+l gsJxqXu/dK12vXewcbt7s3G7e7Nxu3uzcbt7s3G7e7Nxu3uzcbt7s3G7e7Nxu3uzcbt7s3G7e7Nx u3uzcbt7s3G7e7Nxu3uzcbt7s3G7e7P/qyQF/6svDf+6OBLzyUEb5NpJKNjoTEDO81FXwO9Za67k YXqg3GeGlNRrkIvPbpeEzHCcfclzoHjGdaNzxHimbsJ8qW7CfKluwnypbsJ8qW7CfKluwnypbsJ8 qW7CfKluwnypbsJ8qW7CfKluwnypbsJ8qW7CfKluwnypbsJ8qW7CfKn/rSQF/7AvC/vAOA/q0EEX 2uJGKMzuTEHD+VBVtfNYZqXpYXSX4Wd+jdtrhoXXb4x/1HKRetF1lHXPeJdxzXuabMx+nGzMfpxs zH6cbMx+nGzMfpxszH6cbMx+nGzMfpxszH6cbMx+nGzMfpxszH6cbMx+nGzMfpxszH6cbMx+nGzM fpz/ryME/7YtCfHINgzd3D0TzepGKsH2S0C2/09RqvdYYJvvYWuP6Gh0heRte3/gcYB53nSDddx4 hnLae4lu2H6La9aCjWvWgo1r1oKNa9aCjWvWgo1r1oKNa9aCjWvWgo1r1oKNa9aCjWvWgo1r1oKN a9aCjWvWgo1r1oKNa9aCjWvWgo3/sSME+r8sBuPULwfO5jsWwfNFK7T/ST2o/05Mnv1XWJH2YWGG 8Wlpf+1vbnnqdHJ16Hd1ced6d27lfXlr5IB7aeOEfGnjhHxp44R8aeOEfGnjhHxp44R8aeOEfGnj hHxp44R8aeOEfGnjhHxp44R8aeOEfGnjhHxp44R8aeOEfGnjhHz/tSID68siAtDjJwfC8ToZtP5C Kqb/Rjmb/01Fkv9WT4b+YlZ++mpcd/dwYHP1dWNv83hlbfJ8Z2rxf2ho8IJqZu+Fa2bvhWtm74Vr Zu+Fa2bvhWtm74VrZu+Fa2bvhWtm74VrZu+Fa2bvhWtm74VrZu+Fa2bvhWtm74VrZu+Fa2bvhWv2 whsB1N8RAcLvJgu1/Doap/8+J5n/RDON/0s9hf9VRXz/YUt1/2pPcP9wUmz/dVRq/nlWaP18V2b8 f1hk/IJaY/uGW2P7hltj+4ZbY/uGW2P7hltj+4ZbY/uGW2P7hltj+4ZbY/uGW2P7hltj+4ZbY/uG W2P7hltj+4ZbY/uGW2P7hlvUzwoAxO0SArX7Jg2o/zYZmf87I4z/QSyA/0o0eP9TOnH/Xz9s/2lD aP9vRWX/dEdj/3dIYv97SWH/fkpf/4FKXv+ES17/hEte/4RLXv+ES17/hEte/4RLXv+ES17/hEte /4RLXv+ES17/hEte/4RLXv+ES17/hEte/4RLXv+ES17/hEv/nyIF/50tDP+eOBX/qEEe/7FJK/+2 Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk 0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF /50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6 g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55 pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7 mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTR rnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/ uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55 pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50t DP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HF t3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGu eaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6b f6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk 0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P +7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGu eaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+e OBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+X y7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTR rnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bI k4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55 pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7Zm Y+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTR rnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/ qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9 oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk 0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60b3firHWJ2KR7mc6bf6bIk4Sx wo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGu eaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+eOBX/qEEe/7FJK/+2Uzz/uF1P+7ZmY+60 b3firHWJ2KR7mc6bf6bIk4Sxwo2Iub6IjL+6g5HFt3+Xy7R9oM+ueaTRrnmk0a55pNGueaTRrnmk 0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNGueaTRrnmk0a55pNH/nyIF/50tDP+fOBX/qkAe /7NJK/+5Ujz/u1xP+rplZO24bXjhsHOL1ah5nMyffarFl4G1v5GFvrqMicW2h4/MsoOW0q+BoNan fqLTp36i06d+otOnfqLTp36i06d+otOnfqLTp36i06d+otOnfqLTp36i06d+otOnfqLTp36i06d+ otP/nyIF/54tDP+gNxT/q0Ae/7RJK/+7Ujz/vVtQ+r5kZOy8bHngtXKN0613nsqkeq3CnH65vJaC w7eQh8qyi4zSroeV2KaDndqhgqHVoYKh1aGCodWhgqHVoYKh1aGCodWhgqHVoYKh1aGCodWhgqHV oYKh1aGCodWhgqHVoYKh1aGCodX/oCIF/54tDP+hNxT/rEAd/7ZIK/+9UTz/wFpQ+sFjZezBanre uXCP0rF1ocioeLDAoXu8uZt/x7SWhM+wlI3Vq5GX2qCJnNyaiKDXmoig15qIoNeaiKDXmoig15qI oNeaiKDXmoig15qIoNeaiKDXmoig15qIoNeaiKDXmoig15qIoNf/oCIF/54tDP+iNxT/rUAd/7dI Kv+/UTz/wlpQ+cRiZevFaXvevm6Q0bZzo8audrO+p3nAuKN/ybShhs+snI3Vo5aU2pqRnNyVjp/Y lY6f2JWOn9iVjp/YlY6f2JWOn9iVjp/YlY6f2JWOn9iVjp/YlY6f2JWOn9iVjp/YlY6f2JWOn9j/ oCIF/58tDP+jNxT/rkAd/7hIKv/BUDz+xVlQ98hgZuvKZ3zdw22Rz7xxpcW0dLW9sHnAtqx/yK6n hc+loYrVnJyR2pWZnNyPlJ/Yj5Sf2I+Un9iPlJ/Yj5Sf2I+Un9iPlJ/Yj5Sf2I+Un9iPlJ/Yj5Sf 2I+Un9iPlJ/Yj5Sf2I+Un9j/oSIF/58tDP+kNxT/sD8c/7pIKv/DUDv7yFhQ9ctfZunPZnzcyWuS zsNvpsG6crW2snbArKx7yKSof86cpIXUlKCN2I2fmduKnJ/Yipyf2Iqcn9iKnJ/Yipyf2Iqcn9iK nJ/Yipyf2Iqcn9iKnJ/Yipyf2Iqcn9iKnJ/Yipyf2Iqcn9j/oSIF/6AtDP+mNhP/sT8c/7tIKf7G Tzv4y1dQ8tBeZufUZH3az2mTyMVtprq7cLSts3O/o612x5qoes2SpX/SiqKG14SgkdmEopzXhKKc 14SinNeEopzXhKKc14SinNeEopzXhKKc14SinNeEopzXhKKc14SinNeEopzXhKKc14SinNf/oSIF /6AtDP+nNhP/sz8c/71HKfzITjv1zlZP7tVdZuTaYn3T0miSwcZspLO8b7GmtXK8nK90xJOrd8qL p3vPg6SB1H2ii9Z7o5XVe6OV1XujldV7o5XVe6OV1XujldV7o5XVe6OV1XujldV7o5XVe6OV1Xuj ldV7o5XVe6OV1XujldX/oiEF/6AtDP+oNhL/tD8b/79HKPnLTjry01VP6txbZuDgYX3M02eRu8hr oqy+bq+gt3C4lbJzwI2udsWFqnrKfqh/znimh9F1pY/SdaWP0nWlj9J1pY/SdaWP0nWlj9J1pY/S daWP0nWlj9J1pY/SdaWP0nWlj9J1pY/SdaWP0nWlj9L/oiEF/6EsC/+qNhL/tj4b/cJHKPXNTjnu 2VRO5uNZZdjiYHvF1WaPtMpqn6XBbauZum+0kLVyu4ixdcCBrnjFeqx9yXSqhMtxqYvMcamLzHGp i8xxqYvMcamLzHGpi8xxqYvMcamLzHGpi8xxqYvMcamLzHGpi8xxqYvMcamLzHGpi8z/oyEF/6Is C/+sNRH/uT4a+cVHJ/DRTTjp4FJM4ulXZM7kX3q912aMrcxqm5/EbKeTvm+virlxtYO2dLp8s3e+ drF8wnGvgsRurofGbq6Hxm6uh8ZurofGbq6Hxm6uh8ZurofGbq6Hxm6uh8ZurofGbq6Hxm6uh8Zu rofGbq6Hxm6uh8b/pCEF/6MsC/+vNRD/vD4Y9MlGJerYTTbi509M3O9VY8bmX3i02mWJpdBplpjI bKGNw2+ohb9xrn67dLJ4uXe2c7d7uW61gLxrtIW+a7SFvmu0hb5rtIW+a7SFvmu0hb5rtIW+a7SF vmu0hb5rtIW+a7SFvmu0hb5rtIW+a7SFvmu0hb7/pSEE/6QsC/+zNQ/7wT4X7c9GIuHfSzTY609M z/NUYrzoXnSr3mSEndRpkJHObZmHyW+ggMVypXrCdKl0wHiscL57r2u8gLJou4SzaLuEs2i7hLNo u4SzaLuEs2i7hLNou4SzaLuEs2i7hLNou4SzaLuEs2i7hLNou4SzaLuEs2i7hLP/piEE/6grCv+4 NA3zxz0U5NhFHtbmSTXL8U5MxPdTX7HsXXCh4mR9ldtph4rVbo+C0HGVe810mnbLd51xyXmgbcd9 omnFgaVmxIWmZsSFpmbEhaZmxIWmZsSFpmbEhaZmxIWmZsSFpmbEhaZmxIWmZsSFpmbEhaZmxIWm ZsSFpmbEhab/qCAE/64qCPy/MwvpzzwQ1+FCHsrtSTW/+E1Kt/tSW6bxXWmY6WV0jOJqfYPdb4R8 2nOJd9d3jHPVeo9v032RbNGAlGjQhJZlz4eXZc+Hl2XPh5dlz4eXZc+Hl2XPh5dlz4eXZc+Hl2XP h5dlz4eXZc+Hl2XPh5dlz4eXZc+Hl2XPh5f/qiAD/7UpBvDIMQfa3TMMy+pCIb72SDWy/0xGqf9R VZv3XWCO8GVqhetscX3ncXZ35HZ6c+J5fW/hfH9s34CBad6Dg2fdh4Vl3ImGZdyJhmXciYZl3ImG ZdyJhmXciYZl3ImGZdyJhmXciYZl3ImGZdyJhmXciYZl3ImGZdyJhmXciYb/rR8D+b8lA9/WIgLL 6DIPvvRBIrD/RTOk/0pBnP9RTY/+XVaF+WZeffRuZHbyc2hy73hrbu58bWztf29q7IJwZ+qFcmXq iXNj6Yx0Y+mMdGPpjHRj6Yx0Y+mMdGPpjHRj6Yx0Y+mMdGPpjHRj6Yx0Y+mMdGPpjHRj6Yx0Y+mM dGPpjHT/thwC6M0UAczmHQS+8zESsf8+IqP/Qi+W/0g6jf9QRIT/XEt7/2dRdP5uVm/8c1ls+3hb afl8XWf4f15m+INfZPeGYGL2iWFh9oxiYfaMYmH2jGJh9oxiYfaMYmH2jGJh9oxiYfaMYmH2jGJh 9oxiYfaMYmH2jGJh9oxiYfaMYmH2jGLzxA8AztoLAL3zHQex/zIUo/86H5X/PyqJ/0YzgP9POnj/ W0Bx/2ZFbP9tSGj/c0pm/3dMZP97TWL/f05h/4JPYP+FUF7/iVFe/4tRXv+LUV7/i1Fe/4tRXv+L UV7/i1Fe/4tRXv+LUV7/i1Fe/4tRXv+LUV7/i1Fe/4tRXv+LUV7/i1HMywkAvuYMAa//Hgmk/zAT lf81HIf/PCR8/0Qrc/9NMWz/WDVn/2M5Y/9rO2H/cT1f/3U+Xf95P1z/fEBb/39BWv+CQVn/hkJY /4hCWP+IQlj/iEJY/4hCWP+IQlj/iEJY/4hCWP+IQlj/iEJY/4hCWP+IQlj/iEJY/4hCWP+IQlj/ iEL/mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WR psuAlazHfJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/ uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jt o3h545t/h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lv sb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hH Jv+uUTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8 vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb// mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuA lazHfJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+x v7lvsb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h5 45t/h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5 b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hHJv+u UTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8vXGy vrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F /5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuAlazH fJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lv sb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h545t/ h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/ uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F/5YrC/+VNhL/oD4a/6hHJv+uUTT/ r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuAlazHfJmxxXmetcJ2o7nAdKq8vXGyvrlv sb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb//mR8F/5Yr C/+VNhL/oD4a/6hHJv+uUTT/r1tF/61lV/ipb2jto3h545t/h9uShZTUi4yez4WRpsuAlazHfJmx xXmetcJ2o7nAdKq8vXGyvrlvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5b7G/uW+xv7lvsb+5 b7G/uW+xv7lvsb//mR8F/5crC/+XNhL/oT4a/6pGJf+wUDT/sVpF/7BkV/esbWnsp3d74Z59itmW g5fRjomiy4iOq8eCk7HEfpe3wXqcu753or+8darCtXGuw7Nyr8Gzcq/Bs3KvwbNyr8Gzcq/Bs3Kv wbNyr8Gzcq/Bs3KvwbNyr8Gzcq/Bs3KvwbNyr8H/mR8F/5cqCv+YNRL/oz0a/6xGJf+zTzT/tFlG /7RjWPaxbGvqrXV936N7jdWbgZzNkoaox4uKscKFj7m/gJS+u3yaw7l5oce1dqnKrXWsxqt2rcSr dq3Eq3atxKt2rcSrdq3Eq3atxKt2rcSrdq3Eq3atxKt2rcSrdq3Eq3atxKt2rcT/mh8E/5gqCv+a NBL/pT0Z/65GJf+1TjT/t1hG/7dhWfW1amzpsnN/3ah4kNOffqDKloKsxI6Ht76IjL+6g5HFt3+Y y7R8oc+reKXPpXmqyKR5rMakeazGpHmsxqR5rMakeazGpHmsxqR5rMakeazGpHmsxqR5rMakeazG pHmsxqR5rMb/mh8E/5gqCv+bNBH/pj0Z/69FJf+3TjT/uldG/7tgWfS5aW3ntnGB3Kx2k9Cke6PI mn+xwJOEvLuMicW3iJDLtIaZzrKGpNGkfKTRn32pyp59qsiefarInn2qyJ59qsiefarInn2qyJ59 qsiefarInn2qyJ59qsiefarInn2qyJ59qsj/mx8E/5kqCv+cNBH/pzwZ/7FFJP+5TTT/vFdG/r5f WfS9Z27num+C2rF0lc+oeabFn320vpeBwLmUisa1kZLLr42Yz6qKodKegqPTmYGozJiCqcqYgqnK mIKpypiCqcqYgqnKmIKpypiCqcqYgqnKmIKpypiCqcqYgqnKmIKpypiCqcr/mx8E/5kqCv+dNBH/ qTwY/7JFJP+7TTP/v1ZG/cFeWvPBZm/mv22D2bZzl82td6jEpXu3vqGDwLabicaulY/MqJGVz6KO ntKZh6LTlIanzZOGqMuThqjLk4aoy5OGqMuThqjLk4aoy5OGqMuThqjLk4aoy5OGqMuThqjLk4ao y5OGqMv/mx8E/5kqCv+eMxH/qjwY/7NFJP+8TDP/wVVG+8RdWvPFZW/lw2yE2LtxmMyydavDrXy2 uaWBv7CehsaomYzLoZWS0JuSm9OUjqLUj4qmzo+KqMuPiqjLj4qoy4+KqMuPiqjLj4qoy4+KqMuP iqjLj4qoy4+KqMuPiqjLj4qoy4+KqMv/mx8E/5oqCv+fMxD/qzwY/7VEI/++TDP+w1VF+cdcWvHJ ZG/lyGqF1sFvmsq5dKq+sHq2s6l/v6qihMainYrLm5qQz5WXmdKPlKLUipCmzoqPqMyKj6jMio+o zIqPqMyKj6jMio+ozIqPqMyKj6jMio+ozIqPqMyKj6jMio+ozIqPqMz/nB8E/5oqCv+gMxD/rDwY /7ZEI/+/TDL8xlRF9spcWu/NYnDkzWiG08VtmsW8c6q5tHi1rq19vqWngsWdoojLlZ+Oz4+cltKL nKLThpWmzoaUp8yGlKfMhpSnzIaUp8yGlKfMhpSnzIaUp8yGlKfMhpSnzIaUp8yGlKfMhpSnzIaU p8z/nB8E/5opCv+iMxD/rTsX/7dEI//BTDL5yVNF881aWuzSYHDg0GaGzshsmsC/cam0uHe1qbF8 vp+sgcWXqIbKkKSMzoqildGFoqHSgZymzoGap8yBmqfMgZqnzIGap8yBmqfMgZqnzIGap8yBmqfM gZqnzIGap8yBmqfMgZqnzIGap8z/nB4E/5spCv+jMxD/rzsX/7lEIv3DSzH2zFJE8NJZWejaX3Db 1WSGycxqmbrDb6itu3S0orR5vZivfcOQrIPIiamJzIOnkc9+ppzQfaSmzXyiqMt8oqjLfKKoy3yi qMt8oqjLfKKoy3yiqMt8oqjLfKKoy3yiqMt8oqjLfKKoy3yiqMv/nR4E/5spCv+lMg//sTsW/7xE IfrGSzHz0VFD69pXWePfXW/T22OFws9pl7HEbaekvHCymLV0u46xeMKGrX3GgKuCynqpis12qJTO dqmjzHerqMp3q6jKd6uoynerqMp3q6jKd6uoynerqMp3q6jKd6uoynerqMp3q6jKd6uoynerqMr/ nR4E/5wpCv+nMg//szsW/75DIPXKSy/u1lBC5uFWV9zkW27L3mODutFolKnHbKObvm6ukLhxt4a0 dL1+sHjCd658xnKsg8ltq4zKbauZyW6sn8durJ/Hbqyfx26sn8durJ/Hbqyfx26sn8durJ/Hbqyf x26sn8durJ/Hbqyfx26sn8f/nh4E/50pCf+pMg7/tjoU+sJDH/DOSi7n3U9A4ulSV9LoWm3B4GKA sdRnkaHKa56Uw26oib1xsIC5dLZ5tne6dLR7vW6ygcBqsIjCZ7CSw2awlsNmsJbDZrCWw2awlsNm sJbDZrCWw2awlsNmsJbDZrCWw2awlsNmsJbDZrCWw2awlsP/nx4E/54pCf+tMQ3/ujoT9MdCHejV Sivf5Ew/1+xRVsnuWWu342F8qNhni5rPa5eNyW6gg8Rxp3vAdKx1vXiwcLt7s2y5gLZouIa4ZLeP uWO2kbpjtpG6Y7aRumO2kbpjtpG6Y7aRumO2kbpjtpG6Y7aRumO2kbpjtpG6Y7aRumO2kbr/oB4E /6EoCP+xMAv7wDkR7M5CGd/fRyjT6UxAyvFRVb7yWGit5mF3nt1nhJLVbI+Hz2+WfstznHjIdqFy xnmkbsR8p2nCgalmwIasYr+NrWG/j65hv4+uYb+PrmG/j65hv4+uYb+PrmG/j65hv4+uYb+PrmG/ j65hv4+uYb+PrmG/j67/oh0D/6YnB/+3LwnyxzgN4dhBFNLmRirH8ExAvvhQU7L1V2Oi62FwleNn e4rdbYSB2HGLetR1kHTSeZNw0HyWbM5/mWjMg5tky4idYcqNn2DJj59gyY+fYMmPn2DJj59gyY+f YMmPn2DJj59gyY+fYMmPn2DJj59gyY+fYMmPn2DJj5//pB0D/60mBfu+LQbm0DQI0+I8FsfuRiu7 +Uo+sP5PT6b6V1yY8WFojOtocYPmbnh74nN9dd94gXHde4Rt23+HatqDiWfZhopk14uMYdaQjmDV kY5g1ZGOYNWRjmDVkY5g1ZGOYNWRjmDVkY5g1ZGOYNWRjmDVkY5g1ZGOYNWRjmDVkY7/pxwD/7Uj A+7JJgPV3ykHx+w8Gbr4RCut/0g7o/9NSZr/V1SN+WFdhPRqZXzwcGp27XZucet6cW3pfnRr6IJ2 aOaFd2bliHlj5Ix6YeORfGDjknxg45J8YOOSfGDjknxg45J8YOOSfGDjknxg45J8YOOSfGDjknxg 45J8YOOSfGDjknz/qxsC98AdAdncEgHH6ygKuvc7Gqz/QSmg/0Y2lf9MQY3/VkuD/2FSe/1rV3T6 cVxv+HZfbPZ7YWn1f2Nn9INkZfOGZmPyimdh8Y5oX/CSaV/wk2pf8JNqX/CTal/wk2pf8JNqX/CT al/wk2pf8JNqX/CTal/wk2pf8JNqX/CTal/wk2r/txUB1s8LAMfqEwK59ykNrP85Gp7/PiaS/0Qw h/9LOYD/VEB4/2FGcv9qSmz/cE1p/3ZQZv97UWT/f1Nj/4NUYf+GVWD+iVZe/o1XXf2SWFz9k1hc /ZNYXP2TWFz9k1hc/ZNYXP2TWFz9k1hc/ZNYXP2TWFz9k1hc/ZNYXP2TWFz9k1jWxAgAxtQJALj3 FASr/ykOnv80GJD/OiGE/0Epev9JMHL/UjZs/146aP9oPWT/b0Bh/3RBX/95Q17/fURd/4BFXP+E RVv/h0Za/4pHWP+PR1j/kEhY/5BIWP+QSFj/kEhY/5BIWP+QSFj/kEhY/5BIWP+QSFj/kEhY/5BI WP+QSFj/kEjExwcAt9sHAan/Fgaf/yoNkP8wFYP/Nhx3/z4ibv9HKGb/UCxh/1ovXf9kMVv/bDNZ /3E1WP91Nlb/eTZW/3w3Vf9/N1T/gjhT/4U5Uv+JOVL/ijlS/4o5Uv+KOVL/ijlS/4o5Uv+KOVL/ ijlS/4o5Uv+KOVL/ijlS/4o5Uv+KOVL/ijn/kh0E/5ApCf+NNRD/mDsX/6BEIf+mTi3/p1k8/6Vk TP+hblv3m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9zqaXNca6ozG+1qsptvq3Dab2u w2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7/kh0E/5ApCf+NNRD/ mDsX/6BEIf+mTi3/p1k8/6VkTP+hblv3m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9z qaXNca6ozG+1qsptvq3Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9 rsNpva7/kh0E/5ApCf+NNRD/mDsX/6BEIf+mTi3/p1k8/6VkTP+hblv3m3hq7pWBd+eOiYLhho+L 3ICVk9h8m5nUeKCe0XWkos9zqaXNca6ozG+1qsptvq3Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7D ab2uw2m9rsNpva7Dab2uw2m9rsNpva7/kh0E/5ApCf+NNRD/mDsX/6BEIf+mTi3/p1k8/6VkTP+h blv3m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9zqaXNca6ozG+1qsptvq3Dab2uw2m9 rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7/kh0E/5ApCf+NNRD/mDsX /6BEIf+mTi3/p1k8/6VkTP+hblv3m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9zqaXN ca6ozG+1qsptvq3Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNp va7/kh0E/5ApCf+NNRD/mDsX/6BEIf+mTi3/p1k8/6VkTP+hblv3m3hq7pWBd+eOiYLhho+L3ICV k9h8m5nUeKCe0XWkos9zqaXNca6ozG+1qsptvq3Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2u w2m9rsNpva7Dab2uw2m9rsNpva7/kh0E/5ApCf+NNRD/mDsX/6BEIf+mTi3/p1k8/6VkTP+hblv3 m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9zqaXNca6ozG+1qsptvq3Dab2uw2m9rsNp va7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7/kh0E/5ApCf+NNRD/mDsX/6BE If+mTi3/p1k8/6VkTP+hblv3m3hq7pWBd+eOiYLhho+L3ICVk9h8m5nUeKCe0XWkos9zqaXNca6o zG+1qsptvq3Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7Dab2uw2m9rsNpva7/ kx0E/5ApCf+PNBD/mjsX/6JEIP+pTS3/qlg8/6hiTP+kbFz1n3Zs7Jl/euSRh4beiY2Q2IOTmNN+ mZ/Qep2kzXaiqct0p6zJca2vx2+0ssFsubS8bLuxvGy7sbxsu7G8bLuxvGy7sbxsu7G8bLuxvGy7 sbxsu7G8bLuxvGy7sbxsu7H/lB0E/5EoCf+RMxD/nDoW/6RDIP+sTC3/rVY9/61gTf6pal70pXRu 6p99feGWg4vZjoqW04eQoM6BlafKfJqtx3ifssR1pbbCcqu5wHC0u7dutbmzb7i1s2+4tbNvuLWz b7i1s2+4tbNvuLWzb7i1s2+4tbNvuLWzb7i1s2+4tbNvuLX/lB0E/5IoCf+TMg//njoW/6dDIP+u Sy3/sVU9/7BfTv2uaF/yqnJw56R6gd6agI/VkoeczouMpsmEka/Efpe1wXmcu752o7+8dKvCtG+u w65ys7yrc7a4q3O2uKtztrirc7a4q3O2uKtztrirc7a4q3O2uKtztrirc7a4q3O2uKtztrj/lRwE /5IoCf+VMg//oDoW/6lCH/+wSi3/tFQ9/7ReTv2zZ2Dxr3By5ql4g9uffpPSl4Ohy46JrMSGjrXA gJS9vHuaw7p6o8W3eavHrHOsxqd1sb+ld7W6pXe1uqV3tbqld7W6pXe1uqV3tbqld7W6pXe1uqV3 tbqld7W6pXe1uqV3tbr/lRwE/5MoCf+WMQ//oTkV/6pCH/+ySiz/tlM8/7ddTvu2ZWHwtG505K11 htmke5bPm4Clx5KFscGKi7u9h5TAu4WdxLaCpMewfqrIpXeqyKF5sMGferO8n3qzvJ96s7yferO8 n3qzvJ96s7yferO8n3qzvJ96s7yferO8n3qzvJ96s7z/lRwE/5MoCf+XMQ//ozkV/6xCH/+0Siz/ uVM8/7pcTvi6ZGLvuGx147JziNipeZnNn36pxZiEtL+TjLy4jZPBs4mZxa6GociqhKnJn3ypypt9 rsKZfrK9mX6yvZl+sr2ZfrK9mX6yvZl+sr2ZfrK9mX6yvZl+sr2ZfrK9mX6yvZl+sr3/lhwE/5Mo Cf+YMA7/pDkV/61BHv+1SSz/u1I8/b1bTva9Y2LuvWt24rZxidWud5vLpXyqwp2DtLmWibyykZDB rIyWxqeJncijh6bKmYCoy5aBrsSVgbG+lYGxvpWBsb6VgbG+lYGxvpWBsb6VgbG+lYGxvpWBsb6V gbG+lYGxvpWBsb7/lhwE/5QnCf+ZMA7/pTkU/65BHv+3SSv/vVE8/L9aTvTBYmLswWl34btwi9Kx dJ3HqHuqvKCBtLSah7yslI3CppCUxqCNm8mci6TLlYaoy5GFrcWQhbG/kIWxv5CFsb+QhbG/kIWx v5CFsb+QhbG/kIWxv5CFsb+QhbG/kIWxv5CFsb//lhwE/5QnCP+aMA7/pjgU/7BBHf+4SSv/v1E8 +sJZTvLEYWPpxWh33b5tjM20c53Cq3mqt6R+tK6dhLymmIrBoJSRxpqRmMmWj6HLkIuozIyJrMWM ibDAjImwwIyJsMCMibDAjImwwIyJsMCMibDAjImwwIyJsMCMibDAjImwwIyJsMD/lxwE/5UnCP+b MA7/pzgU/7FBHf+6SSv/wlA7+MZYTvDIX2PmyGZ42MFrjcm3cZ29r3epsqd8s6mhgruhnIjBmpiP xpSWlsmQlJ/Li5GozIeOrMaHjbDBh42wwYeNsMGHjbDBh42wwYeNsMGHjbDBh42wwYeNsMGHjbDB h42wwYeNsMH/lxsD/5UnCP+dLw3/qTgT/7NAHf+8SCr8xU879slXTu3NXmPiy2R40sRqjMS7b5y4 snWprat7s6OmgLuboYbBlJ2NxY6blMiKmZ3Khpmoy4KTrMaCkq/BgpKvwYKSr8GCkq/BgpKvwYKS r8GCkq/BgpKvwYKSr8GCkq/BgpKvwYKSr8H/lxsD/5UnCP+eLw3/qjgT/7VAHP++SCn5yE46881W TerTXGLez2J4zcdoi7++bpuyt3Oop7B5sp6rfrqVp4TAjqOLxIihkseDn5rJgKCnyn2arMZ9mK/B fZivwX2Yr8F9mK/BfZivwX2Yr8F9mK/BfZivwX2Yr8F9mK/BfZivwX2Yr8H/mBsD/5YnCP+gLw3/ rDcS/7dAG/3BSCj2y04579NUTObZWmLY1GF3x8tnirnDbJqtvHKnobZ3sZixfbiPrYK+iKqJw4Ko kMZ9p5nIeqelyXeirMV4n7DBeJ+wwXifsMF4n7DBeJ+wwXifsMF4n7DBeJ+wwXifsMF4n7DBeJ+w wXifsMH/mBsD/5cmCP+iLwz/rjcS/7k/GvnERyfxzk046ttTS+DfWWDQ2l92wdBlibPJa5mmwnCl m711r5G4e7aItYC8gbKGwHuwjcN2rpbFc66hxnKtrcRyqbDAcqmwwHKpsMByqbDAcqmwwHKpsMBy qbDAcqmwwHKpsMByqbDAcqmwwHKpsMD/mRsD/5gmCP+kLgv/sTYR/r0/GfTIRyXr1E025eNQSdnj V1/J3150utdkhqzPaZadx22jkcBxrIa7dbN+t3q5d7R/vXKyhb9tsY3BarCXwmmxpcFstLK9bLSy vWy0sr1stLK9bLSyvWy0sr1stLK9bLSyvWy0sr1stLK9bLSyvWy0sr3/mhsD/5kmCP+nLQr/tTYP +cE/F+7ORiPk3Ewy3edPSc/oVl7A5F1yst5kgqPUaZGVy22cicVwpX/Ac6x3vHexcLl8tWu3gbhn toe6Y7WQu2G1m7xjt6a5Y7emuWO3prljt6a5Y7emuWO3prljt6a5Y7emuWO3prljt6a5Y7emuWO3 prn/mxsD/5slB/+rLQn/uTUN8sc+FeXVRh/a40kzz+tOScbtVF236lxuqOJjfZrZaYqO0m2UhMxx m3vIdaFzxHimbsJ8qWnAgaxlvoeuYr2OsF+9l7FevJ6xXryesV68nrFevJ6xXryesV68nrFevJ6x XryesV68nrFevJ6xXryesV68nrH/nBoD/6AkBv+wLAj5wDQL6c89ENrfQh3O6UkzxPFOSLvyUlqt 8FtpnudjdpLgaYGH2m+JftRzkHfRd5VxznuZbMx/nGjKg55kyYigYceOol7GlaRcxpukXMabpFzG m6RcxpukXMabpFzGm6RcxpukXMabpFzGm6RcxpukXMabpFzGm6T/nhoD/6UjBf+3KgXwyDIH3Ns1 DM7nQh/C8Ug0uPlMRq/3UVWi9Vtile1kbYrna3aA4nB9ed51gnPbeodu2X6Ka9eCjGfVho5k1IuQ YdOQkl7RlpRc0ZuVXNGblVzRm5Vc0ZuVXNGblVzRm5Vc0ZuVXNGblVzRm5Vc0ZuVXNGblVzRm5X/ oRkC/60hA/i/JgPi1CUDzuUzD8LwQiG2+kczq/5LQqL+UE+X+1tai/VlY4LwbGp67HJwdOl4dG/n fHds5YF6aOOEfGbiiH1j4Yx/YOCRgV7floJc3pqDXN6ag1zemoNc3pqDXN6ag1zemoNc3pqDXN6a g1zemoNc3pqDXN6ag1zemoP/oxkC/7YdAenMFwHP4x4DwvAzErX6QCKp/0Qwnf9JPZX/UEiL/1tQ gv1lV3r5bV109nNhb/R5ZGvyfmdo8YJpZvCGamTvimxi7o5tYO2Sbl3sl3Bc65txXOubcVzrm3Fc 65txXOubcVzrm3Fc65txXOubcVzrm3Fc65txXOubcVzrm3H/rBUB88MQANHaCwDB7x8GtPszE6j/ PCCb/0IskP9INof/Tz9//1pGeP9lS3H/bU9s/3NSaf95VWb+fldk/YJYYvyGWWH7ilpf+o5bXvqS XFz5l11b+JteW/ibXlv4m15b+JteW/ibXlv4m15b+JteW/ibXlv4m15b+JteW/ibXlv4m176uQ4A zcsJAMDmDQGy/CAIp/8zE5r/OR2N/z8mgv9GLnr/TjVz/1g6bf9jP2n/bEJl/3JEYv93RmD/fEdf /4FIXf+FSVz/iEpb/4xLWv+QTFj/lU1X/5lNV/+ZTVf/mU1X/5lNV/+ZTVf/mU1X/5lNV/+ZTVf/ mU1X/5lNV/+ZTVf/mU3NwQYAvtAHALH2DgKl/yEJmf8uEoz/NBmA/zsgdv9DJ23/TCxm/1QwYv9g M17/aTVc/283Wv90OFn/eTlY/306V/+AO1b/hDtV/4c8VP+LPVP/kD1S/5M+Uv+TPlL/kz5S/5M+ Uv+TPlL/kz5S/5M+Uv+TPlL/kz5S/5M+Uv+TPlL/kz69xQUAsNcFAKP/EAOZ/yIJi/8pD37/MBVz /zgaaf9AH2L/SSNb/1EmV/9aKFX/YipS/2krUf9vLFD/cy1P/3cuTv96Lk7/fS9N/4AvTP+EMEv/ iDBL/4swS/+LMEv/izBL/4swS/+LMEv/izBL/4swS/+LMEv/izBL/4swS/+LMEv/izD/ixwE/4go CP+ENA7/jzoU/5dCHP+eSyf/nlc0/51iQv+ZbU//k3hc+I2CZ/KIi3HsgpN56HyZgOR4nobhdKOK 33Gojt1vrpHbbbOU2my5lthrwpjVacyazGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5vM ZcubzGXLm8xly5v/4v/iSUNDX1BST0ZJTEUABwn/ixwE/4goCP+ENA7/jzoU/5dCHP+eSyf/nlc0 /51iQv+ZbU//k3hc+I2CZ/KIi3HsgpN56HyZgOR4nobhdKOK33Gojt1vrpHbbbOU2my5lthrwpjV acyazGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5v/ixwE/4goCP+E NA7/jzoU/5dCHP+eSyf/nlc0/51iQv+ZbU//k3hc+I2CZ/KIi3HsgpN56HyZgOR4nobhdKOK33Go jt1vrpHbbbOU2my5lthrwpjVacyazGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5vMZcub zGXLm8xly5v/ixwE/4goCP+ENA7/jzoU/5dCHP+eSyf/nlc0/51iQv+ZbU//k3hc+I2CZ/KIi3Hs gpN56HyZgOR4nobhdKOK33Gojt1vrpHbbbOU2my5lthrwpjVacyazGXLm8xly5vMZcubzGXLm8xl y5vMZcubzGXLm8xly5vMZcubzGXLm8xly5v/ixwE/4goCP+ENA7/jzoU/5dCHP+eSyf/nlc0/51i Qv+ZbU//k3hc+I2CZ/KIi3HsgpN56HyZgOR4nobhdKOK33Gojt1vrpHbbbOU2my5lthrwpjVacya zGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5v/ixwE/4goCP+ENA7/ jzoU/5dCHP+eSyf/nlc0/51iQv+ZbU//k3hc+I2CZ/KIi3HsgpN56HyZgOR4nobhdKOK33Gojt1v rpHbbbOU2my5lthrwpjVacyazGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXLm8xly5vMZcubzGXL m8xly5v/ixwE/4koCP+FMw7/kDkU/5hCHP+eSyf/n1Y0/55hQv+abVD/lXdd94+BaPGJi3Lrg5J7 532YguN4nYjgdKOM3XKokNtvrZPabrOW2Gy6mNZrwpvRacqcymbKnMpmypzKZsqcymbKnMpmypzK ZsqcymbKnMpmypzKZsqcymbKnMpmypz/jBwD/4knCP+IMg7/kzgU/5tBHP+iSif/pFQ0/6JfQ/+f alH9mnRf9ZR+bO2OiHjnh4+B4oCVit17mpDad6CW1nSmmtRxrJ7Sb7Kh0G25o89sw6bFZ8OmwGnH ocBpx6HAacehwGnHocBpx6HAacehwGnHocBpx6HAacehwGnHocBpx6H/jRwD/4onCP+KMQ3/ljcT /55AG/+lSSf/p1M0/6ddQ/+kaFP8oHJi8pp8cOqUhX3ji4uI3YSSkdh+mJjTep6f0HWkpM1yqqjL b7CryW24rsJpvLC8a8Cqt23EpbdtxKW3bcSlt23EpbdtxKW3bcSlt23EpbdtxKW3bcSlt23Epbdt xKX/jRsD/4snCP+MMA3/mDcT/6BAG/+nSCb/q1I0/6tcRP+pZlT6pXBk8J95c+eYgoHfj4iN2YiP l9KBlaDOe5unynahrcdzqLHFcK+1wW23t7lruLWzbr2usHDBqLBwwaiwcMGosHDBqLBwwaiwcMGo sHDBqLBwwaiwcMGosHDBqLBwwaj/jhsD/4smCP+OMA3/mjYS/6I/Gv+pSCb/rlE0/65bRP+sZFX5 qm5l76V3duWdf4XclIWS1IyMnc6EkqfJfZivxHietcJ1p7nBdLG7uHCzu7FvtriscbuxqXO/q6lz v6upc7+rqXO/q6lzv6upc7+rqXO/q6lzv6upc7+rqXO/q6lzv6v/jhsD/4wmCP+QLw3/mzYS/6Q/ Gv+rRyb/sVA0/7FZRPywY1X2rmxn7ap1eOOhfIjZmIOW0ZCJo8qHj63Fgpe0wn+guL58qLu7erC9 sXSyvalytLumdLmzo3a+raN2vq2jdr6to3a+raN2vq2jdr6to3a+raN2vq2jdr6to3a+raN2vq3/ jxsD/4wmB/+RLgz/nTYS/6Y+Gv+tRyX/s080/7RYRPq0YVbzsmpo7K9zeuGmeovWnYCazZSGp8aN ja+/h5S1uoKcubV/pLyyfay+q3mxv6N2sr2geLi1nnm9r555va+eeb2vnnm9r555va+eeb2vnnm9 r555va+eeb2vnnm9r555va//jxsD/40mB/+TLgz/njUR/6g+Gf+vRiX/tk4z/rdXRPe3YFbwtmhp 6LNwe96qd43Qn3ydx5eDp7+Qiq+4i5G2soaYuq2DoL2pgam/pX6wwJx5sb+ae7e3mH27sJh9u7CY fbuwmH27sJh9u7CYfbuwmH27sJh9u7CYfbuwmH27sJh9u7D/kBoD/40mB/+ULQz/oDUR/6k+Gf+x RiT/uE0z/LtWRPW7X1btu2dp47Vufdasc4/Ko3qdwZuAp7iUh7Cxj462q4qVu6aHnb6ihaXAn4Sv wZZ+sMGUf7a4k4C7spOAu7KTgLuyk4C7spOAu7KTgLuyk4C7spOAu7KTgLuyk4C7spOAu7L/kBoD /44mB/+VLQz/oTUR/6s9GP+zRiT/uk0z+r5VRPO/XVbqv2Vq37hrftCvcY/Fpnicu59+p7KYha+r k4u2pY6Tu5+Lmr6biaLBmIiswpCCr8KPg7W5j4S6s4+EurOPhLqzj4S6s4+EurOPhLqzj4S6s4+E urOPhLqzj4S6s4+EurP/kBoD/44lB/+WLAv/ojUQ/6w9GP+1RSP/vEwy+MFUQ/DDXFbnw2Nq2rtp fsyycI/AqnactqJ8p62cgq+ll4m2npOQu5mPmL6UjaDBkYypwouIrsKKiLS6ioi5tIqIubSKiLm0 ioi5tIqIubSKiLm0ioi5tIqIubSKiLm0ioi5tIqIubT/kRoD/48lB/+YLAv/pDQQ/649GP+3RSP/ v0wy9sVTQ+7IW1bjxmFq1L9ofse2bo67rXScsaZ6pqeggK+fm4a1mJeOu5OVlb6Okp3BipKnwoaO rsKEjbS7hYy5tIWMubSFjLm0hYy5tIWMubSFjLm0hYy5tIWMubSFjLm0hYy5tIWMubT/kRoD/48l B/+ZLAv/pjQP/7A8F/+5RCL8wUsx9MlSQuvNWVXfyWBqz8JmfcK5bI22sXKbq6t4pqKlfq6ZoIS1 kp2Luoyak76HmJvAhJelwoCWr8J/krO8gJG4tYCRuLWAkbi1gJG4tYCRuLWAkbi1gJG4tYCRuLWA kbi1gJG4tYCRuLX/khoD/5AlB/+bLAr/pzQP/7I8Fv+7RCH5xUsw8c5RQefSWFTazl5pysZlfL29 a4ywtnCapbB2pZyqfK2TpoK0jKOJuYagkL2Bnpm/fZ6iwXuer8F5mbO8epe4tXqXuLV6l7i1epe4 tXqXuLV6l7i1epe4tXqXuLV6l7i1epe4tXqXuLX/khkD/5AlB/+dKwr/qjMO/7U8Ffy/RCD0yEou 7dNQP+PYVlPT0l1oxcpje7fCaYuqu2+Yn7Z0o5WxeqyNrYCyhaqHt3+njrt6ppe+d6agv3Smrb9z obS7dJ64tXSeuLV0nri1dJ64tXSeuLV0nri1dJ64tXSeuLV0nri1dJ64tXSeuLX/kxkD/5EkB/+f Kwn/rDMN/7g7FPjDQx7vzUos59pPPd3eVVHN2Ftnvs9ierDIZ4mkwm2XmbxyoY+4eKmGtX6wf7KF tXmwjLh0r5W7cK+fvG6vrLxtq7W5bqe5tG6nubRup7m0bqe5tG6nubRup7m0bqe5tG6nubRup7m0 bqe5tG6nubT/lBkD/5IkB/+iKgj/sDIM/rw6EvLHQhzo00kp4eFMO9TjU1HG3Vplt9VgeKnPZoed yWuUkcVwnofBdqZ/vnyseLyEsXK6i7RtuZO2aricuGe3p7hnt7e2aLK7sWiyu7FosruxaLK7sWiy u7FosruxaLK7sWiyu7FosruxaLK7sWiyu7H/lRgD/5UjBv+lKQf/tDEK+ME6EOvOQhjg3Ucl1eVL O8vnUVC941ljr95fdKLYZYOW02qPis5vmX/Ic6F1xHinbsF9q2m+hK5lvYuxYbyTsl+8nbJfvKyx Yr++rWK/vq1iv76tYr++rWK/vq1iv76tYr++rWK/vq1iv76tYr++rWK/vq3/lhgD/5khBf+qKAb/ uTAI8Mg4DeHYQBPU40UmyutLO8HsT0+z6FdgpuVfb5riZnyO3GyGhNVxj3rQdZVzzXqbbMp/n2fH hKJjxoqkX8SRplzEmadaw6SnWsSwp1rEsKdaxLCnWsSwp1rEsKdaxLCnWsSwp1rEsKdaxLCnWsSw p1rEsKf/mBcC/54gBP+vJgX4wC4G5tAzCNXhPBTJ6kUov/JKO7XxTkyp71Zbne1faJLqZ3OH4218 ft5ygnbaeIhw132Ma9SCkGbSh5Jj0YyVX8+SllzOmZhZzqKZWM2rmljNq5pYzauaWM2rmljNq5pY zauaWM2rmljNq5pYzauaWM2rmljNq5r/mhcC/6UeA/+3IwPtySYD1t4pBsnpOxe+80Qps/hJOqj3 TUif9lVVlPVfYInxaGiA7G9weOh1dXLlenlt4n99aeCEgGXfiYJi3Y6EX9yThl3bmYda2qGJWNmo iVjZqIlY2aiJWNmoiVjZqIlY2aiJWNmoiVjZqIlY2aiJWNmoiVjZqIn/nBYC/60bAvbBHQHb2hMB yegpCb3zOxmy/UMopv5HNpz9TEOT/VVNiv1fVoH5aV159XBic/J2Z27wfGpq7oFtZ+yGb2Tri3Fh 6o9yX+mUdF3omXVa56B3WOameFjmpnhY5qZ4WOameFjmpnhY5qZ4WOameFjmpnhY5qZ4WOameFjm pnj/ohUB/7cVANjPCwDK5xMCvPMpC7H9Oxmk/0Ammf9FMo//SzyH/1REf/9fS3j/aVBx/3BUbP12 WGn7fFpm+oFcY/iGXmH3i19f9pBhXvaVYlz1mmNa9KBkWPOlZVjzpWVY86VlWPOlZVjzpWVY86Vl WPOlZVjzpWVY86VlWPOlZVjzpWX/rRAA1sMIAMjTCgC79BUDr/8qDaP/NxiX/z0ii/9DLIH/SjR6 /1I6c/9eP27/aENp/29HZv91SWP/e0th/4FMX/+FTl3/ik9c/49QWv+TUVn/mFJX/55TVv+jVFb/ o1RW/6NUVv+jVFb/o1RW/6NUVv+jVFb/o1RW/6NUVv+jVFb/o1TZugUAxccHALnZCACs/xcFov8r DZX/MxaJ/zkefv9AJXX/SCtt/1AwZ/9aNGP/ZTdg/205Xv9zO1z/eD1a/30+WP+CP1f/hkBW/4tA Vf+PQVT/lEJT/5pDUf+fQ1H/n0NR/59DUf+fQ1H/n0NR/59DUf+fQ1H/n0NR/59DUf+fQ1H/n0PG vgUAt80FAKrkCAGf/xkGlP8oDIf/LhN7/zUZcf89Hmn/RSNi/00mW/9WKVj/XyxW/2gtVP9uL1P/ czBS/3gxUf98MVD/gDJP/4QzTv+IM03/jDRM/5I0S/+WNUv/ljVL/5Y1S/+WNUv/ljVL/5Y1S/+W NUv/ljVL/5Y1S/+WNUv/ljW3xAMAqdQCAJz5CwKT/xsFhf8jCnn/KQ9u/zEUZf85GF3/QRtX/0oe U/9SIFD/WSJN/2AjS/9mJEr/ayVJ/28lSP9zJkf/dyZG/3snRf9+J0X/gihE/4coQ/+LKUP/iylD /4spQ/+LKUP/iylD/4spQ/+LKUP/iylD/4spQ/+LKUP/iyn/gxwD/4AnB/97Mw3/hjgR/45AGf+T SSL/lVUt/5NhOf+QbUX/i3hP/4aEWfyCjmH3fZZo9HidbvF0o3Pucal37G6ueupss33parl/52jA geZnx4PjZc+F3WPYhtNg2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2of/gxwD /4AnB/97Mw3/hjgR/45AGf+TSSL/lVUt/5NhOf+QbUX/i3hP/4aEWfyCjmH3fZZo9HidbvF0o3Pu cal37G6ueupss33parl/52jAgeZnx4PjZc+F3WPYhtNg2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng 2ofTYNqH02Dah9Ng2of/gxwD/4AnB/97Mw3/hjgR/45AGf+TSSL/lVUt/5NhOf+QbUX/i3hP/4aE WfyCjmH3fZZo9HidbvF0o3Pucal37G6ueupss33parl/52jAgeZnx4PjZc+F3WPYhtNg2ofTYNqH 02Dah9Ng2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2of/gxwD/4AnB/97Mw3/hjgR/45AGf+TSSL/ lVUt/5NhOf+QbUX/i3hP/4aEWfyCjmH3fZZo9HidbvF0o3Pucal37G6ueupss33parl/52jAgeZn x4PjZc+F3WPYhtNg2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2of/gxwD/4An B/97Mw3/hjgR/45AGf+TSSL/lVUt/5NhOf+QbUX/i3hP/4aEWfyCjmH3fZZo9HidbvF0o3Pucal3 7G6ueupss33parl/52jAgeZnx4PjZc+F3WPYhtNg2ofTYNqH02Dah9Ng2ofTYNqH02Dah9Ng2ofT YNqH02Dah9Ng2of/gxwD/4AnB/99Mgz/iDcR/5A/GP+VSSL/l1Qt/5ZfOf+Ta0X/jndR/4iCW/qE jGT1f5Rr8Xqbcu52onfrcqd76W+tf+dssoLlariE5Gm/h+Jox4ngZs+K1mPWjM9i2IrPYtiKz2LY is9i2IrPYtiKz2LYis9i2IrPYtiKz2LYis9i2Ir/hBsD/4EnB/+AMQz/izYR/5M+GP+ZRyL/nFIt /5pdOv+YaUf/k3RT/o5+X/eIiWnxgpFy7X2Yeel4n3/ldKSE43CqiOBtsIzea7eP3Wq/kdtpyJPV Zs+Vy2TRk8Zl1I7GZdSOxmXUjsZl1I7GZdSOxmXUjsZl1I7GZdSOxmXUjsZl1I7/hRsD/4ImB/+C MAz/jjUQ/5Y9GP+cRiH/oFAt/59bO/+cZkj/mHFW+5N8YvSNhm3uh4536ICVgOR6nIfgdaKM3XKo kdpvr5XYbbeZ1WvAnNJpyZ7JZcmewmfNmL5p0ZO+adGTvmnRk75p0ZO+adGTvmnRk75p0ZO+adGT vmnRk75p0ZP/hhsD/4MmB/+FLwv/kDQQ/5k9F/+fRiH/o08t/6NaO/+gZEn/nW9Y+ph5ZfGSg3Hq i4x85IOSht99mY7aeKCV1nSnmtNwrp/Rbbajz2vApcdmwqfAaMaiu2rLm7dszpa3bM6Wt2zOlrds zpa3bM6Wt2zOlrdszpa3bM6Wt2zOlrdszpb/hhsD/4MmB/+HLgv/kzQQ/5s8F/+hRSD/p00t/6ZY O/+kYkr8oWxZ95x2aO+WgHXnj4mB4IeQjNqAlpXVep6d0XWlo81wrKjLbbWsx2u+rb1ov6y4a8Om s23In7BvzJmwb8yZsG/MmbBvzJmwb8yZsG/MmbBvzJmwb8yZsG/MmbBvzJn/hxoD/4QlB/+JLQv/ lTMP/508Fv+kRCD/qkwt/6pXO/6oYEv4pWpa86F0au2cfnnkk4aG3IuNktWDlJzPfJuly3ejqsd0 q63Ec7Wvv3C8sLVrvLCwbsGprHDGoqlyypypcsqcqXLKnKlyypypcsqcqXLKnKlyypypcsqcqXLK nKlyypz/hxoD/4QlB/+LLAr/lzMP/587Fv+mRB//rEss/65VO/usX0v1qmhc7qZxbOegenzfl4KK 1Y6ImM2Fj6HHgJenwnuerL14p6+6drCxt3W6sq1wurKpcb+spXTEpKN1yZ6jdcmeo3XJnqN1yZ6j dcmeo3XJnqN1yZ6jdcmeo3XJnqN1yZ7/iBoD/4UlB/+MKwr/mDIO/6E7Ff+pQx//r0ss/7FUO/ix XUvxr2Zc6qtvbuGjdn/VmX2PzJGEmcWKjKK+hJOouX+arbR8o7CwequzrXm2tKZ0ubSidb2vn3fD pp15x6CdecegnXnHoJ15x6CdecegnXnHoJ15x6CdecegnXnHoJ15x6D/iBoD/4UlB/+OKgr/mjIO /6M6Ff+rQh7/sUor/bVTO/a1XEvus2Rd5a5sb9ulc4HOnXqPxZWBmb6OiKK3iJCpsYSXrqyAn7Go fqi0pX2ytZ96uLabebuxmXvBqJh8xqKYfMaimHzGoph8xqKYfMaimHzGoph8xqKYfMaimHzGoph8 xqL/iRoD/4YlBv+QKgr/nDEN/6U6FP+tQh7/tEor+7hSOvO5WkvquGJe4bFqcNOpcIHIoHePv5l+ mbeShaKwjIypqoiUrqWEnLKggqS1nYGutpl/t7eUfbqzk3/AqpJ/xaOSf8Wjkn/Fo5J/xaOSf8Wj kn/Fo5J/xaOSf8Wjkn/Fo5J/xaP/iRkD/4YkBv+RKQn/nTEN/6c5FP+vQh3/tkkq+LxQOvC9WUvn vGFe3LVncc6sb4HDpHWOuZx8mbGWgqKqkYqpo4yRrp6JmbKZhqG1loWrt5OFtreOgbm0joO/q42D xKWNg8SljYPEpY2DxKWNg8SljYPEpY2DxKWNg8SljYPEpY2DxKX/iRkD/4ckBv+TKQn/nzEN/6k5 E/+xQRz/uUkp9sBPOe3CV0rkv19d1rlmcMmwbYC+qHOOtKB6mauagKKklYepnZGOrpeOlrKSi5+1 j4qpt4yKtLiIhri1iIe+rIiHw6aIh8OmiIfDpoiHw6aIh8OmiIfDpoiHw6aIh8OmiIfDpoiHw6b/ ihkD/4ckBv+UKQn/oTAM/6s5Ev+0QRz8u0go9MNOOOvHVkrgw15d0bxlb8Sza4C5q3GNr6R3mKae fqGemoSol5aMrpGTlLKMkZy1iI+mt4WPsbiCjLe2goy+rYOMw6aDjMOmg4zDpoOMw6aDjMOmg4zD poOMw6aDjMOmg4zDpoOMw6b/ihkD/4gkBv+WKAj/ozAM/604Ev+2QBv6vkgn8cdON+fMVUjcx1xc zL9jb7+3aX+0sHCMqal1l6Cje6CYn4KokZuJrYqZkrKFlpq1gZWkt36Vr7d7kre2fZG9rn2Qwqd9 kMKnfZDCp32Qwqd9kMKnfZDCp32Qwqd9kMKnfZDCp32Qwqf/ixkD/4kkBv+YKAj/pS8L/7A4Ef+5 QBn4wkcm7stNNeTQVEbVy1tbx8Nibrq7aH6utG6Lo65zlpqpep+SpYCmiqGHrISfj7F+nZi0epyh tnibrLZ1mre2d5i9rniWwqd4lsKneJbCp3iWwqd4lsKneJbCp3iWwqd4lsKneJbCp3iWwqf/jBgD /4ojBv+aJwf/py8K/7M3D/y9PxjzxkYj6tBMMuDVUkXPz1lawchgbLTAZnyoumyKnbRylZSweJ6L rH6lg6iFqn2mjK94pJWydKOftHGjqrVvpLm0cKC+rXKdwqdyncKncp3Cp3KdwqdyncKncp3Cp3Kd wqdyncKncp3Cp3Kdwqf/jBgD/4wiBv+dJwf/qi4J/7Y2DvfBPhbtzEYg5NhLLtncUETJ1FhYu81e a67GZXqiwGqIl7twko23dZuEs3yifbGDqHaviqxxrZOvba2dsWqtqbJprbexaqm/rGumw6ZrpsOm a6bDpmumw6ZrpsOma6bDpmumw6ZrpsOma6bDpmumw6b/jRgC/48gBf+gJgb/ri0I/bs1DPHHPRPl 00Qc3eBILdDhT0LC21ZWtNNdaKfNY3iayGiFj8Nuj4XAdJh9vXqedrqBpHC5iahruJKqZ7ecrGW4 qK1juLatZLXBqWWwxaRlsMWkZbDFpGWwxaRlsMWkZbDFpGWwxaRlsMWkZbDFpGWwxaT/jhcC/5Mf BP+kJQX/sywG98EzCejOPA/c3kAZ0OVILsflTUK54FVUrNtbZZ/VYXSS0GaBh81si37KcpN2yHmZ b8aBnmrFiaJlxZKkYsSdpl/Ep6ddxLSnXsPEpF+9yKBfvcigX73IoF+9yKBfvcigX73IoF+9yKBf vcigX73IoF+9yKD/kBcC/5gdBP+pIwT/uSkE7sgxBt3aNArQ5EEbxutHLrzqTEGw5lNSo+NaYZfg YW6M3Wh5gttugnrZdYly1XyPa9KCk2XPiJdgzY+aXMyXnFrLoJ1Yy6udV8u6nVnMzJlZzMyZWczM mVnMzJlZzMyZWczMmVnMzJlZzMyZWczMmVnMzJn/khYC/50cA/+vIAL2wCUC4tMkA9DjMgzF7EAd uvFHL7DvSz+l7VFOmutaWo/qYmWF6GpufedydXXjeHtv4H6Aad2EhGTbiodg2ZGJXdiYi1rWoI1Y 1qiOVtW0jlTVwY5U1cGOVNXBjlTVwY5U1cGOVNXBjlTVwY5U1cGOVNXBjlTVwY7/lBUC/6QZAv+3 HAHpyxYB0eEdAsXsMQ669UAervdFLqP1Sjya9FBIkPNaU4bzY1t+8mxid/FzaHHuem1s64BwZ+mG c2PnjHZg5pJ4XeSYelrjnntY46V9VuKvflThuH5U4bh+VOG4flThuH5U4bh+VOG4flThuH5U4bh+ VOG4flThuH7/mBMB/60UAfPDDwDS2AsAxOweBLj2MRGt/T4eov1DK5f8SDeO/E9BhfxZSX38Y1B3 /G1WcPt0Wmv5el5o94FhZPWHY2HzjWVf8pNnXfGZaFrwnmlY76VrVu+tbFTutG1U7rRtVO60bVTu tG1U7rRtVO60bVTutG1U7rRtVO60bVTutG3/oxAA8bkMAM7JCQDE3wsAtvcfBqz/MhKg/zsdlP9B J4r/RzGB/045ev9YP3P/YkVu/2xJaf9zTGb/ek9j/4BRYP+GU17/jFRc/5JVWv6YV1n9nVhX/KRZ VfurWlT7sVtU+7FbVPuxW1T7sVtU+7FbVPuxW1T7sVtU+7FbVPuxW1T7sVvwrwgAzb8HAMDNCAC0 7g4Cqf8hCJ//MRGS/zcah/8+In3/RSl1/00wbv9VNWn/YDll/2o8Yf9xPl//d0Bc/35CWv+EQ1n/ iURX/49FVv+URlX/mkdT/6BIUv+nSVH/rUpR/61KUf+tSlH/rUpR/61KUf+tSlH/rUpR/61KUf+t SlH/rUrPuAQAvsMFALLUBgCm/hADnP8jCJD/LQ+E/zMWef87HHD/QyJp/0onYv9SKl3/XC1a/2Uw WP9tMVb/czNU/3k0U/9+NVL/hDZQ/4k3T/+OOE7/kzhN/5k5TP+gOkv/pjpL/6Y6S/+mOkv/pjpL /6Y6S/+mOkv/pjpL/6Y6S/+mOkv/pjq/vAMAsMoDAKPcAwGZ/xIDj/8iCIL/KA12/y8Sbf83F2X/ Pxte/0ceWP9OIVT/VyNR/18lTv9lJk3/bCdL/3EoSv92KUn/eypI/4AqR/+FK0b/iStF/44sRP+U LEP/mi1D/5otQ/+aLUP/mi1D/5otQ/+aLUP/mi1D/5otQ/+aLUP/mi2xwgEAo9IAAJXrAwGM/xMD gP8cBnT/Iwpp/yoOYP8yEln/OhVT/0IXTv9JGUv/URpI/1gcRv9dHUT/Yx1D/2ceQf9sH0D/cB8/ /3QgPv94ID3/fCA8/4EhO/+HITv/jCI7/4wiO/+MIjv/jCI7/4wiO/+MIjv/jCI7/4wiO/+MIjv/ jCL/eh0D/3YoBv9yMwv/fDcP/4Q/Ff+ISB3/i1Mn/4lgMf+GbTv/gnlE/36GTP97kVP/d5pY/3Si XfxxqGH6bq5k+Gu0Z/dpumn1aMFr82bIbe9jzW/sYdNw51/dceJd5XPdW+Zz3Vvmc91b5nPdW+Zz 3Vvmc91b5nPdW+Zz3Vvmc91b5nP/eh0D/3YoBv9yMwv/fDcP/4Q/Ff+ISB3/i1Mn/4lgMf+GbTv/ gnlE/36GTP97kVP/d5pY/3SiXfxxqGH6bq5k+Gu0Z/dpumn1aMFr82bIbe9jzW/sYdNw51/dceJd 5XPdW+Zz3Vvmc91b5nPdW+Zz3Vvmc91b5nPdW+Zz3Vvmc91b5nP/eh0D/3YoBv9yMwv/fDcP/4Q/ Ff+ISB3/i1Mn/4lgMf+GbTv/gnlE/36GTP97kVP/d5pY/3SiXfxxqGH6bq5k+Gu0Z/dpumn1aMFr 82bIbe9jzW/sYdNw51/dceJd5XPdW+Zz3Vvmc91b5nPdW+Zz3Vvmc91b5nPdW+Zz3Vvmc91b5nP/ eh0D/3YoBv9yMwv/fDcP/4Q/Ff+ISB3/i1Mn/4lgMf+GbTv/gnlE/36GTP97kVP/d5pY/3SiXfxx qGH6bq5k+Gu0Z/dpumn1aMFr82bIbe9jzW/sYdNw51/dceJd5XPdW+Zz3Vvmc91b5nPdW+Zz3Vvm c91b5nPdW+Zz3Vvmc91b5nP/ehwD/3cnBv90Mgv/fzYP/4Y9Ff+LRx3/jlEn/4xeMf+Jazz/hXdG /4GDTv99j1b/eZhc/HWgYflypmX3b61p9WyzbPNquW/yaMBx8GbIc+xkzXXoYdR241/ed9td43nV XeV21V3ldtVd5XbVXeV21V3ldtVd5XbVXeV21V3ldtVd5Xb/exwD/3cnBv93MAr/gjUO/4o8Ff+P Rh3/kk8n/5FcMv+OaD3/inRI/4aAUv+Bi1r8fZVh+HidZ/V0pG3ycapx8G6wdO5rtnfsab566mfH fedlzn/iYtaA2V/dgdBf4H7MYON7zGDje8xg43vMYON7zGDje8xg43vMYON7zGDje8xg43v/fBwD /3gmBv96Lwr/hTMO/407FP+SRBz/lk4n/5VaMv+SZT7/jnFK/4p9Vf6FiF75gJJn9HuabvB2oXPt cqd46m+ufehstIDmabyD5GfGhuFlz4jZYteKz2HZiMhi3YLEY+B/xGPgf8Rj4H/EY+B/xGPgf8Rj 4H/EY+B/xGPgf8Rj4H//fRsD/3kmBv98Lgr/iDIO/5A6FP+VQxz/mkwn/5lYM/+WYz//km5M/456 V/yJhWL1hI9r8H6Xc+x5nnrodKWA5XCrheJss4ngaruM3mjGj9pm0ZLOYtGSx2TVjMFl24a9Zt2C vWbdgr1m3YK9Zt2CvWbdgr1m3YK9Zt2CvWbdgr1m3YL/fRsD/3omBv9/LAr/izEN/5M6E/+YQhz/ nUsm/51WM/+bYUD/l2xN+5J2WveNgWbyiIxw7IKUeed7m4HjdaKI33GpjtxtsZLZa7uW12nImcxk y5vFZc6XwGfSkbpo2Iq2aduGtmnbhrZp24a2aduGtmnbhrZp24a2aduGtmnbhrZp24b/fhsD/3sm Bv+BKwn/jTEN/5U5E/+bQhv/oEom/6FUM/+fX0H7nGlP9pdzXfGSfmrsjIh154WRgOJ+mIndeKCR 2HKnl9Jtr53PbLmfzGvFoMNnx6C8aMubt2rQlLJs1Y2vbNmJr2zZia9s2YmvbNmJr2zZia9s2Ymv bNmJr2zZia9s2Yn/fhoD/3slBv+DKgn/jzAM/5g4Ev+eQRv/o0km/6ZSM/2kXUH3oWdQ8ZxxX+uX e23lj4N63oeLhtV+kpHPeJmXynShnMdxqp/Db7OhwW6/o7prxaOza8ifr23NmKtv0pGpcNaMqXDW jKlw1oypcNaMqXDWjKlw1oypcNaMqXDWjKlw1oz/fxoD/3wlBv+GKQj/ki8M/5s4Ev+hQBr/p0gl /6pRMvmpW0HzpmRR7KJuYeWadnDckX5/0omGi8uCjZPFfZWZwHidnrx1paG5c66ktnK5pbJww6ar b8aiqHHLm6Rz0JOidNSOonTUjqJ01I6idNSOonTUjqJ01I6idNSOonTUjqJ01I7/gBoD/3wlBv+I KAj/lC8L/503Ef+kPxn/qkck/a5PMvatWUHvq2JS56ZrYt6ecnPSlXqByo2Ci8OHipO9gZGat32Z n7N5oaOvd6qmrHa0p6p2waijc8OloHXJnp53z5acd9KRnHfSkZx30pGcd9KRnHfSkZx30pGcd9KR nHfSkZx30pH/gBoD/30lBv+KJwj/li4L/582EP+nPxj/rUcj+7JOMfOyV0HrsWBS4qpoZNaicHTM mXeBw5J/i7yLhpS1ho6ar4GVoKp+naSme6ano3qwqaF5vKmbd8GomXnHoJh6zZiXe9GTl3vRk5d7 0ZOXe9GTl3vRk5d70ZOXe9GTl3vRk5d70ZP/gRoD/34kBv+MJgf/mC4K/6I2EP+pPhj/r0Yj+LVN MPC3VkDntV5S3a5mZNClbnPGnXWAvZZ8i7WQg5SuioubqIaSoKOCmqWff6Oom36tqph9uauUe8Cq k33GopJ+zJmRf9CUkX/QlJF/0JSRf9CUkX/QlJF/0JSRf9CUkX/QlJF/0JT/gRkD/34kBv+NJgf/ mi0K/6Q1D/+sPRf+skUi9rhMMO28VEDkuF1R17JkY8upbHPAoXOAt5p6i6+UgJOoj4ibooqPoJyH l6WXhKColIKpqpGCtauNgb+rjYHFpIyCy5uMgs+VjILPlYyCz5WMgs+VjILPlYyCz5WMgs+VjILP lYyCz5X/ghkD/38kBv+PJQf/nC0J/6Y1Dv+uPRb8tUUh87xLLurBUj/gvFtR0bVjY8atanK7pXF/ sp53iqmYfpOik4Wam4+NoJaMlaWRiZ2ojYenq4qHsqyHh7+shobEpYeGypyHhs6Xh4bOl4eGzpeH hs6Xh4bOl4eGzpeHhs6Xh4bOl4eGzpf/ghkD/4AjBf+RJQb/niwJ/6g0Df+xPBX6uEQf8L9LLefF UT3cwFpQzbhhYsGwaHG2qW9+rKJ1iaSdfJKcmIKalZSKoI+RkqWKjpuoho2lq4OMsKyBjb6sgIvD poGLyZ2Bi82YgYvNmIGLzZiBi82YgYvNmIGLzZiBi82YgYvNmIGLzZj/gxkD/4IiBf+TJAb/oCwI /6szDf+0PBT3vEMe7sRKK+TJUTvVxFhPyLxgYby0Z3CxrW19p6dziZ6ieZKWnYCZj5qIn4mXkKSD lJiof5OiqnySrat6krusepHDpnuQyZ58j82YfI/NmHyPzZh8j82YfI/NmHyPzZh8j82YfI/NmHyP zZj/gxgC/4QhBf+VJAb/oisI/60zC/63OxL0wEIc6slJKODNTznQx1dOw8BeYLe4ZW+rsmt8oaxx h5ineJCQo36YiaCFnoKdjaN9m5aneJmgqXWZq6pzmbirc5jDpnWWyZ52lc2ZdpXNmXaVzZl2lc2Z dpXNmXaVzZl2lc2ZdpXNmXaVzZn/hBgC/4cgBf+XIwX/pSoH/7EyCvu7OhDxxUEZ589IJdvSTTjL y1VMvcRdXrG+Y26luGp7m7JvhpKudo+JqnyWgqeDnHuki6F2opSlcaGdp26gqalsobapbaHDpm+d yZ5wnM2YcJzNmHCczZhwnM2YcJzNmHCczZhwnM2YcJzNmHCczZj/hRgC/4oeBP+aIgT/qCkG/7Uw CPbAOA7ry0AV4dhGINPYSzbF0FRLt8lbXKvDYmyfvmh4lLlug4u1c4yDsnqTe6+BmXWtiZ5vq5Ki a6qcpGiqp6VmqrSmZqvFpGimypxppM2XaaTNl2mkzZdppM2XaaTNl2mkzZdppM2XaaTNl2mkzZf/ hhcC/40cBP+eIQT/rCcF/bovBu/HNgrj1D4Q2N9DH8veSjS+1lJIsNBaWqTKYGmYxmZ2jcFsgIS+ col7u3iQdLl/lW63h5pptpCdZbWboGK0pqFgtbOhX7bFoGGxzJpirs+VYq7PlWKuz5Virs+VYq7P lWKuz5Virs+VYq7PlWKuz5X/hxcC/5EaA/+iIAP/siUD9cArBObPMQbY3jgPzOVDIMPiSTO23lFG qdhYV5zSXmWQzmRyhstqfHzIcIR0xneKbsR+j2jDh5RjwpCXX8GbmVzBpppbwrObWsPFmlu+z5Vc utKRXLrSkVy60pFcutKRXLrSkVy60pFcutKRXLrSkVy60pH/iRYC/5YZAv+oHQL+uCEC7MkiAtnd JQTM5TcRwupDIrfnSDOs5E9EoOBWU5TdXWCI2mNrftZqdXXUcH1u0neDZ9F/iGLQh4te0JGOWtCc kFjQp5FW0LWSVdLHkVbN1I5WyNaLVsjWi1bI1otWyNaLVsjWi1bI1otWyNaLVsjWi1bI1ov/ixUC /50XAf+vGQH0wRgB3dgRAMzlJgXB7jcTtu9CI6vtRzKh60xAlulVTYvnXViC5mVheeRsaXLkdG9s 43x0Z+KEeGLijXte4pV+W+CegFjfp4JV3rGDU96+g1Le0oNR2dyCUdncglHZ3IJR2dyCUdncglHZ 3IJR2dyCUdncglHZ3IL/jxMC/6QTAf64EgDWzAsAzOQRAcDvJge19TgVqvRAIp/zRjCV8ks8jPFU RoLwXU968GZWdPBuXG7vdmFp735kZe+GaGHvjmpe7pZtW+2eb1jrpXBW665xVOq4clLqx3NR6dVz UenVc1Hp1XNR6dVzUenVc1Hp1XNR6dVzUenVc1Hp1XP/mBAB/64OANTBCQDJzwkAvvASArP5Jwqp +zgVnvs+IZP7RCyJ+ko1gfpTPnn6XUVy+mZKbfpvTmj6dlJk+n5VYfqGV1/7jlpc+pZbWvmdXVf4 pV5V96xgU/e1YVL2wWFQ9spiUPbKYlD2ymJQ9spiUPbKYlD2ymJQ9spiUPbKYlD2ymL/owsA1rgG AMbEBwC71AkAsPwUA6b/KQuc/zUVkP87Hob/QiZ9/0kudf9RNG//Wzpp/2U+Zf9uQWL/dURf/3xG XP+DSFr/i0lY/5NLVv+bTFX/ok1T/6lOUf+xT1D/u1BP/8NRT//DUU//w1FP/8NRT//DUU//w1FP /8NRT//DUU//w1HarwIAxrwFALnJBQCt2wgAo/8XBJr/KwuO/zESg/84Gnn/QCBw/0cmaf9PK2P/ WC9f/2IyXP9rNFr/cjZY/3g4Vv9/OVT/hjtS/408Uf+VPU//nD5O/6M+Tf+qP0v/s0BK/7lBSv+5 QUr/uUFK/7lBSv+5QUr/uUFK/7lBSv+5QUr/uUHItQIAuMEEAKvQAwCf6wkBlv8aBYv/Jgp//y0P df81FWz/PRpl/0QeXv9MIlj/VCVV/10nUv9lKVD/bCpO/3MrTf95LEz/fy1K/4UuSf+ML0j/kjBH /5kwRf+gMUT/qTJD/64yQ/+uMkP/rjJD/64yQ/+uMkP/rjJD/64yQ/+uMkP/rjK4ugIAqsgAAJ3Z AACS/wwCif8aBH3/IQhy/ygMaP8wEGD/OBRa/0AXVP9IGk//TxxM/1cdSf9dHkf/YyBF/2kgRP9v IUL/dCJB/3oiQP+AIz//hiQ+/4wkPf+SJTz/mSU7/54mO/+eJjv/niY7/54mO/+eJjv/niY7/54m O/+eJjv/niarwQAAndAAAI/hAACG/w4Cev8VA27/HAZk/yMJXP8rDFX/Mw9P/zsRSf9CE0b/SRRC /08WQP9VFj7/Whc8/18YO/9kGDn/aBk4/20ZN/9yGjb/dxo1/3waNP+BGzP/iBsy/40bMv+NGzL/ jRsy/40bMv+NGzL/jRsy/40bMv+NGzL/jRv/cB4D/2wpBv9pMwn/cjcN/3k+Ev99Rxn/gFEh/35f Kf98bTL/eXs5/3aIQP9zk0X/cJ1K/26mTv9rrVH/abRT/2i7Vf9mw1f/Y8dZ+2HMW/df01zzXt1d 8FzjXutb6V/nWe9g5VnxX+VZ8V/lWfFf5VnxX+VZ8V/lWfFf5VnxX+VZ8V//cB4D/2wpBv9pMwn/ cjcN/3k+Ev99Rxn/gFEh/35fKf98bTL/eXs5/3aIQP9zk0X/cJ1K/26mTv9rrVH/abRT/2i7Vf9m w1f/Y8dZ+2HMW/df01zzXt1d8FzjXutb6V/nWe9g5VnxX+VZ8V/lWfFf5VnxX+VZ8V/lWfFf5Vnx X+VZ8V//cB4D/2wpBv9pMwn/cjcN/3k+Ev99Rxn/gFEh/35fKf98bTL/eXs5/3aIQP9zk0X/cJ1K /26mTv9rrVH/abRT/2i7Vf9mw1f/Y8dZ+2HMW/df01zzXt1d8FzjXutb6V/nWe9g5VnxX+VZ8V/l WfFf5VnxX+VZ8V/lWfFf5VnxX+VZ8V//cB4D/2woBv9rMQn/dTYN/3s8Ev9/Rhn/g1Ah/4FeKv9+ azP/e3g7/3iGQv91kkj/cptN/3CkUf9trFT/a7JX/2m5Wv9nwVz8Zcde+GLMX/Vg02HwXt1i7Fzk Y+hb6WTiWu9k4FrwYuBa8GLgWvBi4FrwYuBa8GLgWvBi4FrwYuBa8GL/cR0D/20oBv9uMAn/eDQM /387Ev+DRBn/h04h/4ZbK/+DaDT/f3U9/3yCRf95jkz/dplS/3KhVv9vqVr+bbBe/Gq3YftovmP5 ZsZl9GPMZ/Bh02nrX95r5l3lbOBb6W3ZXO5o1lzvZ9Zc72fWXO9n1lzvZ9Zc72fWXO9n1lzvZ9Zc 72f/ch0D/24oBv9xLgn/ezIM/4M6Ef+HQxj/ikwh/4pZK/+HZTX/g3I//39+SP98i1D/eZZW/3Wf XP1ypmD6bq1k+Gy0aPZpvGv0Z8Vt8GTMcOth03LlX99z3lzldNZc6HHPXu1szV7ua81e7mvNXu5r zV7ua81e7mvNXu5rzV7ua81e7mv/cxwD/28nBv90LQj/fjEM/4Y5Ef+LQhj/jksh/45WK/+LYzb/ h29B/4N7S/9/h1P+fJJb/HicYfl0pGf2cKtr822yb/FqunPvaMN262XMeOZi1XreX998013je81f 5nbHYOpwxmDsbsZg7G7GYOxuxmDsbsZg7G7GYOxuxmDsbsZg7G7/dBwD/3AnBv92Kwj/gS8L/4k4 EP+OQBj/kkkh/5NULP+QYDf/jGxD/4d3TfuDg1f4f45g9nqXZ/N2oG7wcqhz7W6veOtruHzoaMJ/ 5mbNgt9i2ITRX9yFymDgf8Vh43q/Y+h0vmPpcr5j6XK+Y+lyvmPpcr5j6XK+Y+lyvmPpcr5j6XL/ dBwD/3AmBv95Kgj/hS4L/403EP+SPxf/lkgg/5dSLP+VXjj+kWlE+ox0UPWHf1vygoll7n2Tbup3 m3XncqN85G6rgeFqs4beZ72K2mXKjdJi1I7IYtiKwmPchLxl4H63ZuV4tmbmdrZm5na2ZuZ2tmbm drZm5na2ZuZ2tmbmdrZm5nb/dRsD/3EmBv98KAf/iC0K/5A2D/+WPhb/mkcg/5xQK/+aWzj5l2ZF 9JJwUu+Me1/qhYVq5X6NdOB4lX3bcp2F1G2ki9BqrY7NaLeQy2jDkchn0ZK/ZdSPuWfZibRo3YKw aeJ8rmrkea5q5HmuauR5rmrkea5q5HmuauR5rmrkea5q5Hn/dhsD/3ImBf9/Jwf/iiwK/5M1Dv+Z PRb/nkYf/6FOK/ugWTj1nGNG75htVOiQd2LiiH9v2oCHe9J6j4PNdZeJyXGfjcVuqJHCbLGTv2u8 lb1ry5W2adCUsWvVjaxs24aobeB/p23ifKdt4nynbeJ8p23ifKdt4nynbeJ8p23ifKdt4nz/dhsD /3MlBf+BJgf/jSwJ/5Y0Dv+dPBX/oUQe/qVMKvelVzjwomFH6ZxqVuGUcmXYjHtzz4WDfMl/i4TD epOKv3abj7pzo5O3cKyWtG+3l7FvxJisbc2YqW/TkKVw2Imhcd6CoHHgf6Bx4H+gceB/oHHgf6Bx 4H+gceB/oHHgf6Bx4H//dxsD/3QlBf+DJQb/kCsJ/5kzDf+gOxT/pUMd+6lLKfOqVDjsqF5H46Fn V9qZb2fPkXhzx4qAfcGEiIW7f4+LtXqXkLF3n5StdKiXqnOymadyv5qkcsuaoXPQk5501oybddyE mnXegZp13oGadd6BmnXegZp13oGadd6BmnXegZp13oH/eBoD/3YkBf+GIwb/kioI/5syDP+jOhP/ qEIc+K1KKPCvUjfnrFxH3qVkWNGdbWbIlXVzwI58fbmJhIWzg4yMrX+Tkal7m5WleaSZoXeum552 upydd8qcmXfPlpd41I6VeNuGlHjdg5R43YOUeN2DlHjdg5R43YOUeN2DlHjdg5R43YP/eBoD/3gj Bf+IIwb/lCoI/54xC/+mOhL+q0Ib9bBJJ+y1UDbjsFpG2KljV8yha2bCmnJyupN6fLONgYWsiImM poSQkaGAmJadfaGamXuqnJZ7tp2Ue8aeknvNmJF805CPfNmIj3zchY983IWPfNyFj3zchY983IWP fNyFj3zchY983IX/eRoD/3oiBf+KIgX/likH/6AxC/+oORH7r0Ea8rRIJum5TzTftFlF0q1hVsel aWW9nnBytJd3fK2RfoWmjIaMoIiNkZqFlZaWgp6akoCnnY9/s56NgMKei4DMmouB0pKKgNiJiYDb homA24aJgNuGiYDbhomA24aJgNuGiYDbhomA24b/eRoC/3shBP+LIgX/mCgH/6MwCv+rOBD5skAY 77hHJOa9TjPbuFdEzbBgVsKpZ2S4om5xr5t1e6eWfISgkYOLmo2LkZSKk5aPh5uai4WlnYiEsJ+F hL+fhYXLm4WF0ZOFhdiKhITah4SE2oeEhNqHhITah4SE2oeEhNqHhITah4SE2of/ehkC/30gBP+N IQX/mygG/6UvCf+uNw72tj8X7LxGIuPBTjDVvFZDyLReVb2sZmOzpmxwqp9ze6GaeoSaloGLlJKI kY6PkJaJjJmahIqjnYGKrp9+iryfforKnH+K0JR/idaLf4jZiH+I2Yh/iNmIf4jZiH+I2Yh/iNmI f4jZiH+I2Yj/ehkC/38eBP+QIQT/nScF/6guCP6yNg3zuj4V6cFFH9/FTC/Qv1RCxLddU7iwZGKu qmpvpKRxepyfd4OUm36KjpiGkIeVjpWCkpeZfZCgnHqPq554j7mfd5HKnXmQz5V5jtaMeY3YiXmN 2Il5jdiJeY3YiXmN2Il5jdiJeY3YiXmN2In/exkC/4EdBP+SIAT/oCYF/6stB/u1NQvwvj0S5sdE HNrJSS7Lw1NBvrxbUrO1YmGor2lun6pveJaldYGOoXyJh56Dj4Gbi5R7mZSYd5eem3OWqZ1xlrae cJfInXKWz5VzlNWMdJPYiXST2Il0k9iJdJPYiXST2Il0k9iJdJPYiXST2In/fBgC/4QcA/+VHwP/ oyUE/68sBve6MwnsxDsP4s5CGNPOSCzGx1JAucBaUa26YV+jtGdsmbBtd5CrdICIqHqHgaWBjXqi iZJ1oJKWcJ6bmWyep5tqnrScaZ/Fm2ye0JRtmtaMbZnYiW2Z2IltmdiJbZnYiW2Z2IltmdiJbZnY iW2Z2In/fRgC/4caA/+YHgP/piMD/7MpBPPAMQfnyzgL3dg6Fs3SRirAzFA+s8ZYT6fAX12cu2Vq krdrdImzcX2Br3iEeq1/inSqh49uqY+TaaealmanpZhjp7KZYqjDmGWn0ZNmo9aLZ6HZiWeh2Yln odmJZ6HZiWeh2YlnodmJZ6HZiWeh2Yn/fhcC/4sYAv+cHAL/qyEC+7kmA+3HLATf1TEG0945FMbY RCi50U47rMxWTKDHXVqVwmNni79pcYK7b3l6uHaAc7Z9hm20hYtos46PY7KYkmCxpJNesrGUXLLC lF6y05BfrNmJYKrahmCq2oZgqtqGYKrahmCq2oZgqtqGYKrahmCq2ob/fxcC/5AWAv+hGgH/sR0B 9MAgAePRIAHT3ywGyeI7FL7fRCWy2Uw4pdNUSZnPW1eOy2FjhMhobHvFbnVzw3V7bMF8gWfAhIVi v46JXr6Yi1q+pI1YvrGOV7/CjVi/14tZuNyFWbbdg1m23YNZtt2DWbbdg1m23YNZtt2DWbbdg1m2 3YP/gRYC/5UUAf+nFgH9uBcA6csRANPfFgHI5ywHvuY7FrPkRCWo4Us1nN1SRJHZWVKG1WBdfNNm ZnTRbW5sz3R0Zs58eWHNhX1czI6AWcyZg1bMpYRUzLOFU83EhVPN3YNTxuB+VMPhfVTD4X1Uw+F9 VMPhfVTD4X1Uw+F9VMPhfVTD4X3/hxMB/5wSAf+uEQDawgoA0NIKAMfoGAG87CwKsus8F6jqQyWd 6EgzkuZQQIjkWUt+4mBUduFoXG/gb2Jo33doY95/bF7eiHBa3pFzV96bdVTep3dS37R4UN/EeE/g 3nhP1uV1T9PndE/T53RP0+d0T9PndE/T53RP0+d0T9PndE/T53T/jw8B/6QOANu4CADNxQkAxdUK ALrxGgOw8i0MpvE7GJvwQSSR70cvh+5OOn7uWEN37WFKcO1pUGrscVVl7HlZYeyBXF3sil9a7JNh V+2dY1Xtp2VS7bNmUe7AZ0/v1GhO6+ZoTejoaE3o6GhN6OhoTejoaE3o6GhN6OhoTejoaE3o6Gj/ mQsA3a4EAMy8BgDByQcAuNsKAK34HASk+C8Nmfg5F4/4PyGF+EYqfPhNMnX3Vzlu92A/afdpQ2T4 cUdh+HlKXfiBTFr4iU9Y+JJRVvmbUlP5pVRR+q9VUPq7Vk76yldN++NXTPvpV0z76VdM++lXTPvp V0z76VdM++lXTPvpV0z76VflpQAAzrQEAL+/BQC0zgYAqusNAaD/HwaX/y8NjP82FYL/PR14/0Qk cP9MKmr/VC9l/14zYf9nN13/bzla/3Y8WP9+Plb/hj9T/45BUf+XQlD/oENO/6lFTf+zRUv/vkZK /9BHSf/cR0n/3EdJ/9xHSf/cR0n/3EdJ/9xHSf/cR0n/3EfRrgAAv7kDALLFAwCn1QUAnP0PApT/ IgaJ/ysMfv8yEnX/Ohhs/0IdZf9JIl//USVa/1ooV/9jK1T/ay1S/3IvUP95ME//gDFN/4gyS/+Q NEr/mDVI/6E1R/+qNkb/szdE/784RP/FOET/xThE/8U4RP/FOET/xThE/8U4RP/FOET/xTjBswAA sr4CAKXMAQCZ3QMAkP8SAob/HwV7/ycKcf8uDmj/NhNh/z4XWv9GGlX/TR1R/1UfTv9dIEv/ZCJJ /2sjR/9xJEb/eCVE/38mQ/+GJ0H/jihA/5YoP/+eKT3/pyk8/7AqPP+0Kjz/tCo8/7QqPP+0Kjz/ tCo8/7QqPP+0Kjz/tCqzuAEApcYAAJfVAACL7wQBhP8TAnf/GgRt/yIHZP8qC1z/Mg5V/zkRUP9B E0v/SBVI/08XRf9WGEL/XBlA/2EaPv9nGjz/bRs7/3McOf95HDj/gB02/4gdNf+PHjT/lx4y/6Af Mv+kHzL/pB8y/6QfMv+kHzL/pB8y/6QfMv+kHzL/pB+mwAAAl84AAIneAAB//wcBdP8QAmn/FQNf /xwFV/8kCFD/LApK/zMMRf87DkH/QQ89/0cQOv9NETj/UhE2/1cSNP9cEzL/YRMx/2YUL/9rFC7/ cRUt/3cVLP99FSr/gxYp/4sWKf+OFin/jhYp/44WKf+OFin/jhYp/44WKf+OFin/jhb/ZiAD/2Eq Bf9hMwj/aTYL/249D/9xRhX/c1Ec/3NeI/9wbSn/bnww/2uJNf9pljn/Z6E9/2aqQP9kskL/Y7lE /2HCRv9gyEf/Xs1I/1zUSv9b3kv7WeRM91jqTPRX703wVvNN7FX4TexV+E3sVfhN7FX4TexV+E3s VfhN7FX4TexV+E3/ZiAD/2EqBf9hMwj/aTYL/249D/9xRhX/c1Ec/3NeI/9wbSn/bnww/2uJNf9p ljn/Z6E9/2aqQP9kskL/Y7lE/2HCRv9gyEf/Xs1I/1zUSv9b3kv7WeRM91jqTPRX703wVvNN7FX4 TexV+E3sVfhN7FX4TexV+E3sVfhN7FX4TexV+E3/ZiAD/2IqBf9jMQj/azUL/3A8D/9zRRX/dU8c /3ZdI/9zbCr/cHox/22HNv9rlDv/aZ8//2ioQv9msEX/ZLhH/2PASf9hx0r/X8xM/13TTfxc3k75 WuRP9VnqUPFY71HtV/RR6Vf5UOlX+VDpV/lQ6Vf5UOlX+VDpV/lQ6Vf5UOlX+VD/Zx8D/2MqBf9l MAj/bjML/3Q6D/93QxX/eU4c/3paJP93aCv/dHYz/3GEOf9ukD//bJtD/2qlR/9orUr/Z7ZM/2W+ Tv9jxVD/YctS/V/SVPld3VX0W+RW8FrqV+tY8FjnWPVX41n6VONZ+lTjWfpU41n6VONZ+lTjWfpU 41n6VONZ+lT/aB8D/2MpBf9oLgf/cTIK/3c4D/97QhX/fUwc/35YJP97Zi3/d3M1/3SAPP9xjEL/ b5dH/2yhS/9qqk//aLJS/2e7VP9lxFb+YspY+WDRWvVe3FzwXORd6lrrXuZZ8V/iWvVb3Fv5V9xb +VfcW/lX3Fv5V9xb+VfcW/lX3Fv5V9xb+Vf/aR4D/2QpBf9rLQf/dDAK/3s3Dv9/QRX/gUoc/4JV Jf9/Yy7/e3A2/3h8Pv91iUX/cZRL/2+eUP9splT/aq5Y/Wi3W/xmwF36ZMlg9WHQYvBe3GPqXOVl 5VvsZt5a8GPYW/Rg0V34W9Fd+FvRXfhb0V34W9Fd+FvRXfhb0V34W9Fd+Fv/aR4D/2UoBf9uKwf/ eC4K/382Dv+DPxT/hUgc/4dTJf+EYC//gGw4/3x5Qf94hUn+dJBQ+3GZVvluolr4a6pf9miyYvRm u2XzZMVo8GLQa+pf3W3jXedu21vqbdNc72jNXvNkyF/3X8hf91/IX/dfyF/3X8hf91/IX/dfyF/3 X8hf91//ah4D/2YoBf9xKQf/eywJ/4M1Df+HPhT/ikcb/4xQJf+JXS//hWk6/YF1RPp8gE33eItV 9HOVXPFvnWLvbKVn7Wmta+tmtm/oY8By5mHMdeNg33fWXOR4zl7pcslf7W3EYPBov2L0Y79i9GO/ YvRjv2L0Y79i9GO/YvRjv2L0Y79i9GP/ax0D/2cnBf90Jwb/fysI/4czDf+MPBP/j0Ub/5FOJf+P WjD8i2Y7+IZxRvOBfFHvfIda7HaQYuhxmGnlbKBw4Wiodd5ksHrbYrp+2GHHf9Rh2n/LX+F+xGHl d79i6XK7Y+1ttmTxZ7Zk8We2ZPFntmTxZ7Zk8We2ZPFntmTxZ7Zk8Wf/bB0D/2omBf93Jgb/gioI /4oyDP+QOxL/k0Ma/5ZMJP2VVzD3kWI88oxtSeyGeFTnf4Ff4niKadxyknLWbZp40mqifM5nq3/L ZrSByWW/g8dkzoTBY92DumTifLZm5nayZ+pxrmjvaq5o72quaO9qrmjvaq5o72quaO9qrmjvaq5o 72r/bRwD/2wkBf96JAX/hSkH/44xC/+UORH/mEIZ/5tKJPibVDDyl18965JqS+WKc1jegnxk1XyF bs92jXXKcpV6xm6dfsNspYK/aq+EvWm5hrpox4e3aNqHsWjega1p43qpa+h0pmvsbaZs7W2mbO1t pmztbaZs7W2mbO1tpmztbaZs7W3/bRwD/24jBP99IgX/iCgH/5EwCv+YOBD/nEAY+59JI/ShUi/t nVw95ZZmTN2Ob1rTh3hlzIGBbsZ7iXbBd5F7vHOZgLhwoYS1bqqHsm20ia9swYqtbNKKqGzchaVt 4X6ibuV3n2/rcJ9v63Cfb+twn2/rcJ9v63Cfb+twn2/rcJ9v63D/bhwD/3EiBP9/IQX/iycG/5Qv Cf+bNw//oD8X+KRHIfCnTy7oolo935tjTdSUbFrLjHVlxIZ9b76AhXa4fI18s3iVga91nYWrcqWJ qHGvi6Vwu4yjcMuNoHHZiJ1x34GbcuR6mXPpcplz6XKZc+lymXPpcplz6XKZc+lymXPpcplz6XL/ bxsD/3MgBP+CIAT/jiYG/5cuCP+fNg79pD4V9KhGIOysTS3jp1g82aBhTM2YalnFkXJlvYt6braF gnawgIl9q32Rgqd5mYajd6KKn3WrjZx0t46adMaPmHXWi5Z23YOUduJ8k3bndJJ26HSSduh0knbo dJJ26HSSduh0knbodJJ26HT/bxsC/3UfBP+EHwT/kCUF/5otCP+iNQz6qD0U8axFHuiwTCvfq1c7 0qRfS8icaFm/lW9kt493brCKf3aqhYZ9pIGOgp9+loebe56Ll3mojpR4s4+SeMKQkXrVjY9624WO euF+jXrmdo165naNeuZ2jXrmdo165naNeuZ2jXrmdo165nb/cBsC/3YeA/+GHgT/kyUF/50sB/+l NAv3qzwS7rFDHOW0Synar1U6zaheSsKgZli5mm1ksZN1bqqOfHajioN9noaLgpmCk4eUgJuLkH6l jo19sJCKfb6Rin/Tj4l+2oeIft9/h37ld4d+5XeHfuV3h37ld4d+5XeHfuV3h37ld4d+5Xf/cBsC /3gdA/+IHgP/lSQE/6ArBv+oMgr0rzoR67VCGuG4SifUs1M5yKtcSb6kZFe0nmtjrJhybaSTeXWe joF8mIuIgpKHkIeNhZmLiYOijoaCrpGDgryRgoPOkYOD2YiCgt+BgoLkeYKC5HiCguR4goLkeIKC 5HiCguR4goLkeIKC5Hj/cRoC/3ocA/+KHQP/lyME/6IpBfysMQnxszkP6LpAF928SCXPtlI4w69b SLmoYlavompip5xwbJ+Xd3WYk358kpCGgoyNjoeHipeLg4igjn+Hq5F8h7mRe4fLkXyI2Il9h96C fYbken2G5Hl9huR5fYbkeX2G5Hl9huR5fYbkeX2G5Hn/cRoC/3waA/+NHAP/miID/6UoBPmvLwfu uDcM5L8/FNjARiTKulA3v7NZR7SsYVWqpmhhoaFua5mcdXSSmHx7jJWDgYaSi4aBkJSLfI6ejniN qZB2jLaRdI3IkXaO2Ip3jN2Cd4rjeneK43p3iuN6d4rjeneK43p3iuN6d4rjeneK43r/choC/38Z Av+PGwL/nSAD/6kmA/azLQXqvTUJ4MY8ENLERCPFvU81urdYRq+xX1Slq2ZgnKZtapSic3OMnnp6 hpuBgICYiYV6lpKJdZSbjXKTpo9vk7SQbZTFkHCV2Ipwkt2DcZDje3GQ43txkON7cZDje3GQ43tx kON7cZDje3GQ43v/cxkC/4IXAv+SGgL/oB8C/60kAvK4KgTmwzEG28w1D8zIQiHAwk00tLxWRKm2 XlKfsWRelqxraI6pcXGGpXh4f6J/fnmgh4N0nY+Ib5yZi2ubpI1om7KOZ5vCjmmd2Ipqmd2Ca5bj e2uW43trluN7a5bje2uW43trluN7a5bje2uW43v/dBkC/4UVAv+WGAH/pBwB+7IgAe2/JQLhzCoD 1NEyDcfMQR+6x0wxrsFUQqO8XFCZt2JckLNpZoewb26ArXZ1eap9e3OohIBtpo2FaKWXiGWko4pi pLCLYKTBi2Km2Yhjot6BZZ7jemWe43plnuN6ZZ7jemWe43plnuN6ZZ7jemWe43r/dhgC/4kTAf+a FgH/qRgB9rgbAefHGgHb2RwBzdYwC8DSPx20zUovqMhSP53DWk2Sv2FYibtnYoC4bWt5tnRxcrN7 d2yxg3xnsIyAYq+Wg16uoYZcrq+HWq+/h1uw2oRdrOB/XqfleF6n5Xhep+V4XqfleF6n5Xhep+V4 XqfleF6n5Xj/ehUC/44SAf+fEwD/sBMA78AQANnUDADO3xwBxN0vCbnZPRqt00gsoc9QO5XLWEmL x19UgsRlXnnCbGZywHJsa756cma9gnZhu4t6XLuVfVm6oX9Xuq+AVbu/gFW82X9WuON6WLLndViy 53RYsud0WLLndFiy53RYsud0WLLndFiy53T/gBIB/5QQAP+mDwDjuAsA0sYKAMzXCwDD4x4CueIx Cq/gPRik3UYnmdlON43UVkSD0V1Pes9kWHLNal9ry3JlZcp5amDJgm9byYtyV8iWdVTIondSyK94 UcnAeFDK23dRxuhzUsDrb1K/7G9Sv+xvUr/sb1K/7G9Sv+xvUr/sb1K/7G//hw4B/5sNAN+uBwDQ vAgAx8kIAMHbCwC36CADrecxDaTmPRmZ5EQmjuJMM4TgVD573lxHc91jT2vcalZl2nJcYNp6YFvZ g2RX2YxnU9mXalDZo2xO2bFtTdrCbUzb3GxN2OxqTs/wZ07P8GdOz/BnTs/wZ07P8GdOz/BnTs/w Z07P8Gf/jwsA6aQEANG0BgDFvwYAvM0IALTpDgGq7iIFou4zDpftOxmN7EIkg+tJLnvqUzZz6Vw+ bOlkRGfpbEli6HRNXuh8UVrohVRW6I5WU+mYWVHpo1pO6bBcTeq+XEzr0l1L6uldSuPzXErj81xK 4/NcSuPzXErj81xK4/NcSuPzXErj81z5mQMA1KwCAMW3BAC5wwUAsNIIAKf2EQGe9SQGlfUyDor1 OheB9UEgePVIJ3D1UC5q9Fo0ZfRjOGD0azxd9XQ/WfV8Qlf1hERU9Y1GUfaXSE/2oUpN9qxLS/e5 TEr3yE1J+OBNSPfzTUj39E1I9/RNSPf0TUj39E1I9/RNSPf0TUj39E3aowAAx7ECALi7AwCtyQQA o9kHAJr9FAKS/ScHh/4vDX3+NxR0/z8bbP9HIGb/TiVg/1cpXP9gLVn/aTBW/3EyU/94NFH/gDZP /4k3Tf+SOUv/nDpJ/6Y7SP+xPEb/vT1F/8w9RP/mPkT/5z5E/+c+RP/nPkT/5z5E/+c+RP/nPkT/ 5z7LrAAAubYBAKzCAQCg0AIAleUHAI7/GAOE/yQGev8sC3D/NBBo/zwVYf9EGVv/Sx1W/1MgU/9b IlD/YyRN/2smS/9zJ0n/eilI/4IqRv+KK0T/lCxC/54tQf+nLkD/sS4//7wvPv/NMD7/zTA+/80w Pv/NMD7/zTA+/80wPv/NMD7/zTC7sQAArLwAAJ/JAACT2QAAifwLAYD/FwJ2/yAFbP8oCWT/MA1d /zgQV/9AE1H/RxZN/04YSv9WGUf/XBpE/2McQv9pHUD/cB4//3gePf+AHzv/iCA6/5EhOP+bIjf/ pCI2/60jNf+4IzX/uSM1/7kjNf+5IzX/uSM1/7kjNf+5IzX/uSOttgAAn8QAAJLSAACE4QAAff8N AXL/EwJo/xsEX/8jBlj/KwlR/zMLTP86DUf/QQ9D/0gRQP9OEj3/VBM7/1oUOf9fFDf/ZRU1/2sW M/9yFjH/ehcv/4IXLv+LGCz/kxgr/5wZKv+nGSr/pxkq/6cZKv+nGSr/pxkq/6cZKv+nGSr/pxmh vwAAkswAAITcAAB49wAAbv8KAWP/EAJa/xUDUv8dBEv/JAZG/ywIQf8zCTz/Ogo5/0ALNf9FDDL/ Sg0w/1ANLv9UDiz/WQ4q/14PKP9kDyb/ag8l/3EQI/94ECL/gBEg/4gRH/+RER//kREf/5ERH/+R ER//kREf/5ERH/+RER//kRH/XCID/1ctBf9YMwf/XzYJ/2M9Df9lRhL/ZlAX/2VeHP9kbiL/YXwn /1+KK/9eli7/XKEx/1uqM/9asjX/Wbo2/1jDN/9YzTn/V9g5/1bgOv9V5jv/VOw8/1PxPPxS9T34 Uvk99VH9PfNR/z3zUf8981H/PfNR/z3zUf8981H/PfNR/z3/XCID/1csBf9aMgf/YTUJ/2U8Df9n RRL/aE8X/2hcHf9mbSL/Y3so/2GILP9flC//Xp8y/12pNf9bsTf/Wrk4/1rBOv9Zyzv/WNU8/1ff Pf9W5j7/Ves+/VTwP/lT9T/2UvlA81L9QPBS/z7wUv8+8FL/PvBS/z7wUv8+8FL/PvBS/z7/XSED /1gsBf9cMAf/ZDMJ/2g6Df9rQxL/bE4X/2xaHf9qaiT/Z3gp/2SFLv9ikTL/YZw2/1+mOP9erjr/ XbY8/1y+Pv9byD//WtJB/1ndQv9X5UP9VupE+VXwRPVU9UXxVPpF7lT+ROxU/0LsVP9C7FT/QuxU /0LsVP9C7FT/QuxU/0L/XiED/1ksBf9fLgb/ZjIJ/2w4DP9vQRH/b0wX/3FXHv9uZyX/a3Ur/2iC MP9ljjX/ZJk5/2KjPP9gqz7/X7NB/167Qv9dxET/XM5G/1rcR/5Z5Ej6V+pJ9VbwSvBV9krtVfpK 6Vb+R+dW/0XnVv9F51b/RedW/0XnVv9F51b/RedW/0X/XiED/1krBf9iLQb/ajAI/282DP9yQBH/ dEoY/3VVHv9yZCb/b3It/2x/M/9pizj/ZpY8/2WgQP9jqEP/YbBG/2C4SP9ewUr/XctL/1zaTfpa 4071WepP8FfxUOtW9lHnV/tO5Fj/S+FZ/0nhWf9J4Vn/SeFZ/0nhWf9J4Vn/SeFZ/0n/XyAD/1or Bf9lKwb/bS4I/3M1DP93PhH/eEgX/3lSH/93YCf/dG4u/3B7Nf9thzv/apJB/2ebRf9lpEn+Y6xM /WG0TvtgvFH6XsZT+V3UVfVb41bvWupY6VjyWeVZ91bgWvtT21v/T9db/03XW/9N11v/Tddb/03X W/9N11v/Tddb/03/YCAD/10pBf9oKQb/cSsH/3gzC/98PBD/fUYX/35QH/99XSj/eWow/3V2OP9x gj/8bY1F+mqXS/hnn0/2ZadT9GKvVvNguFnxX8Fc8F3NXu1c4GDoWuxh4VryYNpb9lvTXPpXz139 U8xe/1HMXv9RzF7/Ucxe/1HMXv9RzF7/Ucxe/1H/YR8D/2AnBP9rJgX/dSkH/3wxCv+BOhD/g0QX /4RNH/+DWSj/f2Yy/HpyO/h1fkP1cYhL8m2SUe9pmlbtZqJb6mOqX+hgsmPmXrxm5FzIaeFb2mvd Wupr01zwZs1e9WHIX/lcxGD8WMFh/lXBYf5VwWH+VcFh/lXBYf5VwWH+VcFh/lX/Yh8D/2MlBP9v JAX/eSgG/4EwCv+FOQ//iEIW/4lLHv+JVij6hWIz9YBuPfB6eUfsdYNQ6XCMWOVrlV7hZp1k3mOk adtgrW3XX7dv1F7DcNFe0nHNXedxx1/ua8Jh8ma+YvZhumP5XLdj/Fi3Y/xYt2P8WLdj/Fi3Y/xY t2P8WLdj/Fj/Yx8D/2YjBP9yIgT/fScG/4UuCf+KNw7/jUAV/49JHvqPUyj0jF807oZqP+l/dEvj eH5V3nKGXthtj2XTaphqz2egbcxlqHDJY7FzxmK8dMRhyXXBYeB2vGPqcbdk72q0ZfNlsGb2YK5n +VyuZ/lcrmf5XK5n+VyuZ/lcrmf5XK5n+Vz/Yx4D/2ghBP91IAT/gSUF/4ktCP+PNQz/kj4U/JRH HfWWTyjukVs054tmQeCEb07ZfXlY0XeCYMxzimfHb5NsxGybcMBpo3O9Z6x2uma2eLhlwnm2ZdV5 smbmdq5o7G+qafBpqGn0Y6Zq91+mavdfpmr3X6Zq91+mavdfpmr3X6Zq91//ZB4D/2sgA/94HgT/ hCQF/40sB/+TNAv/lzwS+JlFG/CbTSfol1k04ZBiQteJbE7Og3VYyH1+YcN4hmi+dI5tuXCWcrZu nnWybKd4r2qxe61pvXyqac19qGrjeqVs6XKibO1soG3yZp5u9WKebvVinm71Yp5u9WKebvVinm71 Yp5u9WL/ZR0C/20eA/97HQP/hyME/5AqBv+XMgr9nDsQ9J9DGeyhSyXjnFYz2pZgQc+OaU7HiHJY wIJ6Ybp9gmi1eYpusXWSc6xymnepcKN6pm6sfaNtuH6hbcd/n27gfpxw53WacOtvmXHwaJdx82SX cfNkl3HzZJdx82SXcfNkl3HzZJdx82T/ZR0C/28dA/9+HAP/iiIE/5MpBf+bMQn5oDkP8KNBGOem SSPeoVQx0ppeQMiTZ03AjG9YuYd3YbOCf2iufYduqXqOc6R3lnigdJ97nXOofppxtICYccKBlnLY gZV05XiTdOpxknXva5F18maRdfJmkXXyZpF18maRdfJmkXXyZpF18mb/Zh0C/3EbA/+AGwP/jCED /5YoBf+eLwj2pDcN7Kg/FeOrSCDYplIwzJ5cQMOXZU27kW1Xs4t0Ya2GfGingoNuon6LdJ17k3iZ eZx8lXelf5J2sIGQdb6CjnbRgo5443qNeOhzjHjtbIt48WiLePFoi3jxaIt48WiLePFoi3jxaIt4 8Wj/ZxwC/3MaAv+CGgL/jyAD/5kmBP6iLgbzqDUL6a09E9+vRh7SqVEvx6JaP76bY0y1lWpXro9y YKeLeWihh4FunIOIdJeAkHiSfZl8jnyigIt6rYKIeruDh3rNg4d84nyHfOd1hnzsboZ88GmGfPBp hnzwaYZ88GmGfPBphnzwaYZ88Gn/ZxwC/3UZAv+FGQL/kh8C/5wlA/ulLAXwrDQJ5rI7ENuzRB3N rU8uw6ZZPrmfYUuwmWhWqJRwX6GPd2ebi35uloiGc5CFjniMgpZ8iICggIR/q4KBf7iDf3/KhIGB 4X2BgeZ2gYDrb4CA72qAgO9qgIDvaoCA72qAgO9qgIDvaoCA72r/aBwC/3gXAv+HGAL/lB0C/58j A/ipKgTssTEH4rc5DdW3QhzJsE4tvqpXPbSjX0qrnmdVo5huX5yUdWaWkHxtkI2Dc4uKi3iGiJR8 gYaegH2EqIJ7hLWEeYTHhHqG4H97heZ3e4XrcHuE7mt7hO5re4Tua3uE7mt7hO5re4Tua3uE7mv/ aRsC/3oWAv+KFwL/lxwC/6MhAvStJwPotS4F3r01CtC6QBvEtEwsuq5WO6+oXkmmomVUnp1sXZeZ c2aQlXlsipKBcoWQiXd/jZJ8e4ubf3eKpoJ0ibODcorEg3SM4H90i+V4dYnqcXaI7Wx2iO1sdojt bHaI7Wx2iO1sdojtbHaI7Wz/axoC/30UAv+NFgH/mhoB/6YeAfCxIwLkuykD2cIwCcu9PxnAuEoq tbJUOqqsXEehp2NSmaNqXJGfcWSKm3drhJh/cX6WhnZ5k497dJKZfnCQpIFtkLGCa5DBgm2S3X9u keV4b4/qcXCO7Wxwju1scI7tbHCO7Wxwju1scI7tbHCO7Wz/bhgC/4ASAf+QFQH/nhcB+6saAey3 HgHgwyEB0sYtCMbBPRi6vEkor7dSOKWyWkWcrWFRk6loWoulb2KEonVpfp98b3idhHRzm415bpmW fGqYon9nl66AZZi/gWWZ2H9omOV4aZbqcWqU7WxqlO1sapTtbGqU7WxqlO1sapTtbGqU7Wz/cRYC /4MRAf+UEwH/ohQA9bAUAOa+FADZzBUAzMorB8DGOxa1wUcmqrxRNp+4WEOWs2BOjbBmWIWsbWB+ qnNnd6d6bHKlgnJso4t2aKKUeWShoHxgoK19X6G9fl6i1H1hoeZ2Yp3rcGOb7mxjm+5sY5vubGOb 7mxjm+5sY5vubGOb7mz/dBMB/4cQAf+YEAD+pxAA57cNANbFCwDQ0BEAxc8oBbnLORSux0Ujo8NP M5m/V0CPu15LhrhkVH61a1x3snFjcbB4aWuugG1mrYlyYauTdV2rnnhbqqx5Wau8eVis0nlaq+hz XKfsbl2k72pdpO9qXaTval2k72pdpO9qXaTval2k72r/eREB/4wOAP+eDQDcrggA0rsJAMzICQDH 1g4AvdUlBLLSNhGnzkIgnMpML5LHVDyIw1xHf8FiUHe+aVdwvHBeart3Y2W5f2hguIhsXLeSb1i2 nnFVtqtzU7e7c1K30nNUt+tvVrLvalev8WdXr/FnV6/xZ1ev8WdXr/FnV6/xZ1ev8Wf/fw4B/5ML AOGlBQDSswcAyb4HAMLLCAC83Q4AtN0jA6raMw2f1kAclNNKKorQUjeAzVpBeMthSnDJaFFqyG9X ZMZ2XF/Ff2BaxYhkVsSSZ1PEnmlQxKxqT8S8a07F02pPxe1oUMDzZFG99WFRvfVhUb31YVG99WFR vfVhUb31YVG99WH/hgoA8JoEANSqBADItgYAvsEFALfPCQCw4xEAqOMlBJ/iNQ2V4D4Zi95IJYHc UDB42lg6cNhfQmnWZ0lj1W5PXtR2U1nTf1dV04laUtOTXU/ToF9N061gS9S+YErV2GBL1O1eTNH3 XEzM+VpMzPlaTMz5WkzM+VpMzPlaTMz5WkzM+Vr/jwMA2qIAAMqvAwC9uQQAtMYFAKvUCQCk6hQB nOkoBpPpNA6J6D0Yf+dEInfmTipv5lcyaeVfOGPlZz1f5G9CWuR3RVbkgElT5IpLUOSUTk3kn1BL 5axRSeW7Ukjmz1JI5uhSSOT4UUjh/E9I4fxPSOH8T0jh/E9I4fxPSOH8T0jh/E/hmQAAzakAAL6z AgCzvgMAqMsFAJ/aCQCY8hgCkPIqB4byMw588TsWdPFDHWzxSyNm8VQpYfFdLV3xZjFZ8W41VvF2 N1PxfzpQ8og8TfKSPkvynUBJ86lBR/O2Qkb0x0NF9N9DRPTwQ0Ty+kJE8vpCRPL6QkTy+kJE8vpC RPL6QkTy+kLRogAAwK4AALK4AQCnxAIAnNIEAJLtDACM+xwDgvsoB3n7MQxw/DkSafxBF2L8SRxc /FAgV/xZI1T9YiZR/WooT/1zKkz+eyxK/oMuSP6NL0b/mDFE/6IyQ/+uM0H/uzRA/8s0P//jND// 7zU//+81P//vNT//7zU//+81P//vNT//7zXEqgAAs7MAAKe/AACaywAAj9oCAIb/DwF+/xwDdf8l Bmz/LQpk/zYOXf8+Elj/RRVS/00YT/9VGkz/XBxJ/2QeR/9rH0T/cyBC/3wiQf+FIz//jyQ9/5ol O/+kJjr/ryY5/7onOP/KJzj/3Cg4/9woOP/cKDj/3Cg4/9woOP/cKDj/3Ci1rwAAp7oAAJrGAACN 1AAAgeYBAHr/EAFw/xgCZ/8hBV//KQdY/zEKUv85DU3/QQ9J/0gRRf9PE0L/VRRA/1wVPf9iFjv/ aRc5/3AYN/95GTX/ghkz/4waMv+XGzD/oRsv/6ocL/+1HC7/vxwu/78cLv+/HC7/vxwu/78cLv+/ HC7/vxyptQAAmsIAAIzPAAB/3gAAdv8FAGz/DgFi/xQCWv8bA1P/JAVN/ysHR/8zCUP/Ogo//0EL O/9HDDj/TQ01/1MOM/9YDzH/Xg8v/2QQLf9rESv/cxEp/3wSJ/+GEiX/kBMk/5kTI/+jFCL/qxQi /6sUIv+rFCL/qxQi/6sUIv+rFCL/qxScvgAAjcsAAH7aAABw5gAAZ/8AAF3/CgFU/xABTf8VAkf/ HQNB/yQEPP8rBTf/MgY0/zgHMP89CC3/Qwgq/0gJKP9NCSb/Ugok/1cKIv9dCyD/Ywse/2sLHP9z DBr/fAwY/4QMF/+ODRX/lQ0V/5UNFf+VDRX/lQ0V/5UNFf+VDRX/lQ3/UiUD/00vBP9RMgb/VzUH /1o8Cv9bRQ7/Wk8T/1ldF/9YbRv/Vnsf/1WJIv9TlSX/UqAn/1GoKf9QsSr/ULgr/0/BLP9Pyi3/ TtYu/07kLv9O7S//TvMv/034MP9N/DD/TP8w/Ez/MPlM/y/4TP8v+Ez/L/hM/y/4TP8v+Ez/L/hM /y//UyQD/00vBP9UMAX/WTQH/106Cv9fQw7/Xk4T/11aGP9bahz/Wnkh/1iGJP9Wkif/VZ0p/1Sm K/9Tri3/UrYu/1K+L/9RxzD/UdIx/1DhMv9Q6zL/T/Iz/0/3M/9O/DT7Tv80+E3/NPVO/zL0Tv8y 9E7/MvRO/zL0Tv8y9E7/MvRO/zL/UyQD/04uBP9WLwX/XDIH/2A4Cv9iQQ7/YkwT/2BYGP9faB3/ XXYi/1uDJv9Zjyn/WJos/1ajLv9VrDD/VbMx/1S7M/9TxDT/U841/1LeNv9S6Tf/UfE3/1H2OPtQ +zj3T/849E//N/FQ/zXwUP808FD/NPBQ/zTwUP808FD/NPBQ/zT/VCMD/1AtBP9ZLQX/XzAH/2M2 Cv9mQA7/ZkoT/2VVGf9jZR7/YXMj/16AKP9cjCz/W5cv/1mhMf9YqTT/V7A1/1a4N/9VwTj/Vcs5 /1TaOv9U5zv/U/A8+1L2PfZR+z3yUf8971L/O+xS/zjrUv8461L/OOtS/zjrUv8461L/OOtS/zj/ VSMD/1IrBP9cKwX/Yy4H/2c0Cv9qPg7/a0gT/2pTGf9oYR//ZnAl/2N9Kv9giC//XpMz/1ydNv9b pTj/Wq06/1i1PP9XvT7/V8c//1bTQfxV5EL5Ve5D9VT2RPBT/ETsVP9B6VX/P+ZV/zzlVf875VX/ O+VV/zvlVf875VX/O+VV/zv/ViID/1UpBP9fKAX/ZysG/2wyCf9vPA3/cEYT/3BQGf9uXSD/a2sn /2h5Lf9lhDL/Yo83/2CZO/5eoT79XKlB+1uxQ/pZuUX5WMJH91fOSPVW4ErxVuxL7lX2TOlW/Erl V/9G4lj/Q95Z/0DdWf8/3Vn/P91Z/z/dWf8/3Vn/P91Z/z//VyID/1knBP9jJgT/aygG/3EwCP90 OQ3/dUMT/3VNGf91WSH/cWcp/210MP1qgDb6Zoo8+GOUQPZhnET0XqRI8lysS/FbtE3vWb1Q7VjJ UutX2lPnVulV5Ff1VOFZ/U/bWv9L1Vv/SNBc/0TPXP9Ez1z/RM9c/0TPXP9Ez1z/RM9c/0T/WCID /1wkA/9mIwT/byYF/3YuCP96Nwz/e0ES/3tLGf97VSH+d2Mq+XNvMvZuezryaoVB72aPR+xjl0zq YJ9Q6F2nVOVbr1fjWbha4VfDXd9X0l7aVuZe1lnzWtJc/FXNXv9QyV7/TMVf/0nEX/9IxF//SMRf /0jEX/9IxF//SMRf/0j/WSEC/18iA/9qIQT/dCQF/3ssB/9/NQv/gT4R/4JIGf2CUiH3fl8r8nlr Ne1zdT7pboBG5WmJTeFlkVTeYZlZ2l+iXNZdql/TXLNh0Fu+Ys5bzGPLWuJjyFzxYMZf+lrBYP5V vWH/Ubpi/025Yv9LuWL/S7li/0u5Yv9LuWL/S7li/0v/WSEC/2IgA/9uHwP/eCME/38rBv+EMwr/ hzwQ/ohFF/eITiHwhFsr6n5mNuR4cEHfcnpL2W2DUtNpjFjPZpVczGSdX8lipWLGYK5kw1+4ZsFe xGe/XthovF/rZrpj91+2ZPtZs2X+VbBl/1CvZf9Pr2X/T69l/0+vZf9Pr2X/T69l/0//WiAC/2Ue A/9xHAP/fCID/4QpBf+JMQn/jDoO+Y5DFvGOTCDqilgr44RiN9t+bEPTeHZMzXN/U8hvh1nEa5Be wGmYYr1moGW6Zahot2OyarVivmuzYs5ssGLla69m9GSsZ/hdqWj8WKdp/1Omaf9Spmn/UqZp/1Km af9Spmn/UqZp/1L/WyAC/2ccAv90GgL/fyAD/4gnBP+OLwf9kjcM9JRAFOyVSR7kkFUq24pfN9GE aUPKfXJMxHh7VL90g1q6cYtftm6TZLNrm2evaaRqrWetbKpmuG6oZsdvpWbfb6Vq8Wiia/ZhoGz5 W55s/VaebP5Vnmz+VZ5s/lWebP5Vnmz+VZ5s/lX/XB8C/2oaAv93GQL/gx8D/4wlBP+SLQb5lzUL 75k+EuebRhzellIp0pBcN8qJZkLDg29MvH53VLd5f1uydYdgrnKPZapwl2imbZ9so2ypbqBrtHCe asJxnGrXcZxu7muab/NkmW/4Xpdw/FiXcP1Xl3D9V5dw/VeXcP1Xl3D9V5dw/Vf/Xh4C/2wZAv96 GAL/hh0C/48jA/+WKwX1mzMJ6587EOKgRRnXm1AozJRaNsSNY0K8iGxMtYJ0VLB+fFureoRgpneL ZaJ0k2mecpxtm3ClcJhvsHKVbr1zk2/Qc5Ry626Tc/JmknP2YJBz+lqQc/tZkHP7WZBz+1mQc/tZ kHP7WZBz+1n/Xx0C/24XAv99FwL/iRwC/5IiAv2aKQTxoDAH56Q5Dd6lQxfRn04nx5hYNb6SYUG2 jGlLr4dxVKmCeVukf4Bgn3yIZZt5kGqXdpltk3WicZBzrHONc7p0i3PLdYx253CMd/Boi3f1Yop3 +VyKd/painf6Wop3+lqKd/painf6Wop3+lr/YRsC/3EWAv9/FgH/ixoB/5UgAvmeJgPtpC4F46k2 CtipQBbMo0wmwpxWNLmWX0CxkGdKqotvU6SHdlqeg35gmYCFZZR9jWqQe5ZujHmfcYl4qnSGd7Z1 hHfHdoV65HKGe+9qhXv0ZIV7+F2Fe/lchXv5XIV7+VyFe/lchXv5XIV7+Vz/YxoC/3MUAf+BFQH/ jhkB/5keAfahIwLqqSoE4K8yB9KsPhXHpkskvaBVM7SaXj+slWVKpZBtUp6MdFmYiHtgk4WDZY6C i2qKgJNuhn6dcYJ9p3R/fLR2fXzFdn1+4HN/f+5rf3/zZX9+915/fvhdf374XX9++F1/fvhdf374 XX9++F3/ZRgC/3UTAf+EFAH/kRcB/5wbAfKlIAHmriYC27QuBs6vPRTDqkkjuaRTMa+eXD6nmWRJ oJRrUZmQclmTjXlfjoqAZImHiGmEhZFugIOacXyCpXR5gbJ2d4HCdnaC3XR5hO1seYPyZnqC9196 gvheeoL4XnqC+F56gvheeoL4XnqC+F7/ZxcC/3cRAf+HEwH/lBUA/p8YAO6qHAHisyEB1bcqBcmz OxO+rkgitKhSMKujWj2inmJHm5lpUJSVcFiOkndeiI9+ZIONhml+i49teYmYcXaHo3Nyhq91cIa/ dm+H13Vzie1tc4jyZnSH9mB0h/dfdIf3X3SH9190h/dfdIf3X3SH91//aRUB/3oQAf+KEQD/lxIA +aMUAOquFQDduRcAz7ooBMS3ORG5skYgr6xQL6anWDudo2BGlZ9nT46bblaImHVdgpV8Y32ThGh4 kYxsc4+WcG+OoHJsja10ao29dWmN0nVskO1tbY7xZ26M9mBujPdfboz3X26M919ujPdfboz3X26M 91//bBMB/30PAf+NEAD/mxAA9KgPAOW1DQDVvxAAyr4mA7+7NxC0tkQeqrFOLaGtVzmYqV5EkKVl TYmibFWCn3NbfJx6YXeagWZymIpqbZaUbmmVnnFmlKtzY5S6c2KVz3Nml+xsZ5XxZmiT9mBokvdf aJL3X2iS919okvdfaJL3X2iS91//bxEB/4EOAP+RDgDyoAwA2q0JANO4CgDOww4AxMIjA7m/NQ6v u0IcpLdMKpuzVTeSr1xBiqxjSoOpalJ8pnFZdqR4XnCif2NroIhnZ56Ra2OdnW5fnalwXZ25cFyd zXBfn+trYZ3yZWKa9mBimfdeYpn3XmKZ915imfdeYpn3XmKZ917/cxAB/4UMAPqWCgDbpQYA0bEI AMu7CADGxwsAvccgArLFMguowUAZnr5KJ5S6UzSLtlo+g7RhR3yxaE91r29Vb612WmqrfV9lqYZj YaiQZ12nm2pZp6hrV6e4bFanzGxYqOloWqf0Y1uj+F5co/ldXKP5XVyj+V1co/ldXKP5XVyj+V3/ eA0A/4sJAN+cAwDSqQYAybQHAMK+BgC8zAgAtc0cAavLLwmhyD0Wl8VII43CUS+Ev1g6fLxfQ3W6 ZkpvuG1Qabd0VWS1fFpftIVeW7OPYVezmmRUsqdlUrK3ZlGzzGZSs+ljVLL3X1Wu+ltWrftaVq37 Wlat+1pWrftaVq37Wlat+1r/fgkA8pECANahAgDKrQUAwLcFALjCBQCyzwkAq9QXAKPTKwaZ0DoS j85FH4XLTip9yVY0dcddPW7FZURoxGxJY8JzTl7Be1NZwYRWVcCPWVK/m1xPv6hdTb+4XkzAzV5M wOpcTr/5WU+8/lVQuv5VULr+VVC6/lVQuv5VULr+VVC6/lX/hQIA3ZgAAM2mAgDBsQMAt7oDAK7G BgCn0woAoN0VAJndKASQ2zcOhtlCGX3WSyR11FQtbdJcNWfRYzxh0GtBXM9yRljPe0lUzoRNUM6P UE3Om1JLzqlTSc65VEjPz1RIzutTSc74UErL/05Kyv9NSsr/TUrK/01Kyv9NSsr/TUrK/03njwAA 0Z8AAMOrAQC3tAIArb8DAKPLBgCb2QoAlOUaAY3lKwaE5DUNe+M/FnPiSB5s4VImZuFaLGDgYjJb 4Go2V+ByOlPfez1Q34VATd+PQ0rgm0VI4KhGRuC4R0XhzEdF4OhHRd/2RkXe/0RF3v9ERd7/REXe /0RF3v9ERd7/REXe/0TZlwAAx6YAALiwAACsuQEAosUCAJjRBgCP6w0Aie4fAoDuKwZ47TQMcO09 E2jtRhli7U4eXe1XI1ntYCdV7WgqUu1xLU/teS9M7YMySu6NNEfumDVF7qU3Q++zOELwxDhB8N85 Qe/vOEDt/ThA7P84QOz/OEDs/zhA7P84QOz/OEDs/zjLoAAAuqsAAK20AAChwAAAlswBAIvZBQCE +BEBfPgfAnT4KQZs+DIKZPg7D175QxNY+UsXU/lTGlD5Wx1N+mQfSvpsIUj6dCNG+n4lRPuIJkH7 kyhA+54pPvyrKj38uSs7/csrO/3iKzr89Cs6/PcrOvz3Kzr89ys6/PcrOvz3Kzr89yu9qAAArrAA AKG8AACVyAAAidQAAH7oBQB3/xIBb/8cAmf/JgVg/y8IWf83C1T/Pw5P/0cRS/9OE0f/VhVE/10W Qv9kGED/bBk9/3UaO/9+Gzn/iRw3/5QdNv+gHjX/rB8z/7kfM//IHzL/4iAy/+cgMv/nIDL/5yAy /+cgMv/nIDL/5yCwrQAAorcAAJXEAACH0AAAe90AAHL9CQBq/xEBYf8ZAlr/IgNU/yoFTv8yB0n/ OglF/0ELQf9IDD7/Tg47/1UPOP9bEDb/YhE0/2kRMv9yEi//exMt/4YUK/+SFSr/nhUp/6kWKP+z Fif/whYn/8cWJ//HFif/xxYn/8cWJ//HFif/xxaktAAAlsAAAIfMAAB62gAAbesAAGT/BQBc/w4B VP8UAU3/HAJI/yQEQv8sBT7/MwY6/zkHNv9ACDP/RQgw/0sJLv9RCiv/Vwop/10LJ/9kCyT/bAwi /3YNIP+ADR7/jA4d/5cOHP+hDhv/rA8b/64PG/+uDxv/rg8b/64PG/+uDxv/rg+XvAAAiMkAAHnW AABr4wAAX/YAAFb/AABO/woAR/8QAUH/FgI8/x0CN/8kAzL/KgMv/zAEK/82BSf/OwUl/0AFIv9F BiD/SgYe/1AGG/9WBxn/XAcX/2QIFf9tCBP/dwgR/4EJEP+LCRD/lQkP/5gJD/+YCQ//mAkP/5gJ D/+YCQ//mAn/SScC/0QxBP9LMQT/UDQG/1I6CP9SQwv/UU4P/09cE/9Naxb/THkZ/0uHG/9Jkx3/ SJ0f/0imIP9HriH/R7Ui/0a9I/9GxiP/RtAk/0bgJP9G6iX/RvMl/0b6Jf9G/yX/Rv8l/0b/Jf9G /yT9Rv8j/Ub/I/1G/yP9Rv8j/Ub/I/1G/yP/SScC/0YvA/9NLwT/UjIG/1U5CP9VQgv/VE0P/1JZ E/9QaBf/T3ca/06EHf9MkR//S5sh/0qkIv9KrCP/SbMk/0m7Jf9IxCb/SM0m/0jdJ/9I6Cf/SPEo /0j5KP9I/yj/SP8o/kj/KPtI/yf5SP8m+Uj/JvlI/yb5SP8m+Uj/JvlI/yb/SicC/0gtA/9QLQT/ VTAG/1g2CP9ZQAv/WEsP/1VWE/9UZhj/UnQb/1GBHv9PjiH/Tpgj/02hJf9NqSb/TLEn/0u4KP9L wSn/S8oq/0rZKv9K5iv/SvAr/0r4LP9K/yz9Sv8s+kr/K/dK/yn1Sv8o9Ur/KPVK/yj1Sv8o9Ur/ KPVK/yj/SyYC/0srA/9SKwT/WC4F/1s0CP9dPgv/XUkP/1pUFP9ZYhj/V3Ed/1V+IP9TiiP/UpUm /1GeKP9Qpir/T64r/061LP9OvS3/Tccu/03TL/9M4zD/TO0w/Ez2MfpM/jH3TP8x9U3/L/JN/y3w Tf8r8E3/K/BN/yvwTf8r8E3/K/BN/yv/SyYC/04pA/9WKQT/XCsF/2AxB/9iOwv/YkYP/2BRFP9e Xxn/XG0e/1p6I/9Yhib/VpEp/1WaLP9Toi7/Uqow/1GxMf9RuTP/UMM0/k/ONftP3zb4Tus39U71 OPJO/TjwT/817lD/M+tR/zHpUf8v6VH/L+lR/y/pUf8v6VH/L+lR/y//TCUC/1EnA/9aJgP/YCgF /2UvB/9oOQr/aEMP/2dOFf9lWhr/Ymgg/192Jf9dgSr/Wowu/liWMfxXnjT7VaY2+VStOPhTtTr3 Ur479VHJPfNR2j7wUOg/7FDzQOlR/T7oU/875lT/OONV/zXhVf8z4VX/M+FV/zPhVf8z4VX/M+FV /zP/TSQC/1QkA/9dIwP/ZSUE/2otBv9tNgr/bkAO/21LFP9rVhv/aGQh/mVxKPtifS34X4cy9lyR NvNamTryWKE98FepQO5VsULsVLlE61PERulS0kjlUeVJ4lLySN9U/ETdVv9A21j/PdZZ/zrSWf84 0ln/ONJZ/zjSWf840ln/ONJZ/zj/TiQC/1ghA/9hIAP/aiME/3ArBf9zNAn/dD4O/3RIFP9yUhv7 b18j9mtsKvJndzHvY4I37GCLPeldlEHmWpxF5FikSeJWrEzgVLRO3VS/UNtUzVDXU+JR0lTwTtBX +0rOWv9FzVz/Qslc/z7FXP88xVz/PMVc/zzFXP88xVz/PMVc/zz/TyMC/1sfAv9lHQL/biED/3Up Bf95MQj/ejsM/3pEE/p5Thv0dlsj7nFnLOlscjXlaHw84WOFQ91gjkjZXZdM1VyfT9Jap1HPWbBT zVi6VMtYxlXJV9pWxVfsVcNb+U/CXv9KwF//Rr1g/0K6YP9AumD/QLpg/0C6YP9AumD/QLpg/0D/ UiEC/14dAv9pGgL/cx8D/3omBP9+Lwb/gTgL+4FBEvOASxrsfFcj5ndjLeBxbTjabXdA02mARs9l iUvLY5FPyGCZUsVfoVXCXapXwFyzWb5cv1q8W85buFvlW7de9VW3Yv9PtWP/SrJk/0awZP9DsGT/ Q7Bk/0OwZP9DsGT/Q7Bk/0P/VR8C/2EaAv9tGAL/dx0C/34kA/+ELAX+hzUJ9Yg+EO2HSBjlg1Qi 3n5fLtR4aTjOc3NAyW58R8RrhEzAaIxRvWWUVLpjnFe3YqVatGCuXLJguV6wX8derV/fX6xi8Vms Zf5Tqmf/Tqhn/0qmZ/9Gpmf/RqZn/0amZ/9Gpmf/RqZn/0b/Vx0C/2QYAv9wFgL/exwC/4MiAv+J KgT5jDIH7447DeeORBbeilEh1IRcLcx+ZjjFeG9BwHR3SLtwgE23bYhSs2qQVrBomFmsZqBcqmWp X6dktGClY8Jho2PVYqJl7V2iaftXoWr/UZ9r/0yea/9Jnmv/SZ5r/0mea/9Jnmv/SZ5r/0n/WRwC /2cWAf9zFQH/fhoB/4cgAv+NJwP0ki8G6pQ4C+GUQhPWj04gzIlZLcWDYze+fWtAuHl0SLN1fE6u coRTqm+MV6dtlFuja5xeoGmlYJ5osGObZ71kmWfOZJhp6GGabflamW7/VJdu/0+Wbv9Llm7/S5Zu /0uWbv9Llm7/S5Zu/0v/WxoC/2kUAf92FAH/gRgB/4odAfyRJALwlywE5Zo0CNyaPxHPlEwfxo5X LL6IYDe3gmlAsX5xSKx6eU6nd4BTo3SIWJ9xkFybb5hfmG2hYpVsrGSTbLlmkWvJZpBt5GSRcfZc kXL+VpBy/1GQcv9NkHL/TZBy/02Qcv9NkHL/TZBy/03/XRgB/2sTAf95EwH/hBYB/44bAfiVIQHr mygD4aAwBtWePRDKmEoewZJUK7mMXjaxh2Y/q4JuR6Z+dk6he31TnHiFWJh2jVyUdJVfkXKeY45x qWWLcLVniXDFZ4hw4GaKdPRei3b8WIp2/1KJdv9OiXb/Tol2/06Jdv9OiXb/Tol2/07/XxcB/24R Af97EgH/hxQA/5EYAfSZHQHnoCMC3aUrBM+hOw/FnEgdvJZTKrSQXDWsi2Q/podsR6CDc02bgHpT ln2CV5J6ilyOeJJginacY4d1pmaEdLJognTCaIB022iDePJghHr7WYR5/1SEef9PhHn/T4R5/0+E ef9PhHn/T4R5/0//YRUB/3AQAf9+EQD/ihIA/5QVAPCdGQDjpR4B16goA8ulOQ7Bn0Ybt5pRKa+V WjSnkGI+oYtqRpuHcUyVhHhSkIF/V4x/h1yIfZBghHuZY4B6o2Z9ebBoe3m/aXp51ml8fPBhfn76 Wn59/lV+ff9Rfn3/UX59/1F+ff9Rfn3/UX59/1H/YxQB/3IPAf+BEAD/jREA/JgSAOyhEwDfqhYA 0awmA8eoNw28o0Qas55PJ6qZWDOjlGA9nJBoRZaMb0yQiXZSi4Z9V4aEhVuCgo5ffoCXY3p/oWZ3 fq1odX69aXN+0ml2ge5ieIL6W3iC/lZ5gf9ReYH/UXmB/1F5gf9ReYH/UXmB/1H/ZRMB/3UOAP+D DgD/kA4A9ZsOAOimDgDZrw8AzK8kAsKrNQy4p0MZrqJOJqadVjGemV47l5VmRJCRbUuLjnRRhox7 VoGJg1t8h4tfeIaVYnSEn2Vxg6toboO6aW2Dzmlvhutjcof5XHOG/VZzhf9Sc4X/UnOF/1Jzhf9S c4X/UnOF/1L/aBEB/3gNAP+GDQD2kwwA3qAJANapCgDSsg0Ax7IiAr2vMwqzq0EXqqdMJKGiVTCZ nl06kppkQouXa0mFlHJQgJJ5VXuPgVp2jYlecoySYm6KnWVrialnaIm4aGeJy2hpi+ljbI35XG2M /Vdtiv9SbYr/Um2K/1Jtiv9SbYr/Um2K/1L/axAB/3sLAP+KCgDimAYA1qMIANCsCQDLtQsAwbYf Abi0MQmusD8WpKxKIpyoUy6UpFs4jKBiQIaeaUiAm3BOepl3U3WWflhwlIdcbJOQYGiSm2Nkkadl YpC2ZmCRyWZikudiZZT4XGeS/Vdnkf9SZ5H/UmeR/1Jnkf9SZ5H/UmeR/1L/bg4A/38JAPGOBQDZ mwUAz6YHAMmvBwDEuQgAu7ocAbK4LweotT0Tn7FIIJauUSuOqlk1hqdgPoClZ0V6om5LdKB1UW+e fFVqnIVZZpuOXWKamWBemaZiXJm0Y1qZx2NbmuVgX5v3W2Ca/lZhmP9SYZj/UmGY/1JhmP9SYZj/ UmGY/1L/cgsA/4MFAN+TAQDRnwQAyaoGAMGyBQC7vQQAtL8YAKu+LAWiuzoRmbhFHZC1TyiHslcy gK9eOnmtZUJzq2xIbqlzTWmnelFkpoNWX6SNWVyjmFxYo6ReVqOzX1Wjxl9VpORdWKT2WFqj/1Rb of9QW6H/UFuh/1Bbof9QW6H/UFuh/1D/dwcA8IkAANaYAADLpAMAwa0EALm2AwCywAQAq8UUAKPF KASbwjcOkcBDGYm9TCSAulUuebhcNnK2Yz1ttGpDZ7NxSGKxeUxesIFQWq+LVFavl1ZTrqNYUK6y WU+uxllPruRYUa72VFOu/1BUrP9NVKz/TVSs/01UrP9NVKz/TVSs/03/fQAA348AAM6dAADDqAIA ubACALC6AgCoxAUAocwPAJvMIwKSyjMKicg/FYHGSR95xFIocsJaMGvBYTdmv2g8Yb5wQVy9eEVY vIFJVLyLTFG7lk9Ou6NRTLuzUkq7xlJKu+RRTLv2Tk26/0tOuf9JTrn/SU65/0lOuf9JTrn/SU65 /0nvhQAA1JUAAMejAAC6rAEAsLQAAKe/AwCeyQYAldQLAJDVHQGJ1C4GgNI8EHjQRhlxz08has5Y KWTNXy9fzGc0WstuOVbKdz1SyoBAT8mLQ0zJl0VJyaRHR8mzSEbKyEhGyuZHR8n3RUfI/0NIx/9C SMf/QkjH/0JIx/9CSMf/QkjH/0LejQAAy5wAAL2nAACxsAAAproAAJzEAwCTzwcAit0MAIXfHQF+ 3ywFdt43C2/eQxNo3U0aYtxVIF3bXSZY22UqVNptLlDadjJN2oA1StqLN0falzlF2qQ7Q9u0PELc yDxC2+U7Qtr0OkLZ/jpD2P85Q9j/OUPY/zlD2P85Q9j/OUPY/znQlgAAwaMAALKsAACntQAAnMAA AJHKAwCH1gcAgOkRAHnpIAJy6SwFa+k2CmTpPw9e6UgUWelRGVXoWhxR6WIgTulrI0vpdCVI6X0n RumIKkPpkytB6qAtQOqvLj7rwC497NsuPervLj3o/C495/8tPef/LT3n/y095/8tPef/LT3n/y3F nwAAtakAAKixAACcvAAAkMcAAITSAQB63wYAdPQTAG30IAJm9CoEX/Q0CFr1PQtU9UUPT/VMEkz1 VRRJ9l0XRvZlGET2bhpB9nccP/eBHT33jR8795kgOfimITj4tSI3+cgiNvnjIjb48yI29/wiNvf8 Ijb3/CI29/wiNvf8Ijb3/CK3pgAAqa4AAJy5AACQxAAAg88AAHfbAABv9goAZ/8TAWD/HQJa/ycD VP8wBU//OAhK/0AKRv9IDEP/Tw5A/1YPPf9eEDv/ZRI4/24TNv93FDT/ghUy/48WMP+bFy//qRcu /7cYLf/IGCz/4Rgs/+8YLP/vGCz/7xgs/+8YLP/vGCz/7xirqwAAnrUAAJDBAACCzAAAddkAAGnk AABh/wkAW/8RAFT/GQFO/yICSf8rBET/MgVA/zoGPP9BBzn/Rwg2/04JM/9UCjH/Wwsu/2IMLP9r DCn/dQ0n/4AOJf+NDiT/mg8j/6YQIv+zECH/wRAh/9AQIf/QECH/0BAh/9AQIf/QECH/0BCfsgAA kb4AAIPKAAB11gAAZ+IAAFvxAABU/wYATv8OAEj/FAFC/xwCPf8kAjn/KwM1/zIEMf84BC7/PgUr /0MFKP9JBiX/TwYj/1YHIf9dBx7/ZQgc/28IGf96CRf/hwkW/5QJFf+fChT/qgoU/7MKFP+zChT/ swoU/7MKFP+zChT/swqTuwAAhMcAAHXTAABn4QAAWOgAAE77AABI/wAAQf8KADv/EAE2/xUBMf8c AS3/IgIp/ygCJf8tAiL/MgMf/zgDHP89Axr/QgMX/0gEFf9OBBP/VQQR/10FD/9nBQ3/cgUM/30F Cv+JBgr/kwYJ/5wGCf+cBgn/nAYJ/5wGCf+cBgn/nAb/PyoC/z8wA/9EMAP/SDME/0k5Bv9IQgj/ Rk0L/0VbDv9DaRH/QXcT/0CFFf8/kRb/PpsY/z6kGP89qxn/PbMa/z26Gv89wxr/PMwb/zzbG/88 5xv/PPAb/zz4G/89/xv/Pf8b/z3/G/89/xr/Pf8Z/z3/Gf89/xn/Pf8Z/z3/Gf89/xn/QCoC/0Eu A/9HLgP/SjEE/0w3Bv9LQAj/SksL/0hZD/9GZxH/RHUU/0OCFv9Cjxj/QZkZ/0GiGv9AqRv/QLEb /z+4HP8/wBz/P8kd/z/WHf8/5R3/P+8d/z/3Hv8//h3/P/8d/z//Hf9A/xz+QP8b/kD/G/5A/xv+ QP8b/kD/G/5A/xv/QCoC/0MsA/9JLAP/TS8E/081Bv9QPgj/TkkM/0xWD/9KZBL/SHIV/0d/GP9G ixn/RZYb/0SfHP9Epx3/Q64e/0O1H/9CvR//QsYg/0LRIP9C4iH/Qu0h/0L1If9C/SH9Qv8h+0P/ IPpD/x/5Q/8e+UP/HvlD/x75Q/8e+UP/HvlD/x7/QSkC/0YqA/9MKQP/USwE/1MyBv9UPAj/VEcM /1FSD/9PYBP/TW8X/0x8Gf9KiBz/SZIe/0ibH/9HoyH/R6si/0ayI/9GuiP/RsMk/0XNJf9F3iX/ Reom/EX0JvlF/Cb2Rf8m9Ub/JPRG/yPzR/8h80f/IfNH/yHzR/8h80f/IfNH/yH/QigC/0knAv9Q JgP/VSgE/1gvBf9aOQj/WkQM/1dPEP9VXBT/U2oY/1F3G/9Pgx//To4h/02XI/9MnyX/S6cm/0qu J/9Ktin+Sb4q/UnJKvpI2Sv3SOcs9EjyLPFI+yzvSf8q7Ur/KOxK/yfrS/8l60z/JetM/yXrTP8l 60z/JetM/yX/QygC/00kAv9UIwP/WiUD/14sBf9gNgf/YEEL/15MEP9bVxX/WWYZ/1dyHv9VfiL+ U4kl/FGTKPpQmyr5T6Ms906qLvZNsi/0TLow80zEMvJL0TPuS+Q06krwNOdL+jPlTf8w5E7/LeJP /yvhUP8p4VD/KeFQ/ynhUP8p4VD/KeFQ/yn/RiUC/1AhAv9YIAL/XyED/2QqBP9mMwf/Zj0L/2VI EP9iUxX/YGEb/F1tIPhaeSX1WIQp81aNLfBUljDuUp4z7VGlNetQrTfpTrU5506/O+ZNzDzjTOA9 303uPNxP+TnZUf811lL/MtRT/zDTVP8t01X/LdNV/y3TVf8t01X/LdNV/y3/SiMC/1QeAv9cHAL/ ZB8C/2knBP9sMAb/bToK/2xED/1qTxX4Z1wc82NoIu9gdCjrXX4u6FqIM+VXkTfjVZk64FOgPt5S qEDcUbFB2VC7QtZQyEPTUNxEz1DsQ8xS+D/LVf87yVf/N8hY/zTHWf8yxln/McZZ/zHGWf8xxln/ McZZ/zH/TSAC/1cbAv9gGQL/aR0C/28lA/9yLQX/dDcI/XNBDvZxSxTwblgc6mpkJOVlbivgYXkz 3F6CONhcizzTWpQ/0FicQs5Xo0TLVaxGyVW1R8dUwEnFVNBJwlPmScBW9UW+Wf9AvVv/PLxc/zm7 Xf81ul3/Nbpd/zW6Xf81ul3/Nbpd/zX/UB4C/1sZAf9kFgH/bRsC/3QiAv94KgT/ejMH9no9DO94 RxPndVQb4XBfJdprai3TZ3Q0zmR9Osphhj/HX45CxF2WRcFbnki/WqZKvFmvTLpYuk24WMhOtljf TrRZ8EuzXP1Fsl//QLJg/zywYf85sGH/OLBh/ziwYf84sGH/OLBh/zj/UhsB/14WAf9oFAH/chkB /3kfAv9+JwP5gDAF8IE5CueAQxHgfFAa1ndbJM9yZi7JbW81xGp4O8BngUC8ZIlEuWKRSLZgmUqz X6FNsV2qT65ctFGsXMFSqlzUUqhd61CoYPpJqGP/RKhk/0CmZf88pmX/O6Zl/zumZf87pmX/O6Zl /zv/VRkB/2EUAf9sEgH/dhcB/30cAf+DIwL0hiwE6og1B+GHQA7WgkwZzX1YJMZ3Yi3Ac2s1u290 PLdsfEGzaYRGr2eMSaxllEypY5xPpmKlUaRhr1OiYLxVoGDNVZ5g5lSeZPdNn2f/R59p/0Oeaf8/ nWn/PZ1p/z2daf89nWn/PZ1p/z3/VxcB/2MSAf9vEQH/eRQB/4EZAfuHIAHvjCcC5I4wBdqNPQzP h0oYx4JVI799Xy25eGg1s3RwPK9xeEKrboBGp2yISqRpkE6gaJhRnWahU5tlq1WYZLhXlmTIWJRk 4ViVaPRQlmv/Spds/0WWbf9Blm3/QJZt/0CWbf9Alm3/QJZt/0D/WRUB/2YQAf9yEAD/fRIA/4UW APaMGwHqkSIB35QrA9OROgvJjEcXwIdTIrmCXCyyfWU1rXltPKh1dUKjc31HoHCES5xujE6ZbJVS lWueVJJpqFeQabRZjmjDWYxo3FqNbPJTj27/TJBw/0ePcf9Dj3H/QY9x/0GPcf9Bj3H/QY9x/0H/ WxQB/2gPAP91DwD/gBEA/4kTAPKQFwDllhwA2ZkmAs2VOArEkEUWu4tRIbOGWiytgmM0p35rO6F6 ckGdd3pGmXWBS5VziU+ScZFSjm+bVYtupViIbbBahmy/W4Rt1VuGb+9ViHL9Tol0/0mJdP9EiHT/ Q4h0/0OIdP9DiHT/Q4h0/0P/XRIB/2sOAP94DgD/gw8A/YwQAO2UEgDgmhUA05wkAsiZNgm/lEMV to9PIK6KWCunhmEzoYJoO5x/cEGXfHdGk3l+S493hk+LdY9SiHOYVoRyoliBca5af3G8XH1x0Fx/ c+xWgXb7T4N4/0qDeP9Fgnj/RIJ4/0SCeP9Egnj/RIJ4/0T/XxEB/20MAP96DQD/hQ0A8o8NAOeY DQDbnw4Azp8iAcSdNAi6mEIUspNNH6qPViqjil8ynIZmOpeDbUCSgHVFjX58Sol8hE6FeoxSgniV Vn53oFl7dqtbeXW6XHd2zVx4d+pYe3r6UX18/0t9fP9GfXz/RX18/0V9fP9FfXz/RX18/0X/YRAB /28LAP99CwD1iAoA35MIANibCgDTogwAyaMfAb+gMge2nEATrZdLHqWTVCiej10xmItkOZKIaz+N hXJFiIN6SoSAgU6Af4pSfH2TVXh8nVh1e6lbcnq4XHF6ylxyfOhYdX75UXeA/0x3gP9Hd4D/RneA /0Z3gP9Gd4D/RneA/0b/ZA8A/3IJAP9/CADljAUA2JYHANGeCQDOpQoAxKYdAbqkLwaxoD4RqJxJ HaCYUyeZlFswk5BiOI2NaT6IinBEg4h4SX6Gf016hIhRdoKRVXKBm1hvgKdabH+1XGuAyFxrgeVZ boP3UnGE/01yhP9IcoT/R3KE/0dyhP9HcoT/R3KE/0f/Zg0A/3UHAPaDBQDcjwMA0pgGAMyhBwDI qAgAv6kaALWoLQWspDwQpKBHG5ydUSWUmVkvjpZgNoiTZz2CkG5DfY52SHmMfUx0ioVQcIiPVGyH mVdphqVZZoazW2WGxVtlhuNZaIj2UmuK/01siv9IbIn/R2yJ/0dsif9HbIn/R2yJ/0f/aQsA/3gE AOWHAADWkgMAzZwFAMakBgDBqwYAua0XALCsKwSnqToOn6ZFGZaiTyOPn1ctiJxfNYKZZjt9l2xB eJVzRnOTe0tukYNPao+NUmaOl1VjjaNYYI2xWV+Nw1pejeBYYo/1UmSQ/01mkP9IZo//R2aP/0dm j/9HZo//R2aP/0f/bAgA/nwAAN6KAADQlgIAyJ8EAMCnBAC5rgMAsrIUAKqxKAOhrzcMmaxDF5Go TSGJpVUqgqNcMnygYzl3nmo+cpxxRG2aeUhomYFMZJeLUGCWlVNdlqJVWpWwV1mVwVdYld5WW5bz UF2X/0xfl/9HYJb/RmCW/0Zglv9GYJb/RmCW/0b/cAMA64EAANaPAADKmgEAwaMDALmqAgCxsgEA qrcRAKO3JAKbtTQKk7JAFIqvSh6DrVMnfKtaLnaoYTVwp2g7a6VvQGejd0Rion9IXqGJTFqglE9X n6BRVJ+uU1OfwFNSn91SVZ/zTleg/0pZoP9GWZ//RVmf/0VZn/9FWZ//RVmf/0X/dQAA4IYAAM+T AADEnwEAuqcBALGuAACptgAAob0NAJu9IAGUvDEHi7o9EIO3SBp8tVAidbNYKm+yXzBqsGY2Za9t O2CtdT9crH5DWKuHR1Wqk0pRqp9MT6quTU2qwE1NqtxNTqrySVCq/kZSqf9DUqn/QlKp/0JSqf9C Uqn/QlKp/0LyfAAA14wAAMiZAAC9owAAsqsAAKmyAACguwIAl8QJAJLFGwCLxCwEg8I6DHvBRBV0 v04dbr1WJGi8XSpju2QwX7psNFq5dDlWuHw8U7eHP0+3kkJMtp9ESratRki2wEZIt91FSbbyQ0q1 /0FLtf8+S7T/PUu0/z1LtP89S7T/PUu0/z3igwAAzZIAAMGfAAC0pwAAqq8AAKC4AACWwAMAjMoH AIbNFACBzSYCesw1CHPLQQ9sykoXZslTHWHIWyNcx2IoWMZqLFTGcjBQxXwzTcWGNkrEkjlHxJ87 RcSuPETFwTxDxd88RMTzO0TD/zlFwv83RcH/N0XB/zdFwf83RcH/N0XB/zfViwAAxZoAALekAACr rAAAoLQAAJa+AACLxwQAgdAIAHjZDgB12SABb9gvBGnYPAlj1kYQXtZQFVnVWBpV1GAfUdRoIk7U cSZL03spSNOFK0XTki5C1J8vQdSvMD/VwjE/1eEwP9PyMD/S/S8/0f8uP9D/Lj/Q/y4/0P8uP9D/ Lj/Q/y7KlAAAu6EAAK2pAACisQAAlrsAAIvEAACAzQMAddgIAG/kEQBq5CABZOQtA17kOAdZ5EEL VeRLD1HkVBJN5F0WSuRlGEfkbhtF5HcdQuSCH0DkjiE+5ZsjPOWqJDvmvCQ65tMkOeXuJDnj+iM5 4v8kOeL/JDni/yQ54v8kOeL/JDni/yS/ngAAr6YAAKOuAACXuAAAisIAAH7MAABz1gIAaeUJAGTv FABf8CABWfArA1TwNQVP8D4HS/FGCkfxTgxE8VcOQvFfED/yZxI98nAUOvJ7FTjzhxY285QYNfSi GTP0sRky9cUaMfXiGjH08Rkx8f4ZMfH/GTHx/xkx8f8ZMfH/GTHx/xmypAAApasAAJi2AACLwAAA fsoAAHHVAABl3gAAXvUKAFn8EwBT/B4BTvwnAkr9MANF/TkFQf1ABj7+SAc7/k8JOP9XCjb/Xgsz /2cMMf9wDS7/fA4s/4kPK/+WECn/pBAo/7QRJ//HESf/4REm//IRJv/2ESb/9hEm//YRJv/2ESb/ 9hGnqQAAmbMAAIu+AAB+yQAAcNMAAGTeAABY5wAAUv8JAE3/EQBH/xkBQ/8iAT7/KgI6/zIDN/85 AzP/PwQw/0YFLf9NBSv/VAYo/1sHJv9jByP/bQgh/3kJH/+HCR7/lQod/6MKHP+xChv/wAsa/9YL Gv/fCxr/3wsa/98LGv/fCxr/3wubsQAAjbwAAH7HAABw0gAAY94AAFXkAABL9QAARv8FAED/DgA7 /xQAN/8bATP/IwEv/ykCK/8wAij/NQIl/zsDIv9BAx//RwMd/04DGv9VBBj/XgQV/2gFE/90BRH/ ggUQ/5AGEP+dBg//qQYO/7UGDv+6Bg7/ugYO/7oGDv+6Bg7/ugaOugAAf8UAAHDRAABi3gAAVOUA AEbrAAA//gAAOf8AADT/CQAv/w4AK/8UACf/GgEj/yEBH/8lARz/KgEZ/y8BFv80AhT/OgIR/0AC EP9GAg7/TgIM/1YCCf9gAwf/bAME/3gDA/+GAwL/kQMB/50DAf+hAwH/oQMB/6EDAf+hAwH/oQP/ Ni0C/zkuAv8+LgP/QDID/0A4BP8+QQb/PEwI/zpaCv84aAz/NnYO/zWDD/80jxD/M5kR/zOhEf8z qRL/MrAS/zK3Ev8yvxL/MsgT/zLTE/8y4xP/Mu0T/zL2Ev8z/hL/M/8S/zP/Ev8z/xH/M/8R/zP/ EP8z/xD/M/8Q/zP/EP8z/xD/Ni0C/zssAv9ALAP/Qy8D/0M1BP9CPgb/QEoI/z5XC/88ZQ3/OnMP /ziAEP83jBH/N5YS/zafE/82pxP/Nq4U/za1FP82vBT/NcUV/zXQFf814BX/NusV/zb0Ff82/RT/ Nv8U/zb/FP43/xP+Nv8T/Tb/Ev02/xL9Nv8S/Tb/Ev02/xL/NywC/z4qAv9DKgL/Ri0D/0cyBP9G PAb/RUgI/0NVC/9BYg3/P3AQ/z19Ef88iRP/O5MU/zucFf86pBb/OqsW/zqyF/86uRf/OcIX/znM F/853Rj/OekY/znzGP86+xj8Ov8X+jr/F/k6/xb4Ov8W+Dr/Ffg6/xX4Ov8V+Dr/Ffg6/xX/OSsC /0EnAv9GJwL/SikD/0svBP9MOQb/S0UI/0hRC/9GXg7/RGwR/0J5E/9BhRX/QI8X/0CYGP8/oBj/ P6cZ/z6uGv8+thr/Pr4b/z7IG/891hz+PeYc+z7xHPg++hz1Pv8c8z7/GvI//xnxP/8Z8T//GPE/ /xjxP/8Y8T//GPE//xj/PSgC/0UkAv9KIwL/TiUD/1EsBP9SNgb/UUEI/09NDP9MWg//SmcS/0h0 Ff9HgBf/RosZ/0WUG/9EnBz/Q6Qd/kOrHv1Csh/8Qrog+kLEIPlC0CH2QeIh8kLuIu9C+SLtQv8g 60P/H+pD/x3pRP8c6ET/G+hE/xvoRP8b6ET/G+hE/xv/QCUC/0ghAv9PIAL/UyEC/1cpA/9ZMwX/ WD4I/1ZJDP9SVRD/UWMU/09vF/5Nexr7S4Yd+UqPH/dJmCH2SJ8i9EemJPNHriXxRrYm8Ea/J+9F yyjsRd4p6EXsKeVG+CjiR/8m4Uj/JN9J/yLeSf8g3Un/H91J/x/dSf8f3Un/H91J/x//QyIC/0we Af9THAL/WR4C/10mA/9fMAT/XzoH/11FC/9aUBD9WF4V+FVqGfVTdh3yUYAh70+KJO1NkybrTJop 6UuiK+dKqSzlSbEu5Ei7L+JIxzHgSNkx3EjqMdhJ9i7US/8r0kz/KdBN/ybPTv8lzk7/I85O/yPO Tv8jzk7/I85O/yP/Rx8B/1AaAf9XGAH/XhwB/2MjAv9mLAT/ZjYG/2RBCvpiTA/0X1kV71xlG+tZ cCDnVnsl5FSEKeFRjS3eUJUw3E+dMtlOpTPWTa010023NtFMwjfPTNE4zEzmOMlN9DXHT/8xxVH/ LsRS/yvDU/8pwlP/J8JT/yfCU/8nwlP/J8JT/yf/ShwB/1QXAf9cFQH/YxkB/2kgAv9sKQP/bTIF +Ww9CfJpRw7rZlQV5WNgHOBfayLbXHUo1ll/LdJXiDDPVZAzzFSYNspToDjHUqc6xVGwO8NQuzzB UMk9v1DfPbxR8Du6U/w3uVX/M7hX/y+3WP8tt1j/K7dY/yu3WP8rt1j/K7dY/yv/TRoB/1cUAf9g EgH/aBcB/24dAf9yJQL7cy4D8nM4B+lxQw3iblAU22lcHNNlZiTOYnAqyV96L8ZcgjPDW4o2wFmS Ob1Ymju7VqI+uFWrP7ZVtUG0VMJCslTUQrBV6kGuV/k8rln/N61b/zOtXP8wrV3/Lq1d/y6tXf8u rV3/Lq1d/y7/UBcB/1oSAf9kEAD/bRQA/3MaAf93IQH0eSkC6nozBeJ4PwrZdEwTz3BYHMlrYiTE aGwrv2V1MLtifTW4YIU4tV6NPLJclT6vW51BrVqmQ6tZr0SpWbxFp1jMRqRY5UakW/ZAo17/O6Nf /zejYP8zo2H/MaNh/zGjYf8xo2H/MaNh/zH/UxUB/10QAP9oDwD/cBIA/3cWAPt8HAHufyQB5IAt A9p/OwjPekkSx3VUG8FxXyS7bWgrtmpwMbJneTavZYA6q2OIPahhkECmYJhDo16hRaBeq0eeXbdI nF3GSZpc30maX/JEmmL/Pppj/zmbZf82m2X/M5tl/zObZf8zm2X/M5tl/zP/VRMB/2AOAP9rDgD/ dBAA/3sSAPWBFwDohB4A3ocnAdGENwfIf0YRwHtRG7l2WyO0cmUrr29tMapsdTananw6o2iEPqBm jEGdZJREmmOdR5dip0mVYbJLk2HBTJFh2EyRY+9HkmX9QZJn/zyTaf84k2r/NZNq/zWTav81k2r/ NZNq/zX/VxEB/2MNAP9uDAD/dw4A/38PAPCFEQDjiRYA1osjAcuINQbChEMQuoBPGrN7WSOtd2Iq qHRqMaNxcTafbnk7nGyBP5hqiEKVaZFFkmeaSI9mo0qNZa9MimW9TYll0U6JZ+xKimn7Q4tr/z6M bf86jG7/N4xu/zeMbv83jG7/N4xu/zf/WRAA/2ULAP9xCwD/egsA8YIMAOiJDQDdjg4Az48gAcaN Mga9iUEPtYRNGa6AViKnfF8qonhnMJ11bzaZc3Y6lXF9P5JvhUKObY5Gi2yWSYhqoEuFaqxNg2m6 T4FpzE+BauhMg235RYRv/z+FcP87hnH/OIZx/ziGcf84hnH/OIZx/zj/Ww8A/2cIAP9zCADzfQgA 3oYHANmMCQDVkQsAypIeAMGQMAW4jT8OsIhKGKmEVCGigF0pnX1lMJh6bDWTd3M6j3V7PoxzgkKI cotGhXCUSYJvnkx/bqlOfG23T3ttyVB6buZNfHH4Rn5z/0F/dP89gHX/OoB1/zqAdf86gHX/OoB1 /zr/XQ4A/2oGAP92BgDkgAMA2YkGANKPCADPlAoAxZYbALyULgSzkT0Nq41IF6SIUiCehVsomIFj L5N+ajWOfHE5inp4PYZ4gEKDdohFf3WRSXxzm0x5cqdOdnK1UHRyxlB0cuNPdnX2R3h3/0J6eP8+ e3n/Ont5/zp7ef86e3n/Ont5/zr/XwwA/2wEAPV5AgDegwIA04sFAM2SBwDJlwgAwJkZALeYLAOv lTsMp5FHFp+NUB+ZiVknk4ZhLo6DaDSJgW85hX92PYF9fkF9e4ZFeXqPSXZ4mUxzd6VOcHeyUG53 xFBtd+BPcHn1SHJ7/0N0fP8+dX3/O3V9/zt1ff87dX3/O3V9/zv/YQoA/28CAOh8AADZhgEAz44E AMiVBgDDmgYAu5wWALOcKgOqmTkLopVFFJuRTh2UjlcmjotfLYmIZjOEhm04gIR0PXuCe0F3gIRF dH+NSHB9l0ttfKNOanywT2h8wVBnfN1Qan7zSW2A/0Nugf8/b4H/PG+B/zxvgf88b4H/PG+B/zz/ ZAgA/3IAAOF/AADTiQEAypIDAMOYBAC9ngQAtqATAK6gJwKlnTYJnZpDE5aXTRyPk1UkiZFdK4SO ZDF/jGs3eopyO3aIeUByhoJEboWLR2qDlUpngqFNZIKuT2KCv09hgtpPZITySWaF/0Nohv8/aob/ PGqG/zxqhv88aob/PGqG/zz/ZwQA9nYAANyCAADOjQAAxZUCAL6cAwC3oQIAr6QRAKikJAKgojQI mJ9AEZGcShqKmVMihJdbKX6VYjB5kmk1dZBwOnCPdz5sjX9CaIyJRmWKk0lhiZ9LXomsTV2JvU5c idZNXorwSGCL/kNii/8/Y4z/PGOM/zxjjP88Y4z/PGOM/zz/agAA5noAANWGAADJkQAAwJkBALif AQCwpQAAqKkOAKKpIQGaqDEGk6U+D4ujSBiEoFEgfp5ZJ3icYC1zmmcyb5huN2qWdTxmlX0/YpSH Q1+SkUZbkp1JWZGrSleRu0tWkdNLV5LvR1qS/UJck/8+XZP/O12T/ztdk/87XZP/O12T/zv/bgAA 4H4AAM6LAADElQAAup0AALGjAACpqQAAoa4LAJuvHQGUri4EjKw7DIWqRhV+qE4ceKZWI3KkXSpt omQvaaFrNGSfczhgnns8XJ2FP1mcj0JVm5xFU5uqR1GbukdQm9FHUZvuRFOb/EBVm/88Vpv/Olab /zpWm/86Vpv/Olab/zrxdAAA2YMAAMiQAAC+mgAAs6EAAKqnAAChrgAAl7UGAJK2GACMtSoDhbQ3 CX6yQhF3sEwYca5UH2ytWyVnq2IqYqppL16pcTNaqHo3VqeDOlOmjj1QpptATaWpQUulukJLptFC S6XtP02l/DxOpP85T6T/N0+k/zdPpP83T6T/N0+k/zfkegAAz4kAAMKVAAC2nwAArKUAAKKsAACY swAAjrsCAIi9EgCDvSUBfLwzBna7Pw1vukkUarhRGmW3WR9gtmAkXLVnKVi0byxUs3gwUbOCM02y jTZKspo4SLGoOkayuTpFstE6RrHtOUew/DZHsP80SK//M0iv/zNIr/8zSK//M0iv/zPbggAAx5AA ALucAACuowAApKoAAJmxAACPuQAAhMADAHvGDQB4xh4Ac8YuA23FOghnxEUOYsNOE13DVhhZwl4d VcFmIVHBbiROwHcoS8CBK0i/jC1Fv5ovQ7+oMUG/ujFBwNIxQb7uMEG9/S9BvP8uQbz/LUG8/y1B vP8tQbz/LUG8/y3OigAAv5gAALGgAACmqAAAm7AAAJC4AACFvwAAescEAG/PCQBr0RUAZ9EmAWPR NARe0EAIWdBKDFXPUxBRz1sUTs9jGEvOaxtIznUeRc5/IELOjCJAzpkkPs6oJjzOuiY8z9QmPM3v JTvM+yU7y/8lO8r/JTvK/yU7yv8lO8r/JTvK/yXDkwAAtZ4AAKimAACdrgAAkbYAAIW/AAB5xwAA b84EAGTWCQBe3hEAW94gAFfeLQJT3zoEUN9EBkzfTglJ31cMRt9fD0PfaBFB33ETPt98FTzfiRc6 4JYZOOClGjfgtxo24c0aNt/sGjXe+Ro03f8bNNz/GzTc/xs03P8bNNz/GzTc/xu5nAAAqqQAAJ6r AACStQAAhb4AAHnHAABtzwAAYtYDAFjhCABV6hMAUesgAE3rKwFJ6zUCRew+BELsRwU/7E8HPe1Y CTrtYAo47WoMNu50DTPugA4y7o4PMO+dEC7vrREt8MARLfDeESzu8REs7P4RLOv/ECzr/xAs6/8Q LOv/ECzr/xCtogAAoKkAAJOzAACGvQAAecYAAGzPAABg2AAAVd4AAE7zCgBK9xMARvgdAEP4JwE/ +DACO/k4Ajj5QAM1+kcEM/pPBTD7VwUu+18GK/xpByn8dAgn/IIJJf2QCST9oAoj/rAKIv7ECyH/ 4Ash/fIKIPz8CiD8/Aog/PwKIPz8CiD8/AqipwAAlbEAAIe7AAB5xgAAbM8AAF/ZAABS3wAASOgA AEP/CAA//xAAO/8ZADf/IQA0/ykBMP8wAS3/NwIq/z4CJ/9EAiX/SwMi/1MDIP9cAx3/ZgQb/3IE Gf+ABRf/jwUW/58GFf+vBhT/wAYU/9YGE//pBhP/6QYT/+kGE//pBhP/6QaXrwAAiLoAAHrFAABs zwAAXtoAAFDgAABE5gAAPPUAADf/BAAz/w0AL/8TACv/GgAo/yEAJf8nASH/LQEe/zIBG/84ARn/ PwEW/0YCFP9NAhH/VgIQ/2ACDv9sAgz/ewML/4sDCv+aAwr/qAMJ/7UDCP/CAwj/wgMI/8IDCP/C Awj/wgOKuAAAe8MAAGzOAABe2wAAT+IAAELnAAA27AAAMf8AACz/AAAn/wcAI/8OACD/EgAc/xgA GP8dABX/IQAS/yYAEP8sAQ7/MQEN/zcBCv8+AQj/RgEF/08BAf9ZAQD/ZgEA/3QBAP+CAgD/kAIA /5wCAP+mAgD/pgIA/6YCAP+mAgD/pgL/Li8C/zMsAv83LQL/ODAC/zc2A/80PwT/MUsG/y9YB/8s Zgj/KnQJ/ymBCv8ojQv/KJcL/yifC/8opgz/J60M/ye0DP8nuwz/J8QM/yfODP8o3gv/KOkL/yjz C/8o+wv/KP8K/yn/Cv8p/wr/Kf8K/yj/Cv8o/wr/KP8K/yj/Cv8o/wr/MC0C/zYqAv85KgL/Oy4C /zo0A/84PAT/NkkG/zNWB/8xYwn/L3EK/y1+C/8tigz/LJQM/yycDf8spA3/LKsN/yyxDf8suQ3/ K8EN/yzLDf8s2g3/LOcN/yzxDf8s+g3/LP8M/i3/DP0t/wz9Lf8M/Sz/C/0s/wv9LP8L/Sz/C/0s /wv/MisB/zkoAv89KAL/PyoC/z4wA/89OgT/PEYG/zlTCP83YAn/NW0L/zN6DP8yhg3/MZAO/zGZ Dv8xoQ//MagP/zCuD/8wtQ//ML0Q/zDHEP8w1BD/MOQQ/zHvEP4x+Q/7Mf8P+TH/D/gx/w73Mf8O 9zH/DvYx/w72Mf8O9jH/DvYx/w7/NSgB/zwlAf9AJAL/QycC/0MsA/9ENwT/QkMG/0BPCP89XAr/ O2kM/zl2Df84gg//N4wQ/zeVEf82nRH/NqQS/zarEv82shP/NboT/zXDE/81zxP8NeET+TbtE/Y2 9xPzNv8T8Tb/EvA2/xLwN/8R7zf/Ee83/xDvN/8Q7zf/EO83/xD/OSUB/0AhAf9FIAH/RyIC/0kp Av9KNAT/ST8F/0ZLCP9EWAr/QmUN/0BxD/8+fRH/PYcS/z2RFP48mRX9PKAV/DunFvo7rhf5O7YX +Du/F/Y7yhj0O9wY8DvqGO079hjqO/8X6Dz/F+c8/xbmPf8V5T3/FOU9/xTlPf8U5T3/FOU9/xT/ PSIB/0QeAf9JHAH/TR4B/1AmAv9RMAP/UDsF/05GCP9LUwv/SGAO/0ZsEftFeBP4RIIV9kOMF/RC lBjzQZwZ8UGjG+9AqhvuQLIc7T+7Hes/xh7pP9Ue5T/oH+JA9B7fQP4d3UH/G9tC/xrZQv8Y2EL/ F9hC/xfYQv8X2EL/F9hC/xf/QB8B/0gaAf9OGAH/UhsB/1YjAv9YLAP/VzcE/1VCB/9STQv5UFoO 9U1nEvFMchbuSn0Y60iGG+lHjx3nRpcf5UWeIONEpiLhRK4j4EO3JN5DwiXcQ9Am10PlJtNE8yTQ Rf4izUb/IMxH/x7KR/8cyUj/G8lI/xvJSP8byUj/G8lI/xv/RBsB/0wWAf9SFAH/WBgB/10fAf9f KAL/XjID/V09BvZaSQrwV1UP6lViE+ZSbRjiUHcc306BH9xMiiLZS5Ik1UqaJtNJoSjRSakpz0iy Ks1IvCvLSMksyEjfLMVI7yvCSvwowEv/Jb9M/yK+Tf8gvU3/H71N/x69Tf8evU3/Hr1N/x7/RxgB /08TAf9WEQD/XhUA/2IcAf9lJAH+ZS0C9GQ4Be1hQwnmX1EO4FxdFNpYaBrUVnIe0FR7IsxShCbK UIwox0+UKsVOmyzDTqMuwU2sL79MtjC9TMIxu0zTMrhM6TG2TvgttFD/KrNR/yezUv8kslL/IrJS /yKyUv8islL/IrJS/yL/ShUB/1MRAP9bDwD/YhIA/2gXAP9qHwH2aygB7GsyA+RpPgfcZkwN02JY FM1fYxvIXG0gxFp2JMFYfii+VoYru1WOLrlTljC2Up4ytFKmM7JRsDWwUbw2rlDLN6xQ4zeqUvQz qVT/LqhW/yuoV/8oqFf/JahX/yWoV/8lqFf/JahX/yX/TRMA/1YOAP9fDQD/ZxAA/2wTAPtwGQDv cSIB5HEsAttwOgXRbEgMyWhUFMNlXxu+Ymghul9xJrZdeSqzW4EtsFqJMK5YkTOrV5k1qVahN6dW qzilVbY6o1XFO6FV3TufVvA3n1j+Mp9a/y6eW/8rnlz/KJ5c/yieXP8onlz/KJ5c/yj/UBEA/1kM AP9jDAD/aw0A/3AQAPV0EwDodhoA3XclAdF2NgTIckQMwW5QFLtrWxu2Z2QhsWVtJ61idSuqYHwv p1+EMqRdjDSiXJQ3n1udOZ1apjuaWbE9mFm/PpdZ0z6VWuw7lV37NZZe/zGWX/8tlmD/KpZg/yqW YP8qlmD/KpZg/yr/Ug8A/1wKAP9mCQD/bgoA9nQMAO94DgDhexIA1HwgAMp7MwTBd0ELunRNE7Rw WBuubGEhqWppJ6ZncSuiZXgvn2SAM5xiiDaZYZA4ll+ZO5Reoj2RXq0/j127QI1dzUGMXug/jWH5 OI1i/zOOZP8wjmT/LI5l/yyOZf8sjmX/LI5l/yz/VQ4A/18GAP9pBgD0cgYA4ngGANt8CQDZfwwA zYEdAMR/MAO7fD8KtHhLEq11VRqocV4ho25mJp9sbiubanUvmGh9M5VnhDaSZYw5j2SVPIxjnz6J YqpAh2G3QoVhyUKEYuRBhWT3O4Zm/zWHZ/8xh2j/Lodp/y2Haf8th2n/LYdp/y3/VwwA/2EEAP5s AwDkdQEA23sFANOACADQgwoAx4UaAL6ELQO2gTwJr31IEqh5UhmidlsgnXNjJplwayuVbnIvkW15 M45rgTaLaYk6iGiSPIVnnD+CZqdBgGa0Q35mxUR8ZuFDfmj1PH9q/zeAa/8zgWz/L4Fs/y+BbP8v gWz/L4Fs/y//WQsA/2MBAPRvAADfeAAA1H8EAM6DBgDKhwgAwogYALmHKwKxhToIqoFGEaN+UBid elkfmHdhJZN1aCqPc28vi3F3M4hvfjaFboY6gmyPPX9rmUB8aqVCeWqxRHdqwkR2at1EeGzzPnlu /zh6b/80e3D/MHxw/zB8cP8wfHD/MHxw/zD/WwgA/2YAAOdyAADaewAAz4IDAMmHBQDEigYAvIwV ALSLKAKsiTgHpYVEEJ6CThiYf1cek3xfJI55ZiqKd20uhnV0MoJ0fDZ/coQ5fHGNPXlwl0B2b6JC c26vRHFuwEVwbtlFcnDxP3Ny/zl1c/81dnT/MXZ0/zF2dP8xdnT/MXZ0/zH/XQYA/2kAAOJ0AADU fQAAy4UCAMSKBAC/jQUAt48TALCPJgGojTUHoIpCDpqGTBaTg1UdjoFdJIl+ZCmFfGstgXpyMn14 eTV6d4I5dnaLPHN1lUBwdKBCbXOtRGtzvUVqc9VFbHTvQG52/jpvd/82cXj/MnF4/zFxeP8xcXj/ MXF4/zH/XwIA92wAAN53AADQgQAAx4gBAMCNAwC5kQMAspMRAKuTIwGjkTMGnI5ADZWLShWPiFMc iYZbIoSDYiiAgWktfH9wMXh+dzV0fIA4cXuJPG56kz9reZ5CaHirRGZ4u0VkeNFFZnnuQGh7/Tpq e/82a3z/Mmt8/zJrfP8ya3z/Mmt8/zL/YQAA6m8AANl6AADMhAAAw4sAALuRAQC0lQEArJcOAKWX IQGeljEFl5M+DJCQSBSKjlEbhItZIX+JYCd7h2crd4VuMHOEdTRvgn03a4GHO2iAkT5lf5xBYn6p Q2B+uURffs9EYH/sQGKA/DpkgP82ZYH/M2aB/zJmgf8yZoH/MmaB/zL/ZAAA5XIAANN+AADHhwAA vo8AALaVAACumQAAppsMAKCcHgCZmy4Ekpk7CouWRhKFlE8Zf5FXH3qPXiV1jmUqcYxsLm2KczJp iXs2ZoiEOWKGjz1fhZo/XIWoQVqFt0JZhcxCWoXqP1yG+zpehv82X4f/Ml+H/zJfh/8yX4f/Ml+H /zL9aAAA4HYAAM2CAADCjAAAuZMAALCZAAConQAAn6AJAJmhGgCToCsDjJ84CIWdQxB/mkwXeZhU HXSXXCJwlWMna5NqLGeScTBkkXkzYI+CN1yOjTpZjZk9V42mP1SNtkBTjctAVI3pPVaN+jlXjf81 WY7/MlmO/zFZjv8xWY7/MVmO/zHtbQAA2XsAAMiHAAC9kAAAtJgAAKqdAAChoQAAl6YEAJGnFQCM pycChaY1Bn+kQA15okoUc6BSGm6fWR9pnWAkZZxnKGGbbyxemncwWpiAM1aXizZTl5c5UZalO0+W tDxOlsk8TpboOk+W+TZRlv8zUpb/MFKW/zBSlv8wUpb/MFKW/zDmcgAA0IAAAMKMAAC4lgAArZwA AKOhAACZpgAAjq0AAIiuEQCDriIBfa0xBHesPQpyqkcQbKlPFmeoVxtjp14fX6ZlJFukbSdYpHUr VKN/LlGiiTFOoZY0S6GkNkmhtDZIocg3SKDnNUmg+TJKn/8wS5//Lkuf/y1Ln/8tS5//LUuf/y3d eQAAyYYAALySAACxmgAApqAAAJymAACRrAAAhrIAAH22DQB5th0AdbYsAm+1OQZqtEMLZbNMEWCy VBZcsVsaWLBjHlWvayFRr3MlTq59KEutiCpIrZUtRa2jLkStsy9DrcgvQqznL0Or+S1Eq/8rRKr/ KUSq/ylEqv8pRKr/KUSq/ynRgAAAwY0AALWYAACpnwAAnqUAAJOsAACIsgAAfbgAAHG+BgBuvxUA ar8mAWa/MwNhvj8HXb5IC1m9UQ9VvVkTUbxgF068aBpLu3EdSLt7H0W6hyJCupQkQLqiJj66syY9 usgmPbroJj24+SU9t/8kPbb/Iz22/yM9tv8jPbb/Iz22/yPHiAAAuZUAAKydAAChpAAAlqsAAIqy AAB/uQAAc78BAGjGBQBgyg4AXsodAFvKLAFXyjgDVMpDBVDKTAhNyVULSsldDkfJZhFEyW8UQcl5 Fj/IhRg8yJMaOsiiGznJsxw4yckcOMjoHDfH+Rw3xf8cNsT/HDbE/xw2xP8cNsT/HDbE/xy+kQAA sJsAAKSjAACYqgAAjLIAAIC5AAB0wAAAaMcAAF3NBQBT0woAT9cSAE3YIgBL2DAASdg8AkbYRgNE 2U8EQdlYBj/ZYQg82WsKOtl2DDfZgg412pAPNNqgEDLasREx28cRMdrnETDY9hIw1v8TL9T/Ey/U /xMv1P8TL9T/Ey/U/xOzmgAApqEAAJqpAACNsQAAgLoAAHTBAABoyQAAXM8AAFLVAwBI3AgAReUS AEPlHgBB5ioAPuY1ATvnPgE550cCN+dQAzToWQQy6GIFMOhtBi7peQcs6YcIK+qWCSnqpwoo6roK J+vWCifp8Aon5/0JJub/Cibm/wom5v8KJub/Cibm/wqooAAAnKcAAI+wAACCuQAAdMIAAGjKAABb 0QAAT9cAAEXdAAA+7gkAPPIRADnzGwA28yUANPQuADH0NwEu9T8BLPVHASn2TwIn9lcCJfdhAyP3 bAMh+HoEH/iJBB75mgUc+asFG/rABRr63gUa+fIFGvf9BRn2/wUZ9v8FGfb/BRn2/wWepgAAka8A AIO5AAB1wgAAZ8sAAFrTAABN2gAAQt8AADjlAAA1+wcAMf8PAC7/FgAr/x8AKf8mACX/LQAj/zQA IP87AR7/QwEb/0sBGf9TARb/XQIU/2oCEv94AhH/iAIQ/5oCEP+rAw7/vgMO/9UDDv/tAw7/8AMO //ADDv/wAw7/8AOTrgAAhLgAAHbCAABnzAAAWtUAAEzcAAA/4QAANeYAAC30AAAq/wIAJv8LACP/ EQAg/xcAHf8dABn/IwAW/ykAFP8vABL/NQAQ/z0ADv9FAQz/TgEK/1gBB/9lAQX/dAED/4UBAv+W AQH/pgEA/7UBAP/GAQD/ygEA/8oBAP/KAQD/ygGGtwAAd8EAAGjMAABa1wAAS94AAD7kAAAy6QAA J+0AACP/AAAf/wAAG/8FABf/DAAU/xAAEf8UAA//GAAN/x0AC/8iAAj/KAAF/y4AAv81AAD/PQAA /0cAAP9SAAD/XgAA/20AAP9+AQD/jgEA/5sBAP+pAQD/qwEA/6sBAP+rAQD/qwH/Ki0B/y4rAf8w KwH/MC4C/y41Av8pPQP/JUkE/yNXBP8hZAX/H3IG/x1/Bv8digb/HZQG/x2cB/8cowf/HKoH/xyx B/8cuAb/HL8G/xzJBv8c1gb/HeUG/x3vBv8d+QX/Hf8F/x3/Bf8d/wX/Hf8F/x3/Bf8d/wX/Hf8F /x3/Bf8d/wX/LCsB/zAoAf8zKAH/MysC/zExAv8tOgP/K0cE/yhUBf8mYQX/JG8G/yJ8B/8ihwf/ IpEH/yGZB/8hoQj/IacI/yGuCP8htQj/IbwI/yHGB/8h0Qf/IeIH/yLtB/8i9wf/Iv8G/SL/Bvwi /wb8Iv8G/CL/Bvsi/wb7Iv8G+yL/Bvsi/wb/LigB/zMlAf82JQH/NycB/zUtAv80OAP/MkQE/y9R Bf8sXgb/KmsH/yl3B/8ogwj/J40I/yeWCf8nnQn/J6QJ/yerCf8nsgn/J7kJ/yfCCf8nzQn/J94J /yfrCfwn9gj5KP4I9yj/CPYo/wj1KP8I9Sj/CPUo/wj1KP8I9Sj/CPUo/wj/MiUB/zciAf86IQH/ OyMB/zspAv87NAL/OUAE/zZNBf80Wgb/MWYH/zBzCP8ufwn/LokK/y6SCv8tmQv/LaEL/y2nC/8t rgv/LbUM/y2+DP4tyQz7LdkM+C3oC/Qu9AvxLv4L7y7/C+4u/wvtLv8L7C7/Cuwu/wrsLv8K7C7/ Cuwu/wr/NSIB/zseAf8/HQH/QB8B/0ImAf9CMQL/QDwD/z5IBf87VQb/OWII/zduCv82eQv/NYQM /TSNDfw0lQ36NJwO+TOjDvczqg/2M7IP9TO6D/MzxQ/yM9IP7jPlD+o08g/nNP0P5TT/D+Q0/w7i Nf8O4jX/DeE1/w3hNf8N4TX/DeE1/w3/OR4B/z8aAf9DGAH/RhoB/0kjAf9JLQL/SDgD/0VEBf9D UAf/QF0J+z5pC/g9dA31PH8O8zuID/E7kBDvOpgR7TqfEuw5phPqOa4T6Tm2FOc5wRTmOc4V4jnj Fd458RXbOvwU2Dr/E9U7/xLTO/8S0jv/EdI7/xDSO/8Q0jv/ENI7/xD/PRsB/0MWAP9IFAD/TBcB /08fAf9QKAH/TzMC/00/BPtKSgb1R1cJ8UZkDO1Ebw7pQ3kR50KDE+RBixTiQJMW4D+bF98/ohjd PqoZ2z6zGtg+vRrWPsob0j7fG84+7xvLP/sayUD/GMdA/xfGQf8VxUH/FMRB/xTEQf8UxEH/FMRB /xT/QRcA/0cSAP9MEAD/UhQA/1YbAP9XJAH/Vi4C+FQ5A/FRRQbrT1IJ5k1eDOFLaRDdSXQT2Uh9 FtVGhhjSRY4a0EWWHM5EnR3MRKUeykOtH8hDtiDGQ8MhxUPTIcFD6SG+RPcfvEX/HbpG/xu5R/8Z uEf/GLhH/xe4R/8XuEf/F7hH/xf/RBQA/0sQAP9RDgD/VxEA/1sWAP9dHgD5XSgB71szAudZPwTg V00I2lRZDdNSZBLOUG4Wyk53GcdMgBzFS4gewkqQIMBKlyG+SZ8jvEinJLpIsCW4SLwmt0jLJ7RH 4yeySfMlsEr/Iq5L/x+uTP8drUz/G61N/xqtTf8arU3/Gq1N/xr/RxEA/08NAP9WDAD/XA4A/2AS AP1iGADwYyEA5mIsAd5gOgPUXkgHzVtUDcdYXxPDVmkXv1RyG7xSeh65UYIhtlCKI7RPkSWyTpkn sE2iKK5NqyqsTLYrqkzELKhM2yymTe8qpE/9JqRQ/yOjUf8go1L/HqJS/x2iUv8dolL/HaJS/x3/ Sg8A/1IKAP9aCQD/YAsA/2UOAPVnEQDoaBgA3WckANJmNQLKZEQHw2FQDb1eWxO5XGQYtVptHLFY dSCuV30jrFWEJalUjCinU5QqpVKdLKNSpi2hUbEvn1G+MJ1R0TCbUeovmlP6KppV/yaZVv8jmVb/ IZlX/x+ZV/8fmVf/H5lX/x//TQ0A/1UGAP9dBQD7ZAcA72kJAOlrDADhbBAA020eAMlsMQLCakAH u2dMDbVkVxOwYWAZrF9pHahdcSGlXHgkolqAJ6BZhyqdWJAsm1eYLplWojCWVawylFW5M5NVyjOR VeUzkVf3LZFZ/ymRWv8lkVv/I5Fb/yGRW/8hkVv/IZFb/yH/TwsA/1cCAP9hAgDqaAEA3m0EANhw CADVcAsAy3IbAMJxLgK6bz0GtGxJDa5pVBOpZ10ZpGRlHaFibSGdYXQlml98KJhegyuVXYstkluU MJBbnjKNWqg0i1m1NYpZxjaIWeE2iFz0MIhd/yuJXv8oiV//JYlf/yOJX/8jiV//I4lf/yP/UQkA /1oAAPVkAADgbAAA13EDANB0BgDNdQkAxHYXALx2KgG0dDoFrnFGDKduURKia1oYnmliHZpnaSGW ZXElk2R4KJBigCuNYYgui2CRMYhfmjOGXqU1g16yN4JewjeAXtw4gF/yM4Fh/y2CYv8pgmP/JoJk /yWCZP8lgmT/JYJk/yX/UwYA/10AAOdnAADbbwAA0HQCAMp4BQDGeQcAvnoVALZ6KAGveDcFqHZE C6JzThKccFcYmG1fHZRrZyGQam4ljWh1KIpnfSuHZYUuhGSOMYFjlzR/YqI2fGKvOHpivjl5YtU5 eWPvNHpl/i97Zv8rfGf/KHxn/yZ8Z/8mfGf/Jnxn/yb/VQMA/2AAAONqAADVcgAAzHgBAMV7AwDA fQUAuX4SALF+JQGqfTUEo3pBCp13TBGXdFUXknJdHI5wZCCKbmskh2xyKIRreiuBaoIufmmLMXtn lTR4Z6A2dmasOHRmvDlzZtE6c2ftNnRp/TB1av8sdmv/KXdr/yd3a/8nd2v/J3dr/yf/VwAA9mMA AN9tAADRdQAAyHsAAMF/AgC7gAMAtIEQAKyCIwGlgTIEnn4/CZh7ShCSeVMWjXZbG4l0YiCFcmkk gXFwJ35vdyt7bn8ueG2IMXVskjRza543cGqqOW5quTptas46bWvrN29t/DFwbv8tcW7/KnFv/yhx b/8ocW//KHFv/yj/WQAA62UAANtwAADNeAAAxH4AALyCAQC2hAEAroUOAKeGIACghTADmoI9CJOA SA+OfVEViXtZGoR5YB+Ad2cjfHVuJ3l0dSp2c30uc3KGMXBxkDRtcJw3am+oOWhvtzpnb8s6Z3Dp N2lx+jJrcv8tbHP/Kmxz/yhsc/8obHP/KGxz/yj/XAAA52gAANVzAADJewAAwIIAALiGAACxiAAA qYkNAKKKHQCciS4ClYc7B4+FRQ6Jgk8UhIBXGX9+Xh57fGUieHtsJnR5cypxeHstbneEMGt2jjNo dZo2ZXSmOGN0tTlhdMk6YXTnOGN2+TJldv8uZnf/K2d3/ylnd/8pZ3f/KWd3/yn/XwAA42wAANB2 AADFfwAAvIUAALSKAACsjAAAo44KAJ2OGgCXjisCkIw4BoqKQwyEh0wSf4VVGHqEXB12gmMhc4Bq JW9/cSlsfnksaH2CL2V8jDJie5g1X3qkN116szhcesc5XHrlN157+DJfe/8uYHz/K2F8/ylhfP8p YXz/KWF8/yn1YgAA3m8AAMx6AADAgwAAt4kAAK+OAACmkQAAnZIGAJeTFwCRkygBi5I2BYWQQQt/ jkoReoxSFnWKWhtxiGEfbYdoI2qGbydmhHcrY4OALmCCijFdgZY0WoGjNliAsjdWgMU3VoDjNliB 9zFZgf8tW4L/KluC/ylbgv8pW4L/KVuC/ynsZgAA2HMAAMd+AAC8hwAAs44AAKmSAACglQAAlpgB AJCZEwCKmSQBhZgyBH+WPgl5lEgOdJNQFG+RVxlrkF4daI5lIWSNbSVgjHUoXYt+K1qKiC5XiZQx VImhM1KIsDRRiMM1UIjiNFKI9jBTiP8sVIj/KVWI/yhViP8oVYj/KFWI/yjmawAA0HgAAMKDAAC3 jAAArZIAAKOWAACamgAAjp4AAIefEACDnyAAfp8vAnidOwdznEUMbptNEWmZVRZlmFwaYZdjHl6W aiFblXIlV5R8KFSThitRkpIuTpKgMEySrzFLksIxSpHgMUyR9S1Nkf8qTpD/KE6Q/yZOkP8mTpD/ Jk6Q/ybecAAAyX0AALyJAACykgAAp5cAAJ2bAACTnwAAhqQAAH6mDAB6phsAdaYqAXCmNwRspUEJ Z6NKDWOiUhJfoVkWW6FhGVigaB1Un3AgUZ56I06dhCZLnZEpSJyeKkacrixFnMEsRZzfK0Wb9ClG mv8nR5r/JUea/yRHmv8kR5r/JEea/yTUdwAAwoQAALaPAACrlgAAoZwAAJagAACLpQAAf6oAAHSu BQBvrxQAbK8kAGivMgJkrj0FX61GCVusTw1YrFYRVKteFFGqZhdOqm4aS6l4HUipgyBFqI8iQ6id JEGorSVAqMAlP6jfJT+m9CNApf8iQKX/IUCk/yBApP8gQKT/IECk/yDKfgAAu4sAAK+VAACkmwAA maEAAI6mAACCrAAAd7EAAGq2AABjuA4AYbgdAF64LAFauDgCV7hCBVO4SwhQt1MLTbdbDkq2YxBH tmsTRLV1FkK1gRg/tY4aPbWcHDu1rBw6tcAdObXfHDmz9Bw5sv8cObH/Gzmw/xs5sP8bObD/Gzmw /xvBhgAAtJMAAKeaAACcoAAAkacAAIWtAAB5swAAbbgAAGK9AQBWwgcAU8MUAFLDIwBQxDABTcQ7 AkrERQNHxE4FRcRXB0LDXwlAw2gLPcNyDTvDfg84w4wRNsObEjXDqxMzw8ATM8PgEzPB9RMywP8U Mr//FDG+/xQxvv8UMb7/FDG+/xS4kAAAq5kAAJ+gAACTpwAAh64AAHu0AABuuwAAY8AAAFjFAQBN ygUARM8MAEPQFwBC0CUAQNAyAD/RPQE90UcBO9FQAjnSWQM20mMENNJuBTLSegcw0ogILtKYCS3T qQks074KLNPfCSvR8woqz/4LKc7/DCnN/w0pzf8NKc3/DSnN/w2umAAAop8AAJamAACJrgAAfLYA AG+9AABjwwAAV8gAAEzNAABC0gMAOdkJADXfEAA03xsAMuAnADHhMgAw4T0ALuJHAC3iUAEr4loB KuNlAijjcQIm5H8DJeSPAyPloQQi5bQEIeXNBCDk7AQg4vsEH+H/BR/g/wUf4P8FH+D/BR/g/wWk ngAAmKUAAIuuAAB9tgAAcL4AAGPGAABWywAAS9AAAEDVAAA23AAAL+UHAC3tEAAr7hgAKe4iACfv KwAl7zQAI/A8ACHwRQAf8U4AHfJYARvyZAEZ83EBGPOBARf0kgIV9KUCFPW6AhP11gIT9O8CEvL8 AhLw/wIS8P8CEvD/AhLw/wKapAAAja0AAH+2AABxvwAAY8cAAFbOAABJ0wAAPdoAADPfAAAq4wAA JvQFACT7DQAh/BMAHv0bABz9IgAZ/ikAF/4xABX/OQAT/0EAEf9KABD/VQAO/2EADP9vAQz/gAEK /5MBCf+mAQj/ugEH/9QBB//rAQb/9gEG//YBBv/2AQb/9gGPrAAAgLYAAHK/AABjyQAAVtEAAEjY AAA73QAAMOIAACbmAAAf8AAAHP8AABn/CQAW/w4AFP8TABH/GQAP/x4ADf8kAAv/KwAJ/zIABv87 AAP/RAAA/08AAP9cAAD/awAA/30AAP+QAAD/owAA/7QAAP/GAAD/1gAA/9YAAP/WAAD/1gCCtQAA c78AAGTJAABW0wAAR9sAADrgAAAu5QAAI+kAABrtAAAV/QAAEv8AABD/AgAO/wkAC/8NAAj/EAAE /xMAAf8YAAD/HgAA/yQAAP8rAAD/MwAA/z0AAP9JAAD/VgAA/2YAAP94AAD/igAA/5sAAP+oAAD/ sQAA/7EAAP+xAAD/sQD/JSsB/ygpAf8pKQH/KCwB/yMyAf8eOwL/GkcC/xdVA/8VYgP/E3AD/xJ8 A/8ShwP/EpED/xKZA/8SoAP/EqcD/xKtA/8RtAP/EbsD/xHEA/8RzgP/Ed8D/xHrAv8S9gL/Ev4C /xL/Av8S/wL/Ev8C/xL/Av8S/wL/Ev8C/xL/Av8S/wL/KCkB/ysmAf8sJgH/KykB/ygvAf8iOAL/ IEQC/x1SA/8bXwP/GGwD/xd5BP8XhAT/F44E/xeWBP8WnQT/FqQE/xaqBP8WsQT/FrgE/xbAA/8W ygP/FtsD/xboA/8X9AP/F/0D/Bf/AvsX/wP7F/8D+hf/A/oX/wP6F/8D+hf/A/oX/wP/KiYB/y4j Af8vIgH/LyUB/ywrAf8qNQL/J0EC/yROA/8iWwP/IGgE/x50BP8dgAT/HYoE/x2SBf8dmgX/HaEF /x2nBf8drQX/HbQE/x29BP8dxwT/HdQE/h3mBPsd8gT3HvsD9R7/BPQe/wTzHv8E8x7/BPIe/wTy Hv8E8h7/BPIe/wT/LiIB/zIfAf80HgH/MyAB/zImAf8yMgH/Lz4C/yxKA/8qVwP/J2QE/yZwBf8l ewX/JIUF/ySOBv8klgb/JJ0G/ySjBv8kqgb9JLEG/CS5Bvskwwb5JM8G9iTjBvIk8AXuJfoF7SX/ Busl/wbqJf8G6SX/Bukl/wbpJf8G6SX/Bukl/wb/Mh4B/zYbAP84GQD/OBsB/zojAf85LQH/ODoC /zVGA/8yUgT/MF8E/y5rBf8tdgb9LIAH+iyJB/krkQf3K5kI9SufCPQrpgjzK60I8Su1CPArvwju K8sI6yvfCOcs7gjkLPoI4iz/CeAs/wneLP8I3iz/CN0s/wjdLP8I3Sz/CN0s/wj/NRoA/zoWAP89 FAD/PxcA/0EfAP9BKQH/QDQB/z1BAv86TQP8OFoF+DZlBvQ1cQfxNHsI7zOECe0zjQnrMpQK6TKb CugyogvmMqoL5DKyDOMyuwzhMsgM3zLcDNoy7A3VM/gN0jP/DdAz/wzOM/8MzTT/C8w0/wvMNP8L zDT/C8w0/wv/ORYA/z4SAP9BEAD/RRMA/0gbAP9IJAD/Ry8B/kQ7AvdCRwPxP1QF7D5gBug8awjl O3YJ4jt/C+A6iAzdOZAN2zmXDtk4ng/WOKYQ1DiuEdI4txHQOMMSzjjTEso46BLHOfcSxDn/EcI6 /xDBOv8PwDr/Dr86/w6/Ov8Ovzr/Dr86/w7/PRMA/0IPAP9GDQD/SxAA/04WAP9PHwD9TikB9Ew0 AexIQQLmR04E4EVbBttEZgnWQnAM0kF5Ds9AghDNQIoRyj+RE8k/mRTHPqAVxT6oFsM+sRfBPrwX wD7LGL0+4hi6PvIXtz//FrVA/xS0QP8Ts0H/EbNB/xCzQf8Qs0H/ELNB/xD/QBAA/0YMAP9LCgD/ UQ0A/1MRAP9UGADzVCIA6VItAeFQOwHaT0kD0k1VB8xLYAvISWoOxUhzEcJHexO/RoMVvUWLF7tF kxi5RJoZt0OiGrVDqxu0Q7YcskPEHbBD2R6tQ+0dq0X8GqlF/xioRv8WqEb/FadH/xOnR/8Tp0f/ E6dH/xP/RA4A/0oIAP9QBgD/VQoA/1gNAPdZEQDqWBgA31ckANRXNQHMVUQExlRQCMFSWwy9UGUQ uU5tE7ZNdha0TH0YsUuFGq9KjRutSZUdq0mdHqlIpiCnSLAhpUi9IqRIzyKhSOgioEn4Hp9L/xue S/8ZnUz/F51M/xadTP8WnUz/Fp1M/xb/RwsA/00CAP9UAgD3WgQA610HAOddCwDhXBAA010eAMpd MAHDXD8EvVpMCLdYVwyzVmARr1RpFKxTcRepUXgap1CAHKRPhx6iT48goE6YIZ5NoSOcTaskmk24 JZlMyCaWTOImlU71IpRP/x+UUP8clFH/GpRR/xiUUf8YlFH/GJRR/xj/SQgA/1AAAPtYAADlXgAA 3WIDANZjBwDUYQoAymIZAMJjLAG7YjsDtGBICK9dUwyqW1wRplpkFaNYbBigV3QbnVV7HZtUgyCZ VIsillOTJJRSnSWSUacnkFGzKI5RwymNUd0qjFLyJotU/yKLVf8ei1b/HItW/xqLVv8ai1b/GotW /xr/TAQA/1MAAOxcAADfYgAA1GYBAM5oBQDLZwgAwmcWALpoKAGzZzgDrWVFB6hjUAyjYVkRn19h FZtdaBiYXHAblVp3HpNZfyGQWIcjjlePJYxXmSeJVqMph1avKoVVvyuEVtUsg1fvKYNY/iSDWf8g hFr/HoRa/xyEWv8chFr/HIRa/xz/TgEA/1cAAOVfAADYZgAAzmoAAMdsAwDDawUAvGwSALRtJQCt bDUDp2pCB6FnTQycZVYRmGNeFZRiZRiRYGwbjl90HoxeeyGJXYMkhlyMJoRblSiBWqAqf1qsLH1a uy18Ws8ue1vsK3xc/CZ8Xf8ifV7/H31e/x19Xv8dfV7/HX1e/x3/UAAA9VkAAOFjAADSagAAyW4A AMJwAQC9cAMAtnAQAK5xIgCocDICoW4/BpxsSguXalMQkmhbFI5mYhiLZWkbiGNwHoVieCGCYYAk gGCJJn1fkil7Xp0reF6pLXZeuC51XswvdF7pLXVg+id2Yf8jd2L/IHdi/x53Yv8ed2L/Hndi/x7/ UgAA7FwAANxmAADObQAAxHIAAL10AAC3dAEAsHQOAKl1HwCidC8CnHI9BZdwRwqRblEPjWxZFIlq YBeFaWcbgmhuHn9mdSF9ZX0kemSGJ3djkCl1Y5sscmKnLnBiti9vYskvbmLmLm9k+ShwZf8kcWb/ IXFm/x9xZv8fcWb/H3Fm/x//VAAA6F8AANdpAADKcAAAwHUAALl4AACyeAAAq3gNAKR5HQCeeC0B l3c6BZJ1RQqMck4OiHBWE4RvXheAbWQafWxrHXprcyB3ansjdGmDJnJojSlvZ5ksbGalLmpmsy9p ZsYwaGbkL2po9ylraf8lbGn/Imxq/yBsav8gbGr/IGxq/yD/VwAA5GIAANJsAADGcwAAvXgAALV7 AACtfAAApXwKAJ99GgCZfCoBk3s4BI15QwmId0wOg3VUEn9zWxZ7cmIZeHBpHXVvcCBybngjb22B JmxsiylqbJcsZ2ujLmVrsi9ka8QwYmvhL2Rs9ipmbf8mZm3/I2du/yBnbv8gZ27/IGdu/yD2WQAA 4GUAAM5vAADCdgAAuXwAALF/AACpgAAAoIAHAJmBFwCUgSgBjoA1A4h+QQiDfEoNfnpSEXp4WRV2 d2AZc3ZnHHB0bh9tc3YjanJ/JmdxiSlkcZUrYnChLWBwsC9ecMIvXXDfL19x9Spgcf8mYXL/I2Jy /yBicv8gYnL/IGJy/yDvXAAA3GkAAMpyAAC+egAAtYAAAK2EAACkhQAAmoUDAJSFFACOhiUBiYQz A4ODPgd+gUgLeX9QEHV+VxRxfV4YbntlG2t6bB5oeXQiZXh9JWJ3hyhfdpMqXHafLFp1ri5ZdcAu WHXdLll28ypbdv8mXHf/I1x3/yBcd/8gXHf/IFx3/yDqYAAA1WwAAMV2AAC6fgAAsYQAAKiIAACf iQAAlIoAAI2KEQCIiyEAg4owAn6JOwV5h0UKdIZODnCEVRJsg1wWaYJjGmaBah1igHIgX397I1x+ hSZZfZEpV3yeK1V8rCxTfL4tUnzaLVN88ilVfP8lVnz/Ild8/yBXfP8gV3z/IFd8/yDlZAAAz3AA AMF6AAC2gwAArYkAAKOMAACZjgAAjY8AAIaQDgCBkR0AfZAsAXiPOARzjkIIbo1LDGqMUxBniloU Y4lhF2CIaBtdh3AeWoZ5IVaFgyRUhY8mUYScKE+EqipNhLwqTYTXKk2D8SdPg/8kUIP/IlCD/x9Q g/8fUIP/H1CD/x/eaQAAyXUAALyAAACyiAAAqI0AAJ2RAACTkwAAhZYAAH6XCwB5lxkAdZcoAXGX NQNslj8GaJVICmSUUA1hk1cRXZJeFVqRZhhXkG4bVI93HlGOgSBOjo0jS42aJUmNqSZIjbsnR43U J0eM8CRIjP8iSYv/IEqL/x5Ki/8eSov/HkqL/x7VbgAAw3sAALeFAACsjQAAopIAAJeWAACMmQAA f5wAAHWeBQBwnxMAbZ8jAGmfMAFlnjsEYZ5FB12dTQpanFQNV5tcEVSaYxRRmmsXTpl0GUuYfxxI mIseRZeZIEOXqCFCl7oiQZfTIkGW7yBClf4eQpX/HUOU/xxDlP8cQ5T/HEOU/xzMdQAAvIEAALGM AACmkgAAm5cAAJGbAACFnwAAeaMAAGqnAABlpw4AY6gcAGCoKwFdqDYCWadABFanSQZTplEJUKZZ DE2lYA5KpWkRR6RyFESkfRZCo4kYP6OXGj2jpxs8o7kcO6PSGzui7xs7oP4aO5//GTyf/xg8n/8Y PJ//GDyf/xjEfAAAtokAAKqSAACflwAAlZwAAImhAAB9pgAAcaoAAGSuAABasQgAV7EUAFWyIwBT sjABULI7Ak2yRANLsU0FSLFVB0WxXQlDsWULQLBvDT6weg87sIcROa+WEzevphQ2r7gUNbDRFDWu 7xQ0rf4UNKz/FDSr/xQ0q/8UNKv/FDSr/xS7hQAAr5AAAKOXAACYnQAAjKMAAICoAAB0rQAAaLIA AFy2AABQugEASbwNAEi8GQBGvScARb0zAEO9PQFBvUcBP71QAj29WAM6vWEFOL1rBja9dwg0vYQJ Mr2TCjC9pAsvvbcMLr7QCy687gwtuv4NLLn/DSy4/w4suP8OLLj/Diy4/w6zjwAAppcAAJudAACP owAAg6oAAHawAABqtQAAXroAAFK+AABHwgEAPccGADjJEAA3yRsANsonADXKMwA0yz0AM8tHADHL UQEwy1sBLsxlAizMcQIqzH8DKcyQBCfMoQQmzbQEJc3OBCXL7gQkyfwGI8j/ByPH/wcjx/8HI8f/ ByPH/weplgAAnp0AAJKjAACFqwAAeLIAAGu4AABfvgAAUsIAAEfGAAA9ygAANM8EACvUCQAm2Q8A JdkZACXaJQAk2jAAI9s7ACPbRQAi3FAAId1bACDdaAAe3nYAHd6HARzfmQEa36wBGd/EARje5wEY 3PgBGNv/Ahfa/wIX2v8CF9r/Ahfa/wKgnAAAlKMAAIerAAB5swAAbLoAAF/BAABSxgAARsoAADvO AAAx0wAAKdkAACHeBQAe6A4AHegVABvpHgAZ6ScAGOowABbqOQAV60MAFOxOABLsWgAR7WcAEO53 ABDuigAO754ADvCzAA3wzQAM7+wADO38AAzr/wAM6/8ADOv/AAzr/wCXowAAiasAAHu0AABtvAAA X8QAAFLKAABFzgAAOdMAAC/YAAAl3QAAHeEAABjsAgAW9wsAFPcRABH4FwAQ+B4ADvklAA35LQAL +jUACfs/AAf7SgAE/FcAA/1mAAL+dwAA/YsAAP2fAAD8tQAA/NEAAPztAAD8/AAA/P0AAPz9AAD8 /QCLqwAAfbQAAG69AABgxgAAUs0AAETSAAA32AAALN0AACLhAAAZ5QAAE+oAABD6AAAO/wYADf8M AAr/EAAH/xQABP8aAAH/IAAA/ycAAP8wAAD/OgAA/0UAAP9TAAD/YgAA/3UAAP+KAAD/nwAA/7MA AP/HAAD/5QAA/+UAAP/lAAD/5QB/tAAAcL0AAGHHAABT0AAAQ9YAADbdAAAq4gAAH+YAABbqAAAQ 7QAADPoAAAn/AAAG/wAAAv8EAAD/CQAA/w0AAP8QAAD/FAAA/xoAAP8hAAD/KQAA/zQAAP9AAAD/ TgAA/14AAP9yAAD/hwAA/5oAAP+qAAD/uQAA/7kAAP+5AAD/uQD/ICkB/yInAf8iJwH/HyoB/xkw Af8SOQH/EEUB/w1TAf8MYAH/Cm0C/wl5Av8JhAL/CY4B/wmWAf8JnQH/CaMB/wmpAf8JsAH/CLcB /wi+Af8IyAH/CNYB/wjmAf8I8QH/CPsA/wj/AP8I/wD/Cf8B/wn/Af8J/wH/Cf8B/wn/Af8J/wH/ IyYB/yUkAP8lJAD/IycB/x0sAf8YNQH/FUIB/xJQAf8QXQL/DmoC/w52Av8OgAL/DooC/w6SAv8O mgL/DqAC/w6mAf8NrQH/DbMB/w27Af8NxQH/DdEB/w3jAf8N7wH+DfoB+g3/AfkO/wH5Dv8B+Q7/ AfgO/wH4Dv8B+A7/AfgO/wH/JiMA/yggAP8oIAD/JiIA/yIoAf8gMgH/HD8B/xlMAf8XWQL/FWUC /xNxAv8TfAL/E4YC/xOOAv8SlgL/Ep0C/xKjAv8SqQL/ErAC/xK3Av8SwQL/EswB/RLfAfkT7QH1 E/gB8xP/AfIT/wHxE/8C8BT/AvAU/wLwFP8C8BT/AvAU/wL/Kh8A/ywcAP8sGwD/Kx0A/ykkAP8o LwH/JTsB/yJIAf8fVAL/HWEC/xttAv8adwL/GoEC/xqKAv8akgL/GpkC/RqfAvwapgL7GqwC+Rq0 AvgavQL2GsgC8xrbAu8a6gLsG/cC6Rv/Augb/wPnHP8D5hz/A+Uc/wPlG/8D5Rv/A+Ub/wP/LRsA /zAXAP8xFQD/MBYA/zEgAP8wKgD/LjYB/ytDAf8oTwL/JlwC/yRnAvwjcgP5I3wD9yKFA/UijQPz IpUD8iKbA/AiogPvIqkD7SKxA+wiuQPqIsUD6CLVA+Qj6QPgI/YE3iP/BNsk/wTZJP8E2CT/BNck /wTWJP8E1iT/BNYk/wT/MRYA/zQSAP82EQD/NxMA/zkbAP84JQD/NjEB/zM9Af0xSgH4LlYC9C1i A/AsbQPtK3cD6iuABOgqiATmKpAE5SqXBOMqngXhKqUF4CqtBd4qtgXcKsIF2irSBtUr5wbQK/UH zSz/B8ss/wfJLP8HyCz/B8cs/wbHLP8Gxyz/Bscs/wb/NRIA/zkOAP86DQD/PhAA/0AWAP8/IAD/ PSoA+Ts3AfI4RAHsNlEC5zVcA+M0ZwPgM3IE3TN7BdoygwbWMosG1DKTB9IxmgjQMaEIzjGpCcwx sgnLMbwKyTHKCsYy4QvCMvELvzP+C70z/wq7M/8KujP/Cboz/wm6M/8JujP/Cboz/wn/ORAA/z0L AP9ACQD/RA0A/0YRAP9FGQD3RCMA7kEvAOY/PAHgPkoB2j1XAtM8YgTPO2wGzDp1B8k6fQnHOYUK xTmMC8M4lAzBOJsNwDijDb44rA68OLYPujjDD7k41xC1OOwQsjn7D7A6/w6vOv8Nrjr/DK06/wut Ov8LrTr/C606/wv/PA0A/0AGAP9FBAD/SQkA/0sNAPlKEQDtSRoA40YmANpGNgDRRkUBy0VRA8ZE XAXCQmYIv0JvCrxBdwu6QH8NuD+GDrY/jhC0PpURsj6dErA+phOvPrAUrT69FKs+zRWpPuYVpj/3 E6RA/xKjQP8QokD/D6JA/w6iQf8OokH/DqJB/w7/PwkA/0QAAP9KAAD3TgIA7FAGAOpPCwDjTBAA 1kweAM1NMADGTT8BwExMBLtLVwa3SWEJtEhpDLFHcQ6uRnkQrEaAEapFiBOoRJAUpkSYFqRDoRei Q6sYoEO3GZ9DxxmdQ+Aam0TzF5lF/xWYRv8TmEb/EZhG/xCXRv8Ql0b/EJdG/xD/QgUA/0cAAPdP AADlUwAA3VUBANdVBgDVUgsAy1MZAMNUKwC8VDsBtlJIBLFRUgetUFwKqU5kDaZNbA+kTHQRoUt7 E59KghWdSooXm0mTGJlJnBqXSKYblUiyHJRIwR2SSNgdkEnvG49K/hiPS/8Wjkv/FI5M/xKOTP8S jkz/Eo5M/xL/RQAA/0sAAOlTAADeWAAA01sAAM1bBADKWAcAwlgVALpaJwCzWjcBrlhEBKlXTwek VVgKoVRgDZ5TaBCbUW8TmFB2FZZQfheUT4YZkk6OGo9OmByNTaIdi02uH4pNvCCITdAgh03rH4ZP /BuGUP8YhlD/FoZQ/xSGUf8UhlH/FIZR/xT/RwAA+E8AAORXAADVXQAAzGAAAMVgAgDBXgUAul0R ALNfIwCsXzMBpl5AA6FcSwedWlQKmVlcDpZYZBGTVmsTkFVyFo5UehiLVIIaiVOKHIdSlB6FUp4f g1GqIYFRuCJ/UcsiflLnIX5T+R1+VP8aflX/F35V/xZ+Vf8VflX/FX5V/xX/SgAA7lIAAN5bAADP YQAAxmQAAL9lAAC6YwIAs2IPAKxjIACmYzABoGI9A5thSAaWX1EKkl5ZDY9cYRGMW2gTiVpvFoZZ dhiEWH4agleHHH9XkB99Vpshe1anInlWtSN3VsckdlbkJHZX9x93WP8bd1n/GXdZ/xd3Wf8Wd1n/ FndZ/xb/TAAA6VYAANlfAADLZQAAwWgAALppAAC0aAAArWcNAKZoHACgaC0Bmmc6A5VlRQaQY04K jGJXDYlhXhCGX2UTg15sFoBdcxh+XHsae1yDHXlbjR92WpghdFqkI3JasiRxWsQlb1rhJXBb9iBx XP8ccV3/GnFd/xhxXf8XcV3/F3Fd/xf9TwAA5VkAANNiAADHaAAAvWwAALZtAACvbAAAp2sLAKBs GQCbbCoBlWs3ApBpQwWLaEwJh2ZUDINlWxCAY2ITfWJpFXphcBh4YXgadWCBHXNfix9wXpYibl6i JGxesCVrXsEmaV7eJmpf9CFrYP8da2H/G2xh/xlsYf8YbGH/GGxh/xj1UQAA4lwAAM9lAADDawAA uW8AALFxAACqcQAAom8IAJtvFwCWcCcAkG81AotuQAWGbEkIgmpSDH5pWQ97aGASd2ZmFHVmbhdy ZXYacGR+HW1jiB9rY5MiaWKgJGZiriVlYr8mZGLaJmRj8iJlZP8eZmT/G2dk/xlnZf8YZ2X/GGdl /xjwUwAA3V8AAMtoAAC/bwAAtnMAAK51AACmdQAAnXMFAJZzFACRdCQAi3MyAoZyPgSBcEcIfW9P C3ltVw52bF4Rc2tkFHBqbBdtanMaa2l8HGhohh9mZ5EiY2eeJGFmrCVgZr0mX2fWJl9n8SJgaP8e YWj/HGJo/xpiaP8ZYmj/GWJo/xnsVwAA2WIAAMdrAAC8cgAAs3cAAKp5AACheQAAl3cBAJB4EQCL eCEAhngvAYF3OwR8dUUHeHRNCnRyVQ5xcVwRbnBjFGtvahZobnEZZm56HGNthB5gbI8hXmycI1xr qiVaa7smWWzTJlps7yNbbP8fXG3/HF1t/xpdbf8ZXW3/GV1t/xnoWgAA0mYAAMNvAAC4dgAAr3sA AKZ+AACdfgAAkXwAAIp8DwCFfR4AgX0tAXx8OQN3ekMGc3lLCXB4Uwxsd1oQaXZhE2Z1aBZjdG8Y YXN4G15ygh5bco0gWXGaIldxqCRVcbklVHHQJVRx7iJWcf4eV3H/HFdx/xpYcf8ZWHH/GVhx/xnj XgAAzWkAAL9zAAC0egAAq38AAKKCAACYgwAAi4EAAISBDQB/ghoAe4IpAXaBNgJygUAFbn9JCGp+ UAtnfVcOZHxeEWF7ZhReem0XW3p2GVl5gBxWeIsfU3iYIVF3piJQd7cjT3fOI0937CFQd/0eUXf/ G1J3/xlSd/8ZUnf/GVJ3/xneYgAAyG4AALt3AACwfwAAp4QAAJ2HAACShwAAhIcAAH2HCQB4iBYA dIgmAHCIMgJshz0EaIZGBmWFTglhhVUMXoRcD1uDYxJZgmsVVoF0F1OAfhpQgIkcTn+WHkx/pSBK f7YhSX/MIUl+6x9KfvwcS37/Gkt+/xlMfv8YTH7/GEx+/xjVZwAAw3MAALZ8AACshAAAookAAJiL AACNjQAAfI0AAHWOBABvjxIAbZAhAGmQLgFljzkCYo5CBF6OSwdbjVIKWIxZDFaLYQ9Ti2gSUIpx FE2JexdKiYcZSIiVG0aIox1EiLQdQ4jKHUOH6hxEhvsaRIb/GEWG/xdFhf8XRYX/F0WF/xfNbQAA vXgAALGCAACnigAAnI4AAJKQAACGkwAAeZUAAGyXAABmlw4AY5gbAGGYKQBemDUBWpc+A1eXRwVV lk8HUpZWCU+VXgxMlGYOSpRvEEeTeRNEk4UVQpKTF0CSohg+krMZPZLJGT2R6Rg9kPoXPo//Fj6P /xU+j/8VPo//FT6P/xXFcwAAt38AAKyJAAChjwAAlpMAAIuWAAB/mQAAc5wAAGSfAABcoAkAWaAU AFehIgBVoS8AUqE5AVChQwJNoEsESqBTBUigWgdFn2MJQ59sC0Cedg4+noMQO56RETmdoBI4nbIT N57IEzed6BI2m/oSNpr/EjaZ/xE3mf8RN5n/ETeZ/xG+ewAAsYcAAKWPAACblAAAkJgAAIScAAB3 oAAAa6QAAF+nAABSqgAATasOAEurGgBKqycASKszAEarPQFEq0YBQqtOAkCrVgM+q18FO6toBjmq cwg3qoAJNKqPCzKqnwwxqrAMMKrHDDCp5wwvp/oNL6b/DS+l/w0vpf8NL6X/DS+l/w22hAAAqo4A AJ6UAACUmQAAh54AAHujAABvqAAAY6wAAFevAABLsgAAQbUGAD62EQA9th4AO7YpADq3NAA5tz4A N7dHADa3UAE0t1oBMrdkAjC3bwMut3wELLeLBSq3nAUpt64GKLjFBSi35gUntfkHJrP/Byay/wgm sv8IJrL/CCay/wivjQAAopQAAJeaAACLoAAAfqYAAHGrAABlsAAAWbQAAE23AABCuwAAOL4BAC/C CQAtwxIALMMeACvDKQAqxDMAKcQ9ACjFRwAnxVEAJsVcACXGaAAjxnYBIsaGASDGmAEfxqsBHsfB AR7G5AEdxPgCHML/AxzB/wMcwf8EHMH/BBzB/wSllAAAmpoAAI6hAACBpwAAc64AAGe0AABauQAA Tr0AAELAAAA4wwAAL8cAACbLBAAe0AoAG9ERABrSGgAZ0iUAGNMvABjTOgAX1EQAFtRQABXVXQAU 1WsAE9Z8ABLXjwAR2KQAENm7ABDZ3gAQ1fMAENP/ABDS/wEQ0f8BENH/ARDR/wGcmgAAkaEAAIOo AAB1sAAAaLcAAFu9AABOwQAAQsUAADfIAAAtzAAAJNAAABzVAAAV2gUAEOILABDjEQAO5BoADuQj AA3lLQAM5TcAC+ZCAArmTwAJ510ACOdtAAbmgAAF5pUABOarAALmxAAB5uYAAOf5AADn/wAA5v8A AOb/AADm/wCToQAAhakAAHexAABpuQAAW8AAAE7GAABBygAANc4AACrSAAAh1gAAGdsAABLfAAAN 4wAAC/EIAAnzDgAH8xMABPIaAALyIgAA8ioAAPI0AADyPwAA8kwAAPJcAADybQAA8oIAAPKYAADz rQAA88YAAPTlAAD09gAA9PsAAPT7AAD0+wCHqQAAebIAAGq6AABcwgAATskAAEDOAAAz0wAAKNgA AB7dAAAV4QAAD+QAAAroAAAF8wAAA/0BAAD8CAAA+w0AAPsRAAD7FgAA/B4AAPwmAAD8MAAA/TwA AP5JAAD+WgAA/m0AAP+CAAD/mAAA/6wAAP/AAAD/2AAA/+QAAP/kAAD/5AB7sgAAbLsAAF3EAABP zQAAQNIAADLZAAAm3gAAG+IAABLmAAAM6gAABe0AAAD0AAAA/wAAAP8AAAD/AAAA/wQAAP8JAAD/ DgAA/xIAAP8YAAD/IQAA/ysAAP83AAD/RgAA/1gAAP9rAAD/gAAA/5UAAP+mAAD/swAA/7sAAP+7 AAD/uwD/GyYA/xwkAP8aJAD/FScA/xAtAP8KNgD/BUMA/wFQAf8AXgH/AGsB/wB2Af8AgQD/AIoA /wCSAP8AmgD/AKAA/wCmAP8ArAD/ALIA/wC5AP8AwgD/AM0A/wDfAP8A7AD/APgA/wD/AP0A/wD9 AP8A/QD/AP0A/wD9AP8A/QD/AP0A/wD/HyMA/x8hAP8eIQD/GSMA/xMpAP8OMgD/DEAA/wlNAf8H WgH/BGcB/wNzAf8DfQH/A4cB/wOPAP8ClgD/ApwA/wKiAP8CqAD/Aq8A/wG2AP8BvgD/AckA/wHb AP8A6gD8APYA+AD/APcC/wD3A/8A9gT/APYE/wD2Bf8A9gX/APYF/wD/Ih8A/yIcAP8hHAD/Hh8A /xgkAP8VLwD/EjwA/xBJAP8OVgH/DGIB/wtuAf8LeQH/C4IB/wuLAf8LkgH/CpkB/wqfAP8KpQD/ CqsA/wqyAP8KuwD9CsYA+wrUAPcK5wDzCvQA8Ar/AO8L/wDuDP8A7Qz/Ae0M/wHtDP8B7Qz/Ae0M /wH/JRsA/yYYAP8lFwD/IRgA/yAhAP8eKwD/GjcA/xdFAP8UUQH/El4B/xFpAf8RdAH/EX0B/xCG Af0QjgH8EJUB+hCbAfkQoQH3EKgB9hCvAfQQtwDzEMIA8RDQAO0Q5QDoEfIA5hH+AeQS/wHjEv8B 4hL/AeIS/wHhEv8B4RL/AeES/wH/KRYA/yoTAP8pEgD/JxMA/ygcAP8nJwD/IzMA/yA/AP8dTAD/ G1gB/BlkAfgZbgH2GHgB8xiBAfEYiQHvGJAB7hiXAewYngHqGKQB6RisAecYtAHmGL8B5BjNAeAZ 4wHcGvEB2Br+AtQb/wLSG/8C0Rv/AtAb/wLQG/8C0Bv/AtAb/wL/LRIA/y4PAP8uDQD/LxAA/y8X AP8uIQD/LC0A/yk5APkmRgD0JFMB7yJeAesiaQHoIXMB5iF8AeMhhAHhIYwB4CGTAd4hmgHcIaEB 2iGpAdghsQLVIbwC0yLJAtAi3wLMI/ADyCP9A8Yk/wPEJP8DwyT/A8Ik/wPBJP8DwST/A8Ek/wP/ MA8A/zILAP8zCAD/Ng0A/zYSAP81GgD9MiUA9DAyAO0tPwDnLEwA4itYAd0rYwHZKm0B1Sp2AtIq fwLQKoYCziqOA8wqlQPKKpwDySqjBMcqrATFKrYEwyrDBcIq1QW+K+sFuiv5Brgs/wa2LP8FtSz/ BbQs/wW0LP8FtCz/BbQs/wX/NAwA/zYFAP85AwD/PAgA/zwNAP07EwDxOB0A6DUpAOA0NwDZM0YA 0TRSAc0zXQHJM2cCxjNwA8QyeATBMoAEvzKHBb4yjwa8MpYGujGeB7gxpge3MbAItTK8CLMyzAmx MuUJrTP1Casz/wmqM/8IqDP/B6gz/wenM/8HpzP/B6cz/wf/NwcA/zoAAP8+AAD6QQEA8UEGAPE/ DQDmPBIA2zofANA7MQDKPEAAxDxNAcA8WAK8O2EDuTtqBbY6cga0OnoHsjmBCLA5iAmvOZAKrTiY Cqs4oQupOKoMqDi2DaY4xQ2kON4OoTnxDZ86/wyeOv8LnTr/Cpw6/wmcOv8JnDr/CZw6/wn/OwIA /z4AAPdEAADmRwAA30gBANpGBgDZQAsAzUIZAMVEKwC+RDsAuURIAbVDUwOxQlwErkJlBqtBbAep QHQJpkB7CqQ/gwujP4oNoT6TDp8+nA+dPqUQmz6xEZo+vxGYPtQSlj/tEZQ//A+TQP8OkkD/DJJB /wuSQf8LkkH/C5JB/wv/PQAA/0MAAOlJAADeTgAA008AAM1OAwDKSQgAwkkUALtKJgC1SzYAr0tD AqtKTgOnSVcFpEhgB6FHZwmeRm8KnEZ2DJpFfQ6YRYUPlkSOEJRElxKSQ6ETkEOsFI9DuhWNQ80V i0ToFYpF+hKJRv8QiUb/DohG/w2IRv8NiEb/DYhG/w3/QAAA8kcAAONPAADUUwAAy1UAAMRUAADA UAQAuU8RALJQIgCsUTIAp1E/AqJQSgOeT1MFm05cCJhNYwqVTGoMk0txDZFKeQ+OSoARjEmJEopJ khSISJwVhkioFoVItReDSMcYgUjkGIFK9xWASv8SgEv/EIBL/w+AS/8OgEv/DoBL/w7/QwAA7EsA AN1TAADOWAAAxFoAAL1aAAC4VwEAsVQOAKpWHgClVi4An1Y7AZtVRgOXVFAFk1NYCJBSXwqNUWYM i1BtDohPdBCGT3wShE6FE4JOjhWATZkXfk2kGHxNshl6TcMaeU3fGnhO9Bd4T/8UeE//EnhQ/xB4 UP8PeFD/D3hQ/w/9RgAA508AANZXAADIXAAAv18AALdfAACxXAAAqlkMAKRaGgCeWyoAmVs4AZRa QwOQWUwFjFhVCIlXXAqGVmMMg1VqDoFUcRB/U3kSfVOBFHpSixZ4UpUYdlGhGXRRrxtzUcAbcVHb HHFS8hlxU/8VcVT/E3JU/xFyVP8QclT/EHJU/xDzSAAA41MAANBbAADEYAAAumMAALNjAACsYQAA pF4JAJ1fFwCYXycAk181AY5eQAOKXUoFhlxSB4NbWQqAWmAMfVlnDntYbhB4WHUSdld+FHRWiBdy VpMYb1afGm5VrBtsVb0ca1bVHWtW8BprV/8Xa1j/FGxY/xJsWP8RbFj/EWxY/xHxSwAA31YAAMxe AADAZAAAt2cAAK5oAACnZgAAn2IGAJhjFACSZCQAjWMyAYliPQKEYUcEgWBPB31fVgl6Xl0Ld11k DXVcaxBzXHMScFt7FG5bhRdsWpAZalqcG2hZqhxmWrodZVrRHWVa7htlW/4XZlv/FWZc/xNnXP8S Z1z/Emdc/xLtTgAA2lkAAMhhAAC8ZwAAs2oAAKtsAACiagAAmWcCAJJnEQCNZyEAiGcvAYRmOwJ/ ZUQEe2RNBnhjVAl1YlsLcmFhDXBhaQ9tYHASa195FGlfgxdmXo4ZZF6aG2JeqBxhXrgdX17OHV9e 7BtgX/0YYV//FWFf/xNiX/8SYl//EmJf/xLqUQAA1FwAAMRkAAC5agAAsG4AAKdwAACebgAAlGsA AI1qEACHax4Ag2ssAH5rOAJ6akIDdmlKBnNoUghwZ1kKbWZgDWtlZw9oZG4RZmR3FGRjgRZhY4wY X2KYGl1iphxbYrYdWmLMHVpi6hxbY/wYXGP/Flxj/xRdY/8TXWP/E11j/xPmVQAAz18AAMFoAAC2 bgAArHIAAKR0AACacwAAjm8AAIdvDQCCbxsAfXApAHlvNQF1bj8Dcm1IBW5sUAdrbFcKaWteDGZq ZQ5kaWwRYWl1E19ofxZcaIoYWmeWGlhnpBxWZ7QdVWfKHVVn6BtWZ/sYV2f/Fldo/xRYZ/8TWGf/ E1hn/xPhWAAAy2MAAL1rAACycgAAqXYAAKB4AACWdwAAiHMAAIFzCwB8dBcAeHQmAHR0MgFwcz0C bXNGBGpyTgdncVUJZHBcC2FwYw5fb2oQXG5zElpufBVXbYgXVWyUGVNsoxtRbLMcUGzIHE9s5xtR bPoYUWz/FVJs/xRSbP8TUmz/E1Js/xPcXAAAx2cAALlvAACvdgAApXsAAJx8AACRfAAAgngAAHp5 BwB1eRQAcnojAG56LwFreToCaHlDA2R4SwVhd1IIX3dZClx2YAxZdWgPV3RwEVR0ehNSc4YWT3OT GE1yoRlMcrEaSnLGGkpy5RpLcvkXTHL/FUxy/xNNcv8STXL/Ek1y/xLUYAAAwmsAALV0AACrewAA on8AAJeBAACMgQAAen4AAHN/AgBufxEAa4AeAGiALABlgDcBYoBAA19/SARcflAGWX5XCFd9XgtU fGYNUXxuD097eBFMe4MUSnqRFkh6nxdGeq8YRXrEGER65BhFefgWRnn/FEZ4/xJHeP8RR3j/EUd4 /xHNZQAAvXAAALF5AACngAAAnIQAAJKGAACGhgAAd4YAAGuGAABmhw0AY4cZAGCIJwBeiDMBW4g8 AliHRQNWh00EU4ZUBlCGWwhOhWMKS4RsDEmEdg9Gg4ERRIOPE0KDnRRAgq4VP4PCFT6C4hU/gfcT P4H/EkCA/xFAgP8QQID/EECA/xDGawAAt3YAAKx/AACihQAAl4kAAIyLAACBjQAAc44AAGWPAABd jwkAWpAUAFiQIQBWkS0AU5A4AVGQQQJOkEkDTJBQBEqPWAVHj2AHRY5pCUKOcwtAjX8NPo2NDzyN nBA6jawROY3BETiN4RA4i/YQOIr/DzmJ/w85if8OOYn/DjmJ/w6/cgAAsn0AAKeGAACcigAAkY4A AIaRAAB6kwAAbZUAAF+XAABUmQEAT5kPAE6aGgBMmicASpoyAEiaPAFGmkQBRJpMAkKaVANAmVwE PplmBTuZcAc5mHwIN5iKCjWYmgszmKsLMpi/DDKY3wsxlvULMZX/CzGU/wsxk/8LMZP/CzGT/wu4 egAArIUAAKGLAACWkAAAi5QAAH+XAABymwAAZp0AAFqgAABOogAARaQJAEKkEwBApB8AP6QqAD6l NAA8pT4AO6VHATmlTwE3pVgCNaVhAjOlbAMxpXkEL6SHBS2klwYspKkGK6S9Biqk3gYqovUHKaH/ Bymg/wgpn/8IKZ//CCmf/wixggAApYsAAJqRAACQlgAAg5oAAHafAABqogAAXqYAAFKpAABGqwAA PK0AADWvDAAzsBUAMrAhADGwKwAvsDUALrE+AC2xSAAssVEAK7FbACmxZwEnsXQBJrGDASSxlAIj saYCIrK7AiGy2wIhr/MDIK7/AyCt/wQfrP8EH6z/BB+s/wSqiwAAnZEAAJOXAACHnAAAeqIAAG2n AABgqwAAVa8AAEmxAAA+tAAAM7cAACq6AwAkvA0AIr0VACG9IAAhvSoAIL0zAB++PQAevkcAHb5S ABy/XgAav2wAGb98ABi/jgAXwKEAFsC2ABTA0wAVvvEAFbz/ARW7/wEUuv8CFLr/AhS6/wKhkgAA lpgAAIqeAAB9pAAAb6oAAGKvAABWtAAASrcAAD66AAAzvQAAKsAAACHEAAAZxwUAE8sLABHMEgAR zBsAEMwlAA/NLwAOzToADs1GAA3NUgANzmAADM5wAAvOgwAKzpcACc6sAAjOxgAIzugACM37AAnL /wAJy/8ACcv/AAnL/wCYmAAAjZ4AAH+lAABxrAAAZLMAAFe5AABKvQAAPsAAADLDAAAoxgAAH8oA ABfNAAAR0QAADNYFAAjZDAAG2RIABdobAATaJAAD2y4AAds5AADcRQAA3VIAAN5iAADecwAA3ogA AN+dAADfswAA384AAODuAADf+gAA3/8AAN//AADf/wCPnwAAgaYAAHOuAABltQAAWL0AAErCAAA9 xQAAMckAACbMAAAd0AAAFNQAAA7ZAAAJ3QAAA+EAAADjBwAA4w0AAOQSAADlGQAA5iIAAOcrAADp NgAA60MAAOxSAADsYgAA7XYAAO6MAADuoQAA77cAAO/RAADv6wAA8PYAAPD2AADw9gCEpwAAda8A AGe3AABZvwAAS8YAADzKAAAvzgAAJNIAABrYAAAS3AAADOAAAAXjAAAA5wAAAOsAAADrAAAA7QUA AO4LAADwEAAA8RUAAPMeAAD0JwAA9zMAAPlAAAD6UQAA+2MAAPx3AAD9jQAA/aMAAP62AAD+yQAA /98AAP/fAAD/3wB3sAAAaLkAAFrBAABMygAAPM8AAC7UAAAi2gAAF94AABDiAAAJ5gAAAOkAAADs AAAA8AAAAPYAAAD2AAAA9wAAAPgAAAD6BwAA+w0AAP0RAAD/GQAA/yMAAP8vAAD/PgAA/08AAP9i AAD/dwAA/40AAP+fAAD/rgAA/7oAAP+6AAD/ugD/FiMA/xUhAP8SIQD/DiQA/wYqAP8AMwD/AEEA /wBOAP8AXAD/AGgA/wB0AP8AfgD/AIcA/wCPAP8AlgD/AJwA/wCiAP8AqAD/AK4A/wC1AP8AvQD/ AMcA/wDWAP8A5wD+APMA/gD+AP0A/wD8AP8A+wD/APsA/wD7AP8A+wD/APsA/wD/GiAA/xkeAP8W HgD/ECAA/wolAP8EMAD/AD0A/wBLAP8AWAD/AGQA/wBwAP8AegD/AIMA/wCLAP8AkgD/AJgA/wCe AP8ApAD/AKoA/wCxAP0AuQD7AMMA+gDQAPgA4wD3APEA9gD8APQA/wD0AP8A8wD/APMA/wDzAP8A 8wD/APMA/wD/HRwA/xwZAP8ZGQD/FBsA/w7/4v/iSUNDX1BST0ZJTEUACAkhAP8MLAD/CTkA/wVG AP8CUwD/AF8A/wBrAP8AdQD/AH4A/wCGAP8AjgD/AJQA/gCbAPwAoQD6AKcA+ACuAPUAtQDzAL8A 8QDLAPAA3wDuAO4A7AD5AOsA/wDqAP8A6gH/AOkB/wDpAf8A6QH/AOkB/wD/IBcA/x8UAP8cEwD/ FxUA/xYdAP8TKAD/EDQA/w1BAP8MTgD/CVoA/whmAP8IcAD+B3kA/AeBAPoHiQD4B5AA9gaWAPMG nQDxBqMA7waqAO0GsgDqBrsA6AbIAOYG3ADkBuwA4gj6AOAK/wDeC/8A3Qv/AN0M/wDcDP8A3Az/ ANwM/wD/IxIA/yMQAP8hDgD/HhAA/x4YAP8cIwD/GC8A/xQ7AP8SSQD8EFUA+A9gAPQPagDxD3QA 7w58AO0OhADrDosA6Q6SAOcOmQDmDqAA5A6nAOIOrwDgDrgA3g7FANwO2gDWEOwA0hH6AM8S/wDN Ev8BzBL/AcsT/wHKE/8ByhL/AcoS/wH/Jw8A/ycMAP8lCQD/Jg0A/yUTAP8jHAD/ICgA+xw1APUa QgDvGE8A6hdaAOYWZQDjFm4A4BZ3AN4WfwDcFocA2RaOANYWlQDUFpwA0hejANAXqwDOGLUAzBjB AMsY0gDHGugBwxv4AcAb/wG+HP8BvRz/Arwc/wK8G/8CvBv/Arwb/wL/KwwA/ysFAP8rAwD/LQkA /ywOAP8pFQD3JiAA7iMtAOchOgDhH0gA2x9UANUgXwDRIGgAziBxAMwheQDKIYEByCGIAcYhjwHE IZYBwyGeAcEipgG/Iq8BvSK7ArwjygK5I+MCtST0ArMk/wOxJP8DryT/A68k/wOuJP8DriT/A64k /wP/LwYA/y8AAP8yAAD/MwIA+TIIAPcvDgDrKxYA4SciANgnMgDQKUEAyypOAMYqWQDDKmIBwCpr Ab0qcwG7KnoCuSqCArgqiQK2KpACtCqYA7MqoQOxKqoDryu1BK4rxASsK9sEqCzvBKYs/gWkLP8E oy3/BKIt/wSiLP8Eoiz/BKIs/wT/MgAA/zMAAPk4AADpOQAA4jkAAN41BwDeLg0A0S8bAMkxLADD MzsAvTNIALk0UwG2M1wBszNlArAzbQKuM3QDrDJ7A6sygwSpMooEpzKTBaUymwakMqUGojKwB6Ay vgefMtEHnDPqB5oz+weYNP8HlzT/BpY0/waWNP8FljT/BZY0/wX/NQAA/zgAAOo+AADfQgAA1UIA AM8/AwDNOAgAxTgVAL06JgC3OzYAsjxDAK48TgGqO1cCpztgA6U6ZwOjOm8EoTp2BZ85fQadOYUH mzmNB5k4lgiYOKAJljirCpQ4uAqTOcoLkTnlC4869wqNOv8JjDv/CIw7/weMO/8HjDv/B4w7/wf/ OAAA8T4AAONFAADUSQAAy0oAAMVHAADBQQQAuj8RALNBIQCtQjEAqEM+AKRDSQGgQlMCnUFbA5tB YgSYQGoFlkBxBpQ/eAeSP38IkD+ICo8+kQuNPpsMiz6mDYk+sw2IPsQOhj/gDoQ/9A2DQP8Lg0D/ CoJA/wmCQf8IgkH/CIJB/wj/PAAA60MAANxKAADMTwAAw1AAALxOAAC3SQEAsUYOAKpIHACkSSwA oEk6AJtJRQGYSE4ClEdXA5JHXgWPRmUGjUZsB4tFcwmJRXsKh0SDC4VEjQyDRJcOgUOiD39DrxB+ Q8AQfETaEXtE8Q96Rf8Nekb/C3pG/wp6Rv8Jekb/CXpG/wn1PgAA5kgAANNPAADHVAAAvVUAALZU AACwUAAAqUwLAKJNGACdTigAmE42AJROQQGQTUsCjU1TBIpMWgWHS2EGhUtoCINKbwmASncLfkl/ DHxJiQ56SJMPeEifEHdIrBJ1SLwSdEnSE3NJ7hFySv8Pckr/DXJK/wtySv8Lckr/CnJK/wryQgAA 4EwAAM5TAADBWAAAuFoAALBZAACpVgAAolIHAJtSFQCWUyQAkVMyAI1TPgGJUkcChlFQBINRVwWA UF4Gfk9lCHtPbAl5TnMLd057DXVNhQ5zTZAQcU2cEm9NqRNuTbkUbE3OFGxN6xNsTv0QbE//DmxP /wxsT/8LbE//C2xP/wvuRQAA3FAAAMlXAAC9XAAAtF4AAKxeAACkWwAAnFYEAJVWEgCQVyEAi1gv AIdXOwGDVkQCf1ZNA3xVVAV6VFsGd1RiCHVTaAlzU3ALcVJ4DW9Sgg9tUY0Ra1GZEmlRphRnUbYV ZlHLFWVS6RRlUvsRZlP/D2ZT/w1mU/8MZlP/DGZT/wzqSQAA1VMAAMVaAAC6XwAAsGIAAKhiAACf XwAAlloAAI9aEACKWx4AhVssAIFbOAF9W0ECelpKA3dZUQR0WFgGcVhfB29XZgltV20La1Z2DWlW fw9nVYoRZVWXE2NVpBRhVbQVYFXIFl9V5xVgVvoSYFb/D2FX/w5hV/8NYVf/DGFX/wznTAAA0VYA AMFeAAC2YwAArWYAAKRmAACbZAAAkF4AAIleDgCEXxsAgF8pAHxfNQF4Xz8CdF5HA3FdTwRvXFYF bFxcB2pbYwloW2sLZlpzDWRafQ9iWogRX1mUE15ZohRcWbIVW1nGFlpZ5RVbWvkSW1r/EFxa/w5c Wv8NXFr/DVxa/w3jTwAAzVkAAL5hAACzZgAAqWkAAKBqAACXaAAAi2IAAINiDAB+YxgAemMmAHZj MgBzYzwBb2JFAmxhTARqYVQFZ2BaB2VgYQhjX2kKYV9xDF9eew5dXoYRWl6TElhdoBRXXbAVVl7E FlVe4xVWXvcSVl7/EFde/w5XXv8NV17/DVde/w3eUwAAyF0AALtkAACwagAApm0AAJ1uAACTbQAA hWcAAH5nCQB4ZxUAdGcjAHFoLwBuZzkBa2dCAmhmSgNlZlIFY2VYBmBlXwheZGcKXGRvDFpjeQ5Y Y4QQVWKRElNinxNSYq4VUWLCFVBi4RVRYvYSUWL/EFJi/w5SYv8NUmL/DVJi/w3ZVgAAxGAAALdo AACsbgAAo3EAAJpzAACPcQAAf2sAAHhrBQByaxIAbmwfAGtsLABobDcBZmxAAmNrSANga08EXmpW BlxqXQdZaWUJV2ltC1Vpdw1TaIIPUGiPEU5nnRNNZ6wUS2jAFEto3hRLZ/USTGf/D0xn/w5NZ/8N TWf/DU1n/w3SWgAAwGQAALNsAACpcgAAoHYAAJZ3AACKdgAAeXEAAHFxAABrcQ8AaHEcAGZyKABj cjQAYHI9AV5yRQJbcU0DWXFUBVdwWwZUcGMIUm9rClBvdAxNboAOS26NEElumxFHbasSRm6+E0Vu 3BJGbfQRRm3/D0dt/w5HbP8NR2z/DUds/w3MXwAAvGkAALBxAACldwAAnHsAAJF8AACGewAAdXgA AGt3AABldwwAYXgXAF94JABdeTAAWnk6AVh5QgJWeEoCU3hRBFF3WAVPd2AHTHZoCEp2cgpIdX0M RXWKDkN1mQ9CdakQQHW8EEB12RBAdPMPQHT/DkFz/w1Bc/8MQXP/DEFz/wzGZAAAt24AAKt2AACi fAAAl38AAIyBAACBgQAAcoAAAGV/AABdfwgAWX8TAFeAIABVgCsAU4E2AFGAPgFPgEYCTYBOAkt/ VQNJf10FRn9mBkR+cAhCfnsJP36ICz19lww8facNOn26Djp+1g06fPENOnv/DDp7/ws6ev8LOnr/ Czp6/wvAaQAAsnQAAKd8AACdgQAAkoQAAIeGAAB7hwAAbocAAGCHAABVhwEAUIgOAE6IGgBNiSYA S4kwAEmJOgBIiUIBRolKAUSJUgJCiVoDQIhjBD2IbQU7iHgGOYeGCDeHlQk1h6YKNIe5CjOH0woz hvAJM4X/CTOE/wkzg/8JM4P/CTOD/wm5cAAArXoAAKKCAACXhwAAjYoAAIGMAAB1jgAAaI8AAFqQ AABPkQAAR5IKAESSEwBDkx8AQZMqAECTNAA/kz0APZNFADuTTQE6k1YBOJNfAjaTaQM0k3UDMpKD BDCSkwUukqQGLZK3BiyS0QYske8GK4//BiuO/wYrjf8HK43/ByuN/wezeAAAp4IAAJyIAACRjAAA h5AAAHqTAABtlQAAYZcAAFWZAABJmwAAP5wBADmdDgA3nRcANp4iADSeLAAznjUAMp4+ADGeRwAw n1AALp9aAC2fZAErn3EBKZ5/AieekAImnqECJJ61AiOezgIjne4DI5v+AyKa/wQimf8EIpn/BCKZ /wSsgQAAoIgAAJWOAACLkgAAf5YAAHKaAABlnQAAWaAAAE6jAABCpAAAN6YAAC6oBQApqQ8AKKkY ACeqIgAmqiwAJao1ACSqPwAjqkgAIqtTACGrXgAgq2oAHqt5AB2riwAbq50AGquxABmrygAZquwB Gaj9ARin/wIYpv8CGKb/Ahim/wKliQAAmY8AAI+UAACDmQAAdZ4AAGiiAABcpgAAUKkAAESsAAA5 rgAAL7AAACazAAAetQYAGbcPABi3FwAXtyEAFrcqABW3NAAUuD4AE7hJABK4VAASuWIAEblxABC5 gwAPuZcADrmsAA25xAANuOcADrb7AA61/wAOtP8ADrT/AA60/wCckAAAkpUAAIabAAB5oAAAa6YA AF6rAABSrwAARrIAADq1AAAvtwAAJboAAB29AAAVwAAAEMMGAAvGDgAKxRUACcUeAAjFKAAHxTIA BsY9AAXGSQAFxlcAA8ZmAALGdwABxosAAMagAADFtgAAxtIAAMXvAADF/AAAxf8AAMX/AADF/wCV lgAAiZwAAHujAABtqQAAYK8AAFO0AABGuAAAOrsAAC6+AAAkwQAAG8QAABPHAAAOygAACM4BAAHQ CgAA0BAAANAWAADRHgAA0icAANMxAADUPAAA1UkAANZYAADWaQAA1nwAANaSAADWpwAA1r8AANbg AADW8wAA1v4AANb/AADW/wCMnQAAfqQAAG+rAABhsgAAVLkAAEa9AAA5wQAALcQAACLHAAAZywAA Ec4AAAzSAAAF1QAAANsAAADcAwAA3QoAAN4PAADfFAAA4RwAAOIkAADkLgAA5joAAOdJAADoWQAA 6GsAAOmBAADpmAAA6a0AAOnFAADp4gAA6fIAAOn1AADp9QCApQAAca0AAGO1AABVvAAAR8IAADnG AAAsygAAIM4AABbSAAAP1gAACNsAAADfAAAA4wAAAOUAAADnAAAA6AEAAOoHAADrDQAA7REAAO8Y AADxIQAA8ysAAPY4AAD3SAAA+FoAAPltAAD6hAAA+psAAPqvAAD6wgAA+toAAPrfAAD63wB0rgAA ZbYAAFa+AABIxgAAOcsAACvQAAAf1AAAFNoAAA3fAAAF4wAAAOYAAADpAAAA7QAAAO8AAADxAAAA 8wAAAPUAAAD2AgAA+AkAAPoOAAD9EwAA/xwAAP8oAAD/NgAA/0cAAP9aAAD/bgAA/4UAAP+aAAD/ qwAA/7kAAP+8AAD/vAD/ESAA/xAeAP8MHgD/BCEA/wAnAP8AMAD/AD4A/wBMAP8AWQD/AGUA/wBw AP8AegD/AIMA/wCLAP8AkgD/AJgA/wCeAP8ApAD/AKoA/wCwAP8AuAD/AMIA/wDOAP8A4gD+APAA /QD7APsA/wD7AP8A+wD/APoA/wD6AP8A+gD/APoA/wD/FBwA/xIaAP8OGgD/CBwA/wAhAP8ALQD/ ADoA/wBIAP8AVQD/AGEA/wBsAP8AdgD/AH8A/wCHAP8AjgD/AJQA/wCaAP4AoAD9AKYA/ACsAPsA tAD5AL0A+ADJAPcA3AD1AOwA8wD4APMA/wDyAP8A8QD/APAA/wDwAP8A8AD/APAA/wD/FxgA/xUW AP8RFQD/DBcA/wUdAP8AKAD/ADYA/wBDAP8AUAD/AFwA/wBnAP8AcQD/AHoA/ACCAPoAiQD4AJAA 9wCWAPUAnAD0AKIA8wCoAPEAsADwALgA7gDDAOwA0wDqAOcA6QD1AOcA/wDmAP8A5QD/AOUA/wDl AP8A5QD/AOUA/wD/GhMA/xgRAP8UEAD/DxEA/w0ZAP8KJAD/BTAA/wE+AP8ASwD/AFcA/gBiAPoA bAD1AHUA8gB9APAAhADuAIsA7ACRAOsAlwDpAJ4A5wCkAOYArADkALQA4gC/AOAAzQDeAOMA3ADy ANoA/QDYAP8A1gD/ANUB/wDVAf8A1QL/ANUC/wD/HhAA/xwNAP8XCwD/FQ4A/xQVAP8RHwD/DioA /ws4AP0IRQD4BlEA9ARcAO4EZgDqBG8A5gN3AOQEfwDiBIYA4ASMAN4EkwDdBZoA2wWgANgFqADV BbEA0gW7ANAGyQDOB+AAzAjxAMkK/wDHC/8Axgz/AMUM/wDFDP8AxQz/AMUM/wD/IQwA/yAGAP8c AwD/HQoA/xsQAP8YGAD/FCMA9hEwAO8OPgDqDkoA5Q1WAOENYADdDWkA2Q1xANUNeQDTDYEA0Q2I AM8NjwDNDpYAyw6dAMoOpQDIDq4Axg+5AMQQyADCEN8AvhHyALsS/wC5E/8AtxP/AbYT/wG2E/8B thP/AbYT/wH/JQYA/yMAAP8jAAD/JAMA/yEKAP0dEQDxGhsA6BYnAOEUNQDaE0MA0xRPAM4VWQDL FWMAyBZrAMUWcwDDF3sAwReCAMAYiQC+GJAAvBiYALsZoAC5GakAtxm0ALUawgC0GtYAsBvtAa0c /AGrHf8BqR3/Aakd/wGoHf8BqB3/Aagd/wH/KAAA/ycAAP4qAADvKgAA5ycBAOciCQDkHRAA2Rsd AM8dLQDJHjwAxCBJAL8gUwC8IV0AuSFlALcibQC1InQAsyJ8ALEigwGwIooBriKSAawjmwGrI6QB qSOvAacjvAGmJM4BoyToAqAl+QKeJf8CnSX/Apwl/wKbJf8CmyX/Apsl/wL/LAAA/y0AAO0yAADi NAAA2jMAANMuAwDSJQoAySUXAMEnJwC7KTYAtipDALIrTgCvK1cArCtgAKorZwGoK28Bpit2AaQr fQGjK4QCoSuNAp8rlQKeK58CnCuqA5ortgOZLMcDlyziA5Qt9QSSLf8DkS3/A5Au/wOQLf8DkC3/ A5At/wP/MAAA8jMAAOQ6AADWPQAAzDwAAMc5AADDMQUAvS4RALUwIQCwMjAAqzM9AKczSQCkM1IA oTNaAZ8zYgGcM2kCmjNwApkzdwKXMn8DlTKHA5MykASSMpoEkDKlBY4ysQWNM8IGizPcBok08gaH NP8FhjT/BYY0/wSFNP8EhTT/BIU0/wT8MwAA6zoAANxBAADNRAAAw0QAAL1BAAC4OwEAsjcOAKs4 HAClOSsAoTo4AJ07RACaO00BlzpWAZQ6XQKSOmQCkDprA445cgOMOXoEijmCBYk5iwWHOZUGhTmg B4M5rQeCObwIgTnTCH867gh9Ov4HfDv/Bnw7/wV8O/8FfDv/BXw7/wX0NwAA5UAAANJHAADFSgAA vEsAALVJAACvQwAAqT4LAKI/FwCdQCYAmEE0AJRBPwCRQUkBjkFRAYtAWQKJQGADh0BnA4U/bQSD P3UFgT99Bn8+hwd9PpEIez6cCXo+qQl4PrgKdz/NCnU/6gp0QPwIdED/B3RA/wZzQP8Gc0D/BnNA /wbxOwAA30UAAMxMAAC/TwAAtlAAAK5PAACnSgAAoEQHAJpFFACVRiIAkEYwAIxHPACJRkUBhkZO AYNGVQKBRVwDfkVjBHxEagR6RHEFeUR5BndEggh1Q40Jc0OZCnFDpgtwQ7UMbkTJDG1E5wxtRfoK bEX/CGxF/wdsRf8HbEX/B2xF/wfsPwAA2EkAAMdQAAC7VAAAsVUAAKlUAAChUAAAmUoCAJJJEQCN Sh8AiUssAIVMOACCS0IBf0tKAXxKUgJ5SlgDd0pfBHVJZgVzSW0GcUl2B29IfwhtSIoJbEiWC2pI owxoSLINZ0jFDWZJ5A1mSfgLZkn/CWZK/whmSf8HZkn/B2ZJ/wfoQwAA0k0AAMJTAAC3WAAArVkA AKRYAACcVQAAk04AAIxODgCHTxsAgk8pAH9QNQB7UD8BeE9HAXZPTwJzTlUDcU5cBG9NYwVtTWoG a01yB2lNfAhnTIcKZUyTC2NMoA1iTK8OYU3CDmBN4Q5gTfYMYE7/CmBO/wlgTv8IYE7/CGBO/wjj RwAAzVAAAL5XAACzWwAAql0AAKFdAACYWgAAjVMAAIZSDACAUxgAfFMlAHlUMQB1VDwAc1NEAXBT TAJtUlMCa1JZA2lSYARnUWgGZVFwB2NReQhhUYQKYFCRDF5Qng1cUK0OW1HADlpR3g9aUfUMWlL/ CltS/wlbUf8IW1H/CFtR/wjfSgAAyVMAALtaAACwXwAApmEAAJ1hAACUXgAAiFcAAIBWCgB6VxUA dlciAHNYLgBwVzkAbVdBAWpXSQJoVlACZlZXA2RWXgRiVWUFYFVtB15VdwhcVYIKWlWODFlVnA1X VasOVlW+D1VV2w9VVfMNVVX/C1ZV/wlWVf8JVlX/CFZV/wjbTQAAxVcAALheAACtYgAAo2UAAJpl AACQYwAAg1wAAHtbBgB1WxIAcVsfAG5cKwBrXDYAaFs/AWVbRwFjW04CYVpVA19aXARdWmMFW1pr BllZdQhXWYAKVVmMC1RZmg1SWaoOUVm8DlBZ2A5QWfINUVn/C1FZ/wpRWf8JUVn/CFFZ/wjUUQAA wloAALRhAACqZgAAoGgAAJdpAACMZwAAfWAAAHVfAwBvXxAAa18cAGhgKABmYDMAY2A8AWFgRAFf X0wCXF9TA1tfWgRZX2EFV15pBlVecwhTXn4JUV2KC09dmQxNXagNTF66Dkte1A5LXvEMTF7/C0xd /wpMXf8JTF3/CExd/wjPVAAAvl4AALFlAACnagAAnW0AAJRtAACJbAAAeGUAAG9kAABpZA4AZWQZ AGJkJQBgZTAAXmU6AFxlQgFaZUoCWGRRAlZkWANUZF8EUmRnBVBjcQdOY3sJTGOICkpjlwtIY6YM R2O4DUZj0Q1GY+8MRmL/Ckdi/wlHYv8JR2L/CEdi/wjKWAAAumIAAK5pAACjbgAAmnEAAJByAACE cQAAdGsAAGlpAABjaQsAX2kVAFxqIQBaai0AWGs2AFZrPwFVa0cBU2pOAlFqVQNPal0ETWplBUpp bgZIaXkHRmmGCURplQpDaKULQWm3DEBpzwxAaO4LQWj/CkFn/wlBZ/8IQmf/CEJn/wjFXQAAtmYA AKptAACgcwAAlnYAAIt3AACAdgAAcHIAAGVxAABccAcAWHARAFZwHQBUcSgAUnEzAFBxPABPckQB TXFLAUtxUwJJcVoDR3FiBEVwbAVDcHcGQXCEBz9wkwg9b6MJO3C1CjtwzQo6b+wJO27+CDtu/wg7 bf8HO23/Bztt/we/YgAAsWsAAKZzAACdeQAAknsAAId8AAB7fAAAbXoAAGB4AABWdwEAUHcOAE54 GABMeCQAS3kuAEl5NwBIeUAARnlIAUR5TwFCeVcCQXlgAj94aQM8eHQEOniCBTh4kQY3eKEHNXiz BzR4ywc0d+sHNHb9BzR1/wc1df8GNXT/BjV0/wa5aAAArXEAAKJ5AACYfgAAjYAAAIKBAAB2ggAA aYEAAFuBAABRgQAASIAKAEWBEwBDgR4AQoIpAEGCMgBAgjsAPoJDAD2CSwA7glMBOYJcATeCZgI1 gnEDM4J/AzGBjgQwgZ8ELoGxBS2ByAUtgekELX/8BS1+/wUtff8FLX3/BS19/wWzbgAAqHgAAJ1/ AACSgwAAiIYAAH2HAABwiAAAY4kAAFWKAABLigAAQYoCADuLDgA5ixcAOIwiADeMLAA2jDUANIw9 ADOMRgAyjU8AMY1YAC+NYgEtjG4BK4x7ASqMiwIojJwCJoyvAiWMxgIli+gCJYr7AyWI/wMliP8D JYf/AyWH/wOtdgAAo4AAAJeFAACNiQAAgowAAHaOAABpkAAAXJIAAFCTAABElAAAOpUAADGWCAAt lxEALJcaACuXJAAqly0AKZc2ACiYPwAnmEgAJphSACWYXAAjmGgAIph3ACCYhwAfmJkBHZisARyY wwEcl+UBHJX6ARuU/wEbk/8CG5P/AhuT/wKnfwAAnIYAAJGLAACHjwAAepIAAG2VAABhmAAAVZsA AEmdAAA9ngAAM58AACqhAAAhowoAH6MRAB6jGgAdpCQAHKQtABukNgAapD8AGaRKABikVQAWpWEA FaVwABSlgQATpZQAEqWoABGlvwAQpOIAEaL4ABGh/wARoP8BEaD/ARGg/wGghgAAlYwAAIyRAAB/ lQAAcZoAAGSeAABYoQAATKQAAECmAAA1pwAAKqkAACKsAAAZrgAAErAJABCxEAAQsRgADrEiAA6x KwANsTUADbFAAAyxSwALsVgACrFnAAixeAAHsYsABbGgAASwtQAEsNAABLDvAAWv/gAGrv8ABq7/ AAau/wCYjgAAj5MAAIKYAAB1nQAAZ6IAAFqnAABOqwAAQa0AADWvAAArsQAAIbQAABi2AAARuQAA DbwDAAe+DAADvRIAAb0ZAAC+IgAAvisAAL42AAC+QQAAv04AAL9cAAC/bQAAv4AAAL6VAAC+qgAA vsIAAL3kAAC99gAAvf8AAL3/AAC9/wCSlAAAhZoAAHigAABqpgAAXKsAAE+wAABCswAANbYAACq4 AAAguwAAF74AABDBAAALxAAABMcAAADJBwAAyQ0AAMkSAADKGQAAyyIAAMsrAADNNQAAzkEAAM5Q AADPYAAAz3IAAM+HAADPnQAAz7MAAM/OAADP6wAAzvgAAM7+AADO/gCImwAAeqIAAGyoAABerwAA ULUAAEK5AAA1vAAAKb8AAB7CAAAVxgAADskAAAjMAAAA0AAAANMAAADVAAAA1gYAANgMAADZEQAA 2xYAANwfAADeKAAA4DQAAOJBAADiUQAA42MAAON3AADkjgAA5KQAAOS6AADl1AAA5eoAAOXzAADl 8wB8owAAbqoAAGCyAABRuQAAQ74AADXCAAAoxgAAHMkAABPNAAAM0QAABNUAAADaAAAA3gAAAOEA AADiAAAA5AAAAOUDAADnCQAA6Q4AAOsSAADtGgAA7yQAAPIxAAD0QQAA9FMAAPVmAAD1fAAA9pMA APapAAD3vAAA984AAPffAAD33wBwrAAAYbQAAFO7AABFwwAANscAACfMAAAb0AAAEdUAAArbAAAA 3wAAAOIAAADlAAAA6QAAAOwAAADtAAAA8AAAAPEAAADzAAAA9QQAAPcKAAD6EAAA/BYAAP8hAAD/ LgAA/0AAAP9TAAD/aAAA/4AAAP+WAAD/qAAA/7YAAP+/AAD/vwD/DRwA/wobAP8CGwD/AB4A/wAk AP8ALgD/ADwA/wBKAP8AVgD/AGMA/wBtAP8AdwD/AH8A/wCHAP8AjgD/AJQA/wCaAP8AoAD/AKYA /wCsAP8AtAD/AL0A/wDJAP4A3QD9AO0A/AD6APsA/wD6AP8A+QD/APoA/wD6AP8A+gD/APoA/wD/ EBkA/w0XAP8GFgD/ABgA/wAeAP8AKgD/ADcA/wBFAP8AUgD/AF4A/wBpAP8AcgD/AHsA/wCCAP8A iQD/AJAA/gCWAP0AnAD8AKEA+wCoAPkArwD4ALgA9gDDAPQA0gDzAOcA8gD2APAA/wDvAP8A8AD/ AO8A/wDvAP8A7gD/AO4A/wD/EhQA/w8SAP8LEgD/ABIA/wAaAP8AJQD/ADMA/wBAAP8ATQD/AFkA /wBkAP0AbQD7AHYA+QB9APcAhAD1AIsA9ACRAPMAlwDxAJ0A8ACjAO4AqgDsALMA6gC9AOgAywDn AOEA5QDxAOMA/QDjAP8A4gD/AOEA/wDhAP8A4AD/AOAA/wD/FBAA/xEOAP8NDQD/Bw8A/wIVAP8A IAD/AC0A/wA6AP8ARwD5AFMA9QBeAPIAaADwAHAA7QB4AOsAfwDpAIUA6ACMAOYAkgDlAJgA4wCf AOEApgDfAK4A3AC4ANoAxQDWANkA1ADsANIA+QDRAP8AzwD/AM4A/wDOAP8AzgD/AM4A/wD/FwwA /xQIAP8PBQD/DgsA/wwRAP8HGgD/ASYA/AA0APQAQQDtAE0A6QBYAOYAYgDjAGoA4AByAN4AeQDb AIAA2QCGANYAjQDTAJMA0QCaAM8AoQDNAKoAywCzAMkAvwDGANAAxQDoAMMA9gDBAP8AwAL/AL8D /wC/A/8AvwP/AL8D/wD/GwYA/xcAAP8UAAD/EwUA/xENAP8OFAD5Ch8A8AYsAOYDOQDgA0YA3ANR ANYEWwDSBGQAzwVsAMwFcwDKBXoAyAWBAMYFhwDFBo4AwwaWAMEGnQC/BqYAvQawALsHvAC5CM0A uArlALUL9wCzDf8AsQ3/ALAN/wCwDv8Arw7/AK8O/wD/HgAA/xsAAP8bAAD6GgAA9RYFAPYRDQDr DhUA4gsiANgLMQDQDD4Ayw1KAMcNVQDEDl4AwQ5mAL8ObQC9DnQAuw97ALkPggC3EIoAthCRALQQ mgCyEKMAsBGtAK8RugCtEcoAqhLlAKcU9wClFf8AoxX/AKIV/wCiFf8AohX/AKIV/wD/IgAA/yAA APAjAADmJAAA4CEAANwZBQDbEAwA0BEZAMgTKQDCFTcAvRZEALkXTgC1F1cAsxhgALAYZwCuGG4A rBl1AKsZfACpGYQAqBqMAKYalACkGp4AoxuoAKEbtACfHMUAnhzfAJod8wGYHv8Blx7/AZYf/wGV H/8BlR//AZUf/wH/JgAA9CcAAOYtAADaLwAAzy0AAMonAADHHwgAwRwTALoeIgC0HzEAryA9AKsh SACoIlIApiJaAKMjYgChI2kAoCNvAJ4jdwCcI34AmyOGAJkkjwGXJJkBliSjAZQksAGSJb8BkSXW AY4m7wGMJ/8Ciyf/Aoon/wKJJ/8CiSf/AYkn/wH6KQAA7DAAAN02AADNOAAAxDcAAL4yAAC6KwIA tSUOAK4nHQCoKSsApCo4AKAqQwCdK0wAmitVAJgrXACWK2MAlCtqAZIrcQGQLHgBjyyBAY0sigGL LJQCiiyfAogsqwKGLLoChS3OA4Mu6gOBLvwDgC7/An8u/wJ/Lv8Cfi7/An4u/wL0LgAA5DcAANI9 AADFPwAAuz8AALQ8AACvNQAAqS8LAKMvFwCeMSYAmTIzAJYyPgCSM0gAkDNQAI0zWACLM14BiTNl AYczbAGGM3MBhDN8AoIzhQKAM48DfzOaA30zpwN8M7UEejPJBHk05gR3NfkEdjX/A3U1/wN1Nf8D dTX/A3U1/wPwMwAA3T0AAMpDAAC+RQAAtUYAAK1DAACmPQAAoDYGAJk2EwCUOCEAkDkuAIw5OQCJ OUMAhzlMAIQ5UwGCOVoBgDlhAX45aAJ8OW8Cejl3Ank5gAN3OYsEdTmWBHQ5owVyObEFcTnEBm86 4gZuOvcFbjv/BG07/wRtO/8DbTr/A206/wPqOQAA1UIAAMRIAAC5SwAAr0sAAKdJAACfRAAAmD4B AJE8EACMPR0AiD4qAIQ/NQCBPz8Afj9IAHw/TwF6P1YBeD9dAXY+ZAJ0PmsCcj5zA3A+fANvPocE bT6TBWs+oAZqPq4GaT/AB2c/3gdnP/UGZkD/BWZA/wRmQP8EZj//BGY//wTlPQAAz0YAAL9MAAC0 TwAAqlAAAKJPAACZSgAAkUQAAIpBDQCEQhkAgEMmAH1EMgB6RDwAd0REAHVETAFyRFMBcENZAW9D YAJtQ2cCa0NvA2lDeQRoQ4MFZkOPBmRDnQdjQ6sHYUO9CGBE2QhgRPMHYET/Bl9E/wVfRP8EYET/ BGBE/wTgQQAAykoAALtQAACwUwAAp1UAAJ5TAACVTwAAi0kAAINHCwB9RxUAeUciAHZILgBzSDgA cUhBAG5ISQFsSFABakhWAWhIXQJmR2QCZUdsA2NHdgRhR4AFYEeNBl5HmgdcR6kIW0i7CFpI1Aha SPEHWkn/BlpJ/wVaSP8FWkj/BFpI/wTbRAAAxk0AALhTAACtVwAAo1kAAJpYAACRVAAAhk4AAH1L CAB3SxIAc0wfAHBMKwBtTDUAa0w+AGhMRgBmTE0BZExTAWJMWgJhTGICX0xqA15McwRcS34FWkuK BlhLmAdXTKcIVky5CVVM0QlUTO8IVE3/BlVM/wZVTP8FVUz/BVVM/wXVSAAAwlEAALVXAACqWwAA oFwAAJdcAACNWQAAgVMAAHdPBABxTxAAblAcAGpQKABoUDIAZVA7AGNQQwBhUEoBX1BRAV1QWAJc UF8CWlBnA1hQcQRXUHsFVVCIBlNQlgdSUKUIUFC3CVBQzglPUO0IUFD/B1BQ/wZQUP8FUFD/BVBQ /wXQSwAAv1QAALJaAACnXgAAnWAAAJRgAACJXQAAfFcAAHJUAABsUw4AaFQZAGVUJABiVC8AYFQ4 AF5UQABcVEgBWlRPAVlUVgFXVF0CVVRlA1RUbgRSVHkFUFSGBk5UlAdNVKQIS1S1CEtUzAlKVOsI S1T+B0tU/wZLVP8FS1T/BUtU/wXMTgAAu1cAAK5eAACkYgAAmmQAAJFkAACGYgAAd1sAAG1YAABm WAwAYlgWAF9YIgBdWSwAW1k2AFlZPgBXWUYAVllNAVRZVAFSWVsCUVljA09ZbANNWXcES1iEBUlY kgdIWKIHR1mzCEZZyghFWeoIRln9BkZY/wZGWP8FR1j/BUdY/wXHUgAAuFsAAKthAAChZgAAmGgA AI5pAACDZwAAcmAAAGheAABhXQkAXF0TAFpdHgBXXSkAVl4zAFReOwBSXkMAUV5KAU9eUgFOXlkC TF5hAkpeagNIXnUERl6CBURdkAZDXqAHQV6xB0BeyAdAXugHQF38BkFd/wVBXf8FQVz/BUFc/wXD VgAAtF8AAKhmAACeagAAlW0AAIptAAB/bAAAb2cAAGRkAABbYgUAVmIQAFRiGwBSYyUAUGMvAE5k OABNZEAAS2RIAEpkTwFIZFcBRmRfAkVkaAJDZHMDQWN/BD9jjgU9Y54GPGOwBjtkxgY7ZOYGO2P6 BTti/wU7Yv8FPGH/BDxh/wS+WwAAsGMAAKVqAACbbwAAkXIAAIZyAAB7cQAAbG0AAGBrAABVaQAA T2gNAE1pFwBLaSEASWorAEhqNABHaj0ARWtEAERrTABCa1QBQWtcAT9qZQI9anACO2p9AzlqjAQ3 apwENmquBTVqxAU1auUFNWn5BDVp/wQ1aP8ENWj/BDVo/wS5YAAArGkAAKFwAACYdQAAjXcAAIJ3 AAB3dwAAaXQAAFxzAABRcQAASHAKAEVwEgBDcR0AQnEnAEByMAA/cjgAPnJAAD1ySAA7clAAOnJZ AThyYwE2cm0CNHJ6AjNyiQMxcpoDL3KsAy5ywQMucuMDLnH4Ay5w/wMub/8DLm//Ay5v/wOzZgAA p28AAJ12AACTegAAiHwAAH59AAByfQAAZHwAAFd7AABMegAAQnkDADx5DgA6ehcAOXohADh6KgA3 ezMANns7ADR7RAAze0wAMntVADB7XwAve2oBLXt3ASt7hwEqe5gCKHuqAid7vwIme+ECJnr3AiZ4 /wImeP8CJ3f/Aid3/wKubAAAo3YAAJl8AACOfwAAhIIAAHiDAABshAAAX4QAAFGEAABHhAAAPIQA ADOECQAwhBEAL4QaAC2EJAAshS0AK4U1ACqFPgAphUcAKIZQACeGWgAmhmYAJIZzACOGgwAhhpUA IIanAR6GvAEeht4AHoT1AR6C/wEegv8BHoH/AR6B/wGodAAAnn0AAJOCAACJhQAAfogAAHGKAABl iwAAWIwAAEyNAABAjgAANo4AACyPAAAlkAwAI5ATACKQHAAhkCUAIJEuAB+RNgAekUAAHZFJAByR VAAakWAAGZFuABiRfgAWkpAAFZKkABSRuQATkdgAE4/0ABSO/wAUjf8AFIz/ARSM/wGjfQAAmIMA AI6IAACEjAAAd48AAGmRAABdkwAAUJUAAEWXAAA5mAAALpkAACWaAAAdmwIAFp0MABWdEwAUnRsA E50kABKdLQARnjcAEZ5BABCeTAAPnlgADp5nAA2edwAMnooAC52eAAqdsgAJncwACZzsAAqb/gAL mv8AC5n/AAuZ/wCchAAAkYoAAIiOAAB7kgAAbZYAAGCZAABUnAAASJ8AADygAAAwoQAAJqMAAB2l AAAVpwAAEKkFAAurDQAIqhMAB6obAAaqJAAFqi4ABKo4AAKqRAABqlAAAKpeAACqbgAAqoEAAKqV AACpqgAAqcEAAKjkAACo9gAAp/8AAKf/AACn/wCViwAAjJAAAH+VAABxmgAAY54AAFaiAABKpgAA PagAADGqAAAmqwAAHa0AABSwAAAOsgAACbUBAAK2CgAAtg8AALYVAAC3HQAAtyUAALcvAAC4OQAA uEYAALhUAAC4ZAAAuHYAALiLAAC3oAAAt7YAALfTAAC27wAAtvwAALb/AAC2/wCPkgAAgpcAAHSd AABmogAAWKcAAEusAAA+rwAAMbEAACazAAActgAAE7gAAA27AAAGvgAAAMEAAADCBAAAwgsAAMMQ AADEFQAAxBwAAMUkAADGLgAAyDoAAMlHAADJVwAAyWkAAMl9AADJlAAAyKoAAMjDAADI5AAAyPQA AMj9AADI/QCFmQAAd58AAGimAABaqwAATbEAAD+1AAAxuAAAJboAABq9AAARwAAAC8MAAAPHAAAA ygAAAM0AAADOAAAAzwMAANAJAADRDgAA0xIAANUZAADXIgAA2i0AAN05AADeSQAA3loAAN9uAADf hQAA35wAAN+yAADeywAA3uYAAN/0AADf9AB5oQAAa6gAAFyvAABOtQAAQLsAADG+AAAkwQAAGcUA ABDIAAAJzAAAAM8AAADTAAAA2QAAANwAAADdAAAA3wAAAOEAAADiBQAA5AsAAOYQAADoFgAA6iAA AO0rAADwOgAA8UsAAPFeAADycwAA84sAAPOiAADztgAA88kAAPPhAADz4QBtqgAAXrEAAFC5AABB vwAAMsQAACTIAAAXzAAADtAAAAbVAAAA2gAAAN4AAADiAAAA5gAAAOkAAADqAAAA7AAAAO4AAADw AAAA8gAAAPQGAAD2DAAA+RIAAPwcAAD/KQAA/zoAAP9NAAD/YgAA/3gAAP+QAAD/owAA/7MAAP/B AAD/wQD/BxkA/wEXAP8AFwD/ABoA/wAhAP8AKwD/ADkA/wBHAP8AVAD/AF8A/wBqAP8AcwD/AHsA /wCDAP8AigD/AJAA/wCWAP8AmwD/AKEA/wCoAP8ArwD/ALgA/wDEAP4A1QD8AOoA+wD4APoA/wD5 AP8A+AD/APgA/wD2AP8A8wD/APEA/wD/CxUA/wUTAP8AEwD/ABQA/wAaAP8AJwD/ADQA/wBCAP8A TwD/AFsA/wBlAP8AbgD/AHYA/wB+AP8AhQD+AIsA/QCRAPsAlwD6AJ0A+ACjAPcAqwD2ALMA9AC+ APMAzADxAOMA7wDzAO4A/wDtAP8A7AD/AOsA/wDsAP8A7AD/AOsA/wD/DREA/wkQAP8ADwD/ABAA /wAWAP8AIgD/AC8A/wA9AP8ASgD/AFUA/QBgAPoAaQD4AHEA9gB5APQAfwDzAIYA8QCMAO8AkgDu AJgA7ACfAOsApgDpAK4A5wC4AOUAxQDjANoA4QDtAN8A+wDeAP8A3QD/AN0A/wDdAP8A3QD/AN0A /wD/Dw0A/wwLAP8DCQD/AAwA/wASAP8AHQD/ACkA+wA3APgARAD1AFAA8gBaAO4AYwDsAGsA6QBz AOcAegDlAIAA4wCGAOEAjADfAJMA3QCZANsAoQDZAKkA1QCyANIAvgDQAM4AzgDmAMwA9gDKAP8A ygD/AMkA/wDIAP8AyAD/AMgA/wD/EQgA/w0CAP8HAAD/BQgA/wAOAP8AFgD3ACIA7wAwAOsAPQDo AEkA5ABUAOAAXQDdAGUA2QBtANUAcwDSAHoA0ACAAM4AhwDMAI0AygCUAMgAmwDGAKQAxACtAMIA uADAAMcAvQDfALwA8QC7AP4AuQD/ALgA/wC4AP8AuAD/ALgA/wD/FAAA/w8AAP8NAAD/DAAA/wcJ APgBEADoABoA4wAoAN0ANgDYAEIA0gBNAM4AVwDKAF8AxwBmAMUAbQDDAHQAwQB6AL8AgQC9AIgA uwCPALkAlwC3AJ8AtQCoALMAswCxAMIArwDYAK4C7QCsA/sAqwX/AKoG/wCpBv8AqQb/AKkG/wD/ FgAA/xIAAPcSAADsEQAA5g4AAOUGCADdAxIA1AMgAM0ELQDIBDoAwwVGAL8FUAC8BlgAuQZgALcH ZwC1B24Aswd1ALEIewCvCIIArgmKAKwJkgCqCZsAqAqlAKYKsAClC78AowzUAKEN7QCfDv4AnQ7/ AJwP/wCbD/8Amw//AJsP/wD/GgAA9xkAAOoeAADfHgAA1RoAANATAgDODAsAxwsWAMANJQC6DjIA tg4/ALIPSQCvEFIArBBaAKoQYQCoEWgAphFvAKQRdgCiEX0AoRGFAJ8SjgCdEpcAnBKiAJoTrQCY E7wAlxTQAJQV7ACSFv0AkBf/AI8X/wCOF/8Ajhf/AI4X/wD6HQAA7iMAAN8oAADQKgAAxycAAMEh AAC9GQUAuRIQALIVHgCtFiwAqBc4AKQYQwChGUwAnxlUAJwaXACaGmIAmRppAJcbcACVG3cAlBt/ AJIciACQHJIAjxydAI0dqQCLHbcAih7KAIgf5wCGIPoAhCD/AYMg/wGDIP8BgiD/AYIg/wH1JAAA 5SwAANMxAADGMwAAvDEAALYtAACwJQAArB0MAKYeGAChICYAnCEyAJkiPQCVIkcAkyNPAJEjVgCP I10AjSRkAIskawCJJHIAiCR6AIYkgwCEJY0AgyWYAYElpAGAJrIBfibFAX0n4gF7J/cBeSj/AXgo /wF4KP8BeCj/AXgo/wHvKwAA3TMAAMo5AAC+OwAAtDoAAK02AACmLwAAoSgHAJsnEwCWKCAAkSkt AI4qOACLK0IAiCtKAIYrUgCEK1gAgixfAIAsZgB/LG0AfSx1AHssfgF6LIgBeCyUAXYtoAF1La4C dC3AAnIu3QJxLvQCcC//Am8v/wJvL/8Bbi//AW4v/wHoMQAA0zoAAMM/AAC3QQAArkEAAKY+AACe OAAAlzEBAJEuEACMLxwAiDAoAIQxMwCBMj0AfzJGAH0yTQB7MlQAeTJbAHcyYQB1MmkBdDJwAXIy eQFwM4QBbzOQAm0znQJsM6sCajS8Amk01QNoNfECZzX/Amc1/wJmNf8CZjX/AmY0/wLiNgAAzD8A AL1EAACyRwAAqEcAAKBEAACYPwAAkDkAAIg0DQCDNRcAfzYkAHw3LwB5NzkAdzhCAHQ4SQByOFAA cThXAG84XgBtOGUBbDhtAWo4dQFoOIACZziMAmU4mQNkOagDYjm5A2E60ANgOu4DYDr/A186/wJf Ov8CXzr/Al86/wLdOwAAx0MAALlJAACuSwAApEwAAJtKAACSRQAAiT8AAIE6CQB7OhQAdzsgAHQ8 KwByPDUAbz0+AG09RgBrPU0AaT1TAGg9WgBmPWEBZD1pAWM9cgFhPX0CYD2JAl49lgNdPqUDWz62 BFo+zARaP+wEWT/+A1k//wNZP/8CWT//Alk+/wLWPwAAw0cAALVMAACqUAAAoFAAAJdPAACOSwAA hEUAAHpABgB1PxEAcUAcAG1AKABrQTIAaUE7AGdBQgBlQUkAY0FQAGFBVwBgQV4BXkFmAV1CbwJb QnoCWkKGA1hClANXQqMEVUOzBFRDyQRUQ+kEU0P9A1ND/wNUQ/8DVEP/AlRD/wLQQgAAv0oAALJQ AACnUwAAnVQAAJRTAACKUAAAf0oAAHVFAgBuQw4Aa0QZAGdFJABlRS4AYkU3AGFFPwBfRUYAXUVN AFtFVABaRlsBWUZjAVdGbAJWRncCVEaDA1NGkQNRRqEEUEexBE9HxwROR+cETkf7BE5H/wNOR/8D T0f/A09H/wPMRgAAu04AAK9UAACkVwAAmlgAAJFXAACGVAAAe04AAHBKAABpSA0AZUgWAGJJIQBf SSsAXUk0AFtJPABZSUMAV0lKAFZJUgBVSlkBVEphAVJKagFRSnUCT0qBA05KjwNMS58ES0uwBEpL xQRJS+YESUv6BElL/wNKS/8DSkv/A0pL/wPISQAAuFEAAKxXAAChWwAAmFwAAI5cAACDWQAAdlMA AGtOAABkTQoAX0wTAFxNHgBaTSgAWE0xAFZNOgBUTUEAU05IAFJOTwBQTlcBT05fAU1OaAFMTnMC Sk9/AklPjQNHT50ERk+uBEVPwwREUOQERE/5BEVP/wNFT/8DRU7/A0VO/wPETAAAtVUAAKlbAACf XgAAlWAAAItgAACAXgAAclcAAGdTAABeUQcAWVERAFdRGwBUUSUAUlIvAFFSNwBPUj8ATlJGAE1T TQBMU1UASlNdAUlTZgFHU3ACRVN9AkRTiwNCU5sDQVSsBEBUwQQ/VOIEP1T4A0BT/wNAU/8DQFP/ A0BS/wPAUAAAslgAAKZeAACcYgAAkmUAAIhlAAB9YgAAblwAAGNZAABZVgMAVFYOAFFWGABPViIA TVcsAExXNABKVzwASVhEAEhYSwBHWFMARVhbAURYZAFCWG4BQFh7Aj9YiQI9WJkDPFiqAztZvwM6 WeADOlj3AzpY/wM7V/8DO1f/AztX/wO8VAAArlwAAKNjAACZZwAAkGkAAIVpAAB5ZwAAa2IAAGBg AABVXQAATlsMAEtbFABJXB8AR1woAEZdMQBFXTkAQ11BAEJdSABBXlAAQF5YAD5eYQE8XmwBO154 AjlehwI3XpcCNl6pAzVevQM0X90DNF71AzVd/wI1Xf8CNVz/AjVc/wK4WQAAqmEAAKBnAACWbAAA jG4AAIFuAAB2bAAAZ2kAAFxmAABRZAAASGIJAERiEQBCYhsAQWMkAD9jLQA+YzUAPWQ9ADxkRQA7 ZE0AOWRVADhkXwA2ZGkBNWR2ATNkhQExZZUCMGWnAi9luwIuZdoCLmT0Ai5j/wIvY/8CL2L/Ai9i /wKzXgAAp2YAAJxtAACTcQAAiHMAAH1zAABycgAAZHAAAFhuAABNbAAAQmoDADxpDgA6ahYAOWog ADhqKAA2azEANWs5ADRrQQAzbEkAMmxSADFsXAAvbGYALmxzACxsggEqbJMBKWylAShsuQEnbdYB J2vyASdq/wEnav8BKGn/Aihp/wKuZAAAo2wAAJlzAACOdgAAhHgAAHl5AABteAAAYHcAAFN2AABI dQAAPnMAADRyCgAxcxEAMHMaAC9zIwAucysALXQ0ACx0PAArdEQAKXRNACh1VwAndWMAJXVvACR1 fwAidZAAIXWiACB1twAfddIAH3TxAB9z/wEfcv8BIHH/ASBx/wGpawAAnnMAAJR5AACKfAAAgH4A AHR/AABnfwAAWn8AAE1+AABDfgAAOH0AAC99AgAofQ0AJn0UACR9HAAjfiUAIn4tACF+NgAhfj8A H39IAB5/UgAdf14AHH9rABp/egAZf4wAF3+fABZ/swAVf84AFX7vABZ8/wAWe/8AFnv/ABd7/wCk cgAAmnoAAI9/AACFggAAe4QAAG2GAABghwAAVIcAAEiIAAA8iAAAMogAACiIAAAgiAUAGokOABmJ FQAYiR0AF4omABaKLgAVijcAFIpBABOKTAASi1gAEYtlABCLdQAPi4cADoqbAA2KrwAMisgADInq AA2H/AAOh/8ADob/AA6G/wCfewAAlIEAAIqFAACAiAAAc4sAAGWNAABZjwAATJAAAEGSAAA0kgAA KpIAACGTAAAZlAAAEpYGAA6XDgANlxUADJcdAAyXJgALly8ACpc5AAmXRAAIl1AABpdeAAWXbgAD loAAAZaUAACVqAAAlb4AAJTgAACU9AAAk/8AAZL/AAGS/wCYggAAjogAAIWMAAB3jwAAapIAAF2V AABQmAAARJoAADibAAAsnAAAIp0AABmeAAASoAAADaICAAejCwABoxAAAKMXAACjHwAAoycAAKMx AACkPAAApEgAAKRWAACkZQAAo3cAAKOLAACjoAAAorYAAKHSAACh8AAAoPsAAKD/AACg/wCRigAA iY4AAHuSAABtlwAAYJsAAFOeAABGoQAAOaMAAC2kAAAjpgAAGagAABGqAAAMrAAABa4AAACvBwAA rw0AAK8RAACwGAAAsCAAALEoAACxMgAAsj4AALJMAACyWwAAsmwAALKBAACxlwAAsawAALDGAACw 6AAAr/cAAK//AACv/wCMkAAAf5UAAHGaAABjnwAAVaQAAEeoAAA6qgAALawAACKuAAAYsAAAELMA AAq1AAACuAAAALsAAAC7AAAAvAcAALwNAAC9EQAAvhYAAL8eAADAJwAAwTIAAMJAAADDTwAAw2AA AMN0AADDiwAAw6EAAMO4AADC1wAAwu8AAML6AADB/gCBlwAAc50AAGWjAABXqAAASa0AADuxAAAt swAAIbYAABa5AAAOuwAAB74AAADBAAAAxQAAAMcAAADIAAAAyQAAAMoFAADLCwAAzQ8AAM4UAADQ HAAA0yYAANYyAADYQQAA2FMAANlmAADZfAAA2ZQAANmrAADZwwAA2eEAANnwAADZ9AB2nwAAZ6YA AFmsAABLsgAAPLcAAC66AAAhvQAAFcAAAA3EAAAFxwAAAMoAAADOAAAA0gAAANUAAADWAAAA2QAA ANsAAADdAAAA3wcAAOEMAADjEQAA5hkAAOkkAADsMgAA7UMAAO5WAADvawAA74QAAO+cAADvsgAA 78YAAO/dAADv5ABqqAAAW68AAEy2AAA+vAAAL8AAACDEAAAUyAAADMwAAALQAAAA1AAAANkAAADe AAAA4gAAAOUAAADmAAAA6AAAAOkAAADsAAAA7gAAAPACAADyCQAA9Q8AAPgXAAD8IwAA/zMAAP9G AAD/WgAA/3EAAP+JAAD/nwAA/7EAAP/AAAD/xgD/ABUA/wAUAP8AFAD/ABcA/wAdAP8AKAD/ADcA /wBEAP8AUQD/AFwA/wBmAP8AbwD/AHcA/wB+AP8AhQD/AIsA/wCRAP8AlwD/AJ0A/wCkAP8AqwD/ ALQA/gC/AP0AzgD7AOYA+QD2APgA/wD3AP8A9wD/APcA/wDwAP8A7AD/AOkA/wD/AxIA/wAQAP8A EAD/ABEA/wAXAP8AJAD/ADIA/wA/AP8ATAD/AFcA/wBhAP8AagD/AHIA/wB5AP0AgAD8AIYA+gCM APkAkgD4AJgA9gCfAPUApgD0AK4A8gC5APAAxgDuAN4A7QDwAOsA/gDqAP8A6QD/AOkA/wDnAP8A 4wD/AOAA/wD/Bw4A/wANAP8ACwD/AAwA/wATAP8AHwD/ACwA/wA6AP8ARgD+AFIA+wBcAPgAZQD1 AGwA8wB0APEAegDvAIEA7gCHAOwAjQDqAJMA6QCaAOcAoQDmAKkA4wCzAOEAvwDfANAA3QDpANoA +QDZAP8A1wD/ANUA/wDVAP8A1QD/ANQA/wD/CQoA/wEFAP8AAwD/AAkA/wAQAP8AGQD7ACYA9wA0 APQAQADyAEwA7gBWAOoAXwDnAGcA5ABuAOIAdADgAHsA3gCBANwAhwDaAI0A1gCUANQAmwDRAKMA zwCtAMwAuADKAMcAyADgAMYA8wDFAP8AwwD/AMMA/wDDAP8AwwD/AMMA/wD/CwEA/wMAAP8AAAD/ AAMA/wALAPMAEgDuAB8A6gAtAOYAOgDiAEUA3gBPANkAWADUAGAA0QBoAM4AbgDMAHQAygB7AMgA gQDGAIcAxACOAMIAlgDAAJ4AvgCnALsAsgC5AMAAtwDUALUA7ACzAPsAswD/ALIA/wCyAP8AsQD/ ALEA/wD/DQAA/wYAAP8DAAD3AAAA9AADAOcADQDgABgA2gAlANMAMgDOAD4AygBJAMYAUgDDAFoA wABhAL4AaAC8AG4AugB0ALgAewC2AIEAtACIALIAkACwAJkArgCiAKwArQCqALoAqADLAKYA5gCl APcApAD/AKMA/wCiAP8AogD/AKIA/wD/EAAA+wwAAO8OAADmDQAA3wkAANoABgDQABEAyQAdAMQA KgC/ADcAuwBCALcASwC0AFQAsgBbAK8AYgCtAGgAqwBuAKkAdQCoAHsApgCDAKQAiwCiAJQAoACe AJ4BqACcArUAmwPGAJkF4gCYBvQAlgj/AJUJ/wCUCf8AlAn/AJQJ/wD8EQAA8RUAAOMZAADWGQAA zBUAAMcQAADEBwoAvQMUALcEIQCyBi4Argg6AKoJRACnCU0ApApVAKIKXACgCmIAngtpAJwLbwCb C3YAmQx+AJcMhgCWDJAAlAyaAJINpgCRDbMAjw3FAI0O4gCLEPYAiRD/AIgR/wCHEf8AhxH/AIcR /wD2GQAA5yAAANYkAADIJQAAvyIAALkcAAC0FAEAsQ0OAKoOGQClDycAoRAzAJ0RPgCaEUcAmBJP AJUSVgCTElwAkRJjAJATaQCOE3AAjBN4AIsTgQCJFIsAhxSWAIYVogCEFbAAgxbBAIEX3QB/GPQA fRn/AHwZ/wB8Gf8Aexn/AHsZ/wDvIQAA3SkAAMotAAC+LwAAtSwAAK4nAACoIAAAoxcIAJ4WEwCZ FyEAlBktAJEaOACOGkEAixtJAIkbUACHG1cAhRxeAIQcZACCHGsAgBxzAH8dfAB9HYYAfB6RAHoe ngB4H6sAdx+8AHYg1AB0IfAAciH/AHEi/wBxIf8AcSH/AHEh/wDoKAAA0jAAAMI1AAC3NwAArTUA AKUxAACeKwAAmCMCAJIeEACNIBsAiSEnAIYiMgCDIzwAgSNEAH4jSwB8JFIAeyRZAHkkXwB3JGYA diVuAHQldwBzJYEAcSaNAG8mmQBuJqcAbSe4AGwnzgFqKO0BaSn/AWgp/wFoKf8BaCj/AWgo/wHh LgAAyzYAALw7AACxPQAApz0AAJ85AACXMwAAjy0AAIgnDACDJxYAfygiAHwpLQB5KjcAdyo/AHUq RwBzK04AcStUAHArWwBuK2IAbCtqAGsscgBpLH0AaCyJAGYtlgFlLaQBZC60AWMuygFhL+kBYC/9 AWAv/wFgL/8BYC//AWAu/wHaNAAAxTwAALdBAACsQwAAokMAAJlAAACQOgAAiDQAAIAuCAB6LRIA dy4eAHMvKQBxMDMAbzA7AG0wQwBrMUoAaTFRAGcxVwBmMV4AZDFmAGMybwBhMnkAYDKFAV8ykgFd M6EBXDOxAVs0xgFaNOYBWTX7AVk1/wFZNP8BWTT/AVk0/wHSOAAAwEAAALNFAACoSAAAnkgAAJVG AACLQAAAgjsAAHk1BABzMxAAbzQaAGw0JQBpNS8AZzU3AGU2PwBjNkYAYjZNAGA2VABfNlsAXTdj AFw3awBbN3YBWTeCAVg4jwFWOJ4BVTivAlQ5wwJTOeQCUzr5AVM5/wFSOf8BUzn/AVM5/wHNPAAA vEQAAK9JAACkTAAAmkwAAJFLAACHRgAAfUAAAHM7AABsOA0AaDkXAGU5IgBjOisAYDo0AF46PABd OkMAWzpKAFo7UABYO1gAVztgAFY7aABVPHMBUzx/AVI8jQFQPZwBTz2sAk4+wQJNPuECTT74Ak0+ /wFNPv8BTT3/AU09/wHJQAAAuEgAAKxNAAChUAAAl1EAAI5PAACESwAAeUUAAG5AAABmPQsAYj0U AF89HgBcPigAWj4xAFg+OABXPkAAVT9GAFQ/TQBTP1UAUkBdAFBAZgBPQHABTkB8AUxBigFLQZoC SkGrAklCvgJIQt4CSEL2AkhC/wJIQv8BSEH/AUhB/wHFRAAAtUsAAKlQAACeVAAAlVQAAItTAACA UAAAdUoAAGpGAABhQggAXEERAFlCGwBXQiUAVUIuAFNCNQBRQj0AT0JDAE9DSwBOQ1IATURaAEtE YwBKRG4BSUV6AUdFiAFGRZgCRUapAkRGvQJDRtwCQ0b1AkNG/wJDRv8BQ0X/AUNF/wHBRwAAsk8A AKZUAACcVwAAklgAAIhYAAB+VQAAcU8AAGZKAABcRgUAV0YPAFRGGABRRiIAT0YrAE5GMwBMRzoA S0dBAEpHSQBJSFAASEhYAEdIYQBFSWwAREl4AUJJhgFBSZYBQEqnAj9KuwI+S9gCPkrzAj5K/wI+ Sf8BP0n/AT9J/wG9SgAAr1IAAKNYAACZWwAAkF0AAIZcAAB7WQAAbVMAAGJPAABXTAEAUUoNAE5K FQBMSx8ASksoAElLMABHSzgARkw/AEVMRgBETE4AQ01WAEJNXwBATWoAP012AT1OhAE8TpQBO06l ATlPuQI5T9QCOU/yATlO/wE5Tv8BOU3/ATpN/wG6TgAArFYAAKFbAACXXwAAjWEAAINhAAB4XgAA aVgAAF9WAABUUgAATE8LAElPEgBHUBwARVAlAENQLQBCUDUAQVE8AEBRRAA/UUwAPlJUADxSXQA7 UmcAOlJzADhTggE3U5IBNVOkATRTtwEzVNEBM1PxATRT/wE0Uv8BNFL/ATRS/wG2UgAAqVoAAJ5g AACUZAAAi2YAAIBlAAB0YwAAZl4AAFxcAABRWAAAR1UHAEJVEABAVRgAP1YhAD1WKgA8VjIAO1Y5 ADpXQQA5V0kAOFdRADdYWgA1WGUANFhxADJYgAExWJABL1miAS5ZtQEtWc8BLVnvAS5Y/wEuV/8B Llf/AS5W/wGyVwAApV8AAJtlAACRaQAAh2oAAHxqAABxaAAAY2UAAFhiAABNXwAAQ10CADxbDQA6 XBQAOFwdADdcJgA1XS4ANF02ADNdPgAyXUYAMV5OADBeVwAvXmIALV5uACxffQAqX44AKV+gAChf swEnX8wAJ1/tASde/wEnXf8BKF3/AShc/wGtXAAAomQAAJhqAACObgAAg28AAHlvAABubgAAYGsA AFRpAABJZwAAP2UAADVjCQAyYxEAMGMZAC9kIQAuZCkALWQxACxkOQArZUIAKmVKAChlVAAnZV8A JmZrACRmegAjZosAImadACBmsQAfZskAH2brACBl/gAgZP8AIGP/ASFj/wGpYgAAnmoAAJVwAACK cwAAgHUAAHV1AABpdAAAXHIAAE9xAABEbwAAOm4AADBtAwApbA0AJ2wUACZsHAAlbSQAJG0sACNt NAAibT0AIW5GACBuUAAeblsAHW5nABxudgAabocAGW+aABhvrgAWb8YAFm7pABdt/AAYbP8AGGv/ ABhr/wCkaQAAmnEAAJB2AACGeQAAfHsAAHF7AABkewAAV3oAAEp5AAA/eAAANXgAACt3AAAidgcA HXYPABx3FgAbdx4AGncmABl3LgAYdzcAF3hAABV4SgAUeFYAE3hjABJ4cgAReIMAEHiXAA94qwAO eMMADnfmAA52+gAPdf8AEHX/ABB0/wCfcQAAlXgAAIt8AACCfwAAd4EAAGqCAABdggAAUIIAAESC AAA4ggAALoIAACSCAAAcggAAFIIJABGDEAAQgxYAEIMeAA6DJwAOgzAADYM5AA2DRAAMg1AAC4Nd AAmDbAAIg34ABoORAAWCpQADgrsABIHbAASB8gAFgP8ABn//AAZ//wCaeQAAkH4AAIaDAAB9hQAA b4cAAGKJAABVigAASYsAAD2MAAAxjAAAJowAAB2NAAAVjgAAD48DAAqQDAAGkBEABI8YAAOPIAAB jykAAI8yAACQPQAAkEkAAI9WAACPZQAAj3YAAI+KAACOnwAAjrQAAI3PAACM7gAAjPsAAIv/AACL /wCUgAAAi4UAAIKJAAB0jAAAZo8AAFmRAABMkwAAQJUAADSWAAAolgAAHpcAABWYAAAPmgAACpsA AAKcCQAAnA4AAJwTAACcGgAAnCIAAJ0rAACdNQAAnUAAAJ1OAACdXAAAnW4AAJyBAACclwAAnKwA AJvGAACa6AAAmfkAAJn/AACY/wCOiAAAhowAAHiQAABqlAAAXJcAAE+aAABCnQAANp4AACmfAAAf oQAAFaIAAA6kAAAIpgAAAKgAAACpBAAAqQoAAKkOAACpEwAAqhoAAKoiAACrKwAArDYAAKxEAACs UwAArGMAAKx3AACrjgAAq6QAAKu8AACq3gAAqfQAAKn9AACp/wCJjgAAe5MAAG2XAABfnAAAUaAA AESkAAA2pgAAKqgAAB6pAAAUqwAADa4AAAawAAAAsgAAALUAAAC1AAAAtQMAALYJAAC3DgAAuBIA ALgZAAC6IQAAuysAALw4AAC9RwAAvVgAAL1rAAC9gQAAvZkAAL2wAAC9zAAAvOoAALz3AAC7/gB+ lQAAcJsAAGKgAABTpQAARqoAADitAAAqrwAAHrEAABO0AAAMtwAAA7kAAAC8AAAAvwAAAMIAAADC AAAAwwAAAMQAAADGBgAAxwwAAMgQAADKFgAAzCAAAM8rAADQOgAA0UsAANFeAADScwAA0osAANKk AADTuwAA09gAANPtAADT9gBznQAAZKMAAFapAABHrwAAObMAACq2AAAduQAAErwAAAq/AAAAwwAA AMYAAADJAAAAzQAAAM8AAADQAAAA0gAAANQAAADWAAAA2QIAANsIAADeDgAA4RMAAOQdAADoKgAA 6DwAAOlPAADpZAAA6nwAAOuVAADrrAAA68IAAOzVAADs5QBmpgAAWKwAAEmzAAA7uQAAK7wAAB3A AAARxAAACcgAAADMAAAAzwAAANMAAADZAAAA3QAAAOAAAADhAAAA4wAAAOUAAADnAAAA6gAAAOwA AADuBAAA8QsAAPUSAAD4HAAA+ysAAP0+AAD+UwAA/moAAP+DAAD/mwAA/64AAP++AAD/ygD/ABIA /wAQAP8AEQD/ABMA/wAZAP8AJgD/ADQA/wBBAP8ATQD/AFgA/wBiAP8AawD/AHMA/wB6AP8AgQD/ AIcA/wCNAP8AkwD/AJkA/wCgAP8ApwD+AK8A/AC6APoAyQD5AOEA+ADzAPcA/wD2AP8A9QD/APEA /wDpAP8A5AD/AOEA/wD/AA8A/wANAP8ADQD/AA4A/wAUAP8AIQD/AC4A/wA8AP8ASAD/AFMA/wBd AP8AZgD+AG0A/AB1APsAewD5AIIA+ACIAPcAjgD2AJQA9ACbAPMAogDxAKoA7wC0AO0AwQDrANUA 6gDsAOgA/ADnAP8A5QD/AOYA/wDgAP8A2QD/ANQA/wD/AAsA/wAIAP8ABgD/AAkA/wAQAP8AHAD/ ACkA/wA2AP8AQgD7AE4A9wBXAPQAYADyAGgA7wBvAO0AdgDsAHwA6gCCAOgAiADnAI4A5QCVAOMA nADhAKQA3wCuAN0AuQDaAMoA1wDkANQA9gDRAP8A0AD/ANAA/wDPAP8AywD/AMcA/wD/AAMA/wAA AP8AAAD/AAQA/wANAPoAFgD2ACMA8wAwAPAAPADtAEcA6QBRAOUAWgDiAGIA3wBpAN0AbwDaAHYA 2AB8ANQAggDSAIgA0ACPAM0AlgDLAJ4AyQCoAMcAswDFAMEAwgDYAMAA7wC/AP4AvgD/AL0A/wC8 AP8AvAD/ALwA/wD/AgAA/wAAAP8AAAD/AAAA9AAHAO0AEQDoABwA4wApAN8ANQDbAEEA1gBLANEA VADNAFwAygBjAMgAaQDGAG8AwwB1AMEAewC/AIIAvgCIALwAkAC6AJgAuACiALUArACzALkAsQDL AK8A5wCuAPgArAD/AKsA/wCsAP8ArAD/AKsA/wD/BAAA/wAAAPYAAADuAAAA5wAAAN8ADADWABUA zwAiAMoALgDHADoAwwBEAMAATQC8AFUAuQBcALcAYwC1AGkAswBvALEAdQCvAHsArQCCAKsAigCp AJIApwCcAKUApgCjALMAoQDDAJ8A3gCeAPIAnQD/AJwA/wCcAP8AmwD/AJsA/wD/BwAA9gkAAOkL AADfCgAA1QQAAM4ABQDGABAAwAAaALsAJwC3ADIAswA9ALAARgCtAE8AqgBWAKgAXACmAGMApABo AKIAbwChAHUAnwB8AJ0AhACbAI0AmQCXAJcAogCVAK4AkwC9AJEA0wCQAO0AjwD8AI4A/wCNAf8A jQH/AI0B/wD5DgAA6hIAANwVAADNFQAAxBEAAL4MAAC6AgoAtAASAK4AHgCqACoApgA1AKIAPwCg AEgAnQFQAJsCVgCZAlwAlwNjAJUDaQCTA28AkQR2AJAEfwCOBYgAjAWSAIoGngCIBqoAhge6AIUI zwCECusAggv8AIEM/wCADP8AgAz/AIAM/wDxFQAA4B0AAM0gAADBIQAAuB0AALEXAACsEAAAqAkN AKIHFgCdCSMAmQouAJULOACTDEEAkAxJAI4NUACMDVcAig1dAIgNYwCHDWoAhQ5xAIMOegCCDoQA gA6PAH4PmwB8D6gAexC4AHoQzgB4EewAdhL/AHUS/wB0E/8AdBP/AHQT/wDoHgAA0yYAAMMqAAC4 KgAArigAAKcjAACgHAAAmxMDAJYPEACQEBsAjBEnAIkSMgCGEzsAhBNDAIIUSwCAFFEAfhRXAHwU XgB7FWUAeRVsAHcVdAB2Fn4AdBaKAHIXlgBxF6QAbxi0AG4YyQBtGegAaxr8AGob/wBqG/8Aahv/ AGob/wDgJgAAyi0AALwxAACwMwAApzEAAJ8sAACXJgAAkB8AAIoXDACFGBYAgRkiAH4aLAB7GzYA eRs+AHccRQB1HEwAcxxTAHEdWQBwHWAAbh1nAG0ecABrHnoAah6FAGgfkgBnH6AAZSCwAGQhxQBj IeQAYiL6AGEi/wBhIv8AYSL/AGEi/wDXLAAAwzQAALY4AACqOQAAoTgAAJg1AACQLwAAiCgAAIAh CAB7IBIAdyEdAHQiJwBxIjEAbyM5AG0jQQBrI0gAaSNOAGgkVQBmJFsAZSRjAGMlawBiJXUAYSWB AF8mjgBeJp0AXSetAFsowQBbKOAAWin3AFkp/wBZKf8AWSn/AFko/wDPMgAAvjkAALE9AACmPwAA nD8AAJM8AACKNgAAgTAAAHkqAwByJg8AbicZAGsoIwBpKCwAZik1AGUpPABjKUMAYSpKAGAqUQBe KlcAXSpfAFwraABaK3IAWSx9AFgsiwBWLZoAVS2qAFQuvQBTLtwAUi/1AFIv/wBSLv8AUi7/AFIu /wDKNgAAuj0AAK1CAACiRAAAmEQAAI9BAACFPAAAezcAAHIxAABrLAwAZy0VAGQtHwBhLigAXy4x AF0uOQBcL0AAWi9GAFgvTQBXL1QAVjBcAFUwZABTMW4AUjF6AFExiABQMpcATjKoAE0zuwBNNNgA TDTzAEw0/wBMNP8ATDP/AEwz/wDGOgAAtkIAAKlGAACeSQAAlUkAAItHAACBQgAAdz0AAG03AABk MgkAYDISAF0yHABaMiUAWDMtAFYzNQBVMzwAUzRDAFI0SgBRNFEAUDRZAE81YQBNNWwATDZ3AEs2 hQBKN5UASDemAEc4uAFHONMBRjjxAUY4/wFGOP8ARjj/AEY3/wDBPgAAskUAAKZKAACcTQAAkk0A AIhLAAB+RwAAc0IAAGk9AABfNwYAWjYQAFc3GABUNyIAUjcqAFA3MgBPODkATThAAEw4RwBLOE4A SjlWAEk5XwBIOmkARzp1AEU7gwBEO5MAQzykAUI8tgFBPdABQT3wAUE9/wFBPP8BQTz/AUE8/wC+ QgAAr0kAAKNOAACZUAAAj1EAAIVQAAB7TAAAb0YAAGVCAABaPQIAVDsOAFE7FQBPOx8ATTsnAEs7 LwBJPDYARzw9AEc8RABGPUsART1UAEQ+XABDPmcAQj9zAEA/gQA/P5EAPkCiAD1AtQE8Qc4BPEHu ATxB/wE8QP8BPED/AT0//wG6RQAArEwAAKFRAACXVAAAjVUAAINUAAB4UQAAbEsAAGFHAABWQgAA T0AMAEw/EwBJQBwAR0AkAEZALABEQDMAQ0A6AEJBQgBBQUkAQEJRAD9CWgA+Q2UAPUNxADtDfwA6 RI8AOUSgADhFswE3RcsBN0XsATdF/wE3RP8BOET/AThD/wC3SQAAqVAAAJ5VAACUWAAAi1kAAIBY AAB2VgAAaFAAAF1MAABTSAAASkUJAEZEEQBERBkAQkQiAEFFKQA/RTEAPkU4AD1FPwA8RkcAO0ZP ADpHWAA5R2IAOEhuADZIfAA1SI0ANEmeADNJsQAySckAMUnrADJJ/gAySP8AMkj/ADNI/wC0TAAA p1QAAJxZAACSXAAAiF0AAH5dAABzWgAAZVUAAFtSAABQTgAARkoFAEBJDgA+SRYAPUkeADtKJgA6 Si4AOUo1ADhLPQA3S0QANktNADRMVgAzTGAAMkxsADFNegAwTYsALk2cAC1OrwAsTscALE7pACxN /QAtTf8ALUz/AC1M/wCwUAAApFgAAJldAACPYQAAhmIAAHthAABwXwAAYlsAAFhYAABOVQAAQ1EB ADtPDAA4TxMANk8bADVPIwA0UCsAM1AyADJQOgAxUEIAMFFKAC5RUwAtUl0ALFJpACtSeAApUogA KFOaACdTrQAmU8UAJlPnACZT/AAnUv8AJ1H/ACdR/wCsVQAAoFwAAJZiAACNZgAAg2cAAHhmAABt ZQAAYGEAAFVeAABKWwAAP1gAADVWCAAxVRAAMFYXAC5WHwAtVicALFYvACtXNgAqVz4AKVdHAChX UAAmWFoAJVhnACRYdQAjWYYAIVmYACBZqwAfWcIAH1nlAB9Y+gAgWP8AIFf/ACFX/wCoWgAAnWIA AJNnAACKawAAf2wAAHVsAABqawAAXWgAAFFlAABGYwAAO2AAADFeAwAqXQ0AKF0TACZdGwAlXiMA JF4qACNeMgAiXjoAIV5DACBfTAAfX1cAHl9jABxgcQAbYIIAGWCVABhgqQAXYMAAFmDiABdf+QAY Xv8AGV7/ABld/wCkYAAAmWgAAJBuAACGcAAAfHIAAHJyAABmcQAAWG4AAExsAABBawAANmkAAC1n AAAjZggAH2YPAB1mFQAcZh0AG2YlABpmLQAZZzUAGGc+ABdnSAAWZ1MAFWhfABNobgASaH8AEWiS ABBopgAPaL0ADmjgABBn9wAQZv8AEWX/ABFl/wCfZwAAlm8AAIxzAACCdgAAeHgAAG14AABgdwAA U3YAAEZ0AAA7cwAAMXIAACdxAAAecQAAFnAKABNwEAATcBcAEnAfABFxJwAQcS8AEHE4AA5xQgAO cU4ADXFbAAxxaQALcXoACnGNAAhxoQAGcbYABnDSAAdw7wAIb/8ACW7/AAlu/wCbbwAAkXUAAId5 AAB+fAAAdH4AAGZ+AABZfgAATX4AAEB9AAA1fQAAKnwAACF8AAAYfAAAEXwEAAx8DAAKfBEACXwZ AAh8IQAHfCkABnwyAAR8PQADfEgAAXxVAAB8YwAAfHQAAHyHAAB7nAAAe7EAAHrLAAB56wAAefoA AHn/AAB4/wCWdwAAjHwAAIOAAAB5gwAAbIQAAF6FAABRhgAARYcAADmHAAAthwAAI4cAABqHAAAS hwAADYgBAAaJCgABiQ8AAIkUAACIGwAAiCMAAIksAACJNgAAiUIAAIhOAACIXQAAiG0AAIiBAACH lQAAh6sAAIbEAACF5gAAhPgAAIT/AACE/wCQfgAAh4MAAH6HAABxiQAAY4sAAFaNAABJjwAAPJEA ADCRAAAkkQAAGpIAABKTAAANlAAABpUAAACWBgAAlgwAAJUQAACWFQAAlh0AAJYkAACWLgAAljkA AJZGAACWVQAAlmUAAJZ4AACVjgAAlaQAAJS8AACT3wAAk/UAAJL/AACS/wCLhgAAg4oAAHWNAABn kAAAWZQAAEyXAAA/mQAAMpoAACabAAAbnAAAEp0AAAyfAAAEoAAAAKIAAACjAQAAowcAAKMMAACj EAAApBUAAKQcAAClJQAApi8AAKY8AACmSwAAplsAAKZuAAClhAAApZsAAKSzAACj0AAAo+8AAKL8 AACi/wCGjQAAeJEAAGqVAABcmQAATp0AAEGgAAAzogAAJqMAABulAAARpwAACqkAAAGrAAAArQAA AK8AAACwAAAAsAAAALAFAACxCwAAsg8AALMUAAC0GwAAtSQAALcwAAC3PwAAt1AAALdiAAC3eAAA t5AAALapAAC2wgAAtuQAALb1AAC1/gB7kwAAbZgAAF+dAABQogAAQqYAADSpAAAmqwAAGq0AABCv AAAJsgAAALQAAAC3AAAAugAAALwAAAC9AAAAvgAAAL4AAADAAgAAwQgAAMINAADEEgAAxhkAAMkk AADKMgAAy0MAAMtVAADMagAAzIMAAMycAADLtQAAzM4AAMzpAADM9gBwmwAAYaEAAFKmAABEqwAA NrAAACeyAAAatQAAELgAAAe7AAAAvgAAAMEAAADEAAAAyAAAAMsAAADLAAAAzQAAAM4AAADQAAAA 0gAAANUDAADYCgAA2xAAAN4YAADiJAAA4zUAAORIAADlXAAA5nMAAOaNAADmpQAA5rwAAObTAADn 5wBjpAAAVaoAAEawAAA4tQAAKLkAABq8AAAPwAAABcQAAADHAAAAywAAAM8AAADUAAAA2AAAANwA AADdAAAA3wAAAOEAAADjAAAA5QAAAOgAAADqAAAA7QYAAPEOAAD1FgAA+CUAAPk4AAD5TQAA+mMA APt8AAD8lQAA/KoAAPy7AAD9ywD/AA8A/wAOAP8ADgD/ABAA/wAWAP8AIwD/ADAA/wA9AP8ASQD/ AFQA/wBeAP8AZgD/AG4A/wB2AP8AfAD/AIIA/wCJAP8AjwD/AJUA/gCbAP0AowD7AKsA+gC1APkA wwD3ANsA9gDwAPQA/wDzAP8A8gD/AOwA/wDiAP8A3AD/ANYA/wD/AAwA/wAJAP8ACAD/AAoA/wAS AP8AHgD/ACsA/wA4AP8ARAD/AE8A/wBZAP4AYQD8AGkA+gBwAPgAdwD3AH0A9gCDAPQAiQDyAI8A 8QCWAO8AnQDtAKUA7ACvAOoAvADoAM0A5gDoAOQA+gDjAP8A4gD/AOAA/wDVAP8AzgD/AMsA/wD/ AAYA/wABAP8AAAD/AAQA/wAOAP8AGQD/ACUA/QAyAPsAPgD3AEkA8wBTAPAAXADuAGMA7ABqAOoA cQDoAHcA5gB9AOQAgwDiAIkA4ACQAN4AlwDcAJ8A2QCpANYAtADTAMQA0ADeAM4A8wDMAP8AywD/ AMoA/wDIAP8AwgD/AL4A/wD/AAAA/wAAAP8AAAD/AAAA+wALAPYAEwDxACAA7QAsAOoAOADnAEMA 4wBNAOAAVgDcAF0A2QBkANUAawDSAHEA0AB2AM4AfADMAIMAygCJAMgAkQDGAJkAxACjAMEArQC/ ALsAvQDPALsA6wC5APwAtwD/ALcA/wC2AP8AtAD/ALEA/wD/AAAA/wAAAP8AAAD2AAAA7gAFAOcA DwDhABkA2wAlANUAMQDSADwAzgBGAMoATwDHAFcAxABeAMEAZAC/AGoAvQBwALsAdgC5AHwAuACD ALYAigCzAJMAsQCcAK8ApwCtALMAqwDFAKkA4QCnAPUApgD/AKUA/wCkAP8ApAD/AKQA/wD/AAAA /AAAAPEAAADoAAAA4AAAANQACwDMABMAxwAfAMIAKgC/ADUAvAA/ALgASAC1AFAAswBXALAAXgCu AGQArABpAKsAbwCpAHUApwB8AKUAhACjAIwAoQCWAJ8AoQCdAK0AmgC8AJgA0gCXAO4AlQD+AJQA /wCVAP8AlQD/AJUA/wD8AQAA8AUAAOMHAADVBQAAzAAAAMUABAC+AA4AuAAXALMAIwCvAC4AqwA4 AKkAQQCmAEoAowBRAKEAVwCfAF0AnQBjAJsAaQCaAG8AmAB2AJYAfQCUAIYAkgCQAJAAmwCOAKcA jAC2AIoAyQCIAOcAhwD5AIcA/wCGAP8AhgD/AIYA/wD0DAAA5BAAANESAADFEQAAvQ4AALYIAACx AAgAqwARAKYAGwChACYAngAxAJoAOgCYAEMAlQBKAJMAUQCRAFcAjwBdAI4AYwCMAGkAigBwAIgA dwCGAIAAhACLAIIAlgCAAKMAfgCxAH0AxAB7AuEAegP1AHoF/wB5Bf8AeAb/AHgG/wDqEwAA1hoA AMYdAAC6HAAAsRkAAKoTAACkDQAAnwUMAJkAFACVAB8AkQIpAI0DMwCLBDwAiAVEAIYGSwCEBlEA ggdXAIEHXQB/B2MAfQhqAHsIcgB6CHwAeAmGAHYJkgB0CqAAcwqvAHELwQBwDN8Abw32AG4O/wBt Dv8AbQ7/AG0O/wDhHAAAyyMAALwmAACxJgAAqCQAAKAeAACZGAAAkxACAI4LDgCICxcAhAwiAIEN LAB+DTUAfA49AHoORQB4DksAdw5RAHUPWABzD14AcRBlAHAQbgBuEHcAbBCCAGsQjwBpEZ0AaBGt AGYSwABlEt8AZBP2AGMU/wBjFP8AYhT/AGIU/wDWJAAAwyoAALUuAACqLwAAoC0AAJgoAACQIgAA iRsAAIITCAB9ERIAeRIcAHYTJwBzFDAAcRQ4AG8VPwBtFUYAbBVMAGoWUwBoFlkAZxZhAGUWaQBk F3IAYhd+AGEYiwBfGJkAXhmpAFwZvABcGtgAWhvzAFoc/wBZHP8AWRz/AFkc/wDNKgAAvTEAAK81 AACkNgAAmzQAAJIxAACJKwAAgSUAAHkdAwBzGA4AbxkYAGwaIgBpGysAZxszAGUcOwBkHEEAYh1I AGAdTgBfHVUAXR1cAFweZABbHm4AWR95AFgfhwBWIJYAVSCmAFQhuABTIdIAUiLxAFIj/wBSI/8A UiL/AFIi/wDILwAAuDYAAKs6AACgPAAAljsAAI04AACDMgAAei0AAHImAABqIAwAZiATAGMhHQBh ISYAXyIvAF0iNgBbIj0AWiNEAFgjSgBXI1EAVSNYAFQkYQBTJGoAUSV2AFAlgwBPJpMATiejAEwn tQBMKM4ASyjuAEsp/wBLKP8ASyj/AEso/wDDNAAAszsAAKc/AACcQQAAkkAAAIk+AAB/OQAAdTMA AGwtAABjJwgAXiYRAFwmGQBZJyIAVycrAFUoMgBUKDkAUihAAFEoRgBQKU0ATilVAE0pXQBMKmcA SypzAEkrgABIK5AARyyhAEYtswBFLcsARS7sAEQu/wBELv8ARS3/AEUt/wC+OAAAsD8AAKRDAACZ RQAAj0UAAIVDAAB7PgAAcTkAAGc0AABeLgQAWCsOAFUrFgBSLB8AUCwnAE8sLwBNLTYATC08AEot QwBJLUoASC5SAEcuWgBGL2QARS9wAEMwfgBCMI0AQTGeAEAysQA/MsgAPzPqAD8z/gA/Mv8APzL/ AD8y/wC7PAAArUMAAKFHAACWSQAAjEkAAINIAAB4RAAAbT4AAGM5AABaNAAAUjAMAE8wEwBMMBwA SjAkAEkxKwBHMTIARjE5AEQxQABDMkcAQjJPAEEzWABAM2IAPzRtAD40ewA9NYsAPDacADs2rwA6 N8YAOTfoADk3/AA6N/8AOjb/ADo2/wC3QAAAqkYAAJ5LAACUTQAAik4AAIBMAAB1SAAAakMAAGA+ AABWOQAATTUJAEk0EQBHNRkARTUhAEM1KABBNS8AQDU2AD82PQA+NkUAPTdNADw3VQA7OGAAOjhr ADk5eQA4OYkANzqbADU6rQA1O8QANDvmADQ7+wA1O/8ANTr/ADU6/wC0QwAAp0oAAJxOAACSUQAA iFIAAH5QAABzTQAAZ0gAAFxEAABSPwAASDoGAEQ5DwBBORYAPzkeAD45JgA8OS0AOzo0ADo6OwA5 O0IAODtKADc8UwA2PF0ANT1pADQ9dwAzPocAMT6ZADA/qwAvP8IALz/kAC8/+gAwP/8AMD7/ADA+ /wCxRwAApE0AAJlSAACPVQAAhlYAAHxVAABxUgAAZEwAAFlJAABPRQAARUADAD8+DQA8PhMAOj4b ADk+IwA3PioANj8xADU/OAA0P0AAM0BIADJAUQAxQVsAMEFnAC5CdQAtQoUALEOXACtDqgAqQ8AA KUTiACpD+QAqQ/8AK0L/ACtC/wCuSgAAoVEAAJdWAACNWQAAg1oAAHlaAABuVwAAYVIAAFdOAABN SwAAQ0cAADpDCgA2QxEANEMYADNDIAAyRCcAMUQvADBENgAvRT0ALUVGACxFTwArRlkAKkZkAClH cgAoR4MAJkeVACVIqAAkSL4AI0jgACRI9wAlR/8AJUf/ACZH/wCqTwAAn1UAAJRaAACLXgAAgV8A AHdeAABrXAAAX1gAAFVVAABLUQAAQE0AADVKBwAwSQ4ALkkVAC1JHQAsSSQAK0orACpKMwAoSjsA J0tDACZLTAAlS1YAJExiACNMcAAhTIAAIE2TAB9NpgAeTbsAHU7dAB5N9gAeTP8AH0z/ACBL/wCn UwAAnFoAAJJfAACIYwAAfmQAAHRjAABpYQAAXF4AAFJbAABHWAAAPFUAADJSAgAqUAwAJ08SACZQ GQAlUCAAJFAoACNQLwAiUTcAIVFAACBRSQAeUlMAHVJfABxSbQAaU30AGVOQABhTpAAWU7kAFVPZ ABZT9AAXUv8AGFH/ABlR/wCjWQAAmGAAAI9lAACFaAAAe2kAAHFpAABmZwAAWWQAAE1hAABCXwAA OFwAAC5aAAAlWAgAIFcOAB5XFAAdVxwAHFgjABtYKwAaWDMAGVg8ABhYRQAWWVAAFVlbABRZaQAT WnoAElqNABFaoQAQWrcADlrVABBZ8wAQWf8AEVj/ABFY/wCfXwAAlWYAAIxrAACCbQAAeG4AAG5v AABibQAAVWoAAEhoAAA+ZgAAM2UAACljAAAgYQEAGGALABVgEAAUYBcAE2AeABJgJgASYC4AEWE3 ABBhQAAPYUsADmFYAA1hZgAMYnYAC2KJAAphnQAJYbIACGHLAAhh6wAJYP0ACl//AAtf/wCbZgAA km0AAIhxAAB+cwAAdXUAAGp0AABccwAAT3IAAENwAAA4bwAALW4AACRsAAAbawAAE2sEAA5qDAAN ahIADGoZAAtqIQAKaikACWoyAAhqPAAHa0cABWtTAARrYQACa3EAAGqEAABqmAAAaq0AAGnGAABp 5wAAafgAAGj/AABo/wCXbQAAjXMAAIR3AAB7egAAcHsAAGN7AABWegAASXoAAD15AAAxeAAAJ3cA AB12AAAVdgAAD3YCAAl2CgAEdg8AAHYVAAB2HAAAdiQAAHUsAAB1NgAAdUEAAHVOAAB1XAAAdWwA AHV+AAB0kwAAdKgAAHPAAABz4wAAcvcAAHL/AABx/wCSdQAAiXoAAIB+AAB2gAAAaYEAAFuCAABO ggAAQYIAADWDAAApggAAH4EAABaBAAAQggAACoIAAAKDBwAAgg0AAIIRAACCFwAAgh4AAIImAACC LwAAgjsAAIJHAACCVQAAgWUAAIF4AACBjQAAgKIAAH+6AAB/3QAAfvQAAH3/AAB9/wCNfAAAhIEA AHuEAABuhgAAYIgAAFKKAABFiwAAOYwAACyMAAAhjAAAF4wAABCNAAAJjgAAAo8AAACQAwAAjwkA AI8OAACPEgAAkBgAAJAfAACQKAAAkDIAAJA/AACQTQAAkF0AAI9wAACPhQAAjpwAAI6zAACN0AAA jPAAAIv+AACL/wCIhAAAgIgAAHKLAABkjQAAVpAAAEiTAAA7lQAALpYAACKWAAAXlwAAD5gAAAiZ AAAAmwAAAJ0AAACdAAAAnQMAAJ0JAACdDQAAnhEAAJ4XAACfHwAAnykAAKA1AACgQwAAoFQAAKBm AACfewAAnpMAAJ6rAACdxgAAnekAAJz5AACc/wCDiwAAdY4AAGeSAABZlgAAS5kAAD2cAAAwngAA I58AABegAAAOogAAB6QAAACmAAAAqAAAAKoAAACqAAAAqgAAAKsBAACrBwAArAwAAK0QAACuFgAA rx4AALEpAACxOAAAsUgAALFaAACxbwAAsYgAALGgAACwugAAr90AAK/yAACv/QB4kQAAapYAAFya AABNnwAAP6MAADGmAAAjpwAAF6kAAA6rAAAFrgAAALAAAACyAAAAtQAAALcAAAC3AAAAuAAAALkA AAC6AAAAvAMAAL0JAAC+DgAAwBQAAMMeAADFKwAAxTwAAMZOAADGYgAAxnoAAMaUAADGrQAAxsgA AMXlAADF8wBsmQAAXp4AAE+kAABBqAAAMqwAACSvAAAWsQAADbQAAAO3AAAAugAAAL0AAADAAAAA xAAAAMYAAADGAAAAyAAAAMkAAADLAAAAzAAAAM4AAADQBgAA0w0AANgTAADcHgAA3i0AAN9AAADg VAAA4WsAAOGFAADhnwAA4bcAAOHPAADh5gBgoQAAUqcAAEOtAAA0sgAAJbUAABe5AAANvAAAAb8A AADDAAAAxwAAAMoAAADPAAAA0wAAANYAAADXAAAA2gAAANwAAADfAAAA4QAAAOMAAADmAAAA6QEA AOwLAADwEgAA8x8AAPQxAAD2RgAA91wAAPh0AAD4jwAA+aYAAPm4AAD4yQD/AA0A/wALAP8ACwD/ AA4A/wATAP8AHwD/ACwA/wA5AP8ARQD/AFAA/wBZAP8AYgD/AGoA/wBxAP8AdwD/AH4A/wCEAP4A igD9AJAA/ACXAPoAngD5AKcA9wCxAPYAvgD1ANIA8wDsAPEA/gDwAP8A8AD/AOYA/wDcAP8A0gD/ AM0A/wD/AAcA/wAEAP8AAgD/AAYA/wAQAP8AGwD/ACcA/wAzAP8APwD/AEoA/gBUAPsAXQD5AGQA 9wBrAPUAcgDzAHgA8gB+APAAhADvAIoA7QCRAOwAmQDqAKEA6ACrAOYAtgDkAMcA4gDjAOAA9wDe AP8A3QD/ANkA/wDMAP8AxQD/AMEA/wD/AAAA/wAAAP8AAAD/AAEA/wANAP8AFgD8ACIA+QAuAPYA OQDzAEUA7wBOAOwAVwDpAF4A5gBlAOQAbADiAHIA4AB3AN8AfgDdAIQA2wCLANgAkgDVAJsA0gCk AM8ArwDNAL4AywDVAMkA7wDHAP8AxQD/AMQA/wC+AP8AuAD/ALUA/wD/AAAA/wAAAP8AAAD+AAAA 9wAJAPEAEQDrABwA5wAoAOQAMwDhAD4A3QBIANgAUQDTAFgA0ABfAM4AZQDMAGsAygBxAMgAdwDG AH0AxACEAMIAjADAAJQAvgCeALsAqAC5ALYAtwDIALUA5gCzAPoAsQD/ALAA/wCwAP8ArAD/AKkA /wD/AAAA/wAAAPoAAADxAAAA6AADAOAADQDYABYA0QAiAM0ALQDKADcAxgBBAMIASgC/AFIAvQBZ ALoAXwC4AGUAtwBqALUAcACzAHYAsQB9AK8AhQCtAI0AqwCXAKkAoQCnAK4ApQC+AKIA2ACgAPIA nwD/AJ4A/wCeAP8AngD/AJwA/wD/AAAA9wAAAOsAAADhAAAA1gAAAMsACQDFABEAvwAbALsAJgC3 ADEAtAA6ALEAQwCuAEsAqwBSAKkAWACnAF4ApgBkAKQAaQCiAHAAoAB2AJ4AfgCcAIYAmgCQAJgA mwCWAKcAlAC2AJIAygCQAOkAjwD8AI4A/wCNAP8AjAD/AI0A/wD4AAAA6QIAANsDAADMAQAAxAAA AL0AAgC2AA0AsAAVAKsAIACnACoApAA0AKEAPACeAEQAnABLAJoAUgCYAFgAlgBdAJUAYwCTAGkA kQBwAI8AdwCNAIAAiwCKAIkAlQCHAKEAhQCvAIMAwQCBAOAAgAD1AH8A/wB/AP8AfwD/AH8A/wDu CgAA3A4AAMoQAAC+DgAAtQsAAK8DAACpAAcAowAQAJ4AGACZACMAlgAsAJMANQCQAD4AjgBFAIwA SwCKAFEAiABXAIYAXQCFAGMAgwBqAIEAcQB/AHoAfQCEAHsAjwB5AJwAdwCqAHUAuwB0ANQAcgDw AHIA/wByAP8AcQD/AHEA/wDjEQAAzRcAAL8ZAACzGQAAqhUAAKMQAACdCgAAlwEKAJEAEgCNABsA iQAlAIUALwCDADcAgAA+AH4ARQB9AEsAewBRAHkAVwB4AF0AdgBkAHQBawByAXQAcAJ/AG4CiwBs A5gAawOmAGkEtwBoBc4AZwfsAGYI/QBmCf8AZQn/AGUJ/wDWGgAAxCAAALYjAACrIwAAoSAAAJkb AACSFAAAjA4BAIYHDQCABBQAfAYeAHkHKAB2CDAAdAg4AHIJPwBwCUUAbwpMAG0KUgBsClgAagtf AGgLZwBnC3AAZQx6AGMMhwBiDJUAYA2kAF8NtgBeDc4AXA7tAFwP/wBbEP8AWxD/AFsQ/wDNIQAA vCgAAK8rAACkKwAAmikAAJIkAACJHwAAghgAAHsRBQB1DQ8AcQ0XAG4OIQBrDioAaQ8yAGcQOQBl EEAAZBBGAGMQTQBhEFMAXxFaAF4RYgBcEWsAWxF2AFkSgwBYEpIAVhOiAFUTtABUE8sAUxTsAFIV /wBSFv8AUhX/AFIV/wDGKAAAti4AAKkyAACfMgAAlTEAAIwtAACDJwAAeiEAAHIaAABrEwsAZxMT AGQUHABhFCUAXxUtAF0VNABcFTsAWxZCAFkWSABYFk8AVhdWAFUXXgBTF2cAUhhyAFAYfwBPGY4A ThqfAEwasABLG8cASxvpAEoc/QBKHP8AShz/AEoc/wDBLQAAsTQAAKU3AACaOAAAkDcAAIc0AAB9 LwAAdCkAAGwjAABkHAcAXhkQAFsaGABZGyEAVxspAFUbMABUHDcAUhw9AFEcRABPHUsATh1SAE0d WgBLHmMASh5uAEkffABHH4sARiCcAEUhrgBEIcQAQyLmAEMi/ABDIv8AQyL/AEMi/wC8MgAArTgA AKE8AACXPgAAjT0AAIM6AAB5NQAAbzAAAGYqAABeJAIAVyANAFQgFABRIB0ATyElAE4hLABMITMA SyI6AEkiQABIIkcARyJOAEYjVwBEI2AAQyRrAEIkeQBBJYgAPyaZAD4mqwA9J8EAPSfjAD0o+gA9 KP8APSf/AD0n/wC4NgAAqj0AAJ5AAACUQgAAikIAAIA/AAB2OwAAbDYAAGIwAABZKgAAUSULAE0l EQBLJRkASSUhAEcmKABFJi8ARCY2AEMmPQBCJ0QAQSdLAD8oVAA+KF0APSlpADwpdgA7KoYAOSuX ADgrqQA3LL8ANyzgADcs+AA3LP8ANyz/ADgs/wC1OgAAp0AAAJxEAACRRgAAh0YAAH1EAABzQAAA aDsAAF82AABVMQAATCsHAEcpDwBFKhYAQyoeAEEqJQA/KiwAPiszAD0rOQA8K0EAOyxIADosUQA5 LVsAOC5mADYucwA1L4MANC+VADMwpwAyML0AMTHeADEx9wAyMf8AMjD/ADMw/wCxPgAApEQAAJlI AACPSgAAhUoAAHtJAABwRQAAZUAAAFs7AABSNgAASDEEAEIuDQA/LhMAPS4bADsuIgA5LykAOC8v ADcvNgA2MD4ANTBGADQxTwAzMVkAMjJkADEycQAwM4EALzSTAC40pgAsNbsALDXbACw19QAtNf8A LTT/AC40/wCuQQAAokgAAJdMAACNTgAAg04AAHlNAABuSgAAYkUAAFhAAABOPAAARTcAAD0zCwA5 MxEANzMYADYzHwA0MyYAMzMtADI0NAAxNDwAMDVEAC81TAAuNlYALTZiACw3bwArN38AKjiRACg4 pAAnObkAJjnYACc59AAoOf8AKDj/ACk4/wCrRQAAn0sAAJRPAACLUgAAgVMAAHdSAABsTwAAX0kA AFZGAABMQgAAQj0AADg4CAA0OA8AMjgVADE4HQAvOCQALjgrAC05MgAsOTkAKzpBACo6SgApO1QA KDtfACc8bQAlPH0AJD2PACM9ogAiPbcAIT7UACE+8wAiPf8AIz3/ACM8/wCoSQAAnU8AAJJTAACJ VgAAf1cAAHVWAABqUwAAXU8AAFNMAABKSAAAQEQAADZABQAvPQ0ALT0TACs9GgAqPiEAKT4oACg+ LwAnPjcAJj8/ACQ/SAAjQFIAIkBdACFBagAgQXoAHkGNAB1CoAAcQrUAG0LRABtC8QAcQv8AHUH/ AB5B/wClTQAAmlMAAJBYAACGWwAAfVwAAHJbAABnWAAAW1QAAFFSAABITgAAPUoAADNHAAAqQwsA JkMQACVDFgAkQx4AI0QlACJELAAhRDQAIEU8AB5FRQAdRU8AHEZaABtGaAAZRngAGEeKABdHngAW R7MAFEjOABVH7wAWR/8AF0b/ABdG/wCiUgAAl1gAAI1dAACEYAAAemEAAHBgAABlXgAAWVoAAE9Y AABEVAAAOVEAAC9OAAAmSwYAIEoOAB5KEwAdShoAHEohABtLKAAaSzAAGUs4ABdLQgAWTEwAFUxX ABRMZQATTXUAEk2IABFNnAAQTbEADk7MAA9N7gAQTf8AEUz/ABFM/wCeVwAAlF0AAItiAACBZQAA d2YAAG1mAABjZAAAVmEAAEpeAAA/WwAANVgAACtWAAAiVAEAGlIKABZSEAAVUhYAFFIdABNSJAAS UiwAEVI0ABFSPgAQU0gAD1NUAA5TYgANVHIADFSEAAtUmAAJVK0ACFTFAAlU5wAKU/sAC1L/AAtS /wCbXQAAkWQAAIhoAAB+awAAdGwAAGtsAABfagAAUmcAAEVkAAA6YgAAMGAAACZeAAAdXQAAFVsF ABBaDAAOWhEADloYAA1bIAAMWycAC1swAApbOgAJW0UAB1tRAAZbXgAEW20AA1uAAAFblAAAW6gA AFvAAABa4gAAWvYAAVr/AAJZ/wCXZAAAjmsAAIRuAAB7cAAAcnIAAGdxAABZcAAATG4AAEBsAAA1 awAAKmkAACFnAAAYZgAAEWYBAAxlCgAHZQ8ABGUUAANkGwACZCMAAGQsAABkNQAAZEAAAGRMAABk WgAAZGkAAGR7AABkjwAAY6QAAGO7AABi3QAAYvQAAGL/AABh/wCTbAAAiXEAAIB1AAB4dwAAbXgA AGB3AABSdgAARnUAADl0AAAudAAAI3IAABpxAAAScQAADXEAAAZxCAAAcA0AAHASAABwFwAAbx8A AG8mAABvMAAAbzsAAG9HAABvVAAAb2QAAG91AABuigAAbaAAAG22AABs1gAAa/IAAGv/AABr/wCO cwAAhXgAAH17AABzfQAAZX4AAFh+AABLfgAAPn4AADJ+AAAmfQAAHHwAABN8AAANfAAABn0AAAB9 BQAAfAsAAHwPAAB8EwAAfBkAAHwhAAB8KQAAfDQAAHtAAAB7TgAAe14AAHtvAAB6hAAAepoAAHmx AAB4zgAAd+8AAHb+AAB2/wCJegAAgX8AAHiCAABrgwAAXYUAAE+GAABChwAANYgAACmHAAAdhwAA FIcAAA2IAAAGiQAAAIoAAACKAAAAiQYAAIkMAACJDwAAiRMAAIkaAACKIgAAiiwAAIo4AACKRgAA iVYAAIloAACJfAAAiJQAAIerAACGxgAAheoAAIX7AACE/wCFggAAfYYAAG+IAABhiwAAU40AAEWP AAA4kQAAK5EAAB+SAAAUkgAADZMAAASUAAAAlgAAAJcAAACYAAAAlwAAAJcFAACXCwAAmA4AAJgT AACZGgAAmSIAAJouAACaPQAAmU0AAJleAACZcwAAmIsAAJijAACXvAAAluIAAJb3AACV/wCAiQAA cowAAGSPAABWkwAASJYAADqZAAAsmgAAH5sAABScAAAMngAAA58AAAChAAAAowAAAKUAAAClAAAA pQAAAKUAAACmAgAApwgAAKcNAACoEQAAqRkAAKsjAACrMQAAq0EAAKxTAACsZwAAq4AAAKqaAACq swAAqtAAAKnvAACp+wB1jwAAZ5QAAFmYAABKnAAAPJ8AAC2iAAAgowAAE6UAAAunAAABqQAAAKsA AACuAAAAsQAAALIAAACyAAAAswAAALQAAAC1AAAAtgAAALgEAAC5CwAAuxAAAL0YAAC/JAAAvzUA AMBHAADAWwAAwHIAAMCNAADBpgAAwMEAAL/jAAC+8wBqlwAAW5wAAE2hAAA+pQAAL6kAACGrAAAT rQAAC7AAAACzAAAAtQAAALgAAAC8AAAAvwAAAMEAAADBAAAAwwAAAMQAAADGAAAAxwAAAMkAAADL AAAAzggAANEPAADVGAAA2CcAANk5AADaTQAA22QAANt+AADcmQAA3LAAANzJAADc4wBdnwAAT6UA AECqAAAyrwAAIrIAABS1AAAKuAAAALsAAAC/AAAAwwAAAMYAAADLAAAAzgAAANEAAADRAAAA1AAA ANYAAADZAAAA2wAAAN4AAADgAAAA5AAAAOcGAADrDgAA7xkAAPAqAADyPwAA81UAAPRtAAD0iAAA 9KEAAPS2AAD0xwD/AAkA/wAGAP8ABwD/AAwA/wARAP8AHAD/ACgA/wA0AP8AQQD/AEwA/wBVAP8A XQD/AGUA/wBsAP8AcgD+AHgA/AB+APsAhAD6AIsA+QCSAPcAmQD2AKIA9ACsAPMAuQDxAMsA8ADo AO4A+wDtAP8A7AD/AOEA/wDSAP8AyQD/AMQA/wD/AAEA/wAAAP8AAAD/AAQA/wAOAP8AFwD/ACMA /wAvAP8AOwD9AEYA+gBQAPcAWAD0AF8A8gBmAPAAbADvAHIA7QB4AOwAfgDqAIUA6QCMAOcAkwDl AJwA4wCmAOEAsQDfAMEA3QDdANsA9ADZAP8A1gD/AM8A/wDEAP8AvQD/ALkA/wD/AAAA/wAAAP8A AAD/AAAA/wALAPwAEwD3AB4A9AAqAPIANQDuAEAA6QBKAOYAUgDjAFkA4ABgAN4AZgDcAGwA2gBy ANcAeADUAH4A0gCFANAAjQDOAJUAzACfAMkAqgDHALgAxQDNAMMA6wDAAP4AvwD/AL4A/wC2AP8A sAD/AK0A/wD/AAAA/wAAAP8AAAD5AAAA8gAGAOsADwDmABkA4QAkAN4ALwDaADkA0wBDAM8ATADM AFMAyQBaAMcAYADFAGYAwwBrAMEAcQC/AHcAvQB+ALsAhgC5AI4AtwCYALUAowCzALAAsQDCAK4A 4ACsAPcAqwD/AKoA/wCoAP8AowD/AKAA/wD/AAAA/wAAAPUAAADrAAAA4QAAANYADADPABMAygAe AMYAKQDCADMAvwA9ALsARQC4AE0AtgBUALMAWgCxAF8AsABlAK4AagCsAHAAqwB3AKkAfwCnAIcA pQCRAKMAnACgAKkAngC4AJwAzgCaAO4AmQD/AJcA/wCWAP8AlgD/AJMA/wD9AAAA8QAAAOUAAADZ AAAAzQAAAMQABgC9AA8AtwAYALMAIgCwACwArQA2AKkAPgCnAEYApABNAKIAUwCgAFkAnwBeAJ0A ZACbAGoAmgBwAJgAdwCWAIAAlACKAJEAlQCPAKIAjQCwAIsAwwCJAOMAiAD5AIYA/wCGAP8AhgD/ AIYA/wDzAAAA4wAAANEAAADFAAAAvQAAALYAAACuAAsAqAASAKQAHACgACYAnAAvAJoANwCXAD8A lQBGAJIATACRAFIAjwBYAI0AXQCLAGMAigBqAIgAcQCGAHkAhACDAIIAjwB/AJsAfgCpAHwAuwB6 ANUAeADyAHgA/wB3AP8AdwD/AHcA/wDnBwAA0QwAAMMNAAC4DAAArggAAKgAAACiAAUAmwAOAJYA FQCSAB8AjgAoAIsAMQCIADkAhgBAAIQARgCCAEwAgABSAH8AVwB9AF0AewBjAHoAawB4AHMAdgB9 AHQAiABxAJUAcACkAG4AtABsAMoAawDqAGoA/ABqAP8AagD/AGoA/wDaEAAAxhQAALgWAACtFQAA pBIAAJwOAACWBwAAkAAJAIoAEACFABgAgQAhAH4AKgB7ADIAeQA5AHcAQAB1AEYAcwBMAHIAUQBw AFcAbgBeAG0AZQBrAG4AaQB3AGcAgwBlAJEAYwCfAGIArwBgAMQAXwDkAF8B+ABeAv8AXgL/AF4C /wDOGAAAvR0AALAgAAClHwAAmxwAAJMXAACLEQAAhAwAAH4ECwB5ABIAdQAbAHIAIwBvACsAbQEz AGsBOgBpAkAAZwNGAGYDTABkBFIAYwRZAGEEYABfBWkAXgVzAFwGfwBaBo0AWQecAFcIrQBWCMEA VQnhAFQL9gBUC/8AVAv/AFQL/wDGHwAAtiUAAKkoAACeKAAAlCUAAIshAACDGwAAexQAAHQOAwBu CQ0AaQgUAGYJHQBkCiUAYgotAGALNABeCzoAXQtAAFsMRwBaDE0AWAxUAFcNXABVDWQAVA1vAFIN ewBQDooATw6aAE4OrABMD8IATBDjAEsQ+QBLEP8ASxH/AEsQ/wC/JgAAsCsAAKQvAACZLwAAjy0A AIYpAAB9JAAAdB4AAGwXAABlEQcAXw4QAFwPFwBaEB8AWBAnAFYQLgBUEDUAUxA7AFIRQgBQEUgA TxFQAE4RVwBMEmAASxJrAEkSeABIE4cARhOXAEUUqQBEFL4AQxXfAEMW+ABDFv8AQxb/AEMW/wC6 KwAAqzEAAKA0AACVNQAAizQAAIExAAB4KwAAbyYAAGYgAABeGQEAVxQNAFQUEwBRFBsATxUjAE4V KgBMFTEASxY3AEkWPgBIFkQARxdMAEUXVABEF10AQxhnAEEYdABAGYMAPxqUAD0apgA8G7sAOxvb ADsc9gA8HP8APBz/ADwc/wC1MAAAqDYAAJw5AACROwAAhzoAAH43AABzMgAAai0AAGEnAABZIQAA URsJAEwZEABKGhcASBofAEYaJgBFGy0AQxszAEIbOgBBHEEAQBxIAD4cUAA9HVkAPB5kADsecQA5 H4AAOB+SADcgpAA2ILgANSHWADUh9AA1Iv8ANSH/ADYh/wCyNAAApDoAAJk+AACPPwAAhT8AAHs8 AABwOAAAZzIAAF0tAABUKAAATCIFAEYfDgBDHxQAQR8bAD8fIgA+ICkAPSAwADsgNgA6IT0AOSFF ADgiTQA3IlcANiNiADQjbgAzJH4AMiSPADElogAvJbYALybSAC8m8gAvJv8AMCb/ADAm/wCvOAAA oj4AAJZCAACMQwAAgkMAAHhBAABuPQAAYzgAAFozAABRLgAASCgBAEAkDAA9IxEAOyQYADkkHwA4 JCYANiQsADUlMwA0JToAMyZCADImSgAxJ1QAMCdfAC8obAAuKHsALCmNACsqoAAqKrQAKSrPACkr 8AAqK/8AKir/ACsq/wCsPAAAn0IAAJRGAACKRwAAgEcAAHZFAABsQgAAYT0AAFc4AABOMwAARC4A ADwpCQA3KBAANSgVADMoHAAyKCMAMCgpAC8pMAAvKjcALio/AC0rSAAsK1IAKyxdACosagAoLXkA Jy2LACYungAlLrMAJC/NACQv7gAlL/8AJS//ACYu/wCpPwAAnUUAAJJJAACISwAAfkwAAHRKAABq RwAAXkIAAFQ9AABLOQAAQTQAADgvBgAyLQ0AMC0TAC4tGQAtLSAAKy0nACouLgApLjUAKS89ACgv RgAnME8AJTBbACQxaAAjMXcAIjKJACEynQAfM7EAHjPLAB4z7QAfM/8AIDP/ACEy/wCmQwAAmkkA AJBNAACGTwAAfFAAAHNPAABoTAAAXEYAAFJDAABJPwAAPzsAADY2AgAuMgwAKzIRACkyFwAoMh4A JjIkACUzKwAkMzIAIzQ6ACI0QwAhNU0AIDVYAB82ZQAeNnUAHDeHABs3mwAaN68AGTjIABk46wAa OP8AGzf/ABs3/wCjRwAAmE0AAI5RAACEUwAAe1QAAHFTAABmUAAAWkwAAFBJAABHRQAAPUEAADM9 AAAqOQkAJTcOACM3FAAiOBsAITgiACA4KAAfODAAHjk4AB05QQAcOksAGjpWABk7YwAYO3IAFjuF ABU8mQAUPK0AEz3GABM96QAUPP0AFTz/ABY7/wCgSwAAlVEAAItVAACCWAAAeVkAAG5YAABkVgAA WFEAAE5PAABFSwAAOkcAADBDAAAnQAUAID4NAB0+EQAcPhcAGz4eABo+JQAZPi0AGD81ABY/PgAV P0gAFEBTABNAYAASQXAAEUGCABBBlwAPQawADkLEAA5C5wAPQfwAEEH/ABBA/wCdUAAAk1YAAIla AACAXQAAdl4AAGxdAABiWwAAVlcAAExVAABBUQAANk4AACxLAAAjSAAAG0UJABdEDwAVRBQAFEUb ABNFIgASRSkAEUUxABFFOwAQRkUAD0ZQAA5HXgANR20ADEd/AAtHkwAJR6cACEe+AAhH4AAJR/YA Ckb/AAtG/wCaVQAAkFsAAIdgAAB9YgAAc2MAAGpiAABgYQAAU14AAEdaAAA8VwAAMlUAAChSAAAf UAAAF04EABFMDAAPTBEADkwXAA5MHgANTSUADE0uAAtNNwAKTUIACU1NAAdOWgAGTmkABE57AAJO jwABTqQAAE26AABN2wABTfIAAU3/AAJM/wCWWwAAjWIAAIRmAAB6aAAAcWkAAGhpAABcZwAAT2QA AEJhAAA3XwAALVwAACNaAAAaWAAAElcBAA1WCQAJVQ4AB1UTAAZVGgAEVSIAA1UqAAJVNAAAVT4A AFVKAABWVwAAVmUAAFV3AABViwAAVaAAAFW2AABU1AAAVPEAAFP9AABT/wCTYgAAimgAAIBsAAB3 bgAAb28AAGNuAABWbAAASWoAAD1oAAAyZgAAJ2UAAB1jAAAVYgAADmEAAAlgCAADYA0AAF8RAABf FwAAXx4AAF8mAABfLwAAXzoAAF9FAABfUwAAX2EAAF5yAABehwAAXZwAAF2yAABczwAAXO8AAFv9 AABb/wCQagAAhm8AAH1yAAB1dAAAanUAAF10AABPcwAAQnIAADZwAAArbwAAIG4AABdtAAAQbAAA CmwAAAJrBgAAawsAAGoPAABqFAAAahoAAGohAABpKgAAaTQAAGlAAABpTgAAaVwAAGltAABoggAA aJgAAGeuAABmygAAZe0AAGX8AABk/wCLcQAAgnYAAHp5AABwewAAYnsAAFV7AABIegAAO3oAAC96 AAAjeQAAGXgAABF3AAAKdwAAA3cAAAB3AgAAdwgAAHYNAAB2EAAAdhUAAHYbAAB2IwAAdi4AAHU6 AAB1RwAAdVYAAHVoAAB0fAAAdJIAAHOqAAByxAAAcekAAHD7AABw/wCGeQAAf30AAHZ/AABogQAA WoIAAEyCAAA/gwAAMoQAACWDAAAagwAAEYMAAAqDAAACgwAAAIQAAACFAAAAhAMAAIMIAACDDQAA gxAAAIMVAACEHAAAhCYAAIQyAACEPwAAg08AAINgAACCdQAAgowAAIGkAACAvQAAf+MAAH75AAB+ /wCCgAAAeoQAAGyGAABeiAAAUIoAAEKLAAA1jQAAJ40AABuNAAARjgAACo4AAACPAAAAkQAAAJIA AACSAAAAkgAAAJIBAACSBwAAkgwAAJIQAACTFQAAkx0AAJQoAACUNgAAlEUAAJNXAACTawAAk4IA AJKcAACRtgAAkNgAAI/zAACP/wB+hwAAcIoAAGGNAABTkAAARZMAADeVAAAplgAAHJcAABGYAAAJ mQAAAJsAAACcAAAAngAAAKAAAACgAAAAoAAAAKAAAAChAAAAoQQAAKIJAACjDgAApBQAAKUdAACm KgAApjoAAKZMAAClYAAApXgAAKWSAACkrAAApMkAAKPrAACi+gBzjgAAZJEAAFaVAABHmQAAOZwA ACqeAAAdoAAAEaEAAAijAAAApQAAAKcAAACpAAAArAAAAK4AAACuAAAArgAAAK8AAACwAAAAsQAA ALIAAACzBgAAtQ0AALcTAAC5HgAAuS4AALpAAAC6VAAAu2oAALqFAAC5oQAAubsAALreAAC58gBn lQAAWJkAAEqeAAA7ogAALKYAAB2oAAARqgAAB6wAAACvAAAAsQAAALQAAAC4AAAAuwAAALwAAAC8 AAAAvgAAAL8AAADAAAAAwgAAAMQAAADGAAAAyAMAAMsLAADPEgAA0SAAANEyAADSRgAA010AANR2 AADUkgAA1asAANXEAADU4gBbnQAATKIAAD2nAAAvrAAAH68AABGxAAAHtQAAALgAAAC7AAAAvgAA AMIAAADHAAAAygAAAMwAAADMAAAAzgAAANAAAADSAAAA1QAAANgAAADbAAAA3wAAAOIAAADmCwAA 6xMAAOwkAADtOAAA7k4AAO9nAADwggAA8JwAAPCyAADxxQD/AAMA/wABAP8ABAD/AAkA/wAPAP8A GAD/ACQA/wAwAP8APAD/AEcA/wBRAP8AWQD/AGAA/QBnAPwAbQD6AHMA+QB5APgAfwD2AIUA9QCM APMAlADyAJ0A8ACnAO4AswDsAMQA6wDhAOoA+ADpAP8A5wD/ANkA/wDLAP8AwgD/AL0A/wD/AAAA /wAAAP8AAAD/AAAA/wAMAP8AFAD/ACAA/wArAP4ANwD6AEIA9gBLAPIAUwDwAFsA7gBhAOwAZwDq AG0A6ABzAOcAeQDlAH8A4wCGAOEAjgDfAJYA3QCgANsArADYALsA1ADRANMA8ADQAP8AzgD/AMgA /wC9AP8AtgD/ALIA/wD/AAAA/wAAAP8AAAD/AAAA/QAIAPcAEADzABoA7wAmAO0AMQDoADsA4wBF AOAATQDcAFUA2QBbANYAYQDTAGcA0QBsAM8AcgDNAHgAywB/AMkAhwDHAJAAxQCaAMMApQDAALIA vgDFALwA5QC6APsAuAD/ALcA/wCwAP8AqQD/AKUA/wD/AAAA/wAAAP4AAAD1AAAA7AADAOUADQDf ABUA2gAgANQAKgDQADUAywA+AMgARwDFAE4AwgBVAMAAWwC+AGEAvABmALoAbAC4AHIAtgB4ALUA gACzAIgAsQCSAK4AngCsAKoAqQC7AKgA1QCmAPMApAD/AKMA/wChAP8AmwD/AJgA/wD/AAAA+wAA APAAAADlAAAA2AAAAM4ACQDHABEAwgAaAL4AJAC7AC4AtwA4ALQAQACxAEgArgBOAKwAVACqAFoA qQBfAKcAZQClAGsApABxAKIAeACgAIEAngCLAJwAlgCZAKMAlwCyAJYAxwCTAOgAkgD+AJEA/wCQ AP8AjQD/AIsA/wD5AAAA6wAAAN0AAADPAAAAxgAAALwABAC1AA0AsAAVAKwAHgCoACgApQAxAKIA OQCfAEEAnQBIAJsATgCZAFMAlwBZAJYAXgCUAGQAkgBqAJAAcQCOAHoAjACDAIoAjwCIAJwAhgCq AIQAvACCANwAgQD2AIAA/wB/AP8AfwD/AH4A/wDsAAAA2gAAAMkAAAC+AAAAtgAAAK4AAACnAAkA oQAQAJwAGACYACIAlQAqAJIAMgCQADoAjQBBAIsARwCJAE0AhwBSAIYAWACEAF0AggBkAIEAawB/ AHMAfQB9AHsAiAB4AJUAdgCjAHUAtABzAMwAcQDtAHAA/wBwAP8AcAD/AHAA/wDfBQAAygoAALwL AACxCQAAqAQAAKEAAACbAAMAlAAMAI8AEwCKABsAhwAkAIQALACBADMAfwA6AH0AQQB7AEcAeQBM AHcAUgB2AFcAdABdAHIAZABwAG0AbwB2AGwAggBqAI8AaQCdAGcArgBlAMMAZADkAGMA+gBjAP8A YgD/AGMA/wDQDgAAvxIAALITAACnEgAAnRAAAJULAACPAwAAiQAHAIIADgB+ABUAegAeAHYAJQB0 AC0AcQA0AG8AOgBuAEAAbABGAGoATABpAFIAZwBYAGYAXwBkAGcAYgBxAGAAfABeAIkAXACYAFsA qQBZALwAWADcAFgA9ABYAP8AVwD/AFcA/wDGFgAAthoAAKodAACfHAAAlRkAAI0UAACFDwAAfgkA AHcBCgByABAAbgAXAGoAHwBoACcAZQAuAGQANABiADsAYABAAF8ARgBdAEwAXABTAFoAWgBYAGIA VwBsAFUAdwBTAIUAUgCUAFABpQBPAbgATgLSAE0E8ABNBf8ATQX/AE0F/wC/HQAAsCIAAKMlAACZ JQAAjyIAAIUdAAB9GAAAdRIAAG4NAgBnBgwAYwMRAF8CGQBdAyEAWwQoAFkELwBXBTUAVgU7AFQG QQBTBkcAUQZOAFAHVQBOB14ATQhnAEsIcwBJCYEASAmSAEcKowBFCrYARAvQAEQM7wBDDf8AQw3/ AEQN/wC5JAAAqikAAJ4sAACULAAAiioAAIAmAAB3IQAAbhsAAGYUAABfDwUAWQsNAFUKEwBTCxsA UQsiAE8MKQBNDC8ATAw2AEsNPABJDUIASA1JAEYNUQBFDloARA5kAEIOcABADn8APw+QAD4QogA8 ELYAOxDRADsR8QA7Ef8AOxH/ADwR/wC0KQAApi8AAJoyAACQMgAAhjEAAHwtAAByKAAAaSMAAGEd AABZFgAAUREIAEwPEABKEBYASBAdAEYQJABFECsAQxExAEIRNwBBET4AQBFFAD4STQA9ElYAPBJh ADoTbQA5E3wANxSNADYUnwA1FbMANBXNADMW7gA0Fv8ANBb/ADQW/wCvLgAAojQAAJc3AACMOAAA gjYAAHg0AABuLgAAZSoAAFwkAABUHgAATBgEAEYUDQBCFBIAQBQZAD8UIAA9FScAPBUtADsVNAA5 FjoAOBZCADcWSgA2F1MANRdeADMYagAyGXkAMBmKAC8anQAuGrEALRvKAC0b7AAtHP8ALhv/AC4b /wCsMgAAnzgAAJQ7AACKPAAAgDwAAHY5AABrNAAAYi8AAFkqAABQJQAARx8AAEAaCgA8GRAAOhkW ADgZHQA2GiMANRopADQaMAAzGjcAMhs+ADEbRwAvHFAALh1bAC0dZwAsHnYAKh6IACkfmwAoH64A JyDHACYg6gAnIP4AKCD/ACgg/wCpNgAAnTwAAJI/AACHQQAAfUAAAHQ+AABpOgAAXzUAAFYwAABN KwAARCUAADsgBwA2Hg4AMx4TADIeGQAwHiAALx4mAC4fLQAtHzQALCA7ACsgRAAqIU4AKSFYACci ZQAmInQAJSOFACMjmQAiJK0AISTFACEl6AAiJf0AIiT/ACMk/wCmOgAAmj8AAI9DAACFRQAAe0QA AHJDAABnPwAAXToAAFM2AABKMQAAQSwAADgmAwAxIwwALiIRACwiFgAqIh0AKSIjACgjKgAnIzEA JiQ5ACUlQQAkJUsAIyZWACImYwAhJ3IAHyeDAB4olwAdKKsAGynDABsp5gAcKfsAHSn/AB4o/wCj PgAAmEMAAI1HAACDSQAAekkAAHBHAABmRAAAWj8AAFE7AABHNwAAPjIAADUtAAAsKAkAKCcPACcn FAAlJxoAJCchACMoJwAiKC4AISk2ACApPwAfKkkAHipUAB0rYAAbK28AGiyBABkslQAXLakAFi3B ABYt5AAXLfoAGC3/ABkt/wChQQAAlUcAAItLAACCTQAAeE0AAG5MAABkSQAAWEQAAE9AAABGPQAA PTgAADM0AAAqLwYAJCwNACEsEgAgLBgAHy0eAB4tJQAdLSwAHC40ABsuPAAaL0YAGC9RABcwXgAW MG0AFTF/ABMxkwASMagAETK/ABEy4gASMvkAEzH/ABMx/wCeRQAAk0sAAIlPAACAUQAAdlIAAG1Q AABiTgAAVkkAAE1GAABEQwAAOz8AADE6AAAnNgMAHzILABwyEAAbMhUAGTIbABgyIgAXMykAFjMx ABU0OgAUNEQAEzRPABI1XAARNWsAEDZ9AA82kQAONqYADTe8AA033QANNvYADjb/AA82/wCbSQAA kU8AAIdTAAB+VgAAdVYAAGpVAABgUwAAVU8AAExMAABCSQAAOEUAAC5BAAAkPQAAHDoIABY4DgAV OBIAFDgYABM5HwASOSYAETkuABA5NwAPOkEADjpMAA07WQANO2gACzt6AAo7jQAJPKIABzy4AAc8 1QAIPPAACTv/AAo7/wCYTgAAjlQAAIVYAAB8WwAAclsAAGhaAABeWAAAU1UAAElSAAA+TgAANEsA ACpHAAAhRAAAGEIDABJACwAQPxAADj8VAA4/HAANQCMADEArAAtANAAKQD4ACUFKAAdBVgAGQWUA BEF2AANBigABQZ8AAEG0AABB0AABQe4AAUH8AAJA/wCVVAAAjFkAAINeAAB5YAAAcGAAAGZgAABd XgAAUVsAAEVXAAA6VAAAL1EAACVPAAAcTAAAFEoAAA5ICAALRw4ACEcSAAdHGQAGRyAABUgoAANI MQACSDsAAEhHAABIUwAASGIAAEhzAABIhgAASJsAAEixAABHzAAAR+0AAEf7AABH/wCSWgAAiWAA AIBjAAB3ZQAAbmYAAGVmAABZZAAATGAAAEBdAAA1WwAAKlkAACBXAAAXVQAAEFMAAAtSBwAFUQ0A AVARAABQFgAAUB0AAFAlAABQLgAAUDgAAFBDAABQUAAAUF4AAFBvAABQgwAAT5gAAE+uAABOyQAA TusAAE37AABN/wCPYQAAhmYAAH1pAAB0bAAAbG0AAGFrAABTaQAARmcAADpkAAAvYwAAJGEAABpf AAASXgAADFwAAAZcBgAAWwsAAFoPAABaEwAAWhkAAFkhAABZKQAAWTMAAFk/AABZTAAAWVoAAFlr AABYfgAAWJQAAFerAABXxQAAVukAAFX7AABV/wCMaAAAgm0AAHpwAABycgAAZ3IAAFpxAABMcAAA P24AADNtAAAoawAAHWoAABRoAAANZwAAB2cAAABmAwAAZgkAAGUNAABlEQAAZBUAAGQcAABkJAAA ZC4AAGQ6AABjRwAAY1UAAGNmAABjegAAYpAAAGGnAABgwQAAX+YAAF/6AABe/wCHbwAAf3QAAHh3 AABueAAAYHgAAFJ3AABFdwAAOHYAACt2AAAgdAAAFnMAAA5zAAAHcgAAAHIAAAByAAAAcQUAAHEK AABxDgAAcBEAAHAXAABwHgAAcCcAAHAzAABvQAAAb1AAAG9gAABudAAAbosAAG2iAABsvAAAa+IA AGr4AABp/wCDdwAAfHsAAHN9AABlfgAAV38AAEl/AAA8fwAAL4AAACJ/AAAXfgAAD34AAAd+AAAA fwAAAH8AAAB/AAAAfgAAAH4FAAB+CgAAfg0AAH4RAAB+FwAAfiAAAH4rAAB9OQAAfUgAAH1ZAAB8 bQAAfIQAAHucAAB6tgAAedoAAHj1AAB3/wCAfwAAd4IAAGmDAABbhQAATYYAAD+IAAAyiQAAJIkA ABiJAAAPiQAAB4oAAACLAAAAjAAAAI0AAACNAAAAjAAAAIwAAACMAwAAjAgAAI0NAACNEQAAjRcA AI4iAACOLwAAjj8AAI1QAACNZAAAjHsAAIyVAACLrgAAis0AAInvAACJ/wB7hQAAbYgAAF6KAABQ jQAAQo8AADSRAAAmkgAAGZMAAA6UAAAGlQAAAJYAAACYAAAAmgAAAJsAAACbAAAAmwAAAJsAAACb AAAAnAAAAJ0FAACdCwAAnhAAAJ8XAACgJAAAoDQAAKBGAACgWQAAn3AAAJ+KAACepQAAnsIAAJ3o AACc+QBwjAAAYY8AAFOSAABElgAANpkAACebAAAZnAAAD50AAAWfAAAAoQAAAKMAAAClAAAAqAAA AKkAAACpAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAQAAsAkAALIPAACzGAAAtCcAALQ5AAC1TQAA tGQAALR+AACzmgAAs7QAALPVAACz8ABkkwAAVZcAAEebAAA4nwAAKaIAABqkAAAOpgAABKgAAACr AAAArQAAALAAAAC0AAAAtgAAALgAAAC4AAAAuQAAALoAAAC8AAAAvQAAAL8AAADAAAAAwwAAAMUH AADJDwAAyhoAAMssAADMQAAAzVYAAM5vAADNiwAAzKgAAMzCAADM4gBYmwAASaAAADqlAAAsqQAA HKsAAA+uAAAEsQAAALQAAAC3AAAAugAAAL4AAADDAAAAxgAAAMgAAADIAAAAygAAAMsAAADNAAAA zwAAANIAAADVAAAA2QAAAN0AAADhBQAA5g8AAOceAADoMgAA6UgAAOpgAADrewAA65cAAOyuAADs wgD/AAAA/wAAAP8AAAD/AAYA/wANAP8AFQD/ACEA/wAsAP8AOAD/AEMA/wBMAP4AVAD7AFsA+gBi APgAaAD2AG4A9QB0APQAegDyAIAA8QCHAO8AjwDtAJcA6wChAOkArQDnAL0A5QDYAOQA8wDiAP8A 4AD/ANAA/wDEAP8AvAD/ALYA/wD/AAAA/wAAAP8AAAD/AAAA/wAJAP8AEQD/ABwA/QAnAPkAMgD1 AD0A8QBGAO0ATwDrAFYA6ABcAOYAYgDkAGgA4wBuAOEAcwDfAHkA3QCAANoAiADYAJEA1ACbANIA pgDPALQAzADJAMkA6QDIAP8AxwD/AMEA/wC3AP8ArwD/AKsA/wD/AAAA/wAAAP8AAAD/AAAA+AAF APIADgDuABcA6gAiAOYALADhADcA3QBAANgASQDTAFAA0ABWAM4AXADMAGIAygBnAMgAbQDGAHMA xAB5AMIAgQDAAIoAvgCUALwAnwC5AKwAtgC+ALQA3QCzAPcAsQD/ALAA/wCoAP8AogD/AJ4A/wD/ AAAA/wAAAPkAAADvAAAA5gAAAN8ACwDWABIA0AAcAMwAJgDIADAAxAA6AMAAQgC9AEoAuwBQALgA VgC2AFsAtQBhALMAZgCxAGwAsAByAK4AegCsAIIAqQCMAKcAmAClAKUAowC0AKAAywCfAO4AnQD/ AJwA/wCZAP8AlAD/AJEA/wD/AAAA9gAAAOoAAADdAAAAzwAAAMcABgDAAA8AuwAXALcAIACzACoA sAAzAK0AOwCqAEMApwBJAKUATwCjAFUAogBaAKAAXwCeAGUAnQBrAJsAcgCZAHsAlwCFAJQAkACS AJ0AkACsAI4AvwCMAOIAiwD6AIkA/wCJAP8AhgD/AIMA/wD0AAAA5AAAANQAAADIAAAAvwAAALUA AQCuAAsAqQASAKUAGwChACMAngAsAJsANACYADwAlgBDAJQASQCSAE4AkABTAI4AWQCNAF4AiwBk AIkAawCHAHMAhQB9AIMAiACBAJUAfwCkAH0AtQB7AM8AeQDxAHgA/wB3AP8AdwD/AHUA/wDlAAAA 0QAAAMMAAAC4AAAArwAAAKgAAACgAAYAmgAOAJUAFQCRAB4AjgAmAIsALQCIADUAhgA8AIQAQgCC AEcAgABNAH8AUgB9AFgAewBeAHkAZQB4AG0AdgB2AHMAgQBxAI4AbwCdAG0ArgBsAMQAagDnAGkA /QBoAP8AaAD/AGkA/wDVAwAAwwcAALYIAACrBgAAogAAAJsAAACUAAAAjQAKAIgAEACDABgAfwAg AHwAJwB6AC4AdwA1AHUAOwB0AEEAcgBHAHAATABvAFIAbQBYAGsAXwBpAGYAZwBwAGUAewBjAIgA YgCXAGAApwBeALsAXQDcAFwA9gBcAP8AWwD/AFsA/wDJDQAAuRAAAKwRAAChEAAAlw0AAI8IAACI AAAAggAFAHsADQB3ABIAcwAaAG8AIQBsACgAagAvAGgANQBnADsAZQBBAGMARgBiAEwAYABSAF8A WQBdAGEAWwBqAFkAdQBXAIIAVQCRAFQAogBTALUAUQDPAFAA7wBQAP8AUAD/AFAA/wC/FAAAsBgA AKQaAACZGQAAjxYAAIcRAAB/DQAAdwYAAHEACABrAA4AZwAUAGQAGwBhACIAXgApAF0ALwBbADUA WQA7AFgAQQBWAEYAVQBNAFMAVABSAFwAUABlAE4AcABMAH0ASwCNAEkAngBIALAARwDHAEYA6QBG APsARgD/AEUA/wC4GwAAqiAAAJ4iAACTIgAAiR8AAIAaAAB3FQAAbxAAAGgLAABhBAoAXQAQAFkA FgBWAB0AVAAjAFIAKgBQADAATwA1AE4AOwBMAEEASwBIAEkATwBHAVcARgFhAEQCbABDAnkAQQOJ AEADmgA+BK0APQTEADwF5QA8B/gAPAf/ADwH/wCyIgAApScAAJkpAACOKQAAhCcAAHsjAABxHgAA aRgAAGESAABaDQMAUwgMAE8FEQBMBRcASgYeAEgGJABHBioARQcwAEQHNgBDCD0AQQhDAEAISwA+ CVMAPQldADsKaAA6CnYAOAuHADcLmQA1C6wANAzCADMM5AAzDfkAMw3/ADQN/wCtJwAAoCwAAJUv AACLLwAAgC4AAHcqAABtJQAAZCAAAFwaAABUFAAATA8GAEYMDQBDDBIAQQwYAD8MHwA+DCUAPA0r ADsNMgA6DTgAOA0/ADcORwA2DlAANA5aADMOZgAxD3QAMA+FAC4QmAAtEKsALBDDACsR5QAsEfoA LBH/AC0R/wCqLAAAnTEAAJI0AACHNQAAfTQAAHQxAABqKwAAYCcAAFghAABPGwAARxYAAEARCQA7 EA8AORAUADcQGwA2ECEANBAnADMRLQAyETQAMRE7ADARQwAuEk0ALRJXACwSYwAqE3EAKROCACcU lQAmFKkAJRXAACQV4wAlFvoAJhb/ACYV/wCmMQAAmjYAAI85AACFOgAAezkAAHE2AABnMQAAXS0A AFQoAABMIgAAQx0AADsXBQA1FA0AMhMRADEUFwAvFB0ALhQkACwUKgArFTEAKhU4ACkWQAAoFkoA JxdUACYXYAAkGG8AIxiAACEZkwAgGacAHxm+AB4a4AAfGvgAIBr/ACAa/wCjNAAAmDoAAI09AACD PgAAeT0AAG87AABlNwAAWzIAAFItAABJKAAAQCMAADgeAQAwGQoALBgPACoYFAApGBoAJxggACYZ JwAlGS0AJBo1ACMaPgAiG0cAIRtSACAcXgAfHWwAHR1+ABwdkQAaHqUAGR68ABgf3QAZH/YAGh// ABse/wChOAAAlT0AAItBAACBQgAAd0IAAG1AAABjPAAAWTcAAE8zAABGLgAAPSkAADUkAAAtIAcA Jx0NACUdEgAjHRcAIR0dACEdJAAgHisAHx4yAB4fOwAdH0UAHCBPABohXAAZIWoAGCJ7ABYijwAV IqMAFCO6ABMj2gAUI/UAFSP/ABYj/wCePAAAk0EAAIlEAAB/RgAAdUYAAGxEAABiQQAAVzwAAE04 AABENAAAPDAAADMrAAAqJgMAIyILACAhEAAeIRUAHCIbABsiIQAaIigAGiMwABkjOAAYJEIAFiVN ABUlWQAUJmgAEyZ5ABImjQARJ6IAECe4AA4n1gAQKPQAESf/ABEn/wCcQAAAkUUAAIdIAAB9SgAA dEoAAGpJAABgRgAAVUEAAEw+AABDOgAAOjYAADEyAAAoLQAAICkJABsnDgAZJxIAGCcYABYnHwAV KCUAFCgtABMoNgASKUAAEilLABEqVwAQKmYADit3AA4riwANLJ8ADCy1AAsszwAMLO8ADSz/AA0r /wCZRAAAj0kAAIVMAAB8TgAAc08AAGlOAABeSwAAU0cAAEpEAABCQAAAOT0AAC84AAAlNAAAHTAF ABYtDAAULBAAEy0VABItHAARLSMAEC0qAA8uMwAOLj0ADS9IAA0vVQAMMGMACjB0AAkwiAAIMZwA BjGxAAYxywAGMesABzD8AAgw/wCXSAAAjU0AAINRAAB6UwAAcVQAAGdSAABdUAAAUkwAAElKAABA RgAANUIAACs+AAAiOgAAGjcBABI0CQAPMw4ADjMTAA0zGQANMyAADDQoAAs0MQAKNTsACDVGAAc1 UgAFNmAABDZxAAI2hAAANpkAADavAAA2yAAANugAADb5AAE1/wCUTQAAilIAAIFWAAB4WAAAb1kA AGVYAABbVQAAUVIAAEdPAAA8TAAAMUgAACdEAAAeQQAAFj8AABA8BwALOg0ACToRAAg7FwAGOx4A BTsmAAQ7LgACOzgAATxDAAA8TwAAPF4AADxuAAA8gQAAPJcAADysAAA7xQAAO+cAADv4AAA7/wCR UgAAiFgAAH9cAAB2XQAAbV4AAGNdAABaXAAATlgAAEJUAAA3UQAALU4AACNLAAAaSQAAEkYAAA1E BgAHQwwAA0MQAABDFQAAQxsAAEMjAABDKwAAQzUAAENAAABDTQAAQ1sAAENrAABDfgAAQ5QAAEKq AABCwwAAQeYAAEH5AABB/wCOWAAAhl4AAH1hAABzYwAAa2QAAGJjAABXYQAASV0AAD1aAAAyWAAA J1UAAB5TAAAVUQAADk8AAAlNBQACTQsAAEwOAABMEwAASxgAAEsfAABLKAAASzIAAEs9AABLSQAA S1cAAEtnAABKewAASpAAAEmnAABJwAAASOQAAEj4AABH/wCLXwAAg2QAAHpnAABxaQAAaWoAAF5p AABQZgAAQ2QAADdhAAAsXwAAIV0AABhbAAAQWQAAClgAAANXAwAAVwkAAFYNAABVEAAAVRUAAFQb AABUIwAAVC0AAFQ5AABURQAAVFMAAFRkAABTdwAAU40AAFKkAABRvQAAUOIAAFD4AABP/wCIZwAA f2sAAHduAABvcAAAZXAAAFduAABKbAAAPWsAADBpAAAlaAAAGmYAABFkAAALYwAABGIAAABiAQAA YQYAAGALAABgDgAAXxIAAF8XAABfHgAAXigAAF4zAABeQAAAXk8AAF5fAABdcgAAXYgAAFygAABb uQAAWt8AAFn3AABY/wCEbgAAfHIAAHV1AABrdgAAXXUAAE90AABCcwAANXMAAChyAAAdcAAAE28A AAxuAAAEbgAAAG4AAABuAAAAbAIAAGwHAABrCwAAaw4AAGsSAABqGQAAaiIAAGotAABqOgAAaUkA AGlaAABpbAAAaIMAAGebAABmtQAAZdgAAGT1AABk/wCAdQAAenkAAHB7AABiewAAVHwAAEZ8AAA5 fAAALHwAAB97AAAUegAADXoAAAR6AAAAegAAAHoAAAB6AAAAeQAAAHkBAAB4BgAAeAsAAHgOAAB4 EwAAeBoAAHglAAB4MgAAd0EAAHdSAAB3ZQAAdnwAAHWVAAB0rwAAc84AAHLxAABx/wB+fQAAdYAA AGeBAABYggAASoMAADyEAAAuhQAAIYUAABWFAAANhQAAA4UAAACGAAAAhwAAAIgAAACIAAAAhwAA AIcAAACHAAAAhwQAAIcJAACHDgAAiBMAAIgcAACIKQAAiDgAAIdKAACHXQAAhnMAAIaNAACFpwAA hMUAAIPsAACC/gB4hAAAaoYAAFyIAABNigAAP4wAADGOAAAjjwAAFo8AAA2QAAACkQAAAJIAAACT AAAAlQAAAJYAAACWAAAAlgAAAJYAAACWAAAAlwAAAJcAAACXBwAAmA0AAJkTAACaHwAAmi0AAJo/ AACaUgAAmmgAAJmDAACZnwAAmLoAAJfiAACW+ABtigAAX40AAFCQAABBkwAAM5YAACSXAAAWmAAA DZkAAAGbAAAAnQAAAJ8AAAChAAAApAAAAKUAAACkAAAApQAAAKUAAACmAAAApwAAAKgAAACpAAAA qgQAAKwMAACuEwAAriEAAK4zAACuRwAArl0AAK52AACukwAArq4AAK3NAACs7wBhkQAAU5UAAESY AAA1nAAAJp8AABehAAANowAAAKUAAACnAAAAqgAAAKwAAACwAAAAsgAAALQAAACzAAAAtAAAALUA AAC3AAAAuAAAALkAAAC7AAAAvQAAAL8BAADDCwAAxRUAAMUlAADGOQAAx08AAMdoAADGhQAAxqIA AMa8AADG3gBVmQAAR50AADiiAAAppgAAGagAAA2rAAAArQAAALEAAAC0AAAAtwAAALoAAAC/AAAA wQAAAMQAAADDAAAAxQAAAMYAAADIAAAAygAAAM0AAADPAAAA0gAAANYAAADbAAAA4AwAAOEYAADj KwAA5EEAAOVaAADmdAAA5pEAAOWsAADlxAD/AAAA/wAAAP8AAAD/AAEA/wAKAP8AEgD/AB0A/wAo AP8ANAD/AD4A/QBIAPoAUAD3AFcA9QBdAPQAYwDyAGkA8ABvAO8AdADtAHsA6wCBAOkAiQDoAJIA 5gCcAOQAqADiALcA3wDNANwA7gDZAP8A2QD/AMoA/wC+AP8AtQD/ALAA/wD/AAAA/wAAAP8AAAD/ AAAA/wAGAP8ADwD8ABgA+AAjAPQALgDwADgA6wBCAOgASgDlAFEA4gBYAOAAXQDeAGMA3ABoANkA bgDWAHQA1AB7ANEAggDPAIsAzQCVAMoAoQDIAK8AxQDBAMIA4wDAAPsAwAD/ALsA/wCwAP8AqAD/ AKQA/wD/AAAA/wAAAP8AAAD7AAAA8wABAO0ADADoABMA4wAeAOAAKADaADIA0wA8AM8ARADMAEsA yQBRAMYAVwDEAF0AwgBiAMEAZwC/AG0AvQB0ALsAewC5AIQAtwCOALQAmQCyAKcArwC3AK0A0ACr APIAqgD/AKkA/wChAP8AmwD/AJcA/wD/AAAA/wAAAPQAAADpAAAA4AAAANUACADOABAAyQAYAMUA IgDBACsAvAA1ALkAPQC2AEUAswBLALEAUQCvAFYArgBbAKwAYQCqAGYAqQBtAKYAdACkAHwAogCG AKAAkgCeAJ8AnACuAJkAwwCXAOcAlgD/AJUA/wCSAP8AjQD/AIoA/wD8AAAA8AAAAOMAAADUAAAA yAAAAL8AAwC5AA0AswATAK8AHACsACUAqQAuAKUANgCjAD4AoABEAJ4ASgCdAFAAmwBVAJkAWgCX AF8AlgBmAJQAbACSAHUAkAB+AI4AigCLAJcAiQCmAIcAuACFANYAhAD2AIIA/wCBAP8AfgD/AHwA /wDtAAAA3QAAAMwAAADBAAAAuAAAAK4AAACnAAkAogAQAJ4AFwCaAB8AlwAnAJQALwCRADcAjwA9 AI0AQwCLAEkAiQBOAIgAUwCGAFkAhABfAIIAZQCAAG0AfgB3AHwAggB6AI8AeACeAHUArwBzAMcA cgDsAHEA/wBwAP8AcAD/AG4A/wDdAAAAyQAAALwAAACxAAAAqQAAAKEAAACZAAMAkwAMAI4AEgCK ABkAhwAhAIQAKQCBADAAfwA3AH0APQB7AEIAeQBIAHgATQB2AFIAdABYAHIAXwBxAGcAbwBwAGwA ewBqAIgAaACXAGYAqABlALwAYwDhAGIA+gBhAP8AYQD/AGEA/wDNAQAAvAUAAK8FAAClAgAAnAAA AJQAAACNAAAAhgAIAIEADgB8ABQAeAAbAHUAIwByACkAcAAwAG4ANgBtADwAawBBAGkARwBoAEwA ZgBSAGQAWQBjAGAAYQBpAF8AdABdAIEAWwCQAFkAoQBXALQAVgDQAFUA8gBVAP8AVAD/AFUA/wDB DAAAsg4AAKYPAACbDgAAkgsAAIkFAACCAAAAewACAHUACwBwABAAbAAWAGgAHQBmACMAYwAqAGEA MABgADYAXgA7AF0AQQBbAEYAWgBMAFgAUwBWAFsAVABkAFIAbgBRAHsATwCKAE0AmwBMAK4ASwDG AEoA6gBJAP4ASQD/AEkA/wC5EgAAqhYAAJ4XAACUFgAAihMAAIEQAAB5CwAAcQMAAGsABgBlAA0A YQARAF0AGABaAB4AWAAkAFYAKgBUADAAUwA2AFEAOwBQAEEATgBHAE0ATgBLAFYASQBfAEcAaQBG AHYARACFAEMAlwBBAKkAQAC/AD8A4gA/APgAPgD/AD8A/wCyGQAApB4AAJgfAACOHwAAhBwAAHoY AAByEgAAag4AAGIIAABcAQgAVwAOAFMAEwBQABkATgAfAEwAJQBKACsASAAwAEcANgBGADwARABC AEMASQBBAFEAPwBaAD4AZQA8AHIAOgCBADkAkwA4AKUANgC6ADYA2wA1APQANQD/ADUA/wCsIAAA nyQAAJQmAACJJgAAfyQAAHUgAABsGwAAZBUAAFwQAABUDAEATgYKAEoCDwBHABQARAAaAEIAIABA ACUAPwArAD4BMQA8ATcAOwI+ADkCRQA4A00ANgNWADUEYQAzBG4AMQV+ADAFkAAvBaMALQa4ACwG 1AAsB/AALAj/ACwI/wCoJQAAmyoAAJAsAACGLQAAeysAAHInAABoIgAAXx0AAFcXAABPEgAASA4E AEEKCwA+BxAAOwYVADkHGwA4ByEANggmADUILAAzCDIAMgk5ADEJQQAvCUkALgpTACwKXgArC2wA KQt8ACgMjwAmDKIAJQy3ACQM0wAjDfAAJA3/ACUN/wCkKgAAmC8AAI0yAACDMgAAeTEAAG8uAABl KQAAXCQAAFMfAABLGQAAQxMAADwQBgA1DQwAMwwRADEMFgAvDBwALg0iAC0NKAArDS4AKg01ACkN PQAnDkYAJg5QACQOXAAjD2oAIg97ACAQjgAfEKIAHRC3ABwQ1AAdEfIAHRH/AB4R/wChLwAAlTMA AIo2AACANwAAdjYAAG0zAABjLwAAWSoAAFAlAABIIAAAPxoAADgVAAAwEQgALBAOACoQEgAoEBgA JxAeACUQJAAkECoAIxEyACIROgAhEUMAIBJOAB4SWgAdE2gAGxN4ABoTiwAYFKAAFxS1ABYU0QAW FfEAFxX/ABgU/wCeMwAAkzcAAIg6AAB+OwAAdDsAAGs4AABhNAAAVy8AAE4rAABFJgAAPSEAADQc AAAtFwUAJhMMACMTEAAiExUAIBMaAB8TIQAeFCcAHRQvABwVNwAbFUEAGhZLABkWVwAXF2UAFhd2 ABQYiQATGJ4AEhizABEZzgARGe8AEhn/ABMZ/wCcNgAAkTsAAIY+AAB8PwAAcz8AAGk9AABfOQAA VTUAAEwwAABDLAAAOicAADIiAAAqHgEAIhkJAB4XDgAcFxIAGhcXABkYHgAZGCQAGBksABcZNAAW Gj4AFRpJABMbVQASG2MAERx0ABAchwAPHZwADh2xAA0dywANHewADh3/AA8d/wCZOgAAjz8AAIRC AAB7RAAAcUMAAGhCAABePgAAUzoAAEo2AABBMgAAOS0AADEpAAAoJQAAICAGABodDAAXHBAAFRwV ABQdGwAUHSIAEx0pABIeMgARHzwAEB9GABAgUwAOIGEADSFxAAwhhQALIpkACiKuAAkixwAJIucA CiL7AAsh/wCXPgAAjEMAAINGAAB5SAAAcEgAAGdGAABcRAAAUj8AAEk7AABAOAAAODQAAC8wAAAn LAAAHicDABYjCgASIQ4AESETABAiGQAQIiAADyInAA4jLwANJDkADCREAAslUAAKJV4ACSZvAAcm ggAGJpYABCasAAMmxAAEJuUABCb3AAYm/wCVQgAAikcAAIFKAAB4TAAAb0wAAGVLAABbSAAAUEQA AEdBAAA/PgAANzsAAC02AAAkMQAAGy0AABMqBwAPKA0ADScRAA0oFgAMKB0ACyglAAopLQAJKTcA BypCAAYqTgAEK1wAAytsAAErfwAAK5QAACupAAArwQAAK+MAACv2AAAq/wCSRgAAiEsAAH9PAAB2 UQAAbVEAAGNQAABaTQAAT0oAAEdHAAA+RAAAM0AAACk8AAAgOAAAFzQAABExBQAMLwwACS4QAAcu FQAGLxsABS8jAAMvKwACMDUAADA/AAAwTAAAMVkAADFpAAAxfAAAMZEAADGnAAAwvwAAMOEAADD1 AAAv/wCQSwAAhlAAAH1UAAB1VgAAa1YAAGJVAABYUwAATlAAAEVNAAA6SQAAL0UAACVCAAAcPgAA FDsAAA45BQAJNwsABDYPAAE2EwAANhkAADYgAAA2KQAANjIAADc9AAA3SQAAN1cAADdnAAA3eQAA N48AADalAAA2vQAANuAAADX1AAA1/wCNUAAAhFYAAHxaAAByWwAAaVsAAGBbAABXWQAATFYAAEBS AAA1TgAAKksAACBIAAAXRgAAEEMAAAtBBAAEQAoAAD8OAAA+EQAAPhYAAD4dAAA+JgAAPi8AAD46 AAA+RgAAPlQAAD5kAAA+dgAAPYwAAD2jAAA8uwAAPN4AADv1AAA7/wCKVwAAglwAAHlfAABwYQAA aGEAAF9hAABUXgAAR1sAADpXAAAvVQAAJVIAABtQAAASTQAADEsAAAZKAwAASQkAAEgNAABHEAAA RxQAAEYaAABGIgAARiwAAEY3AABGQwAARlEAAEZgAABFcwAARYkAAESgAABEuAAAQ9wAAEL1AABC /wCIXQAAf2IAAHdlAABuZwAAZ2gAAFtmAABOYwAAQWEAADReAAApXAAAH1oAABVXAAAOVgAAB1QA AABTAQAAUgYAAFELAABRDgAAUBEAAE8WAABPHgAATycAAE8yAABPPwAAT00AAE5dAABObwAAToUA AE2dAABMtQAAS9gAAEr1AABK/wCFZQAAfGkAAHRsAABtbgAAYm0AAFRrAABHaQAAOmcAAC1lAAAi ZAAAGGIAABBgAAAJXwAAAF4AAABeAAAAXQMAAFwIAABbDAAAWg8AAFoTAABZGQAAWSIAAFktAABZ OgAAWUgAAFhYAABYawAAV4EAAFeZAABWsgAAVdIAAFT0AABT/wCBbAAAeXAAAHNzAABocwAAWnIA AExxAAA/cAAAMm8AACVuAAAabAAAEWsAAAlqAAAAagAAAGkAAABpAAAAaAAAAGcDAABmCAAAZgwA AGYPAABlFAAAZRwAAGUnAABkNAAAZEMAAGRTAABkZQAAY3sAAGKUAABhrQAAYM0AAF/xAABe/wB9 dAAAd3cAAG55AABfeQAAUXkAAEN5AAA2eAAAKXgAABx3AAARdgAACnUAAAB1AAAAdQAAAHYAAAB1 AAAAdAAAAHQAAABzAgAAcwcAAHMMAAByEAAAchUAAHIgAAByLAAAcjsAAHFMAABxXwAAcXQAAHCO AABvqAAAbsYAAGztAABr/wB7ewAAcn4AAGR+AABVfwAAR4AAADmBAAArggAAHoEAABKBAAAKgQAA AIEAAACCAAAAgwAAAIMAAACDAAAAggAAAIIAAACCAAAAggAAAIIFAACCCgAAgg8AAIIXAACCIwAA gjIAAIJDAACBVgAAgWwAAICGAAB/oQAAfr0AAH3mAAB8/AB2ggAAaIMAAFmFAABLhwAAPIkAAC6K AAAgiwAAE4sAAAqLAAAAjAAAAI0AAACPAAAAkQAAAJIAAACRAAAAkQAAAJEAAACRAAAAkQAAAJIA AACSAgAAkwkAAJQPAACUGQAAlCcAAJQ4AACUTAAAk2IAAJN8AACTmAAAkrMAAJHYAACQ9gBqiAAA XIoAAE2NAAA/kAAAMJIAACGUAAAUlQAACpYAAACXAAAAmQAAAJsAAACdAAAAnwAAAKAAAACgAAAA oAAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYHAACoEAAAqBwAAKgtAACpQAAAqVYAAKlvAACp iwAAqKgAAKfHAACm7ABfjwAAUJIAAEGWAAAzmQAAI5wAABSdAAAKnwAAAKEAAACjAAAApgAAAKgA AACsAAAArgAAAK8AAACvAAAAsAAAALAAAACyAAAAswAAALQAAAC2AAAAtwAAALoAAAC9BwAAvxAA AL8fAADAMwAAwEkAAMBiAADAfgAAwJsAAMC3AAC/2ABTlwAARJsAADWfAAAmowAAFqUAAAunAAAA qgAAAK0AAACwAAAAswAAALYAAAC7AAAAvQAAAMAAAAC/AAAAwQAAAMIAAADEAAAAxgAAAMgAAADK AAAAzAAAAM8AAADTAAAA2gcAANsTAADdJQAA3jsAAN9TAADgbgAA34wAAN2pAADdwgD/AAAA/wAA AP8AAAD/AAAA/wAHAP8AEAD/ABkA/wAkAP8ALwD8ADoA+QBDAPUASwDzAFIA8QBZAO8AXgDtAGQA 6wBpAOkAbwDnAHUA5gB8AOQAhADiAI0A4ACXAN0AogDaALEA1QDFANIA6ADQAP8AzwD/AMQA/wC4 AP8ArwD/AKkA/wD/AAAA/wAAAP8AAAD/AAAA/wACAPsADQD3ABUA8wAfAO8AKQDqADQA5gA9AOIA RQDeAEwA2wBTANgAWADUAF4A0gBjANAAaQDOAG4AzAB1AMoAfQDIAIUAxgCQAMIAmwDAAKkAvgC6 ALsA2QC5APcAuAD/ALQA/wCpAP8AogD/AJ0A/wD/AAAA/wAAAP8AAAD2AAAA7gAAAOcACgDhABEA 3AAaANcAIwDQAC4AywA3AMcAPwDEAEYAwQBNAL8AUgC9AFgAuwBdALkAYgC4AGgAtgBuALQAdQCx AH4ArwCIAK0AkwCqAKEAqACxAKYAyACkAO0AogD/AKIA/wCbAP8AlQD/AJEA/wD/AAAA/AAAAO4A AADjAAAA2AAAAM0ABQDGAA4AwQAVAL0AHgC5ACcAtQAwALIAOACvAEAArABGAKoATACoAFEApwBW AKUAWwCjAGEAoQBnAJ8AbgCeAHYAmwCAAJkAjACXAJkAlACoAJIAvACQAN8AjgD7AI4A/wCLAP8A hgD/AIMA/wD4AAAA6QAAANwAAADMAAAAwQAAALgAAACyAAoArAARAKgAGAClACEAogApAJ4AMgCc ADkAmQA/AJcARQCVAEoAlABQAJIAVQCQAFoAjwBgAI0AZwCLAG8AiQB4AIYAhACEAJEAggCgAIAA sgB9AMwAfADxAHsA/wB6AP8AdwD/AHUA/wDmAAAA0wAAAMYAAAC7AAAAsQAAAKcAAAChAAUAmwAN AJcAEwCTABsAkAAjAIwAKwCKADIAiAA4AIYAPgCEAEQAggBJAIEATgB/AFMAfQBZAHsAYAB5AGgA dwBxAHUAfABzAIkAcACYAG8AqQBtAL8AawDmAGoA/wBpAP8AaQD/AGcA/wDTAAAAwwAAALUAAACr AAAAowAAAJsAAACSAAAAjAAKAIcAEACDABYAfwAdAH0AJAB6ACsAeAAyAHYAOAB0AD0AcgBCAHEA SABvAE0AbQBTAGwAWQBqAGEAaABqAGYAdABkAIEAYQCRAF8AogBeALYAXADVAFsA9wBbAP8AWgD/ AFoA/wDFAAAAtgIAAKkCAACfAAAAlgAAAI4AAACHAAAAgAAFAHoADAB1ABEAcQAYAG4AHgBrACUA aQArAGcAMQBmADcAZAA8AGMAQQBhAEcAXwBNAF4AUwBcAFsAWgBkAFgAbgBWAHsAVACKAFIAmwBR AK4AUADIAE8A7gBOAP8ATgD/AE0A/wC7CgAArA0AAKANAACVDAAAjAgAAIMCAAB8AAAAdQAAAG4A CABpAA4AZQATAGIAGQBfAB8AXQAlAFsAKwBZADEAWAA2AFYAOwBVAEEAUwBHAFEATgBQAFUATgBe AEwAaABKAHUASACEAEcAlQBFAKgARAC/AEMA5ABCAPwAQgD/AEIA/wCyEQAApRQAAJkVAACOEwAA hBEAAHsNAABzCAAAbAAAAGUAAwBfAAsAWwAPAFcAFABUABoAUQAfAE8AJQBOACsATAAwAEsANgBJ ADwASABCAEYASABFAFAAQwBZAEEAYwA/AG8APgB+ADwAkAA7AKMAOgC4ADkA2QA4APUAOAD/ADgA /wCsFwAAnxsAAJMdAACJHAAAfxkAAHUVAABsEAAAZAwAAF0GAABWAAYAUQAMAE0AEABKABUARwAa AEUAIABEACYAQgArAEEAMQA/ADYAPgA9ADwARAA7AEsAOQBUADcAXwA2AGsANAB6ADIAjAAxAJ4A MACzAC8AzgAvAO8ALgD/AC4A/wCnHgAAmiIAAI8kAACEJAAAeiEAAHEdAABnGAAAXxMAAFcOAABQ CgAASQMIAEUADQBBABEAPgAWADwAGwA6ACEAOQAmADcALAA2ADIANAA4ADMAPwAxAEcAMABQAC4A WwAtAGcAKwB2ACoAiAAoAJwAJwCwACYAyQAlAOoAJQH7ACUB/wCiIwAAligAAIsqAACBKgAAdygA AG0lAABkIAAAWxsAAFIVAABLEAAAQwwCAD0HCQA5Aw4ANgESADMBFwAxARwAMAEiAC8CJwAtAi0A LAM0ACoDOwApBEMAKARNACYFWAAlBWUAIwZ0ACIGhgAgBpoAHweuAB4HxgAdB+cAHQj4AB0J/wCf KAAAky0AAIgvAAB+LwAAdC4AAGorAABhJgAAWCEAAE8cAABHFwAAPxIAADgOBAAxCwoALggOACsH EgApBxcAKAgdACcIIwAlCCkAJAkwACMJNwAhCkAAIApKAB8LVQAdC2IAGwxyABoMhQAYDJkAFwyt ABYMxgAVDeYAFQ35ABYN/wCcLQAAkDEAAIY0AAB8NAAAcjMAAGgxAABfLAAAVScAAEwjAABEHQAA PBgAADQTAAAtEAYAJg0LACQMDwAiDBMAIQwZAB8MHwAeDSUAHQ0sABsNNAAaDj0AGQ5HABcOUwAW DmEAFA9xABMQhAASEJgAERCuABAQxgAQEOgAEBD7ABEQ/wCZMQAAjjUAAIQ4AAB6OQAAcDgAAGc2 AABdMgAAUy0AAEooAABCJAAAOR8AADEaAAAqFQEAIxEHAB0QDQAbDxAAGQ8VABgQGwAXECEAFhAp ABUQMQAUEToAExFFABISUQAREl8AEBJvAA4TggAOE5YADROrAAsTwgALFOMADBT6AA0T/wCXNQAA jDkAAII8AAB4PQAAbz0AAGU6AABbNwAAUjIAAEkuAABAKgAANyUAAC8hAAAoHAAAIBgDABkUCgAV Eg4AFBISABMTGAASEx8AERQmABEULgAQFDgADxVCAA4WTwANFlwADBdsAAsXfwAJGJMACBioAAYY vwAHGOAABxj1AAkY/wCVOAAAij0AAIBAAAB3QQAAbUEAAGQ/AABaPAAAUDgAAEczAAA+MAAANisA AC4nAAAnIwAAHx8AABcaCAASFw0AEBcRAA8XFgAOGBwADhgjAA0ZLAAMGjUACxpAAAobTAAJG1oA BxxpAAUcfAAEHZEAAh2mAAEdvAACHN0AAhzyAAMc/wCTPAAAiEEAAH9EAAB1RQAAbEUAAGNEAABZ QQAATz0AAEY5AAA+NgAANTIAAC4uAAAlKgAAHSUAABQhBAAPHQsADR0QAAwdFAALHRoACh4iAAge KgAHHzMABiA+AAQgSgADIVcAASFnAAAheQAAIY4AACGkAAAhugAAIdsAACHyAAAg/gCQQAAAhkUA AH1IAAB0SgAAa0oAAGJJAABYRgAATkIAAEU/AAA9PAAANTkAACs0AAAiLwAAGSsAABIoBAANJAoA CSMOAAYjEgAFIxkABCQgAAIkKAABJTEAACU8AAAlSAAAJlUAACZlAAAmdwAAJowAACaiAAAmuQAA JtkAACXyAAAl/gCORQAAhEkAAHtNAABzTwAAak8AAGBOAABXSwAATUgAAERFAAA8QgAAMT0AACc5 AAAeNQAAFTIAAA8uAwAKLAoABSsOAAEqEQAAKhYAACoeAAAqJgAAKy8AACs5AAArRQAALFMAACxi AAAsdQAALIoAACugAAArtwAAK9YAACryAAAq/wCMSQAAgk4AAHpSAABxVAAAaFQAAF9TAABWUQAA TE4AAENLAAA3RwAALUMAACM/AAAaPAAAEjgAAAw2AwAGMwkAADINAAAyEAAAMRQAADEbAAAxIwAA MSwAADI3AAAyQwAAMlAAADJgAAAycgAAMocAADGeAAAxtQAAMNQAADDyAAAv/wCJTwAAgFQAAHhX AABvWQAAZlkAAF5ZAABVVwAASVMAAD5PAAAyTAAAKEgAAB5FAAAVQgAADkAAAAg9AgABPAgAADsM AAA6DwAAORIAADkYAAA5IAAAOSkAADk0AAA5QAAAOU4AADldAAA5bwAAOIUAADicAAA3swAAN9IA ADbyAAA1/wCHVQAAf1oAAHZdAABtXwAAZV8AAF1fAABSXAAARFgAADhVAAAtUgAAIk8AABhMAAAQ SgAACkgAAANGAQAARQYAAEQKAABDDQAAQhAAAEEVAABBHQAAQSYAAEExAABBPQAAQUoAAEFaAABB bAAAQIEAAD+ZAAA/sQAAPtAAAD3yAAA8/wCEXAAAfGAAAHNjAABsZQAAZGYAAFlkAABLYQAAPl4A ADJbAAAmWQAAHFYAABJUAAAMUgAABFEAAABPAAAATgMAAE0IAABMDAAASw4AAEsSAABKGQAASiIA AEosAABKOQAASkcAAEpWAABJaAAASX4AAEiWAABHrwAARs0AAEXxAABE/wCBYwAAeWcAAHJqAABr bAAAYGsAAFJpAABEZgAAN2QAACpiAAAfYAAAFV4AAA1dAAAGWwAAAFoAAABZAAAAWAAAAFcEAABW CAAAVgwAAFUQAABUFAAAVB0AAFQnAABUNAAAVEIAAFNSAABTZAAAUnkAAFKSAABRqwAAUMoAAE/v AABO/wB+agAAd24AAHBxAABmcQAAWHAAAEpvAAA8bQAAL2wAACJqAAAXaQAADmcAAAZmAAAAZQAA AGUAAABlAAAAYwAAAGIAAABiBAAAYQgAAGENAABgEAAAYBcAAGAhAABfLgAAXzwAAF9NAABeXgAA XnQAAF2NAABcpwAAW8UAAFrtAABZ/wB7cgAAdXYAAGt3AABddgAAT3YAAEF1AAAzdQAAJnQAABlz AAAQcgAAB3EAAABxAAAAcQAAAHEAAABxAAAAbwAAAG8AAABuAAAAbgIAAG4IAABtDAAAbREAAG0a AABtJgAAbDUAAGxGAABrWAAAa20AAGqGAABpoQAAaL4AAGfoAABm/gB5egAAcHwAAGF8AABTfQAA RH0AADZ+AAAofgAAG30AABB9AAAHfQAAAH0AAAB9AAAAfgAAAH8AAAB+AAAAfQAAAH0AAAB8AAAA fAAAAHwAAAB8BgAAfAwAAHwSAAB8HQAAfCwAAHw8AAB8TwAAe2UAAHt+AAB6mgAAebYAAHjfAAB3 +gBzgAAAZYEAAFaDAABIhAAAOYYAACuHAAAdhwAAEYcAAAeIAAAAiAAAAIkAAACKAAAAjAAAAI0A AACNAAAAjAAAAIwAAACMAAAAjAAAAIwAAACNAAAAjQQAAI4MAACOEwAAjyEAAI4yAACORgAAjlsA AI10AACNkAAAjK0AAIvOAACK8wBohgAAWogAAEuLAAA8jQAALY8AAB6QAAARkQAAB5IAAACTAAAA lQAAAJcAAACZAAAAmwAAAJwAAACbAAAAmwAAAJwAAACcAAAAnQAAAJ4AAACeAAAAnwAAAKEDAACi DAAAohYAAKMmAACjOgAAo08AAKNoAACihgAAoqIAAKLAAACh6ABcjQAATZAAAD+TAAAwlgAAIZkA ABKaAAAHmwAAAJ0AAACgAAAAogAAAKQAAACoAAAAqgAAAKsAAACqAAAAqwAAAKwAAACtAAAArgAA AK8AAACxAAAAsgAAALQAAAC3AQAAuQ0AALkaAAC6LQAAukMAALpbAAC6dwAAu5QAALuxAAC50gBQ lQAAQZgAADKcAAAjoAAAE6IAAAikAAAApwAAAKoAAACsAAAArwAAALIAAAC3AAAAuQAAALsAAAC6 AAAAvAAAAL0AAAC/AAAAwAAAAMIAAADEAAAAxgAAAMkAAADNAAAA0gEAANQPAADVHwAA1zUAANhN AADYaQAA14YAANejAADWvQD/AAAA/wAAAP8AAAD/AAAA/wADAP8ADQD/ABUA/wAgAPwAKwD4ADUA 9AA/APAARwDuAE4A6wBUAOkAWgDnAF8A5QBkAOMAagDhAHAA3wB2AN0AfgDbAIcA2ACRANMAnQDP AKsAzQC9AMsA4ADJAPsAxwD/AL0A/wCxAP8AqQD/AKMA/wD/AAAA/wAAAP8AAAD/AAAA/AAAAPYA CwDxABEA7QAbAOkAJQDkADAA3wA5ANoAQQDVAEgA0QBOAM8AVADNAFkAywBeAMkAYwDHAGkAxQBv AMMAdwDAAH8AvgCKALsAlQC4AKMAtgC0ALQAzQCyAPIAsAD/AKwA/wCjAP8AnAD/AJcA/wD/AAAA /wAAAPoAAADxAAAA6AAAAOAABgDZAA4A0gAWAM4AHwDIACkAxAAyAMAAOgC9AEEAugBIALgATQC2 AFMAtABYALIAXQCwAGIArgBpAKwAbwCqAHgAqACCAKYAjgCkAJsAoQCrAJ8AwACdAOYAmwD/AJoA /wCUAP8AjgD/AIoA/wD/AAAA9gAAAOgAAADcAAAAzgAAAMYAAQC/AAsAugARALYAGgCyACIArgAr AKoANACoADsApQBBAKMARwChAEwAnwBRAJ4AVgCcAFwAmgBiAJkAaACXAHAAlQB6AJIAhgCQAJMA jQCiAIsAtQCJANMAhwD3AIYA/wCEAP8AfwD/AHwA/wDyAAAA4wAAANIAAADFAAAAugAAALEAAACr AAcApQAOAKEAFACeABwAmgAlAJcALQCUADQAkgA6AJAAQACOAEUAjQBKAIsAUACJAFUAiABbAIYA YQCEAGkAggByAH8AfQB9AIsAewCaAHgAqwB2AMQAdADrAHMA/wBzAP8AcAD/AG4A/wDfAAAAzAAA AL8AAAC0AAAAqwAAAKEAAACaAAIAlAALAJAAEACMABcAiAAeAIUAJgCDAC0AgQAzAH8AOQB9AD8A ewBEAHkASQB4AE4AdgBUAHQAWgBzAGIAcABrAG4AdQBsAIMAagCSAGgAowBmALgAZADeAGMA+wBi AP8AYgD/AGAA/wDMAAAAvAAAAK8AAAClAAAAnQAAAJQAAACMAAAAhgAHAIEADQB8ABIAeAAZAHUA HwBzACYAcQAtAG8AMgBtADgAawA9AGoAQgBoAEgAZwBOAGUAVABjAFsAYQBkAF8AbgBdAHsAWwCK AFkAmwBXAK8AVgDLAFUA8gBUAP8AVAD/AFQA/wC+AAAAsAAAAKQAAACZAAAAkAAAAIgAAACBAAAA eQACAHMACgBvAA8AawAUAGcAGgBlACAAYwAmAGEALABfADIAXgA3AFwAPABbAEIAWQBHAFcATgBW AFUAVABeAFIAaABQAHQATgCDAEwAlQBKAKgASQDAAEgA6ABHAP8ARwD/AEcA/wC0CQAApgsAAJsM AACQCgAAhgUAAH4AAAB2AAAAbwAAAGgABQBjAAwAXwAQAFsAFQBYABoAVgAhAFQAJgBTACwAUQAx AFAANgBOADwATQBCAEsASABJAFAASABYAEYAYgBEAG4AQgB9AEAAjgA/AKIAPQC4AD0A3QA8APgA PAD/ADwA/wCsEAAAnxIAAJQSAACJEQAAfw8AAHYMAABuBQAAZgAAAGAAAQBZAAgAVQANAFEAEQBO ABYASwAbAEkAIQBIACYARgArAEUAMQBDADYAQgA8AEAAQwA+AEsAPQBTADsAXQA5AGkANwB4ADYA iQA0AJwAMwCxADIAzgAyAPEAMQD/ADEA/wCmFgAAmhkAAI4aAACEGgAAehYAAHASAABoDgAAXwoA AFgDAABRAAQATAAKAEgADgBEABIAQQAWAD8AGwA9ACEAPAAmADoALAA5ADEANwA3ADYAPgA0AEYA MwBPADEAWQAvAGUALgBzACwAhQArAJgAKgCtACkAxgAoAOoAKAD+ACgA/wChHAAAlSAAAIohAAB/ IQAAdR8AAGwaAABjFgAAWhEAAFINAABLBwAARAAGAEAACwA8AA8AOAASADYAFwA0ABwAMwAhADEA JwAwACwALgAzAC0AOgArAEIAKgBLACgAVQAmAGEAJQBwACQAgQAiAJUAIQCpACAAwQAgAOQAHwD5 AB8A/wCdIgAAkSYAAIYoAAB8JwAAciUAAGkiAABfHQAAVxgAAE4TAABGDgAAPwsAADgFBwA0AAwA MQAQAC4AEwAsABgAKgAdACkAIgAnACgAJgAuACQANgAjAD4AIgBHACAAUgAfAF4AHQBtABwAfgAa AJIAGQCnABgAvQAXAN8AFwH1ABcC/wCaJwAAjisAAIQtAAB5LQAAcCsAAGYoAABdJAAAVB8AAEsa AABDFAAAOxAAADQNAgAtCQkAKQUNACYDEAAkARMAIgIZACECHgAgAiQAHgMqAB0DMgAbBDoAGgVE ABkFTwAXBlwAFgZqABQHfAATB5AAEgelABEHuwAQB9sAEAjyABAJ/wCXKwAAjC8AAIExAAB3MgAA bjEAAGQuAABbKgAAUSUAAEkgAABAGwAAOBYAADESAAApDgQAIwwJAB8JDQAdBxAAGwcVABkIGgAY CCAAFwknABYJLgAVCjcAEwpBABILTQARC1oAEAtpAA4MewAODJAADQylAAwNuwALDdkACw3xAAwN /wCVLwAAijMAAH82AAB2NgAAbDUAAGMzAABZLwAAUCsAAEcmAAA+IQAANh0AAC4YAAAnEwAAIBAF ABkOCgAVDA4AFAwRABMMFgASDBwAEQ0jABANKwAPDTQADg4/AA0OSgAMD1gACw9nAAoQeQAIEI0A BxCiAAYQuAAFENQABRDvAAYQ/wCSMwAAiDcAAH46AAB0OwAAazoAAGE4AABYNQAATjAAAEUsAAA9 JwAANSMAAC0fAAAmGgAAHhYBABcTBgAREAsADg4OAA4PEwANEBkADRAgAAwQKAALETIAChE8AAgS SAAHElUABhNlAAQTdgADE4sAARSgAAATtgAAE9EAABPuAAAT+wCQNgAAhjsAAHw+AABzPwAAaj8A AGA9AABXOQAATTYAAEQxAAA8LgAANCoAACwmAAAlIgAAHh4AABYaAgAQFQkADBMOAAoTEgAJFBcA CBQfAAcVJgAGFS8ABBY6AAMWRgABF1MAABdiAAAYdAAAGIkAABifAAAYtQAAF9AAABftAAAX+wCO OgAAhD8AAHtCAAByQwAAaEMAAF9CAABWPwAATDsAAEM3AAA7NAAAMzAAACwsAAAkKQAAGyQAABMf AgANGwkACRkNAAYZEQAEGRYAAhkdAAEaJAAAGi0AABs4AAAbRAAAHFEAABxgAAAdcgAAHYcAAByd AAAcswAAHM4AABvtAAAb/ACMPgAAgkMAAHlGAABwSAAAaEgAAF5GAABVRAAAS0AAAEM9AAA7OgAA MzcAACoyAAAgLQAAFykAABAlAgALIgkABSANAAEfEAAAHxQAAB8bAAAgIgAAICsAACE2AAAhQQAA IU8AACFeAAAicAAAIoUAACGbAAAhsgAAIc0AACDtAAAf/ACKQwAAgEgAAHhLAABvTAAAZk0AAF1L AABUSQAASkYAAEJDAAA6QAAALzsAACU3AAAcMwAAEy8AAA0sAgAHKQgAAScMAAAmDgAAJRIAACYZ AAAmIQAAJikAACYzAAAnPwAAJ00AACdcAAAnbQAAJ4IAACeZAAAmsAAAJcwAACXuAAAk/QCISAAA f0wAAHZQAABuUQAAZVIAAFxRAABTTwAASkwAAEFJAAA1RAAAK0AAACE8AAAXOQAAEDYAAAoyAQAD MAcAAC8LAAAuDgAALREAAC0WAAAtHgAALScAAC0xAAAtPQAALUoAAC1ZAAAtawAALYAAACyXAAAs rwAAK8sAACruAAAq/gCFTQAAfVIAAHVVAABsVwAAY1cAAFtWAABTVQAAR1EAADtNAAAwSQAAJUYA ABxDAAATPwAADT0AAAY6AAAAOAUAADcJAAA2DQAANQ8AADQUAAA0GwAANCQAADQuAAA0OgAANEcA ADRXAAA0aAAANH0AADOVAAAyrQAAMcoAADHuAAAw/wCDUwAAe1gAAHNbAABqXQAAYl0AAFtdAABP WgAAQlYAADZSAAAqTwAAIEwAABZJAAAORwAACEQAAABCAAAAQQMAAD8HAAA+CwAAPQ4AAD0RAAA8 GAAAPCEAADwrAAA8NwAAPEQAADxTAAA8ZQAAO3oAADqSAAA6qwAAOcgAADjtAAA3/wCBWgAAeV4A AHFhAABpYwAAYmQAAFdiAABJXgAAPFsAAC9YAAAkVQAAGVMAABBRAAAKTwAAAU0AAABMAAAASgAA AEkEAABICAAARwwAAEYPAABGFAAARRwAAEUnAABFMwAARUAAAEVQAABEYQAARHYAAEOPAABCqAAA QcYAAEDsAAA//wB+YQAAdmUAAG9oAABoagAAXWkAAE9mAABCZAAANGEAAChfAAAdXQAAElsAAAtZ AAACWAAAAFYAAABWAAAAVAAAAFMAAABSBAAAUQkAAFANAABQEAAATxgAAE8iAABPLgAATzwAAE9L AABOXQAATnIAAE2LAABMpQAAS8IAAEnqAABI/wB7aQAAdGwAAG5vAABkbwAAVW0AAEdsAAA5agAA LGkAACBnAAAUZQAADWQAAANiAAAAYgAAAGEAAABgAAAAXwAAAF4AAABdAAAAXAQAAFwJAABbDQAA WxIAAFscAABaKAAAWjYAAFpGAABZWAAAWW0AAFiFAABXoAAAVr0AAFXoAABT/gB5cAAAc3QAAGl1 AABbdAAATHMAAD5zAAAwcgAAI3EAABZvAAANbgAABG0AAABtAAAAbQAAAG0AAABsAAAAawAAAGoA AABpAAAAaQAAAGkDAABoCQAAaA4AAGgVAABnIQAAZy8AAGc/AABmUgAAZmYAAGV/AABkmgAAY7cA AGLhAABh/AB3eAAAbXoAAF96AABQegAAQnoAADN7AAAlewAAGHoAAA55AAAEeQAAAHkAAAB5AAAA egAAAHoAAAB6AAAAeAAAAHgAAAB3AAAAdwAAAHcAAAB3AQAAdwgAAHcOAAB3GAAAdyYAAHY2AAB2 SQAAdV8AAHV3AAB0kwAAc68AAHLTAABx9wBxfgAAY38AAFSAAABFggAANoMAACiEAAAahAAADoMA AASEAAAAhAAAAIUAAACGAAAAiAAAAIkAAACIAAAAhwAAAIcAAACHAAAAhwAAAIcAAACIAAAAiAAA AIgHAACJEAAAiRwAAIksAACIPwAAiFUAAIhtAACHiQAAhqcAAIXHAACE7wBmhAAAV4YAAEiIAAA5 igAAKowAABuNAAAPjQAABI4AAACQAAAAkQAAAJMAAACVAAAAlwAAAJgAAACWAAAAlwAAAJcAAACX AAAAmAAAAJgAAACZAAAAmgAAAJsAAACdBwAAnREAAJ0hAACdMwAAnUkAAJxiAACcfwAAnJwAAJy5 AACb4gBaiwAAS44AADyRAAAtkwAAHpUAABCWAAAEmAAAAJoAAACcAAAAngAAAKEAAACkAAAApgAA AKcAAACmAAAApwAAAKcAAACoAAAAqQAAAKoAAACsAAAArQAAAK8AAACxAAAAswkAALMVAAC0JwAA tD0AALVVAAC1cAAAtI4AALSsAAC0zABNkgAAP5YAAC+aAAAgnQAAEZ8AAAWhAAAAowAAAKYAAACp AAAArAAAAK8AAACzAAAAtQAAALcAAAC2AAAAtwAAALgAAAC6AAAAuwAAAL0AAAC/AAAAwQAAAMQA AADHAAAAywAAAM0MAADOGgAAzy8AAM9IAADQYgAA0IAAANCdAADQuAAAAAAAAAAAAAAAAAAAAAAA AQMEBQYICQoLDQ4PERITFBYXGBobHB0fICEiJCUmKCkqKy0uLzAyMzQ2Nzg5Ozw9PkBBQkRFRkdJ SktNTk9QUlNUVVdYWVtcXV5gYWJjZWZnaWprbG5vcHFzdHV3eHl6fH1+gIGCg4WGh4iKi4yOj5CR k5SVlpiZmpydnp+hoqOkpqeoqqusra+wsbO0tba4ubq7vb6/wcLDxMbHyMnLzM3P0NHS1NXW19na 293e3+Di4+Tm5+jp6+zt7vDx8vT19vf5+vv8/v////////////////////////////////////// ////////////////AAAAAAAAAAAAAAAAAAAAAAEDBAUGCAkKCw0ODxESExQWFxgaGxwdHyAhIiQl JigpKistLi8wMjM0Njc4OTs8PT5AQUJERUZHSUpLTU5PUFJTVFVXWFlbXF1eYGFiY2VmZ2lqa2xu b3Bxc3R1d3h5enx9foCBgoOFhoeIiouMjo+QkZOUlZaYmZqcnZ6foaKjpKanqKqrrK2vsLGztLW2 uLm6u72+v8HCw8TGx8jJy8zNz9DR0tTV1tfZ2tvd3t/g4uPk5ufo6evs7e7w8fL09fb3+fr7/P7/ /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAB AwQFBggJCgsNDg8REhMUFhcYGhscHR8gISIkJSYoKSorLS4vMDIzNDY3ODk7PD0+QEFCREVGR0lK S01OT1BSU1RVV1hZW1xdXmBhYmNlZmdpamtsbm9wcXN0dXd4eXp8fX6AgYKDhYaHiIqLjI6PkJGT lJWWmJmanJ2en6Gio6Smp6iqq6ytr7Cxs7S1tri5uru9vr/BwsPExsfIycvMzc/Q0dLU1dbX2drb 3d7f4OLj5Obn6Onr7O3u8PHy9PX29/n6+/z+//////////////////////////////////////// //////////////8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywt Li8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVm Z2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6f oKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY 2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/bWZ0MQAAAAADASEAAAEAAAAA AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAECAwQFBgcICAkKCwwNDg8QERITFBUWFxgZ GhobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9Q UVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJ iouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrrCxsrO0tba3uLm6u7y9vr/AwcLD xMXGx8jJysvMzc7P0NHT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Hy8/T19vf4+fr7/P3+ /wABAQICAwMEBAUGBgcHCAgJCQoLCwwMDQ0ODw8QEBEREhMTFBQVFhYXFxgZGRoaGxwcHR4eHyAg ISIiIyQkJSYmJygpKSorLC0tLi8wMTIyMzQ1Njc4OTo7PD0+P0BCQ0RFRkhJSkxNT1BSU1VXWFpc XmBiZGZoam1vcXR2eXx+gYOGiYuOkJKVl5mbnZ+ho6WnqKqsra+wsrO1tre5uru8vb/AwcLDxMXG x8jJysvMzc3Oz9DR0tLT1NXW1tfY2dna29vc3d3e39/g4eHi4+Pk5eXm5ufo6Onp6uvr7Ozt7u7v 7/Dw8fLy8/P09PX29vf3+Pj5+fr7+/z8/f3+/v8AAQECAgMDBAQFBgYHBwgICQkKCwsMDA0NDg8P EBARERITExQUFRYWFxcYGRkaGhscHB0eHh8gICEiIiMkJCUmJicoKSkqKywtLS4vMDEyMjM0NTY3 ODk6Ozw9Pj9AQkNERUZISUpMTU9QUlNVV1haXF5gYmRmaGptb3F0dnl8foGDhomLjpCSlZeZm52f oaOlp6iqrK2vsLKztba3ubq7vL2/wMHCw8TFxsfIycrLzM3Nzs/Q0dLS09TV1tbX2NnZ2tvb3N3d 3t/f4OHh4uPj5OXl5ubn6Ojp6err6+zs7e7u7+/w8PHy8vPz9PT19vb39/j4+fn6+/v8/P39/v7/ //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////4oHwSUNDX1BST0ZJTEUA CQn///////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////T///////////////////////////// ////////////69H/////////////////////////////////////////9+n+//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////4c3X///////////////////////////////////////dr5a39P////////////////// ///////////////////FjGin5//////////////////////////////////////MnImk5/////// ///////////////////////////////6zrvG9f////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////3MW99f////////////////////// //////////////+/k3qFxf///////////////////////////////////9uQWz1lqPb///////// /////////////////////////rx1NABUm+v/////////////////////////////////05R+SSxO muz////////////////////////////////Y1MqzfmVtpfn///////////////////////////// ///////0xa6vyf////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////8NbG7P///////////////////////////////////+a7kXRjq/f///////////// ///////////////////2xJpzRSY0fcz///////////////////////////////+1gFUwCgAZYLL/ /////////////////////////////890NQsAAAAKUqf//////////////////////////////5Y0 AAAAAAAAT6f/////////////////////////////9mkdAAAJDAYJUrH///////////////////// ////////yzsOEzVMW01MXsP/////////////////////////////qWA2YIaftqypuNn///////// ////////////////////4JeNvuX//////////////////////////////////////+35//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////r2cq8x/////////////////// ////////////////z5qBbVpGiOr////////////////////////////////EfD4mEAAAVLD///// /////////////////////////+CDPAAAAAAALoft/////////////////////////////6xTEAAA AAAAF23W////////////////////////////+4AxAAAAAAAACWHM//////////////////////// ////0loCAAAAAAAAAF3M////////////////////////////qDUAAAAAAAAAAFzT//////////// ////////////////fQ0AAAAAAAAAAFTW///////////////////////////ufUUAAAAAAAAAAETU ///////////////////////////8qmQvAgAABCI3SVjO////////////////////////////6aRr QSg/Y3+Vp7ra///////////////////////////////VsqyyzOT6//////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////lu5d3Ysj/////////////////////////////////255nNgoAAoz///////// ///////////////////////Ifz8FAAAAAF7P/////////////////////////////9mBOQAAAAAA ADyq/////////////////////////////55MAAAAAAAAACOQ//////////////////////////// 3G8aAAAAAAAAABB9+f//////////////////////////r0gAAAAAAAAAAABv7v////////////// ////////////hBMAAAAAAAAAAABk5v/////////////////////////sUQAAAAAAAAAAAABX3v// //////////////////////+4FQAAAAAAAAAAAABI1v////////////////////////90FAAAAAAA AAAAAAA4z/////////////////////////miWhMAAAAAAAAAAAAjxf////////////////////// ///fm1wsAAAAAAAAAAANuv//////////////////////////77F9VTkiEQcBAhEisv////////// ////////////////////37+lmZiaoKy92v////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////476dgHz7//////////// ////////////////////8reEVzAOAB2s///////////////////////////////SikwVAAAAAABy 8////////////////////////////9Z/NgAAAAAAAABLyf//////////////////////////+pE+ AAAAAAAAAAAvq///////////////////////////wFoAAAAAAAAAAAAalf////////////////// ////////jSQAAAAAAAAAAAAIhP/////////////////////////nXgAAAAAAAAAAAAAAd/////// //////////////////+0JQAAAAAAAAAAAAAAav////////////////////////99AAAAAAAAAAAA AAAAW/T///////////////////////0rAAAAAAAAAAAAAAAATOv//////////////////////6UA AAAAAAAAAAAAAAAAPOH//////////////////////zAMAAAAAAAAAAAAAAAALdn///////////// ////////mYphJwAAAAAAAAAAAAAAJ9f//////////////////////+2+iVUnAAAAAAAAAAAAJdz/ /////////////////////////sqddl1KPDItLDA5R97///////////////////////////////3m 3dbS0NPZ5P////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////v1LvW/////////////////////////////////+e4j2pLLxVv//// ///////////////////////////koWc0BwAAAAA8yf///////////////////////////9aCOwAA AAAAAAASl///////////////////////////7YUxAAAAAAAAAAAAb/////////////////////// ////pkIAAAAAAAAAAAAAUOH////////////////////////saQAAAAAAAAAAAAAAN8n///////// //////////////+zLwAAAAAAAAAAAAAAIrb///////////////////////95AAAAAAAAAAAAAAAA EKf///////////////////////I0AAAAAAAAAAAAAAAAAJn//////////////////////6kAAAAA AAAAAAAAAAAAAIz//////////////////////0YAAAAAAAAAAAAAAAAAAH////////////////// ////3wAAAAAAAAAAAAAAAAAAAHT/////////////////////lwAAAAAAAAAAAAAAAAAAAGr///// ////////////////zgAAAAAAAAAAAAAAAAAAAGP//////////////////////ykiAQAAAAAAAAAA AAAAAGH//////////////////////7mjgFc3FwAAAAAAAAAAAGj///////////////////////// //rTrpSGfHVxcHJ3gZT///////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////27qdgmlp0///////////////////////////////yJNlPRkA AAAdnv///////////////////////////9uOTBMAAAAAAAAAbv////////////////////////// 23wsAAAAAAAAAAAARdf/////////////////////////iyoAAAAAAAAAAAAAIrT///////////// ///////////CRAAAAAAAAAAAAAAAA5f///////////////////////99AQAAAAAAAAAAAAAAAH// /////////////////////+c2AAAAAAAAAAAAAAAAAGr//////////////////////50AAAAAAAAA AAAAAAAAAFj//////////////////////0YAAAAAAAAAAAAAAAAAAEf4//////////////////// 6QAAAAAAAAAAAAAAAAAAADXp////////////////////lgAAAAAAAAAAAAAAAAAAACXb//////// ////////////vAAAAAAAAAAAAAAAAAAAABjO////////////////////6wAAAAAAAAAAAAAAAAAA AA/C/////////////////////wAAAAAAAAAAAAAAAAAAAAq5/////////////////////ycAAAAA AAAAAAAAAAAAAAq1/////////////////////3AAAAAAAAAAAAAAAAAAAA25//////////////// /////+CcjHBVQjMmGxQPDQ4SGia/////////////////////////////+eTY0s7My8zP1uD8//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////69O8 4////////////////////////////////9KphWVILBIBhf////////////////////////////Gr cTwPAAAAAAAAT+D/////////////////////////1X81AAAAAAAAAAAAH7L///////////////// ///////jdR0AAAAAAAAAAAAAAIn///////////////////////+QIwAAAAAAAAAAAAAAAGf///// /////////////////9VDAAAAAAAAAAAAAAAAAEj2/////////////////////4oAAAAAAAAAAAAA AAAAAC7d/////////////////////zgAAAAAAAAAAAAAAAAAABfI////////////////////vgAA AAAAAAAAAAAAAAAAAAS2////////////////////nAAAAAAAAAAAAAAAAAAAAACl//////////// ////////ugAAAAAAAAAAAAAAAAAAAACT////////////////////3AAAAAAAAAAAAAAAAAAAAACC /////////////////////wAAAAAAAAAAAAAAAAAAAAB0/////////////////////xMAAAAAAAAA AAAAAAAAAABo/////////////////////0IAAAAAAAAAAAAAAAAAAABg//////////////////// /3oAAAAAAAAAAAAAAAAAAABd/////////////////////9EAAAAAAAAAAAAAAAAAAABh//////// //////////////8kAAAAAAAAAAAAAAAAAABm///////////////////////JrJmJfXZxbGlnZmdr cHqM//////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// 4sWqkXlhd//////////////////////////////dpndQLAwAAAAAMcT///////////////////// ////4JJOEwAAAAAAAAAAAI/////////////////////////ScB0AAAAAAAAAAAAAAGD///////// /////////////+5vDwAAAAAAAAAAAAAAADfi/////////////////////5YcAAAAAAAAAAAAAAAA ABTA/////////////////////0AAAAAAAAAAAAAAAAAAAACj////////////////////rgAAAAAA AAAAAAAAAAAAAACJ////////////////////ngAAAAAAAAAAAAAAAAAAAABy//////////////// ////vAAAAAAAAAAAAAAAAAAAAABf////////////////////2gAAAAAAAAAAAAAAAAAAAABN//// ////////////////+gAAAAAAAAAAAAAAAAAAAAA7/////////////////////w4AAAAAAAAAAAAA AAAAAAAq+f///////////////////zMAAAAAAAAAAAAAAAAAAAAb6f///////////////////14A AAAAAAAAAAAAAAAAAAAP2////////////////////48AAAAAAAAAAAAAAAAAAAAG0P////////// /////////9AAAAAAAAAAAAAAAAAAAAAAyv////////////////////8rAAAAAAAAAAAAAAAAAAAA yP////////////////////+AAAAAAAAAAAAAAAAAAAAAy//////////////////////3FgEFBQMB AAAAAAABBg0Yy////////////////////////Ovh2M/Mzc/Q0tTX3OLq//////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////Haxv////////////////////////// ////8cajhGhNMhgAFav//////////////////////////7l8RhgAAAAAAAAAAHH///////////// ///////////XfC8AAAAAAAAAAAAAADvj/////////////////////99kCQAAAAAAAAAAAAAAAAy1 /////////////////////3QDAAAAAAAAAAAAAAAAAACN////////////////////xRUAAAAAAAAA AAAAAAAAAABq////////////////////mQAAAAAAAAAAAAAAAAAAAABL//////////////////// tgAAAAAAAAAAAAAAAAAAAAAw/f//////////////////1wAAAAAAAAAAAAAAAAAAAAAZ5/////// ////////////9gAAAAAAAAAAAAAAAAAAAAAF0////////////////////w4AAAAAAAAAAAAAAAAA AAAAwf///////////////////y8AAAAAAAAAAAAAAAAAAAAAr////////////////////1IAAAAA AAAAAAAAAAAAAAAAnv///////////////////3kAAAAAAAAAAAAAAAAAAAAAjv////////////// /////6UAAAAAAAAAAAAAAAAAAAAAgP///////////////////9gAAAAAAAAAAAAAAAAAAAAAdP// //////////////////82AAAAAAAAAAAAAAAAAAAAbf////////////////////98AAAAAAAAAAAA AAAAAAAAaf/////////////////////XDQAAAAAAAAAAAAAAAAAAaP////////////////////// cAAAAAAAAAAAAAAAAAAAYf///////////////////////1A8Rk5UWV1hZGhscHZ+if////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////79W7o4tzWpX///////////////// //////////i/jmRBIQUAAAAAAFL8///////////////////////3nVYYAAAAAAAAAAAAABfB//// /////////////////+VsFgAAAAAAAAAAAAAAAACN/////////////////////2MAAAAAAAAAAAAA AAAAAABe////////////////////nQAAAAAAAAAAAAAAAAAAAAA1/P//////////////////oQAA AAAAAAAAAAAAAAAAAAAR2f//////////////////ygAAAAAAAAAAAAAAAAAAAAAAu/////////// ////////7gAAAAAAAAAAAAAAAAAAAAAAof///////////////////wwAAAAAAAAAAAAAAAAAAAAA iv///////////////////y0AAAAAAAAAAAAAAAAAAAAAdv///////////////////00AAAAAAAAA AAAAAAAAAAAAZP///////////////////28AAAAAAAAAAAAAAAAAAAAAUv////////////////// /5QAAAAAAAAAAAAAAAAAAAAAQP///////////////////7wAAAAAAAAAAAAAAAAAAAAAMP////// /////////////+oOAAAAAAAAAAAAAAAAAAAAIv////////////////////9EAAAAAAAAAAAAAAAA AAAAFf////////////////////+BAAAAAAAAAAAAAAAAAAAAC/X////////////////////ICwAA AAAAAAAAAAAAAAAAAuz/////////////////////XgAAAAAAAAAAAAAAAAAAAOX///////////// ////////yRwAAAAAAAAAAAAAAAAAANr//////////////////////50BAAAAAAAAAAAAAAcOF8X/ ///////////////////////VubzBx87V2+Hm7fT7//////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////438//////////////////////////////7MaliG1UOyEHADLe//////// ////////////////15JZKQAAAAAAAAAAAACg//////////////////////+JNgAAAAAAAAAAAAAA AABn/////////////////////2YAAAAAAAAAAAAAAAAAAAAy9v//////////////////lQAAAAAA AAAAAAAAAAAAAAADyP//////////////////pwAAAAAAAAAAAAAAAAAAAAAAoP////////////// ////1wAAAAAAAAAAAAAAAAAAAAAAfP///////////////////wAAAAAAAAAAAAAAAAAAAAAAXv// /////////////////yUAAAAAAAAAAAAAAAAAAAAAQ////////////////////0gAAAAAAAAAAAAA AAAAAAAALP///////////////////2oAAAAAAAAAAAAAAAAAAAAAGP///////////////////4sA AAAAAAAAAAAAAAAAAAAABfP//////////////////68AAAAAAAAAAAAAAAAAAAAAAOH///////// /////////9UAAAAAAAAAAAAAAAAAAAAAAM////////////////////8kAAAAAAAAAAAAAAAAAAAA AL7///////////////////9UAAAAAAAAAAAAAAAAAAAAAK7///////////////////+LAAAAAAAA AAAAAAAAAAAAAJ/////////////////////LDgAAAAAAAAAAAAAAAAAAAJL///////////////// ////VwAAAAAAAAAAAAAAAAAAAIb/////////////////////qgoAAAAAAAAAAAAAAAAAAHn///// /////////////////20AAAAAAAAAAAAAAAAAAGb///////////////////////dVAAAAAAAAAAAA AAAAAEX/////////////////////////aiMrNT9KVWBqdX6HkZz///////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////+jPtp2DaU65/////////////////////////+yyg1w6HQIAAAAAAAB7 ///////////////////////FbSkAAAAAAAAAAAAAAABA/////////////////////4MbAAAAAAAA AAAAAAAAAAAHy///////////////////kgAAAAAAAAAAAAAAAAAAAAAAmP////////////////// pAAAAAAAAAAAAAAAAAAAAAAAav//////////////////3QAAAAAAAAAAAAAAAAAAAAAAQf////// /////////////w4AAAAAAAAAAAAAAAAAAAAAHf///////////////////zkAAAAAAAAAAAAAAAAA AAAAAOj//////////////////2AAAAAAAAAAAAAAAAAAAAAAAM7//////////////////4UAAAAA AAAAAAAAAAAAAAAAALf//////////////////6gAAAAAAAAAAAAAAAAAAAAAAKP///////////// /////8sAAAAAAAAAAAAAAAAAAAAAAJD//////////////////+8WAAAAAAAAAAAAAAAAAAAAAH3/ //////////////////8+AAAAAAAAAAAAAAAAAAAAAGz///////////////////9pAAAAAAAAAAAA AAAAAAAAAFr///////////////////+ZAAAAAAAAAAAAAAAAAAAAAEn////////////////////S FgAAAAAAAAAAAAAAAAAAADn/////////////////////WAAAAAAAAAAAAAAAAAAAACn///////// ////////////ogAAAAAAAAAAAAAAAAAAABn/////////////////////9VYAAAAAAAAAAAAAAAAA AAT//////////////////////7svAAAAAAAAAAAAAAAAAAD4//////////////////////+rKQAA AAAAAAAAAAAAAADP////////////////////////yUcAAAAABxMgLj5SaITt//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////9NXJ//// ////////////////////////+tKwknddQigMAABK////////////////////////xX1FFwAAAAAA AAAAAAAR2P///////////////////8RQAAAAAAAAAAAAAAAAAAAAn///////////////////ogwA AAAAAAAAAAAAAAAAAAAAaP//////////////////lAAAAAAAAAAAAAAAAAAAAAAANv////////// ////////2gAAAAAAAAAAAAAAAAAAAAAAB+z//////////////////xUAAAAAAAAAAAAAAAAAAAAA AMT//////////////////0gAAAAAAAAAAAAAAAAAAAAAAKL//////////////////3UAAAAAAAAA AAAAAAAAAAAAAIP//////////////////50AAAAAAAAAAAAAAAAAAAAAAGn///////////////// /8MAAAAAAAAAAAAAAAAAAAAAAFL//////////////////+cPAAAAAAAAAAAAAAAAAAAAAD7///// //////////////8zAAAAAAAAAAAAAAAAAAAAACv///////////////////9YAAAAAAAAAAAAAAAA AAAAABj///////////////////+BAAAAAAAAAAAAAAAAAAAAAAX///////////////////+sAAAA AAAAAAAAAAAAAAAAAAD////////////////////eIgAAAAAAAAAAAAAAAAAAAADy//////////// ////////XAAAAAAAAAAAAAAAAAAAAADf////////////////////nwAAAAAAAAAAAAAAAAAAAADM ////////////////////6EoAAAAAAAAAAAAAAAAAAAC3/////////////////////6AWAAAAAAAA AAAAAAAAAACc//////////////////////96AgAAAAAAAAAAAAAAAAB3//////////////////// ////egsAAAAAAAAAAAAAAAVM/////////////////////////6JXaHSAjZyrvNDn//////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /+3j///////////////////////////So3pYOikjHBYOBgAAn/////////////////////+sUg4A AAAAAAAAAAAAAAAAaf//////////////////5EMAAAAAAAAAAAAAAAAAAAAANP////////////// ////eQAAAAAAAAAAAAAAAAAAAAAAAOP/////////////////zQAAAAAAAAAAAAAAAAAAAAAAALL/ /////////////////xMAAAAAAAAAAAAAAAAAAAAAAIX//////////////////08AAAAAAAAAAAAA AAAAAAAAAF3//////////////////4MAAAAAAAAAAAAAAAAAAAAAADr//////////////////7IA AAAAAAAAAAAAAAAAAAAAABz//////////////////9sDAAAAAAAAAAAAAAAAAAAAAAL///////// //////////8qAAAAAAAAAAAAAAAAAAAAAAD7//////////////////9PAAAAAAAAAAAAAAAAAAAA AADn//////////////////90AAAAAAAAAAAAAAAAAAAAAADU//////////////////+bAAAAAAAA AAAAAAAAAAAAAADA///////////////////EBwAAAAAAAAAAAAAAAAAAAACt//////////////// ///wMwAAAAAAAAAAAAAAAAAAAACa////////////////////ZwAAAAAAAAAAAAAAAAAAAACG//// ////////////////owAAAAAAAAAAAAAAAAAAAABy////////////////////40QAAAAAAAAAAAAA AAAAAABc/////////////////////5EGAAAAAAAAAAAAAAAAAABB/////////////////////+tf AAAAAAAAAAAAAAAAAAAd///////////////////////KSwAAAAAAAAAAAAAAAAAA//////////// ////////////y1cAAAwYJDE/TmB0i6fH///////////////////////////X5/L///////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////r1M3Hwr66t7Owramopf////////////////// /91+Uz8wIxkRCQIAAAAAAAAAANv/////////////////dgAAAAAAAAAAAAAAAAAAAAAAAKf///// ////////////ugAAAAAAAAAAAAAAAAAAAAAAAHX//////////////////wcAAAAAAAAAAAAAAAAA AAAAAEb//////////////////04AAAAAAAAAAAAAAAAAAAAAABr//////////////////4wAAAAA AAAAAAAAAAAAAAAAAAD9/////////////////8EAAAAAAAAAAAAAAAAAAAAAAADb//////////// //////EZAAAAAAAAAAAAAAAAAAAAAAC+//////////////////9EAAAAAAAAAAAAAAAAAAAAAACk //////////////////9rAAAAAAAAAAAAAAAAAAAAAACN//////////////////+RAAAAAAAAAAAA AAAAAAAAAAB5//////////////////+3AAAAAAAAAAAAAAAAAAAAAABm///////////////////e IQAAAAAAAAAAAAAAAAAAAABT////////////////////SgAAAAAAAAAAAAAAAAAAAAA///////// ////////////dwAAAAAAAAAAAAAAAAAAAAAr////////////////////rAoAAAAAAAAAAAAAAAAA AAAW////////////////////50UAAAAAAAAAAAAAAAAAAAAA/////////////////////4oAAAAA AAAAAAAAAAAAAAAA/////////////////////9ZNAAAAAAAAAAAAAAAAAAAA/f////////////// //////+nLgAAAAAAAAAAAAAAAAAA1f//////////////////////mCoAAAAAAAAAAAYYLUVg4P// /////////////////////6hjdIGPnKu7zeL6//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////ny7epnZWOiYSAfHh0cGxoZZD/////////////////vGpILRkKAAAAAAAAAAAAAAAA ADH//////////////////wAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////0IAAAAAAAAA AAAAAAAAAAAAAADc/////////////////44AAAAAAAAAAAAAAAAAAAAAAACy//////////////// /84AAAAAAAAAAAAAAAAAAAAAAACN//////////////////8pAAAAAAAAAAAAAAAAAAAAAABr//// //////////////9aAAAAAAAAAAAAAAAAAAAAAABO//////////////////+GAAAAAAAAAAAAAAAA AAAAAAA0//////////////////+uAAAAAAAAAAAAAAAAAAAAAAAe///////////////////UFwAA AAAAAAAAAAAAAAAAAAAK///////////////////6PQAAAAAAAAAAAAAAAAAAAAAA//////////// ////////ZQAAAAAAAAAAAAAAAAAAAAAA////////////////////jgAAAAAAAAAAAAAAAAAAAAAA ////////////////////vBkAAAAAAAAAAAAAAAAAAAAA7///////////////////8U4AAAAAAAAA AAAAAAAAAAAA2P///////////////////4sAAAAAAAAAAAAAAAAAAAAAv/////////////////// /8xDAAAAAAAAAAAAAAAAAAAAof////////////////////+RGQAAAAAAAAAAAAAAAAAAev////// ///////////////ydAoAAAAAAAAAAAAAAAARX///////////////////////6HQTHyw4RVNicoWb tNL1///////////////////////////X6PT///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////v38/Hu7Ovr7PH//////////////////9mymYd5bWRdVlFL RkE8ODItKCPE/////////////////0slCwAAAAAAAAAAAAAAAAAAAACS/////////////////4gA AAAAAAAAAAAAAAAAAAAAAABm/////////////////9cAAAAAAAAAAAAAAAAAAAAAAAA9//////// //////////8zAAAAAAAAAAAAAAAAAAAAAAAY//////////////////9sAAAAAAAAAAAAAAAAAAAA AAAA//////////////////+dAAAAAAAAAAAAAAAAAAAAAAAA///////////////////JDAAAAAAA AAAAAAAAAAAAAAAA9v/////////////////xNQAAAAAAAAAAAAAAAAAAAAAA3/////////////// ////WwAAAAAAAAAAAAAAAAAAAAAAy///////////////////ggAAAAAAAAAAAAAAAAAAAAAAt/// ////////////////qQYAAAAAAAAAAAAAAAAAAAAAo///////////////////0y8AAAAAAAAAAAAA AAAAAAAAjf///////////////////14AAAAAAAAAAAAAAAAAAAAAd////////////////////5MH AAAAAAAAAAAAAAAAAAAAXv///////////////////81DAAAAAAAAAAAAAAAAAAAAQP////////// //////////+HEAAAAAAAAAAAAAAAAAAAHP/////////////////////YXgAAAAAAAAAAAAAAAAAA AP//////////////////////v04AAAAAAA4cLD5SaoalyP///////////////////////8J8jJqn tsXW6P3///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////+7h 18/Jw766trGtqaempqeu/////////////////76GbVtMQDcvKCIcFhALBAAAAAAU//////////// /////9cFAAAAAAAAAAAAAAAAAAAAAAAA//////////////////80AAAAAAAAAAAAAAAAAAAAAAAA 9v////////////////92AAAAAAAAAAAAAAAAAAAAAAAA0v////////////////+wAAAAAAAAAAAA AAAAAAAAAAAAsv/////////////////hJAAAAAAAAAAAAAAAAAAAAAAAlv////////////////// UQAAAAAAAAAAAAAAAAAAAAAAfP//////////////////eQAAAAAAAAAAAAAAAAAAAAAAZv////// ////////////oAAAAAAAAAAAAAAAAAAAAAAAUf//////////////////xyMAAAAAAAAAAAAAAAAA AAAAPP//////////////////7ksAAAAAAAAAAAAAAAAAAAAAJ////////////////////3QAAAAA AAAAAAAAAAAAAAAAEP///////////////////6MWAAAAAAAAAAAAAAAAAAAAAP////////////// /////9hMAAAAAAAAAAAAAAAAAAAAAP////////////////////+IDwAAAAAAAAAAAAAAAAAAAP// ///////////////////LUwAAAAAAAAAAAAAAAAAAAP//////////////////////pTgAAAAAAAAA AAkdNE5rjP///////////////////////5k5Q1Ffbn2OoLXL5f////////////////////////// ///r+f////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////rzLmsoZmRi4aBfHh0cGtoZmZo8f// //////////////9hRTIjGA4GAAAAAAAAAAAAAAAAnv////////////////9+AAAAAAAAAAAAAAAA AAAAAAAAdf/////////////////DAAAAAAAAAAAAAAAAAAAAAAAAUv/////////////////7NwAA AAAAAAAAAAAAAAAAAAAAMv//////////////////agAAAAAAAAAAAAAAAAAAAAAAFv////////// ////////lgAAAAAAAAAAAAAAAAAAAAAAAP//////////////////vxsAAAAAAAAAAAAAAAAAAAAA AP//////////////////5kIAAAAAAAAAAAAAAAAAAAAAAP///////////////////2kAAAAAAAAA AAAAAAAAAAAAAP///////////////////5ACAAAAAAAAAAAAAAAAAAAAAP////////////////// /7ksAAAAAAAAAAAAAAAAAAAAAPT//////////////////+hcAAAAAAAAAAAAAAAAAAAAANn///// //////////////+RGAAAAAAAAAAAAAAAAAAAALz////////////////////KUwAAAAAAAAAAAAAA AAAAAJ3/////////////////////mC4AAAAAAAAAAAAAEClGZsT/////////////////////7n8d DBooN0ZXaX6Vr8zu/////////////////////////+egqrnI2On8//////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////fXw6+bi39vY1NLR 0NLX4P/////////////////Onop8cWlhW1ZRTEhDPjo2Mi8uMf/////////////////SJREDAAAA AAAAAAAAAAAAAAAAAP//////////////////QgAAAAAAAAAAAAAAAAAAAAAAAP////////////// ////fQAAAAAAAAAAAAAAAAAAAAAAAP//////////////////sAsAAAAAAAAAAAAAAAAAAAAAAPb/ ////////////////3TkAAAAAAAAAAAAAAAAAAAAAANz//////////////////2IAAAAAAAAAAAAA AAAAAAAAAMX//////////////////4kAAAAAAAAAAAAAAAAAAAAAAK///////////////////68i AAAAAAAAAAAAAAAAAAAAAJn//////////////////9ZIAAAAAAAAAAAAAAAAAAAAAIL///////// //////////9yAAAAAAAAAAAAAAAAAAAAAGn///////////////////+hKAAAAAAAAAAAAAAAAAAA AE7////////////////////TXAAAAAAAAAAAAAAAAAAAADP/////////////////////li4AAAAA AAAAAAAAABUyUnf/////////////////////4HITAAABDx8vQlhwi6jI7P////////////////// /////8pvbn6OnrDD2O////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////+eDSyMC6tbCsqKWin52bm5ygp/////////////////// gmRWS0M8NjArJyIdGBMOCQQAANT/////////////////kgAAAAAAAAAAAAAAAAAAAAAAAK3///// ////////////zB4AAAAAAAAAAAAAAAAAAAAAAIv/////////////////+1IAAAAAAAAAAAAAAAAA AAAAAG3//////////////////4AAAAAAAAAAAAAAAAAAAAAAAFH//////////////////6kbAAAA AAAAAAAAAAAAAAAAADr//////////////////9BCAAAAAAAAAAAAAAAAAAAAACP///////////// //////VoAAAAAAAAAAAAAAAAAAAAAAz///////////////////+PFAAAAAAAAAAAAAAAAAAAAAD/ //////////////////+4PgAAAAAAAAAAAAAAAAAAAAD////////////////////lbQMAAAAAAAAA AAAAAAAAAAD/////////////////////nzcAAAAAAAAAAAAAABAvUHT///////////////////// 3XIUAAAAAAYXKkFadZS22v///////////////////////7xYRFRkdYaar8jj//////////////// ///////////////SzeHx//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////8+/r7/f////////////// ////////7rmonZaPioaCf3t4dnRyc3V4f5D/////////////////6086MCghGxUQCwcCAAAAAAAA ACP//////////////////2kAAAAAAAAAAAAAAAAAAAAAAAD//////////////////5sKAAAAAAAA AAAAAAAAAAAAAAD//////////////////8g5AAAAAAAAAAAAAAAAAAAAAAD///////////////// //BjAAAAAAAAAAAAAAAAAAAAAAD///////////////////+KDgAAAAAAAAAAAAAAAAAAAAD///// //////////////+wNAAAAAAAAAAAAAAAAAAAAAD////////////////////VWwAAAAAAAAAAAAAA AAAAAAD/////////////////////hRoAAAAAAAAAAAAAAAAAAAPs////////////////////sUkA AAAAAAAAAAAAABg5XYH/////////////////////5XseAAAAAAAMIThSb4+z2f////////////// /////////7tYKTlJWmyAl7DN7f////////////////////////////+znrTF1+v///////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////67+fh3NnW1NLQ0NDR09ng6/f//////////////////7iKfndxbGhkYV5b WVhXV1leZXH//////////////////78xHxYQCgUAAAAAAAAAAAAAAAD//////////////////+1W AAAAAAAAAAAAAAAAAAAAAADo//////////////////+CBAAAAAAAAAAAAAAAAAAAAADM//////// //////////+rLwAAAAAAAAAAAAAAAAAAAACz///////////////////SVwAAAAAAAAAAAAAAAAAA AACb///////////////////3fBAAAAAAAAAAAAAAAAAAAACF////////////////////ojcAAAAA AAAAAAAAAAAABSuU////////////////////y2ECAAAAAAAAAAAADCxQdp7R//////////////// ////9Y0wAAAAAAANIztXdpm+5f///////////////////////8NjGCo7TF90jafG5/////////// //////////////////+of5aou9Dn/////////////////////////////////////f////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////dzsW/ vLm2tLOxsrK1ucDJ1eP///////////////////+XbGReWVVRT0xKSEdGSEtQWWah//////////// //////+nJg4HAgAAAAAAAAAAAAAAAABW///////////////////OUAAAAAAAAAAAAAAAAAAAAAA6 ///////////////////0eQsAAAAAAAAAAAAAAAAAAAAh////////////////////nzIAAAAAAAAA AAAAAAAAAAAO////////////////////xFgAAAAAAAAAAAAAAAAIMVqE//////////////////// 6X8fAAAAAAAAAAAGJ0txmsLp/////////////////////6dJAAAAAAIXL0poiq7V/P////////// /////////////9N1HiY4Sl51j6vL7/////////////////////////////+ucoWYrMLb9v////// ////////////////////////////3+////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////v7KqpqOhoJ+foaOmrLTAzd3s//// ////////////////ilpTT0tIRkRDQkFCQ0dOWWl9////////////////////ni4GAAAAAAAAAAAA AAAAAAAA////////////////////w1YAAAAAAAAAAAAAAAAAABVB////////////////////53sa AAAAAAAAAAAAAAk0YIu0/////////////////////58/AAAAAAAAAAQlSnGZwuv///////////// /////////8ZmDwAAABMqRGKDp831/////////////////////////+uONSs+UWiBnbze//////// //////////////////////++dn+UqcHc+f//////////////////////////////////0tjz//// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////28vDv7+/x8/j9//// ////////////////////////+LCfmpeWlpaYm5+krLbC0eHu/////////////////////o5QSkdF RERERUZHS1FaaIOp/////////////////////6ZBAQAAAAAAAAAABzZjj7rh//////////////// /////8ZlCgAAAAAABCdMc5zE7P///////////////////////+WILwAAEypEYoKmzPT///////// //////////////////+rUDZKYXuWtNb6///////////////////////////////Sh3yYscvp//// ////////////////////////////////1M7t//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////t5ePj5Obo7fH5//////////////////////////// //2xlJKSlZmdo6myvNDt//////////////////////////+dU0dJTVFWYHOKr9b8//////////// //////////////+yVgAaNVBti67S9//////////////////////////////Nbz5fe5m31/n///// ///////////////////////////un4OmwuH/////////////////////////////////////487r //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD///////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////wAAAP/uAA5BZG9iZQBkgAAAAAL/2wCEABIODg4QDhUQEBUeExETHiMa FRUaIyIXFxcXFyIRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBFBMTFhkWGxcX GxQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/A ABQIACEAZAQBIgACEQEDEQEEIgD/3QAEAAf/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJ CgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIx BUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXy s4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQD BAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMH JjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3 h5ent8f/2gAOBAEAAhEDEQQAAD8A4dSaxzjDRJ8BqtLpPTBmPc+wltNehjku/cXSV0Y+Mz9E1lLR +eYn/tx6nx4JTHESIQ8WbHhMxxE8EHuE0gCSY+KrZeV6IAaJe7UeELNNllrveXPPgNAuWq6R1C3i ktHi6Gj/AKatt+r2RzbbXX5SZWrb1HpzPp3mw+DZI/8AAfTU22VvrbbRiG1rtQTs/wDRj3qYYcXf jP8AV9TKMOL97jP9X1f9B1X5eOzmwE+A1/6lCPUKvzGucqrMfJ/NqazzP/qTeoua8OLbLwwjw3f9 8a1ZY6Jht/nMsE+DY/8AJog6V0oc2WP+DXf98qetL181ujMEj/rjB/1LUBnUc+1z214kurO1wNgB BR4MQr0/8ycl3BiFenf+pOTb+2Xu+jQ75qH2rLPDGN+JH/pRVzXj8vyP+i7/AL+pOxcdgaXXEB2r TtlV/wBm9IHFdzv7Nn/pNP8AYukj/tLe75Wf+SVv7T1X/uGD/wBcCqu6zmV3Cl2GRYeGbjJ/q+1I jGNxGP8A1LiURjG4iP0f5pIcnM8ax82/+TT+tlH/AA1Q+YQPSw/9P97UUYVJYXttlo76JvQ6S3/t Hd/mP/8ASiiR0Uc4tnzY7/yavDK6mRJwgfIWt3f5ir5HWbsZwbkYpYXCR7wdP81I8AFkRHf9Qo8F Eng8f1LIWZh4ur+9v/kE/wCv9rWn5t/8iq/o4gMC/wCe3T/OU68KuwE1WggH91UL2YFzmtooLKgY LoO/cB6lu/3/AM2xBfjYpb9At0DpaHkwTs/wqlb1HGtyfUDHMa7Vwn86PTf9D99ig7JxAyAd5gNA aHM9s7/pPeoTwG64PsYSY6/J9jbq+0NB9V4c7QxAgT/VRN7wdCD21hRqosZWGbg7aI+5T2vniNZ1 hUPQf6/ofnbtqSXrP9b1/wA/duSUPp/53/MYvT/zv+az3jZv7cpJ9o27e3CS/9DE6DmMqc7HsO1t hBaT+99FZ+flZN+Q8XEjaT+j7NhU5jjlEstdYAX6uGm7uf6ykOQmAj+6ye4TAQvSL1XUKHPaLG67 OR5Kxj1VV1t9Pgj6XcoyYNAEDQIYXS/V0u9C3X84ASsQMwy0e8tcGy7SRu/cV+vqfoVium8BjRDR 6Q3QP33J+EiMuKRXYiIT4iV1m9SjfX20P3q/NknQc6fBV34rLHFz2ann3FW8i7FoxLLcV5F7bdC4 j1ND+5u/mVW6Xk2ZXVfVtiXNM7RA49qqX5FGRa997y4+1rSxor3D8+xyLi5bMQEUXwHmXTXuLf7T keO5g3UIforuK5g3UY/oo2NtfcGXNGws7fR/z1LJrbXiFjZgERrrqUdlbq2hrBA5MklRtobcZe06 afS/8itXNuwaM1tl9ljbGgHY0exCq6ic3qNX2doAqa7WzQuafp/Q3qhk5leWxrbsjQGdK4P+c1Vq bKcY+tRafWb9EFuk/RTpZfVp/N8XH/WTLJctK9rj4/67Tx23vxy2trSw6bj9JSOOKMZ4sdO8j6Os K1XQ2lxNbOf5X/klN7DaCx7faVuX29OffGSyzHvBjd7h/melurVfr1VgoqsNgfW07WyIdx/pGoX7 ZsmPWkaaPrDtv7/0VTyMoZLwb7nPAaSGxtAf/o/YjPJExIH6fb0/4yp5AYkfNx/u/wDdNGtuUKv0 RZbX+7A/78p4D273t2lp5MGQifYq/wDRx/VcUauptQ9jQ3XXuY/tLOSkqy6vHhpbZz9IEcf1UQV4 G4zY6AXaQfo/4JVuHxYOHxTJKMv10+CjNscCYH3qkkpQN0bhHikmrUiSSS//0eHSTJJJ7PcJLw5J FbwPim/N+9DSQOyzo+391JeHJInZR8VFJHqfqu6l9xCS8OSUgl/r+Kikl/BXV9xSXhySkpdz80NJ Luo7l9xKXivDklJyX9yikkp9xSXhySl+akopJKfcUl4ckv/Z --047d7b3a7f0c5eb6c204f8df4f45-- From ddiss@suse.de Thu May 8 03:57:10 2014 Return-Path: <ddiss@suse.de> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9EC3E7F55 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:57:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F3138F804C for <xfs@oss.sgi.com>; Thu, 8 May 2014 01:57:10 -0700 (PDT) X-ASG-Debug-ID: 1399539427-04cbb03cc73cc5d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 63GHTJv4QL0SLyGJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 01:57:08 -0700 (PDT) X-Barracuda-Envelope-From: ddiss@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1EBDFAC7A; Thu, 8 May 2014 08:57:07 +0000 (UTC) Date: Thu, 8 May 2014 11:05:22 +0200 From: David Disseldorp <ddiss@suse.de> To: bo.li.liu@oracle.com Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Message-ID: <20140508110522.21930dfd@f163.suse.de> X-ASG-Orig-Subj: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP In-Reply-To: <20140508041123.GB3407@localhost.localdomain> References: <1399465998-26545-1-git-send-email-ddiss@suse.de> <20140508041123.GB3407@localhost.localdomain> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-suse-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1399539427 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=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5635 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi liubo, On Thu, 8 May 2014 12:11:24 +0800, Liu Bo wrote: > Something different here, I didn't get EIO on 3.15.0-rc4. Strange, I'm able to consistently reproduce this on a vanilla v3.15-rc4-202-g30321c7 kernel. Does that mean the updated test passes successfully for you? Cheers, David From mcaubet@pic.es Thu May 8 04:12:40 2014 Return-Path: <mcaubet@pic.es> X-Spam-Checker-Version: SpamAssassin 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 3FB907F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 04:12:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D49EFAC003 for <xfs@oss.sgi.com>; Thu, 8 May 2014 02:12:36 -0700 (PDT) X-ASG-Debug-ID: 1399540353-04bdf02b8a3f8460001-NocioJ Received: from mail-oa0-f52.google.com (mail-oa0-f52.google.com [209.85.219.52]) by cuda.sgi.com with ESMTP id 682CI4d33qIYK3jF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 02:12:33 -0700 (PDT) X-Barracuda-Envelope-From: mcaubet@pic.es X-Barracuda-Apparent-Source-IP: 209.85.219.52 Received: by mail-oa0-f52.google.com with SMTP id eb12so2740408oac.11 for <xfs@oss.sgi.com>; Thu, 08 May 2014 02:12: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=RKbJPrLsd9gaPKuF7okncD4A56UvIbv1GLJlkKIpyn0=; b=IhQwE4+OFrSS+E6aJdVwf860NF0O59bsC6wI5mrlQ3C35zVeoS0DnATvBRwQdbq2eQ giEL80pcGxNOLrIlI39UIhUrPlz6SMf+6EFFgCSF8sEX5F8eLaPbo4mjXmsDQVYuuQIP 9xB98DAFWzWQ7NwxwwPQWfRkvacNJyMmmiQjUW29vjCwup3OySXIKF3T/sO4TH68VWgk zLaEhpbfGJNPvQWCSnXmXyfBNqJZV0sY3NjFqHuDGRVf7YAMPTD72PVK5AhdDuqGjhKN LEOE7IuYSnS/sSPHo6CdUXaAB1839cAiFyHtXPrYeUS0N2BsLV6DSev6Ckfh9S+9DbV/ s+zw== X-Gm-Message-State: ALoCoQkczmk4uEy0p0XRuQFSZyyMOBjcnH9Lc7RMkQNJm0alO4hOrKJl9T7LC1s3ROZMgF5bAeg8 MIME-Version: 1.0 X-Received: by 10.182.225.137 with SMTP id rk9mr2343499obc.51.1399540353065; Thu, 08 May 2014 02:12:33 -0700 (PDT) Received: by 10.76.114.48 with HTTP; Thu, 8 May 2014 02:12:32 -0700 (PDT) In-Reply-To: <536AEBB9.3020807@hardwarefreak.com> References: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> <536AEBB9.3020807@hardwarefreak.com> Date: Thu, 8 May 2014 11:12:32 +0200 Message-ID: <CAPrERe3v_1mPy6ABAKj4TxTmy1FB2=ipi6Vn3N6dZ7w8B9DeZA@mail.gmail.com> Subject: Re: Alignment: XFS + LVM2 From: Marc Caubet <mcaubet@pic.es> X-ASG-Orig-Subj: Re: Alignment: XFS + LVM2 To: stan@hardwarefreak.com Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c3001897f62304f8dfe1ee X-Barracuda-Connect: mail-oa0-f52.google.com[209.85.219.52] X-Barracuda-Start-Time: 1399540353 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5635 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c3001897f62304f8dfe1ee Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Stan, thanks for your answer. Everything begins and ends with the workload. > > On 5/7/2014 7:43 AM, Marc Caubet wrote: > > Hi all, > > > > I am trying to setup a storage pool with correct disk alignment and I > hope > > somebody can help me to understand some unclear parts to me when > > configuring XFS over LVM2. > > I'll try. But to be honest, after my first read of your post, a few > things jump out as breaking traditional rules. > > The first thing you need to consider is your workload and the type of > read/write patterns it will generate. This document is unfinished, and > unformatted, but reading what is there should be informative: > > http://www.hardwarefreak.com/xfs/storage-arch.txt > Basically we are moving a lot of data :) It means, parallel large files (GBs) are being written and read all the time. Basically we have a batch farm with 3,5k cores processing jobs that are constantly reading and writing to the storage pools (4PBs). Only few pools (~5% of the total) contain small files (and only small files). > > > Actually we have few storage pools with the following settings each: > > > > - LSI Controller with 3xRAID6 > > - Each RAID6 is configured with 10 data disks + 2 for double-parity. > > - Each disk has a capacity of 4TB, 512e and physical sector size of 4K. > > 512e drives may cause data loss. See: > http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.html#gmlfz > Haven't experienced this yet. But good to know thanks :) On the other hand, we do not use zfs > > - 3x(10+2) configuration was considered in order to gain best performan= ce > > and data safety (less disks per RAID less probability of data corruptio= n) > > RAID6 is the worst performer of all the RAID levels but gives the best > resilience to multiple drive failure. The reason for using fewer drives > per array has less to do with probability of corruption, but > > 1. Limiting RMW operations to as few drives as possible, especially for > controllers that do full stripe scrubbing on RMW > > 2. Lowering bandwidth and time required to rebuild a dead drive, fewer > drives tied up during a rebuild > > > From the O.S. side we see: > > > > [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc > ... > > You omitted crucial information. What is the stripe unit size of each > RAID6? > Actually the stripe size for each RAID6 is 256KB but we plan to increase some pools to 1MB for all their RAIDs. It will be in order to compare performance for pools containing large files and if this improves, we will apply it to the other systems in the future. > > The idea is to aggregate the above devices and show only 1 storage spac= e. > > We did as follows: > > > > vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc > > lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a > > You've told LVM that its stripe unit is 4MB, and thus the stripe width > of each RAID6 is 4MB. This is not possible with 10 data spindles. > Again, show the RAID geometry from the LSI tools. > When creating a nested stripe, the stripe unit of the outer stripe (LVM) > must equal the stripe width of eachinner stripe (RAID6). > Great. Hence, if the RAID6 stripe size is 256k then the LVM should be defined with 256k as well, isn't it? > Hence, stripe of the 3 RAID6 in a LV. > > Each RAID6 has ~1.3GB/s of throughput. By striping the 3 arrays into a > nested RAID60 this suggests you need single file throughput greater than > 1.3GB/s and that all files are very large. If not, you'd be better off > using a concatenation, and using md to accomplish that instead of LVM. > > > And here is my first question: How can I check if the storage and the L= V > > are correctly aligned? > > Answer is above. But the more important question is whether your > workload wants a stripe or a concatenation. > > > On the other hand, I have formatted XFS as follows: > > > > mkfs.xfs -d su=3D256k,sw=3D10 -l size=3D128m,lazy-count=3D1 /dev/dcvg_a= /dcpool > > This alignment is not correct. XFS must be aligned to the LVM stripe > geometry. Here you apparently aligned XFS to the RAID6 geometry > instead. Why are you manually specifying a 128M log? If you knew your > workload that well, you would not have made these other mistakes. > We receive several parallel writes all the time, and afaik filesystems with such write load benenfit from a larger log. 128M is the maximum log size. So how XFS should be formatted then? As you specify, should be aligned with the LVM stripe, as we have a LV with 3 stripes then 256k*3 and sw=3D30? Thanks a lot, --=20 Marc Caubet Serrabou PIC (Port d'Informaci=C3=B3 Cient=C3=ADfica) Campus UAB, Edificio D E-08193 Bellaterra, Barcelona Tel: +34 93 581 33 22 Fax: +34 93 581 41 10 http://www.pic.es Avis - Aviso - Legal Notice: http://www.ifae.es/legal.html --001a11c3001897f62304f8dfe1ee Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Hi Stan, <br><br>thanks for your answer.<br><div class=3D"= gmail_extra"><br><div class=3D"gmail_quote"><blockquote class=3D"gmail_quot= e" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204)= ;padding-left:1ex"> Everything begins and ends with the workload.<br> <div class=3D""><br> On 5/7/2014 7:43 AM, Marc Caubet wrote:<br> > Hi all,<br> ><br> > I am trying to setup a storage pool with correct disk alignment and I = hope<br> > somebody can help me to understand some unclear parts to me when<br> > configuring XFS over LVM2.<br> <br> </div>I'll try. =C2=A0But to be honest, after my first read of your pos= t, a few<br> things jump out as breaking traditional rules.<br> <br> The first thing you need to consider is your workload and the type of<br> read/write patterns it will generate. =C2=A0This document is unfinished, an= d<br> unformatted, but reading what is there should be informative:<br> <br> <a href=3D"http://www.hardwarefreak.com/xfs/storage-arch.txt" target=3D"_bl= ank">http://www.hardwarefreak.com/xfs/storage-arch.txt</a><br></blockquote>= <div><br></div><div>Basically we are moving a lot of data :) It means, para= llel large files (GBs) are being written and read all the time. Basically w= e have a batch farm with 3,5k cores processing jobs that are constantly rea= ding and writing to the storage pools (4PBs). Only few pools (~5% of the to= tal) contain small files (and only small files).<br> </div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b= order-left:1px solid rgb(204,204,204);padding-left:1ex"> <div class=3D""><br> > Actually we have few storage pools with the following settings each:<b= r> ><br> > - LSI Controller with 3xRAID6<br> > - Each RAID6 is configured with 10 data disks + 2 for double-parity.<b= r> > - Each disk has a capacity of 4TB, 512e and physical sector size of 4K= .<br> <br> </div>512e drives may cause data loss. =C2=A0See:<br> <a href=3D"http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.html#gmlfz= " target=3D"_blank">http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.h= tml#gmlfz</a><br></blockquote><div><br></div><div>Haven't experienced t= his yet. But good to know thanks :)=C2=A0 On the other hand, we do not use = zfs<br> <br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8= ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br><div class= =3D""> > - 3x(10+2) configuration was considered in order to gain best performa= nce<br> > and data safety (less disks per RAID less probability of data corrupti= on)<br> <br> </div>RAID6 is the worst performer of all the RAID levels but gives the bes= t<br> resilience to multiple drive failure. =C2=A0The reason for using fewer driv= es<br> per array has less to do with probability of corruption, but<br> <br> 1. Limiting RMW operations to as few drives as possible, especially for<br> controllers that do full stripe scrubbing on RMW<br> <br> 2. =C2=A0Lowering bandwidth and time required to rebuild a dead drive, fewe= r<br> drives tied up during a rebuild <br></blockquote><blockquote class=3D"gmail= _quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204= ,204);padding-left:1ex"> <div class=3D""><br> > From the O.S. side we see:<br> ><br> > [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc<br> </div>...<br> <br> You omitted crucial information. =C2=A0What is the stripe unit size of each= <br> RAID6?<br></blockquote><div><br></div><div>Actually the stripe size for eac= h RAID6 is 256KB but we plan to increase some pools to 1MB for all their RA= IDs. It will be in order to compare performance for pools containing large = files and if this improves, we will apply it to the other systems in the fu= ture.<br> </div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0p= x 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">&g= t; The idea is to aggregate the above devices and show only 1 storage space= .<br> <div class=3D""> > We did as follows:<br> ><br> > vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc<br> > lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a<br> <br> </div>You've told LVM that its stripe unit is 4MB, and thus the stripe = width<br> of each RAID6 is 4MB. =C2=A0This is not possible with 10 data spindles.<br> Again, show the RAID geometry from the LSI tools. <br></blockquote><blockqu= ote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px= solid rgb(204,204,204);padding-left:1ex"> When creating a nested stripe, the stripe unit of the outer stripe (LVM)<br= > must equal the stripe width of eachinner stripe (RAID6).<br></blockquote><d= iv><br></div><div>Great. Hence, if the RAID6 stripe size is 256k then the L= VM should be defined with 256k as well, isn't it? <br><br></div><blockq= uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1p= x solid rgb(204,204,204);padding-left:1ex"> <div class=3D""> > Hence, stripe of the 3 RAID6 in a LV.<br> <br> </div>Each RAID6 has ~1.3GB/s of throughput. =C2=A0By striping the 3 arrays= into a<br> nested RAID60 this suggests you need single file throughput greater than<br= > 1.3GB/s and that all files are very large. =C2=A0If not, you'd be bette= r off<br> using a concatenation, and using md to accomplish that instead of LVM.<br> <div class=3D""><br> > And here is my first question: How can I check if the storage and the = LV<br> > are correctly aligned?<br> <br> </div>Answer is above. =C2=A0But the more important question is whether you= r<br> workload wants a stripe or a concatenation.<br> <div class=3D""><br> > On the other hand, I have formatted XFS as follows:<br> ><br> > mkfs.xfs -d su=3D256k,sw=3D10 -l size=3D128m,lazy-count=3D1 /dev/dcvg_= a/dcpool<br> <br> </div>This alignment is not correct. =C2=A0XFS must be aligned to the LVM s= tripe<br> geometry. =C2=A0Here you apparently aligned XFS to the RAID6 geometry<br> instead. =C2=A0Why are you manually specifying a 128M log? =C2=A0If you kne= w your<br> workload that well, you would not have made these other mistakes.<br></bloc= kquote><div><br></div><div>We receive several parallel writes all the time,= and afaik filesystems with such write load benenfit from a larger log. 128= M is the maximum log size.<br> <br>So how XFS should be formatted then? As you specify, should be aligned = with the LVM stripe, as we have a LV with 3 stripes then 256k*3 and sw=3D30= ? <br></div></div><br>Thanks a lot,<br>-- <br>Marc Caubet Serrabou<br>PIC (= Port d'Informaci=C3=B3 Cient=C3=ADfica)<br> Campus UAB, Edificio D<br>E-08193 Bellaterra, Barcelona<br>Tel: +34 93 581 = 33 22<br>Fax: +34 93 581 41 10<br><a href=3D"http://www.pic.es" target=3D"_= blank">http://www.pic.es</a><br>Avis - Aviso - Legal Notice: <a href=3D"htt= p://www.ifae.es/legal.html" target=3D"_blank">http://www.ifae.es/legal.html= </a> </div></div> --001a11c3001897f62304f8dfe1ee-- From namjae.jeon@samsung.com Thu May 8 04:49:23 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 F25BD7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 04:49:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9439304048 for <xfs@oss.sgi.com>; Thu, 8 May 2014 02:49:19 -0700 (PDT) X-ASG-Debug-ID: 1399542556-04cbb03cc73ce400001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id XETvvg6MDXlWpnTu (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 02:49:17 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900KGT1Y3TF00@mailout3.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 18:49:15 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 83.43.11120.B135B635; Thu, 08 May 2014 18:49:15 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-fd-536b531bf0dc Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 70.09.25708.A135B635; Thu, 08 May 2014 18:49:14 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900MOX1Y2ALC0@mmp2.samsung.com>; Thu, 08 May 2014 18:49:14 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Date: Thu, 08 May 2014 18:49:14 +0900 X-ASG-Orig-Subj: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-id: <002601cf6aa2$c59cd670$50d68350$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qoluo/WhIkI7JRwqHgniVfElQMw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrAIsWRmVeSWpSXmKPExsWyRsSkSFc6ODvY4M5GNostx+4xWizqu8Xo wORxapGEx+oLWxkDmKK4bFJSczLLUov07RK4Mi7OP8lScJyz4vS+9ewNjE/Zuxg5OSQETCSu rHvECGGLSVy4t56ti5GLQ0hgKaPE75lrWbsYOcCK5q1ghIhPZ5Ro/bMUqugvo8SvlYeYQIrY BLQl/mwRBRkkIqAmMWnSDmaQMLOAsMST5WYgYWEBB4k1DX9ZQGwWAVWJrZ27wGxeAUuJvkVX GCFsQYkfk++BxZkFtCTW7zzOBGHLS2xe85YZ4k4FiR1nXzNCrNKT+DDvJDtEjYjEvhfvwO6U EJjMLnF0Xys7xDIBiW+TD7FA/CIrsekA1BxJiYMrbrBMYBSbhWT1LCSrZyFZPQvJigWMLKsY RVMLkguKk9KLjPWKE3OLS/PS9ZLzczcxAmPn9L9n/TsY7x6wPsSYDLR+IrOUaHI+MPbySuIN jc2MLExNTI2NzC3NSBNWEue9/zApSEggPbEkNTs1tSC1KL6oNCe1+BAjEwenVANj1qLuaHaj /1aZwdvm158rTrnNkt0s45K2XCHGsrWwQi7/k1hBla2pMcvNDTe1a2PUs9QnfCsum+a+aKmc 0T6pj6lvEqcIGgS4nWnfo723dM7UFfMd1R5qJXsbRp/eYDjx68KKj4Wi5qVfWAsYQpaudr9c 8OWXN8f/UlFhh7necwtXyxU4PFJiKc5INNRiLipOBAAGiyddswIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrLIsWRmVeSWpSXmKPExsVy+t9jQV2p4Oxgg1MfrC22HLvHaLGo7xaj A5PHqUUSHqsvbGUMYIpqYLTJSE1MSS1SSM1Lzk/JzEu3VfIOjneONzUzMNQ1tLQwV1LIS8xN tVVy8QnQdcvMAZqvpFCWmFMKFApILC5W0rfDNCE0xE3XAqYxQtc3JAiux8gADSSsYcy4OP8k S8FxzorT+9azNzA+Ze9i5OCQEDCRmLeCsYuRE8gUk7hwbz1bFyMXh5DAdEaJ1j9LoZy/jBK/ Vh5iAmlgE9CW+LNFFKRBREBNYtKkHcwgYWYBYYkny81AwsICDhJrGv6ygNgsAqoSWzt3gdm8 ApYSfYuuMELYghI/Jt8DizMLaEms33mcCcKWl9i85i0zxD0KEjvOvmaEWKUn8WHeSXaIGhGJ fS/eMU5gFJiFZNQsJKNmIRk1C0nLAkaWVYyiqQXJBcVJ6blGesWJucWleel6yfm5mxjBkflM egfjqgaLQ4wCHIxKPLwZzlnBQqyJZcWVuYcYJTiYlUR4efyzg4V4UxIrq1KL8uOLSnNSiw8x JgN9OpFZSjQ5H5g08kriDY1NzIwsjcwNLYyMzUkTVhLnPdhqHSgkkJ5YkpqdmlqQWgSzhYmD U6qBMeDFiWeega1/DKprgr59XKBkKPtuxvvuJEE5pfWiNd7LHj00NQiqen9tk+CczAszE08f Pv37jcS6mvgV7JFLWlsm7mTs4JU6uX6tmuvlf+klgjvNH7/fxLf46zqBZHVJGYaru1+ZqX+d 9Ob5wd86toUzWx77ukz5wVaqkxLHymhW6XQ9v2oahxJLcUaioRZzUXEiABwzygsQAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1399542557 X-Barracuda-Encrypted: RC4-MD5 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=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== There is no need to dip into reserve pool. Reserve pool is used for much more important things. And xfs_trans_reserve will never return ENOSPC because punch hole is already done. If we get ENOSPC, collapse range will be simply failed. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- fs/xfs/xfs_bmap_util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 296160b..91a43c5 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); - tp->t_flags |= XFS_TRANS_RESERVE; /* * We would need to reserve permanent block for transaction. * This will come into picture when after shifting extent into @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); if (error) { - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); + ASSERT(XFS_FORCED_SHUTDOWN(mp)); xfs_trans_cancel(tp, 0); break; } -- 1.7.11-rc0 From bo.li.liu@oracle.com Thu May 8 05:05:43 2014 Return-Path: <bo.li.liu@oracle.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=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 0F9C47F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:05:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDC048F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:05:42 -0700 (PDT) X-ASG-Debug-ID: 1399543537-04bdf02b8a3fa660001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id nc2HIEWWCLZCyDhJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:05:38 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s48A5a0O014861 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 8 May 2014 10:05:37 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s48A5ZeT006263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 8 May 2014 10:05:35 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s48A5YBc006140; Thu, 8 May 2014 10:05:34 GMT Received: from localhost.localdomain (/10.182.228.124) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 08 May 2014 03:05:33 -0700 Date: Thu, 8 May 2014 18:05:29 +0800 From: Liu Bo <bo.li.liu@oracle.com> To: David Disseldorp <ddiss@suse.de> Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Message-ID: <20140508100528.GD3407@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] btrfs/035: update clone test to expect EOPNOTSUPP Reply-To: bo.li.liu@oracle.com References: <1399465998-26545-1-git-send-email-ddiss@suse.de> <20140508041123.GB3407@localhost.localdomain> <20140508110522.21930dfd@f163.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508110522.21930dfd@f163.suse.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399543537 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.5636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, May 08, 2014 at 11:05:22AM +0200, David Disseldorp wrote: > Hi liubo, > > On Thu, 8 May 2014 12:11:24 +0800, Liu Bo wrote: > > > Something different here, I didn't get EIO on 3.15.0-rc4. > > Strange, I'm able to consistently reproduce this on a > vanilla v3.15-rc4-202-g30321c7 kernel. > Does that mean the updated test passes successfully for you? (yeah I've reproduce that error as well) The interesting thing is that if you do a _scratch_remount before 'cat $SCRATCH_MNT/src', it goes well, I'm looking into why... -liubo From namjae.jeon@samsung.com Thu May 8 05:23:24 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 F19207F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:23:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8E238F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:23:24 -0700 (PDT) X-ASG-Debug-ID: 1399544600-04cbb03cc53cf6a0001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id iOPjiYjYGRs8Ob6Y (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:23:21 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900KGI3IVIE30@mailout3.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:23:19 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 3D.6F.11496.71B5B635; Thu, 08 May 2014 19:23:19 +0900 (KST) X-AuditID: cbfee691-b7f3e6d000002ce8-4b-536b5b175d48 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 37.21.25708.71B5B635; Thu, 08 May 2014 19:23:19 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N59000K63IVJ7B0@mmp2.samsung.com>; Thu, 08 May 2014 19:23:19 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: Dave Chinner <david@fromorbit.com>, Theodore Ts'o <tytso@mit.edu> Cc: linux-ext4 <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Ashish Sangwan <a.sangwan@samsung.com> Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Thu, 08 May 2014 19:23:19 +0900 X-ASG-Orig-Subj: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003601cf6aa7$883103b0$98930b10$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qpxnbZQt24EFjSkK2EdLY2LQUZA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOIsWRmVeSWpSXmKPExsWyRsSkRFc8OjvYYOtpLYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVcevME9aCz3wVy4+8ZGtg7OTpYuTkkBAwkej//JwNwhaTuHBvPZgt JLCUUWLP8xy4mk0P2bsYuYDi0xklVjxdwgLh/GWUONbYDZTh4GAT0Jb4s0UUpEFEwFVi3t3v jCA1zCCD3t/5zAhSIyzgLTH/fwpIDYuAqsS+5pusIDavgKVE5/xlULagxI/J91hAbGYBLYn1 O48zQdjyEpvXvGWGOEhBYsfZ12AjRQT0JBacDIEoEZHY9+Id2FoJgUvsEvOv72CH2CUg8W3y IRaQegkBWYlNB6DGSEocXHGDZQKj2Cwkm2ch2TwLyeZZSFYsYGRZxSiaWpBcUJyUXmSqV5yY W1yal66XnJ+7iREYiaf/PZu4g/H+AetDjMlA6ycyS4km5wMjOa8k3tDYzMjC1MTU2Mjc0ow0 YSVx3vRHSUFCAumJJanZqakFqUXxRaU5qcWHGJk4OKUaGPn2cnVPLDri/fGyetiSm0/dnzc7 vTJllutkDE6wVUhpuHMjfs2T5yFme1nKWvdKbPvy7J/RQ/XYUDunw7PCzfo2dglzSv7+Liyw uVzk+Iosueg8b3f1i1pLt61qEVCt04pymDBN75nHq4eNq/im6d6f8ikv6dP9+Qud1Jw76k1N Uq7tXV8hrcRSnJFoqMVcVJwIABb9gHHaAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrKKsWRmVeSWpSXmKPExsVy+t9jQV3x6Oxgg2dLlCyWTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxoxbZ56wFnzmq1h+5CVbA2Mn TxcjJ4eEgIlE/6aH7BC2mMSFe+vZuhi5OIQEpjNKrHi6hAXC+csocayxG6iKg4NNQFvizxZR kAYRAVeJeXe/M4LUMAssZZR4f+czI0iNsIC3xPz/KSA1LAKqEvuab7KC2LwClhKd85dB2YIS PybfYwGxmQW0JNbvPM4EYctLbF7zlhniIAWJHWdfg40UEdCTWHAyBKJERGLfi3eMExgFZiGZ NAvJpFlIJs1C0rKAkWUVo2hqQXJBcVJ6rpFecWJucWleul5yfu4mRnCkP5PewbiqweIQowAH oxIPb4ZzVrAQa2JZcWXuIUYJDmYlEV4e/+xgId6UxMqq1KL8+KLSnNTiQ4zJQI9OZJYSTc4H JqG8knhDYxMzI0sjc0MLI2Nz0oSVxHkPtloHCgmkJ5akZqemFqQWwWxh4uCUamBUYVNNs21b /2zNxSQz83vRfKFhZybO2MX4J+Xklmj+U7bL2n78XuW6v6xcedX2rX+O5MZuNfrpb2lX6dCb ZP2p3NBvzrLyzEnPhZJ4/sS1Wh/5espEd8nfINbXBsc0uYvv+DFc5jBOad0+9+Tuy5F/lue+ 5m2ctURT0vz31ElF9ZOcv5SxlgsqsRRnJBpqMRcVJwIAeV+N8jgDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1399544601 X-Barracuda-Encrypted: RC4-MD5 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=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== In continuation of the work of making the process of non linear editing of media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE for fallocate. This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space in between the file within the range specified by offset and len. User can write new data in this space. e.g. ads. Like collapse range, currently we have the limitation that offset and len should be block size aligned for both XFS and Ext4. The semantics of the flag are : 1) It allocates new zeroed out on disk space of len bytes starting at offset byte without overwriting any existing data. All the data blocks from offset to EOF are shifted towards right to make space for inserting new blocks 2) It should be used exclusively. No other fallocate flag in combination. 3) Offset and length supplied to fallocate should be fs block size aligned in case of xfs and ext4. 4) Insert range does not work for the case when offset is overlapping/beyond i_size. If the user wants to allocate space at the end of file they are advised to use either ftruncate(2) or fallocate(2) with mode 0. 5) It increses the size of file by len bytes. Namjae Jeon (10): fs: Add support FALLOC_FL_INSERT_RANGE for fallocate xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate xfsprogs: xfs_io: add finsert command for insert range via fallocate xfstests: generic/027: Standard insert range tests xfstests: generic/028: Delayed allocation insert range xfstests: generic/029: Multi insert range tests xfstests: generic/030: Delayed allocation multi insert xfstests: fsstress: Add fallocate insert range operation xfstests: fsx: Add fallocate insert range operation -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:24:46 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 85E7C7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:24:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E23B8F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:24:46 -0700 (PDT) X-ASG-Debug-ID: 1399544683-04cb6c72903e5920001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id 6YixaIQMAE3nIkc5 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:24:45 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900J5R3L77W50@mailout4.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:24:43 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 86.01.18501.B6B5B635; Thu, 08 May 2014 19:24:43 +0900 (KST) X-AuditID: cbfee68d-b7f4e6d000004845-f9-536b5b6b62a9 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id B8.35.27725.B6B5B635; Thu, 08 May 2014 19:24:43 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900G3C3L64O60@mmp1.samsung.com>; Thu, 08 May 2014 19:24:42 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Thu, 08 May 2014 19:24:42 +0900 X-ASG-Orig-Subj: [PATCH v2 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003701cf6aa7$ba00c8d0$2e025a70$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qp5ImXCTRP02WQyqa5euW3XEtIw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGIsWRmVeSWpSXmKPExsWyRsSkRDc7OjvY4PJpIYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVsWLBNqaCZWIV//ZuY2lgbBDqYuTgkBAwkXjznqmLkRPIFJO4cG89 WxcjF4eQwFJGie3rWtkhEiYSO/6dY4ZILGKUWPijlREkISTwl1Fiz2kJkEFsAtoSf7aIgoRF BDwlFh/fCjaIWWAlo8S94x/ZQBLCAr4Sb9pXs4LUswioSqw8YQwS5hWwlJj37DojhC0o8WPy PRYQm1lAS2L9zuNMELa8xOY1b5kh7lGQ2HH2NSPIGBEBPYljE8IhSkQk9r14xwiyVkLgGrvE xJcNYPUsAgIS3yYfYoH4V1Zi0wGoMZISB1fcYJnAKDYLyeZZSDbPQrJ5FpIVCxhZVjGKphYk FxQnpRcZ6hUn5haX5qXrJefnbmIExuHpf896dzDePmB9iDEZaP1EZinR5HxgHOeVxBsamxlZ mJqYGhuZW5qRJqwkzpv0MClISCA9sSQ1OzW1ILUovqg0J7X4ECMTB6dUA+MW+5kNUxXkVRgW yW7bbHJP4PWvuiVz7U4sl1hlusjoa5y12KYXYj4iqrI9J2/+WCEiMv+E9JNCPp3VimcTZ+5s ul+0yL9V+3/XgoXdZoqM2+wnrli2eMu2vzWvnM1dW4sLJyydva106XzZE1lrj10qnJD/5Ybs Wq6Gk3Mspb9KK/pNn8b3Ri9AiaU4I9FQi7moOBEALe2XtdkCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrCKsWRmVeSWpSXmKPExsVy+t9jAd3s6Oxgg393OS2WTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxowVC7YxFSwTq/i3dxtLA2OD UBcjJ4eEgInEjn/nmCFsMYkL99azdTFycQgJLGKUWPijlREkISTwl1Fiz2mJLkYODjYBbYk/ W0RBwiICnhKLj28Fq2cWWMkoce/4RzaQhLCAr8Sb9tWsIPUsAqoSK08Yg4R5BSwl5j27zghh C0r8mHyPBcRmFtCSWL/zOBOELS+xec1bqHsUJHacfc0IMkZEQE/i2IRwiBIRiX0v3jFOYBSY hWTSLCSTZiGZNAtJywJGllWMoqkFyQXFSem5hnrFibnFpXnpesn5uZsYwXH+TGoH48oGi0OM AhyMSjy8Gc5ZwUKsiWXFlbmHGCU4mJVEeHn8s4OFeFMSK6tSi/Lji0pzUosPMSYD/TmRWUo0 OR+YgvJK4g2NTcyMLI3MDS2MjM1JE1YS5z3Qah0oJJCeWJKanZpakFoEs4WJg1OqgbGf9daT mjeXe9e/vCcqfGDK5Vs56yu3y275Fql3ced9C9N6tr0Fl/eUTF/oNTd874aoU080935Nvyj5 1kyB9c16pdW/t97WWJ+9xz9Y5umdsoOaF3zfzvQ+JeKT8n9bgdL0mOo6v0e35Kx0c/1/Bdqc ufK4i0/6wry29PSmA66ul21mBZxcJaOkxFKckWioxVxUnAgAnBZ+uzcDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1399544684 X-Barracuda-Encrypted: RC4-MD5 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 FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will insert a range of a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- fs/open.c | 8 +++++++- include/uapi/linux/falloc.h | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/fs/open.c b/fs/open.c index 36662d0..74ed498 100644 --- a/fs/open.c +++ b/fs/open.c @@ -232,7 +232,8 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +251,11 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..f4d12eb 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,21 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to allocate disk space within the file size + * without overwriting any existing data. The contents of the file beyond offset + * are shifted towards right by len bytes to create space for inserting + * new disk blocks and in this space new zeroed out disk blocks are inserted. + * As such, this operation will increase the size of the file by len bytes. + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * + * Attempting to allocate new blocks using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:26:31 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 726B97F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:26:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2F5128F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:26:31 -0700 (PDT) X-ASG-Debug-ID: 1399544787-04bdf02b8c3fb320001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id W9xAfONmKnFOwXOg (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:26:28 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900IRJ3NTUD60@mailout1.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:26:17 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm1.samsung.com ( [172.20.52.113]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 40.02.11120.9CB5B635; Thu, 08 May 2014 19:26:17 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-14-536b5bc9db75 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 16.A5.27725.8CB5B635; Thu, 08 May 2014 19:26:17 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900GBS3NS4O60@mmp1.samsung.com>; Thu, 08 May 2014 19:26:16 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Thu, 08 May 2014 19:26:16 +0900 X-ASG-Orig-Subj: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qp87H8lhu4d3oS4uX1DOEZySoJw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNIsWRmVeSWpSXmKPExsWyRsSkUPdkdHawwazTghZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr4/XVyWwFs+czVjzd9IyxgXF7XRcjJ4eEgInEhdeX2SFsMYkL99az dTFycQgJLGWU+PvtIitM0apj91kgEosYJbpPnWKCcP4ySlzvWgbUzsHBJqAt8WeLKEiDiICn xOLjW8EmMQusZJS4d/wjG0hCWMBP4uXMm4wgNouAqsSxrgnMIDavgKXEzqOtULagxI/J91hA bGYBLYn1O48zQdjyEpvXvGWGuEhBYsfZ14wQy/Qk3h3/ywxRIyKx78U7RpDFEgKX2CW2LW2A WiYg8W3yIRaQQyUEZCU2HYCaIylxcMUNlgmMYrOQrJ6FZPUsJKtnIVmxgJFlFaNoakFyQXFS epGxXnFibnFpXrpecn7uJkZgRJ7+96x/B+PdA9aHGJOB1k9klhJNzgdGdF5JvKGxmZGFqYmp sZG5pRlpwkrivPcfJgUJCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYLT8eWa3cLpoI1vIXRsR 8/XzLH8E3Vpz88acXeu1impkjfR3cvoZTOeUmJzcn99Wlzp37vWownzV88kV+/+siVg9abPN qvPlXWvmcTTbeYk9q089pLSvQeNQVLyHeGPSkh1P319+fXeiTG0sV9GMlx7Fz+eptm3+NvOK lN/RY8rTLixVEwndra3EUpyRaKjFXFScCADLUj853gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrBKsWRmVeSWpSXmKPExsVy+t9jAd2T0dnBBttXslgsnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBmvr05mK5g9n7Hi6aZnjA2M 2+u6GDk5JARMJFYdu88CYYtJXLi3nq2LkYtDSGARo0T3qVNMEM5fRonrXcvYuxg5ONgEtCX+ bBEFaRAR8JRYfHwrWAOzwEpGiXvHP7KBJIQF/CRezrzJCGKzCKhKHOuawAxi8wpYSuw82gpl C0r8mHwPbDOzgJbE+p3HmSBseYnNa94yQ1ykILHj7GtGiGV6Eu+O/2WGqBGR2PfiHeMERoFZ SEbNQjJqFpJRs5C0LGBkWcUomlqQXFCclJ5rqFecmFtcmpeul5yfu4kRHO/PpHYwrmywOMQo wMGoxMOb4ZwVLMSaWFZcmXuIUYKDWUmEl8c/O1iINyWxsiq1KD++qDQntfgQYzLQpxOZpUST 84GpKK8k3tDYxMzI0sjc0MLI2Jw0YSVx3gOt1oFCAumJJanZqakFqUUwW5g4OKUaGDvE3L3a v7Z6n6znXHFb7pFTRZbW/EccXFdtnz2bGJM2+cHxK4fZrfj5e5wUlcXmvf39Uf6xcZ3htblv /rWLp7vMfXl8slWi7/XHu3piplgyRldrusdwLYmR/vYhhaua+U26dSGn9ep2zQV7M29dMZZe opzgaHyzZsHFtTJHm/ZNNsjJSr4+UYmlOCPRUIu5qDgRAPHCQUQ7AwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1399544788 X-Barracuda-Encrypted: RC4-MD5 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 patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 5) Allocate unwritten extents for the hole created in step 4. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- fs/xfs/xfs_bmap.c | 372 ++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 9 +- fs/xfs/xfs_bmap_util.c | 129 ++++++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 37 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 545 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..e24aa14 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5419,7 +5419,7 @@ error0: * into, this will be considered invalid operation and we abort immediately. */ int -xfs_bmap_shift_extents( +xfs_bmap_shift_extents_left( struct xfs_trans *tp, struct xfs_inode *ip, int *done, @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmap_shift_extents", + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } @@ -5606,3 +5606,371 @@ del_cursor: xfs_trans_log_inode(tp, ip, logflags); return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be splitted. @split_fsb is a block where the extents is spliited. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* splitted extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + int error = 0; + int logflags; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + /* Add new extent */ + (*current_ext)++; + xfs_iext_insert(ip, *current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *split_ext) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + + if (error) { + /* + * Free the transaction structure. + */ + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, + &firstfsb, &free_list); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return error; +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* + * Shift extent records to the right to make a hole. + * The maximum number of extents to be shifted in a single operation + * is @num_exts, and @current_ext keeps track of the current extent + * index we have shifted. @offset_shift_fsb is the length by which each + * extent is shifted. @end_ext is the last extent to be shifted. + */ +int +xfs_bmap_shift_extents_right( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t offset_shift_fsb, + xfs_extnum_t *current_ext, + xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int num_exts) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec right; + xfs_ifork_t *ifp; + xfs_fileoff_t startoff; + xfs_filblks_t blockcount = 0; + xfs_extnum_t last_extent; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int logflags; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstblock; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + /* start shifting extents to right */ + while (num_exts-- > 0) { + blockcount = 0; + + if (*current_ext < end_ext) { + *done = 1; + break; + } + + gotp = xfs_iext_get_ext(ifp, *current_ext); + xfs_bmbt_get_all(gotp, &got); + startoff = got.br_startoff + offset_shift_fsb; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. This checking has + * to be performed for all except the last extent. + */ + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + if (last_extent != *current_ext) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext + 1), &right); + if (startoff + got.br_blockcount > right.br_startoff) { + error = XFS_ERROR(EINVAL); + if (error) + goto del_cursor; + } + } + + /* Check if we can merge 2 adjacent extents */ + if (last_extent != *current_ext && + right.br_startoff == startoff + got.br_blockcount && + right.br_startblock == + got.br_startblock + got.br_blockcount && + right.br_state == got.br_state && + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { + blockcount = right.br_blockcount + got.br_blockcount; + + /* Make cursor point to the extent we will update */ + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_iext_remove(ip, *current_ext + 1, 1, 0); + if (cur) { + error = xfs_btree_delete(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (got.br_blockcount < blockcount) { + xfs_bmbt_set_blockcount(gotp, blockcount); + got.br_blockcount = blockcount; + } + + + xfs_bmbt_set_startoff(gotp, startoff); + got.br_startoff = startoff; + + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + (*current_ext)--; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 38ba36e..af05899 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, int *done, xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, + xfs_extnum_t *split_ext); +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, + int *done, xfs_fsblock_t offset_shift_fsb, + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + int num_exts); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 296160b..5a56f5b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1550,7 +1550,7 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, shift_fsb, ¤t_ext, &first_block, &free_list, XFS_BMAP_MAX_SHIFT_EXTENTS); @@ -1574,6 +1574,133 @@ out: } /* + * xfs_insert_file_space() + * This routine allocate disk space and shift extent for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. Lastly + * allocate an unwritten extent in hole range created by shifting extents. + * + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + xfs_ifork_t *ifp; + int done = 0; + int committed; + int error; + uint rounding; + xfs_fileoff_t start_fsb; + xfs_fileoff_t shift_fsb; + xfs_extnum_t split_ext; + xfs_extnum_t current_ext = 0; + xfs_off_t ioffset; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + error = xfs_qm_dqattach(ip, 0); + if (error) + return error; + + /* wait for the completion of any pending DIOs */ + inode_dio_wait(VFS_I(ip)); + + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, + ioffset, -1); + if (error) + return error; + + truncate_pagecache_range(VFS_I(ip), ioffset, -1); + + start_fsb = XFS_B_TO_FSB(mp, offset); + shift_fsb = XFS_B_TO_FSB(mp, len); + + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); + if (error) + return error; + + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + while (!error && !done) { + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + /* + * We would need to reserve permanent block for transaction. + * This will come into picture when after shifting extent into + * hole we found that adjacent extents can be merged which + * may lead to freeing of a block during record update. + */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + break; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + + /* + * We are using the write transaction in which max 2 bmbt + * updates are allowed + */ + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, + ¤t_ext, split_ext, + &first_block, &free_list, + XFS_BMAP_MAX_SHIFT_EXTENTS); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + } + + /* Add unwritten extent in a hole range. */ + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); + +out: + return error; + +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..d62ab4b 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 97855c5..392b029 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -760,7 +760,8 @@ xfs_file_fallocate( if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -790,6 +791,40 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + struct iattr iattr; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + + /* + * The first thing we do is to expand file to + * avoid data loss if there is error while shifting + */ + iattr.ia_valid = ATTR_SIZE; + iattr.ia_size = i_size_read(inode) + len; + error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; + + error = xfs_insert_file_space(ip, offset, len); + if (error) + goto out_unlock; } else { if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 152f827..8943c9f 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:27:49 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 8F7A87F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:27:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C04E8F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:27:49 -0700 (PDT) X-ASG-Debug-ID: 1399544866-04bdf02b8a3fb3d0001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id zNKfjwBYFfImIf6V (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:27:47 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900HFY3QAS980@mailout1.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:27:46 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm1.samsung.com ( [172.20.52.113]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 3A.01.11496.12C5B635; Thu, 08 May 2014 19:27:45 +0900 (KST) X-AuditID: cbfee691-b7f3e6d000002ce8-c1-536b5c21dfc8 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 74.E5.27725.12C5B635; Thu, 08 May 2014 19:27:45 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900IY53Q9VU10@mmp1.samsung.com>; Thu, 08 May 2014 19:27:45 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Thu, 08 May 2014 19:27:44 +0900 X-ASG-Orig-Subj: [PATCH v2 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003901cf6aa8$268787a0$739696e0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqAQDhL9/wBirR+CXLbuj+pUIcg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkUFcxJjvYYPlJKYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVcbblOXvBhryKP0fmsjUwHo/oYuTkkBAwkdj++RYLhC0mceHeerYu Ri4OIYGljBJrp59lhil68fULVGIRo8TvyUsZIZy/jBLTT+8HaufgYBPQlvizRRSkQUTAU2Lx 8a1gDcwCKxkl7h3/yAaSEBbwl9j68QwjiM0ioCpxcOFMMJtXwFLi9KstbBC2oMSPyffATmIW 0JJYv/M4E4QtL7F5zVuoixQkdpx9zQixTE/i/KXprBA1IhL7XrwDO05C4By7xOeXN9khlglI fJt8COxQCQFZiU0HoOZIShxccYNlAqPYLCSrZyFZPQvJ6llIVixgZFnFKJpakFxQnJReZKpX nJhbXJqXrpecn7uJERiPp/89m7iD8f4B60OMyUDrJzJLiSbnA+M5ryTe0NjMyMLUxNTYyNzS jDRhJXHe9EdJQUIC6YklqdmpqQWpRfFFpTmpxYcYmTg4pRoY5x34tYXtwkdmXe2s1D3WvdPv q1RJuB/5WCvszvHxYMSPnStt7K8lu30JfC9w5Nx3f/6MLbNVW+UbV9Quv/e4Juju0RkXsqxu hSzjWtfHqXmlVX/jt6b/abzhGW5r1312PBO533dHzHTjqw0zroW85HfhmzZfZLFEU5hRX/2E HbxrY1gPH1b9osRSnJFoqMVcVJwIAAJwcHTdAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOKsWRmVeSWpSXmKPExsVy+t9jAV3FmOxgg5ZWPoulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GtXAaJORmpiSWqSQmpecn5KZl26r5B0c7xxvamZgqGtoaWGupJCXmJtqq+TiE6DrlpkDdIaS QlliTilQKCCxuFhJ3w7ThNAQN10LmMYIXd+QILgeIwM0kLCGMeNsy3P2gg15FX+OzGVrYDwe 0cXIySEhYCLx4usXNghbTOLCvfVANheHkMAiRonfk5cyQjh/GSWmn97P0sXIwcEmoC3xZ4so SIOIgKfE4uNbwRqYBVYyStw7/hFskrCAv8TWj2cYQWwWAVWJgwtngtm8ApYSp19tYYOwBSV+ TL7HAmIzC2hJrN95nAnClpfYvOYtM8RFChI7zr5mhFimJ3H+0nRWiBoRiX0v3jFOYBSYhWTU LCSjZiEZNQtJywJGllWMoqkFyQXFSem5hnrFibnFpXnpesn5uZsYwdH+TGoH48oGi0OMAhyM Sjy8Gc5ZwUKsiWXFlbmHGCU4mJVEeHn8s4OFeFMSK6tSi/Lji0pzUosPMSYDfTqRWUo0OR+Y iPJK4g2NTcyMLI3MDS2MjM1JE1YS5z3Qah0oJJCeWJKanZpakFoEs4WJg1OqgTEpocrSIeVa 2yb72/722uzqG/2KZ3MeXnhMSnu++/QkixvbDm1ODZw93f2P60nGepfl63oF4vaaOh1c0rf7 ZbPFs2DblzeEOr7fzNOJD23u3rr9Uv2qNvujYa/DOZh/9uZH86fKVaYclrvZU1a9d+W7Bs7u +rkNz9fOvFl5sfJ4pm6d1wUhWyWW4oxEQy3mouJEAGkJVjk6AwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1399544867 X-Barracuda-Encrypted: RC4-MD5 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 patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 5) Allocate unwritten extents for the hole created in step 4. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- fs/ext4/ext4.h | 1 + fs/ext4/extents.c | 333 ++++++++++++++++++++++++++++++++++++++++++-- include/trace/events/ext4.h | 25 ++++ 3 files changed, 350 insertions(+), 9 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 78fed7b..c8e074a 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2745,6 +2745,7 @@ extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); +extern int ext4_insert_range(struct file *file, loff_t offset, loff_t len); /* move_extent.c */ extern void ext4_double_down_write_data_sem(struct inode *first, diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 086baa9..17321c6 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4900,7 +4900,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) @@ -4923,6 +4924,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (mode & FALLOC_FL_ZERO_RANGE) return ext4_zero_range(file, offset, len, mode); + if (mode & FALLOC_FL_INSERT_RANGE) + return ext4_insert_range(file, offset, len); + trace_ext4_fallocate_enter(inode, offset, len, mode); lblk = offset >> blkbits; /* @@ -5225,13 +5229,13 @@ ext4_access_path(handle_t *handle, struct inode *inode, } /* - * ext4_ext_shift_path_extents: + * ext4_ext_shift_path_extents_left: * Shift the extents of a path structure lying between path[depth].p_ext - * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift + * and EXT_LAST_EXTENT(path[depth].p_hdr) to the left, by subtracting shift * from starting block for each extent. */ static int -ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, +ext4_ext_shift_path_extents_left(struct ext4_ext_path *path, ext4_lblk_t shift, struct inode *inode, handle_t *handle, ext4_lblk_t *start) { @@ -5301,13 +5305,13 @@ out: } /* - * ext4_ext_shift_extents: + * ext4_ext_shift_extents_left: * All the extents which lies in the range from start to the last allocated - * block for the file are shifted downwards by shift blocks. + * block for the file are shifted to the left by shift blocks. * On success, 0 is returned, error otherwise. */ static int -ext4_ext_shift_extents(struct inode *inode, handle_t *handle, +ext4_ext_shift_extents_left(struct inode *inode, handle_t *handle, ext4_lblk_t start, ext4_lblk_t shift) { struct ext4_ext_path *path; @@ -5387,7 +5391,7 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, break; } } - ret = ext4_ext_shift_path_extents(path, shift, inode, + ret = ext4_ext_shift_path_extents_left(path, shift, inode, handle, &start); ext4_ext_drop_refs(path); kfree(path); @@ -5495,7 +5499,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) } ext4_discard_preallocations(inode); - ret = ext4_ext_shift_extents(inode, handle, punch_stop, + ret = ext4_ext_shift_extents_left(inode, handle, punch_stop, punch_stop - punch_start); if (ret) { up_write(&EXT4_I(inode)->i_data_sem); @@ -5520,3 +5524,314 @@ out_mutex: mutex_unlock(&inode->i_mutex); return ret; } + +/* + * ext4_ext_shift_path_extents_right: + * Shift the extents of a path structure towards right, by adding shift_lblk + * to the starting ee_block of each extent. Shifting is done from + * the last extent in the path till we reach first extent OR hit start_lblk. + * In case the first extent in the path is updated, extent index will also be + * updated if it is present. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_path_extents_right(struct ext4_ext_path *path, + struct inode *inode, handle_t *handle, + ext4_lblk_t start_lblk, ext4_lblk_t shift_lblk) +{ + int depth, err = 0; + struct ext4_extent *ex_start, *ex_last; + + depth = ext_depth(inode); + while (depth >= 0) { + if (depth == path->p_depth) { + ex_start = EXT_FIRST_EXTENT(path[depth].p_hdr); + + ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + if (!ex_last) + return -EIO; + + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + while ((ex_start <= ex_last) && + (le32_to_cpu(ex_last->ee_block) >= start_lblk)) { + le32_add_cpu(&ex_last->ee_block, shift_lblk); + ext4_ext_try_to_merge_right(inode, path, + ex_last); + ex_last--; + } + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + if (--depth < 0 || ex_start <= ex_last) + break; + } + + /* Update index too */ + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + le32_add_cpu(&path[depth].p_idx->ei_block, shift_lblk); + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + /* we are done if current index is not a starting index */ + if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) + break; + + depth--; + } + +out: + return err; +} + +/* + * ext4_ext_shift_extents_right: + * All the extents of an inode which lies in the range from start_lblk + * to the last allocated block are shifted right by @shift_lblk blocks. + * As we will be shifitng complete extents, @start_lblk should be the + * starting block of an extent OR it can lie in a hole. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_extents_right(struct inode *inode, handle_t *handle, + ext4_lblk_t start_lblk, ext4_lblk_t shift_lblk) +{ + struct ext4_ext_path *path; + struct ext4_extent *ex_start; + int ret = 0, depth; + ext4_lblk_t current_block = EXT_MAX_BLOCKS - 1; + + /* Its safe to start updating extents */ + while (start_lblk < current_block) { + path = ext4_ext_find_extent(inode, current_block, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = ext_depth(inode); + if (unlikely(path[depth].p_hdr == NULL)) { + ret = -EIO; + goto out_stop; + } + + ex_start = EXT_FIRST_EXTENT(path[depth].p_hdr); + if (!ex_start) { + ret = -EIO; + goto out_stop; + } + + current_block = ex_start->ee_block; + ret = ext4_ext_shift_path_extents_right(path, inode, handle, + start_lblk, shift_lblk); +out_stop: + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + break; + } + + return ret; +} + +/* + * ext4_insert_range: + * This function implements the FALLOC_FL_INSERT_RANGE flag of fallocate. + * Firstly, the data blocks starting from @offset to the EOF are shifted by + * @len towards right to create a hole in the @inode. Secondly, the hole is + * filled with uninit extent(s). Inode size is increased by len bytes. + * Returns 0 on success, error otherwise. + */ +int ext4_insert_range(struct file *file, loff_t offset, loff_t len) +{ + struct inode *inode = file_inode(file); + struct super_block *sb = inode->i_sb; + handle_t *handle; + struct ext4_ext_path *path; + struct ext4_extent *extent; + ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk, ee_last_lblk; + unsigned int credits, ee_len; + int ret = 0, depth, split_flag = 0; + loff_t ioffset; + + /* Insert range works only on fs block size aligned offsets. */ + if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || + len & (EXT4_BLOCK_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + if (EXT4_SB(inode->i_sb)->s_cluster_ratio > 1) + return -EOPNOTSUPP; + + trace_ext4_insert_range(inode, offset, len); + + offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb); + len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb); + + /* Call ext4_force_commit to flush all data in case of data=journal */ + if (ext4_should_journal_data(inode)) { + ret = ext4_force_commit(inode->i_sb); + if (ret) + return ret; + } + + /* + * Need to round down to align start offset to page size boundary + * for page size > block size. + */ + ioffset = round_down(offset, PAGE_SIZE); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, + LLONG_MAX); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { + ret = -EOPNOTSUPP; + goto out_mutex; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + ret = -EFBIG; + goto out_mutex; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + + path = ext4_ext_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); + if (IS_ERR(path)) { + ret = PTR_ERR(path); + goto out_mutex; + } + + depth = path->p_depth; + extent = path[depth].p_ext; + if (extent) { + /* + * Check if number of blocks of file shifted by insert range + * can be bigger than EXT_MAX_BLOCKS at first. + */ + ee_last_lblk = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + if (ee_last_lblk + len_lblk > EXT_MAX_BLOCKS - 1) + ret = -EINVAL; + } + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + goto out_mutex; + + truncate_pagecache(inode, ioffset); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + /* Expand file to avoid data loss if there is error while shifting */ + inode->i_size += len; + EXT4_I(inode)->i_disksize += len; + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_dio; + + if (!extent) + /* Just allocate unwritten blocks and exit */ + goto alloc_blocks; + + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + path = ext4_ext_find_extent(inode, offset_lblk, NULL, 0); + if (IS_ERR(path)) + goto out_sem; + + depth = ext_depth(inode); + extent = path[depth].p_ext; + ee_start_lblk = le32_to_cpu(extent->ee_block); + ee_len = ext4_ext_get_actual_len(extent); + + /* + * If offset_lblk is not the starting block of extent, split + * the extent @offset_lblk + */ + if ((offset_lblk > ee_start_lblk) && + (offset_lblk < (ee_start_lblk + ee_len))) { + if (ext4_ext_is_unwritten(extent)) + split_flag = EXT4_EXT_MARK_UNWRIT1 | + EXT4_EXT_MARK_UNWRIT2; + ret = ext4_split_extent_at(handle, inode, path, offset_lblk, + split_flag, EXT4_EX_NOCACHE | + EXT4_GET_BLOCKS_PRE_IO | + EXT4_GET_BLOCKS_METADATA_NOFAIL); + } + + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + goto out_sem; + + ret = ext4_es_remove_extent(inode, offset_lblk, + EXT_MAX_BLOCKS - offset_lblk); + if (ret) + goto out_sem; + + /* + * if offset_lblk lies in a hole which is at start of file, use + * ee_start_lblk to shift extents + */ + ret = ext4_ext_shift_extents_right(inode, handle, + ee_start_lblk > offset_lblk ? ee_start_lblk : offset_lblk, + len_lblk); + if (ret) + goto out_sem; + + up_write(&EXT4_I(inode)->i_data_sem); + +alloc_blocks: + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_stop; + + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + + ext4_journal_stop(handle); + + ret = ext4_alloc_file_blocks(file, offset_lblk, len_lblk, + EXT4_GET_BLOCKS_CREATE_UNWRIT_EXT, 0); + goto out_dio; + +out_sem: + up_write(&EXT4_I(inode)->i_data_sem); +out_stop: + ext4_journal_stop(handle); +out_dio: + ext4_inode_resume_unlocked_dio(inode); +out_mutex: + mutex_unlock(&inode->i_mutex); + return ret; +} diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index d4f70a7..0b90106 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2438,6 +2438,31 @@ TRACE_EVENT(ext4_collapse_range, __entry->offset, __entry->len) ); +TRACE_EVENT(ext4_insert_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:30:55 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 4F49C7F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:30:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D688EAC006 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:30:51 -0700 (PDT) X-ASG-Debug-ID: 1399545048-04cb6c72903e5c90001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id tPcSpPBxNqAPgGta (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:30:50 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900HY53VBBS70@mailout4.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:30:47 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 98.63.18501.7DC5B635; Thu, 08 May 2014 19:30:47 +0900 (KST) X-AuditID: cbfee68d-b7f4e6d000004845-6b-536b5cd7247f Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 8E.92.25708.7DC5B635; Thu, 08 May 2014 19:30:47 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900G563VBP060@mmp1.samsung.com>; Thu, 08 May 2014 19:30:47 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Date: Thu, 08 May 2014 19:30:47 +0900 X-ASG-Orig-Subj: [PATCH v2 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Message-id: <003a01cf6aa8$933f6890$b9be39b0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqDqdsqLPPTg5S2q44W4B1WcK7w== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkRPd6THawwfevehZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr43jXCraCR4IVX6edY2pgnMvXxcjJISFgInHt/WtmCFtM4sK99Wwg tpDAUkaJU2tjYGp2fPvD2MXIBRRfxCixbO8qVgjnL6PEpm0HgTo4ONgEtCX+bBEFaRAR8JRY fHwrG0gNs8BKRol7xz+CTRUWiJf4+2E3K4jNIqAq8ab7OzuIzStgKXHp/AI2CFtQ4sfkeywg NrOAlsT6nceZIGx5ic1r3kJdqiCx4+xrRohlehKPty5hhqgRkdj34h3YpRICl9gl/n5pZIJY JiDxbfIhFpBDJQRkJTYdgJojKXFwxQ2WCYxis5CsnoVk9Swkq2chWbGAkWUVo2hqQXJBcVJ6 kaFecWJucWleul5yfu4mRmA0nv73rHcH4+0D1ocYk4HWT2SWEk3OB0ZzXkm8obGZkYWpiamx kbmlGWnCSuK8SQ+TgoQE0hNLUrNTUwtSi+KLSnNSiw8xMnFwSjUwTvy15JDFq+WNN9z1S5fr 7wwQuHhs0/2Vy6er7ZI4f90p8e93tdKw3b3LfyS3+VeWzH8xf+P232GlRSqOmvI31vjLb0g8 KfTj2rMDv8LfBs1k2X3gXxv3ydcht2fHaPwO3Shs1VVy61XJruB8ozlpLxfl9u+49393fOpy DSeuyUopdx8dfhDObarEUpyRaKjFXFScCADTkw9q3AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOKsWRmVeSWpSXmKPExsVy+t9jAd3rMdnBBt2vVC2WTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxozjXSvYCh4JVnyddo6pgXEu XxcjJ4eEgInEjm9/GCFsMYkL99azdTFycQgJLGKUWLZ3FSuE85dRYtO2g0AZDg42AW2JP1tE QRpEBDwlFh/fCtbALLCSUeLe8Y9sIAlhgXiJvx92s4LYLAKqEm+6v7OD2LwClhKXzi9gg7AF JX5MvscCYjMLaEms33mcCcKWl9i85i0zxEUKEjvOvmaEWKYn8XjrEmaIGhGJfS/eMU5gFJiF ZNQsJKNmIRk1C0nLAkaWVYyiqQXJBcVJ6blGesWJucWleel6yfm5mxjB0f5MegfjqgaLQ4wC HIxKPLwZzlnBQqyJZcWVuYcYJTiYlUR4efyzg4V4UxIrq1KL8uOLSnNSiw8xJgN9OpFZSjQ5 H5iI8kriDY1NzIwsjcwNLYyMzUkTVhLnPdhqHSgkkJ5YkpqdmlqQWgSzhYmDU6qBUfpVv/IH cZ0cDRupegMmhTtP/qrtlxD9+/X8WTW2Yw2Hdv3dJGZaPnHyyfNrTDwjt145J1UkGVV7a8G5 2gkZ51MMs+W5307X4Tnz85W7x7SNzbeXuipHNkz+bbrv/rG+4n+H+24t9J0Z2WM12dDKQX3W j5jcO/VPvyz4JvNSTkdFSkj3VsWhu0osxRmJhlrMRcWJAPrXMYs6AwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1399545049 X-Barracuda-Encrypted: RC4-MD5 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 finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- io/prealloc.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/io/prealloc.c b/io/prealloc.c index aba6b44..11b1e12 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -37,6 +37,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; @@ -46,6 +50,7 @@ static cmdinfo_t zero_cmd; static cmdinfo_t falloc_cmd; static cmdinfo_t fpunch_cmd; static cmdinfo_t fcollapse_cmd; +static cmdinfo_t finsert_cmd; static cmdinfo_t fzero_cmd; #endif @@ -169,11 +174,14 @@ fallocate_f( int mode = 0; int c; - while ((c = getopt(argc, argv, "ckp")) != EOF) { + while ((c = getopt(argc, argv, "cikp")) != EOF) { switch (c) { case 'c': mode = FALLOC_FL_COLLAPSE_RANGE; break; + case 'i': + mode = FALLOC_FL_INSERT_RANGE; + break; case 'k': mode = FALLOC_FL_KEEP_SIZE; break; @@ -237,6 +245,25 @@ fcollapse_f( } static int +finsert_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_INSERT_RANGE; + + if (!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} + +static int fzero_f( int argc, char **argv) @@ -345,6 +372,16 @@ prealloc_init(void) _("de-allocates space and eliminates the hole by shifting extents"); add_command(&fcollapse_cmd); + finsert_cmd.name = "finsert"; + finsert_cmd.cfunc = finsert_f; + finsert_cmd.argmin = 2; + finsert_cmd.argmax = 2; + finsert_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + finsert_cmd.args = _("off len"); + finsert_cmd.oneline = + _("allocates zeroes space after creating the hole by shifting extents"); + add_command(&finsert_cmd); + fzero_cmd.name = "fzero"; fzero_cmd.cfunc = fzero_f; fzero_cmd.argmin = 2; -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:32:24 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 B99D97F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:32:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5B4A1AC003 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:32:24 -0700 (PDT) X-ASG-Debug-ID: 1399545141-04bdf02b8c3fb630001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id 58I7jtc4zZreEOOu (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:32:22 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900L9Y3XW0A40@mailout1.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:32:20 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 13.CE.09952.43D5B635; Thu, 08 May 2014 19:32:20 +0900 (KST) X-AuditID: cbfee690-b7fcd6d0000026e0-14-536b5d348e50 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 2A.96.27725.43D5B635; Thu, 08 May 2014 19:32:20 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900I8C3XW9G30@mmp1.samsung.com>; Thu, 08 May 2014 19:32:20 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 5/10] xfstests: generic/027: Standard insert range tests Date: Thu, 08 May 2014 19:32:20 +0900 X-ASG-Orig-Subj: [PATCH v2 5/10] xfstests: generic/027: Standard insert range tests Message-id: <003b01cf6aa8$cab3e170$601ba450$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqKzthvi/gId6QlucXFZLQIM8EA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOIsWRmVeSWpSXmKPExsWyRsSkRNckNjvY4PELQ4ulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVMWHmNeaCh7oVj747NDAeUu1i5OSQEDCR6D+/hh3CFpO4cG89G4gt JLCUUeLfNwmYmk2L9zJ3MXIBxRcxSnzt2AHl/GWUODvtI1AHBwebgLbEny2iIA0iAp4Si49v ZQOpYRZYyShx7zhEjbCAt8TfdzwgNSwCqhL7//wDW8wrYCmx8P0xNghbUOLH5HssIDazgJbE +p3HmSBseYnNa94yQxykILHj7GtGiF16Ek0LnrJD1IhI7HvxjhFkr4TAOXaJ7p52JohlAhLf Jh9iAblBQkBWYtMBqDmSEgdX3GCZwCg2C8nqWUhWz0KyehaSFQsYWVYxiqYWJBcUJ6UXmegV J+YWl+al6yXn525iBEbi6X/PJuxgvHfA+hBjMtD6icxSosn5wEjOK4k3NDYzsjA1MTU2Mrc0 I01YSZxX7VFSkJBAemJJanZqakFqUXxRaU5q8SFGJg5OqQbGpkjOle0L53PLOL7r5XlQGaw1 w9+xTDt2SdP1jM/7Q4vq/zj7W2S3cPifDPJMs615c1N6HqfeRPttQV8vOOjV5bP3yjXvXW4W 82Si35GE6uJH6079kA/x6hB36zQ9Vf/9V+KRD6+arq9avv+D7Rmj6fL7T/bdZ/xWaqBv/FvR TnnzbrcZV5iVWIozEg21mIuKEwG5SeYn2gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrKKsWRmVeSWpSXmKPExsVy+t9jAV2T2OxggwufNSyWTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxowJM68xFzzUrXj03aGB8ZBq FyMnh4SAicSmxXuZIWwxiQv31rN1MXJxCAksYpT42rGDGcL5yyhxdtpHoAwHB5uAtsSfLaIg DSICnhKLj28Fa2AWWMkoce84RI2wgLfE33c8IDUsAqoS+//8YwexeQUsJRa+P8YGYQtK/Jh8 jwXEZhbQkli/8zgThC0vsXnNW6iDFCR2nH3NCLFLT6JpwVN2iBoRiX0v3jFOYBSYhWTULCSj ZiEZNQtJywJGllWMoqkFyQXFSem5hnrFibnFpXnpesn5uZsYwZH+TGoH48oGi0OMAhyMSjy8 Gc5ZwUKsiWXFlbmHGCU4mJVEeHn8s4OFeFMSK6tSi/Lji0pzUosPMSYDfTqRWUo0OR+YhPJK 4g2NTcyMLI3MDS2MjM1JE1YS5z3Qah0oJJCeWJKanZpakFoEs4WJg1OqgZGdX3AzU9S+X5xs azfH/Spa+O60stl21fefAkt2bzgun3nhzwPxNMMdApNecLcw7rZTvfDwF/upKQnML2YK32vl 45PmXNC5Q/UUQ8fyq3tv9ngcXMrtpj4nsYz1/4p19frv/TxSXryWuNHPJHjvsPUD5eJex32+ IRfu3XrIWvNAjTXUQuvq+wNKLMUZiYZazEXFiQBwQcipOAMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1399545142 X-Barracuda-Encrypted: RC4-MD5 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 testcase(027) tries to test various corner cases for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- common/punch | 5 ++++ common/rc | 2 +- tests/generic/027 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/027.out | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 5 files changed, 138 insertions(+), 1 deletion(-) create mode 100755 tests/generic/027 create mode 100644 tests/generic/027.out diff --git a/common/punch b/common/punch index f2d538c..4cc50d5 100644 --- a/common/punch +++ b/common/punch @@ -527,6 +527,11 @@ _test_generic_punch() return fi + # If zero_cmd is finsert, don't check unaligned offsets + if [ "$zero_cmd" == "finsert" ]; then + return + fi + echo " 16. data -> cache cold ->hole" if [ "$remove_testfile" ]; then rm -f $testfile diff --git a/common/rc b/common/rc index 5c13db5..3af3a20 100644 --- a/common/rc +++ b/common/rc @@ -1237,7 +1237,7 @@ _require_xfs_io_command() "falloc" ) testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` ;; - "fpunch" | "fcollapse" | "zero" | "fzero" ) + "fpunch" | "fcollapse" | "zero" | "fzero" | "finsert" ) testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "$command 4k 8k" $testfile 2>&1` ;; diff --git a/tests/generic/027 b/tests/generic/027 new file mode 100755 index 0000000..f2f7642 --- /dev/null +++ b/tests/generic/027 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/027 +# +# Standard insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/027.out b/tests/generic/027.out new file mode 100644 index 0000000..9b5ec15 --- /dev/null +++ b/tests/generic/027.out @@ -0,0 +1,66 @@ +QA output created by 027 + 1. into a hole +0: [0..7]: hole +1: [8..23]: extent +2: [24..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: extent +2: [24..31]: hole +3: [32..47]: extent +4: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..7]: hole +1: [8..23]: extent +2: [24..31]: hole +3: [32..47]: extent +4: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..31]: extent +1: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..47]: extent +1: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..47]: extent +1: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: extent +2: [32..39]: hole +3: [40..47]: extent +4: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..39]: extent +1: [40..47]: hole +2: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 961f4e5..6ab5618 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -29,6 +29,7 @@ 024 auto quick 025 auto quick 026 acl quick auto +027 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:33:20 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 DE7D27F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:33:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8AE3304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:33:17 -0700 (PDT) X-ASG-Debug-ID: 1399545194-04cbb03cc53cfc00001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id YP9e9Iy6htJNtfMS (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:33:16 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N59001ZJ3ZEXR60@mailout2.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:33:14 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm1.samsung.com ( [172.20.52.115]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id FA.B4.11120.A6D5B635; Thu, 08 May 2014 19:33:14 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-a5-536b5d6a5c06 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id E1.C6.27725.A6D5B635; Thu, 08 May 2014 19:33:14 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900G9A3ZE4O70@mmp1.samsung.com>; Thu, 08 May 2014 19:33:14 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 6/10] xfstests: generic/028: Delayed allocation insert range Date: Thu, 08 May 2014 19:33:13 +0900 X-ASG-Orig-Subj: [PATCH v2 6/10] xfstests: generic/028: Delayed allocation insert range Message-id: <003c01cf6aa8$ea9c5e40$bfd51ac0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqOKP6A3WltxpTZWOu9+eYf6+wQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOIsWRmVeSWpSXmKPExsWyRsSkWDcrNjvY4ESXmMXSiZeYLbYcu8do MXPeHTaLPXtPslhc3jWHzaK15ye7xaK+W4wO7B6nFkl4NJ05yuyx+sJWRo++LasYPT5vkgtg jeKySUnNySxLLdK3S+DKaF+7hq3gvVpF0+RHzA2MyxW6GDk4JARMJBb81+5i5AQyxSQu3FvP 1sXIxSEksJRRYtGCd2wwNV8+V0DEFzFK7DuwhhnC+cso0dVzhAWkiE1AW+LPFlGQQSICnhKL j28FG8QssJJR4t7xj2wgCWEBf4nPy1aygtgsAqoSqzdfB1vAK2ApMemNCUiYV0BQ4sfkeywg NrOAlsT6nceZIGx5ic1r3jJDHKogsePsa0aIXXoSj2/dYoaoEZHY9+IdI8heCYFr7BI9fyax QewSkPg2+RALxDOyEpsOQM2RlDi44gbLBEaxWUhWz0KyehaS1bOQrFjAyLKKUTS1ILmgOCm9 yFivODG3uDQvXS85P3cTIzAST/971r+D8e4B60OMyUDrJzJLiSbnAyM5ryTe0NjMyMLUxNTY yNzSjDRhJXHe+w+TgoQE0hNLUrNTUwtSi+KLSnNSiw8xMnFwSjUwThfa+tj/X3H8j42+9/b8 tNb9XSOgc6Xl8Y+I/8v3bf9+7d/yaYZr3uqk6G+1nyxgNtVo7qvZzWJpN9JTNXfvbj766fZO 111ZKqHf68IaraeWv3by9im/XbZNNGJbnZT1K6nrHx/5qr14NefavzLBkBUaD1hFmY6sTSu5 vFVd7fSk4kv53p8/vVViKc5INNRiLipOBACtBvhZ2gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrKKsWRmVeSWpSXmKPExsVy+t9jAd2s2Oxgg+NPeSyWTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxoz2tWvYCt6rVTRNfsTcwLhc oYuRg0NCwETiy+eKLkZOIFNM4sK99WxdjFwcQgKLGCX2HVjDDOH8ZZTo6jnCAtLAJqAt8WeL KEiDiICnxOLjW8EamAVWMkrcO/6RDSQhLOAv8XnZSlYQm0VAVWL15utsIL28ApYSk96YgIR5 BQQlfky+xwJiMwtoSazfeZwJwpaX2LzmLTPEQQoSO86+ZoTYpSfx+NYtZogaEYl9L94xTmAU mIVk1Cwko2YhGTULScsCRpZVjKKpBckFxUnpuYZ6xYm5xaV56XrJ+bmbGMGR/kxqB+PKBotD jAIcjEo8vBnOWcFCrIllxZW5hxglOJiVRHh5/LODhXhTEiurUovy44tKc1KLDzEmAz06kVlK NDkfmITySuINjU3MjCyNzA0tjIzNSRNWEuc90GodKCSQnliSmp2aWpBaBLOFiYNTqoGxUkLi faXGt2MGZXyzEq9Zue97MsnY5cCkbeqC8212sy+omVM0EZhgklZWe2WttmMVmTRXYVO42MS3 7r+2TNhwSkj78H6r+nabAy+6r0XsvC3kmF4ka9JUIjlf9b63u7a9dSFn9OkE+7DgrNm3z0k4 vYn6+FuZZc5X1XdiH555vP3bavWgOkuJpTgj0VCLuag4EQCG5h6nOAMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1399545196 X-Barracuda-Encrypted: RC4-MD5 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 testcase(028) tries to test various corner cases with delayed extents for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- tests/generic/028 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/028.out | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 132 insertions(+) create mode 100755 tests/generic/028 create mode 100644 tests/generic/028.out diff --git a/tests/generic/028 b/tests/generic/028 new file mode 100755 index 0000000..bc6f9a6 --- /dev/null +++ b/tests/generic/028 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/028 +# +# Delayed allocation insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/028.out b/tests/generic/028.out new file mode 100644 index 0000000..30af9a7 --- /dev/null +++ b/tests/generic/028.out @@ -0,0 +1,66 @@ +QA output created by 028 + 1. into a hole +0: [0..7]: hole +1: [8..23]: extent +2: [24..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: extent +2: [24..31]: hole +3: [32..47]: extent +4: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..7]: hole +1: [8..23]: extent +2: [24..31]: hole +3: [32..47]: extent +4: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..31]: extent +1: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..47]: extent +1: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..47]: extent +1: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: extent +2: [32..39]: hole +3: [40..47]: extent +4: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..39]: extent +1: [40..47]: hole +2: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 6ab5618..0ef13be 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -30,6 +30,7 @@ 025 auto quick 026 acl quick auto 027 auto quick prealloc +028 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:34:27 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 CA0AE7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:34:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AD19AC003 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:34:27 -0700 (PDT) X-ASG-Debug-ID: 1399545265-04bdf02b8d3fb8b0001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id hKADGtuS2jndIT3B (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:34:26 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900ICL41C5M80@mailout1.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:34:24 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 04.35.11120.0BD5B635; Thu, 08 May 2014 19:34:24 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-63-536b5db075aa Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id A5.23.25708.0BD5B635; Thu, 08 May 2014 19:34:24 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N59000UT41CJ7C0@mmp2.samsung.com>; Thu, 08 May 2014 19:34:24 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 7/10] xfstests: generic/029: Multi insert range tests Date: Thu, 08 May 2014 19:34:24 +0900 X-ASG-Orig-Subj: [PATCH v2 7/10] xfstests: generic/029: Multi insert range tests Message-id: <003d01cf6aa9$14808ce0$3d81a6a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqQEKNAa6fIjXQJ+ZGjnVsSYHIA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkWHdDbHawQddxNYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVcf/kL6aCxSoVD66fZ2pgnC3XxcjJISFgItF9ci4jhC0mceHeerYu Ri4OIYGljBJr9hxkhinaNb+TFSIxnVGic/4zKOcvo8TMq/eA2jk42AS0Jf5sEQVpEBHwlFh8 fCvYJGaBlYwS945/ZANJCAt4SNyetYAdxGYRUJXYtO8PE0gvr4ClxL49BiBhXgFBiR+T77GA 2MwCWhLrdx5ngrDlJTaveQt1kILEjrOvGSF26Uk8fH6dHaJGRGLfi3eMIHslBK6xS8z7sgJq l4DEt8mHWEB2SQjISmw6ADVHUuLgihssExjFZiFZPQvJ6llIVs9CsmIBI8sqRtHUguSC4qT0 ImO94sTc4tK8dL3k/NxNjMBoPP3vWf8OxrsHrA8xJgOtn8gsJZqcD4zmvJJ4Q2MzIwtTE1Nj I3NLM9KElcR57z9MChISSE8sSc1OTS1ILYovKs1JLT7EyMTBKdXAeOTJYuOEpquWnUrn1Grk by550Kagcut647SFLtzlOwXKHeZeOzijYmKkZ8C6fFm1fb4XbjGZWlizNhV94HJxbdlz/2JM ONOLY6dLZda5dmgtNue9vevT7pdC8b/7/Do+tmW7tzSeL5zN/ra0ryI18vFLNRN7MXHPSu7X JVNannYx8c+sP+KixFKckWioxVxUnAgAwJAWP9wCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGKsWRmVeSWpSXmKPExsVy+t9jQd0NsdnBBif+ylosnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBn3T/5iKlisUvHg+nmmBsbZ cl2MnBwSAiYSu+Z3skLYYhIX7q1n62Lk4hASmM4o0Tn/GSuE85dRYubVe4xdjBwcbALaEn+2 iII0iAh4Siw+vhWsgVlgJaPEveMf2UASwgIeErdnLWAHsVkEVCU27fvDBNLLK2ApsW+PAUiY V0BQ4sfkeywgNrOAlsT6nceZIGx5ic1r3jJDHKQgsePsa0aIXXoSD59fZ4eoEZHY9+Id4wRG gVlIRs1CMmoWklGzkLQsYGRZxSiaWpBcUJyUnmukV5yYW1yal66XnJ+7iREc68+kdzCuarA4 xCjAwajEw5vhnBUsxJpYVlyZe4hRgoNZSYSXxz87WIg3JbGyKrUoP76oNCe1+BBjMtCjE5ml RJPzgWkoryTe0NjEzMjSyNzQwsjYnDRhJXHeg63WgUIC6YklqdmpqQWpRTBbmDg4pRoY42ef ZmXnCKtvSfA22pr63Sfqi6uhiuqDtHn38h/Vt8oeu7Du4rWuIjvnA/URC1Meh57zTNXRnuYW s9OsN6dG2K3iz4YoL9ukcrfkc3s1L8+2jS9/1Pd4e6RB9+XT3pcMjtRobZh6av0tfYPOnV+C jL9pJjPlxZmcDs67WTh92vHn+79fPsWtxFKckWioxVxUnAgAJWtkozkDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1399545265 X-Barracuda-Encrypted: RC4-MD5 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 testcase(029) tries to test various corner cases with pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- tests/generic/029 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/029.out | 50 +++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 116 insertions(+) create mode 100755 tests/generic/029 create mode 100644 tests/generic/029.out diff --git a/tests/generic/029 b/tests/generic/029 new file mode 100755 index 0000000..13d7164 --- /dev/null +++ b/tests/generic/029 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/029 +# +# Multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/029.out b/tests/generic/029.out new file mode 100644 index 0000000..0a2b659 --- /dev/null +++ b/tests/generic/029.out @@ -0,0 +1,50 @@ +QA output created by 029 + 1. into a hole +0: [0..7]: hole +1: [8..23]: extent +2: [24..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..55]: extent +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..39]: extent +1: [40..47]: hole +2: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 0ef13be..f5fe53c 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -31,6 +31,7 @@ 026 acl quick auto 027 auto quick prealloc 028 auto quick prealloc +029 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:35:25 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 56CDD7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:35:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 31A908F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:35:25 -0700 (PDT) X-ASG-Debug-ID: 1399545322-04cb6c1fcc293f80001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id XwQ02S1cUjDAyZRH (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:35:23 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900I4Q42YZ760@mailout4.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:35:22 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id A4.DF.09952.9ED5B635; Thu, 08 May 2014 19:35:22 +0900 (KST) X-AuditID: cbfee690-b7fcd6d0000026e0-05-536b5de9ccc4 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 5C.37.27725.9ED5B635; Thu, 08 May 2014 19:35:21 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900GJO42X4O70@mmp1.samsung.com>; Thu, 08 May 2014 19:35:21 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 8/10] xfstests: generic/030: Delayed allocation multi insert Date: Thu, 08 May 2014 19:35:21 +0900 X-ASG-Orig-Subj: [PATCH v2 8/10] xfstests: generic/030: Delayed allocation multi insert Message-id: <003e01cf6aa9$36b14c00$a413e400$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqSVS59PZm3FqQM22KLrPnqc6tA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBIsWRmVeSWpSXmKPExsWyRsSkRPdVbHawweatjBZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoErY8+cZewFl1UqTp9ewdrAeESui5GTQ0LAROLp1gZWCFtM4sK99Wwg tpDAUkaJCccjYWoatvwGquECii9ilOj7OosRwvnLKDF94QamLkYODjYBbYk/W0RBGkQEPCUW H9/KBlLDLLCSUeLe8Y9sIDXCAv4Suw6LgNSwCKhKdPT1gS3jFbCUeLj4KDOELSjxY/I9FhCb WUBLYv3O40wQtrzE5jVvmSEOUpDYcfY1I8QuPYkNCxrZIWpEJPa9eAd2m4TAJXaJZ49mM0Es E5D4NvkQC8gNEgKyEpsOQM2RlDi44gbLBEaxWUhWz0KyehaS1bOQrFjAyLKKUTS1ILmgOCm9 yESvODG3uDQvXS85P3cTIzAWT/97NmEH470D1ocYk4HWT2SWEk3OB8ZyXkm8obGZkYWpiamx kbmlGWnCSuK8ao+SgoQE0hNLUrNTUwtSi+KLSnNSiw8xMnFwSjUwRuxPXXbpQGq+Hsu1+1ZH D6wLzJ+1L+5QU87cDQsLP29TNtV0zzh37mO1cIPG7Y9TdfdvjuO7dmPP3JOz4+S2yputffE9 nemuXNI/7VXMZRt/HZ7ZxJpwv+TDgTcXaye6ntzWpvEi+tDjns03fPh8Sxfk3NqV26FwZn3B ipVeThsenL6sb9FmqKnEUpyRaKjFXFScCABBaCUm2wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGKsWRmVeSWpSXmKPExsVy+t9jAd2XsdnBBjdWmFksnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBl75ixjL7isUnH69ArWBsYj cl2MnBwSAiYSDVt+s0LYYhIX7q1n62Lk4hASWMQo0fd1FiOE85dRYvrCDUxdjBwcbALaEn+2 iII0iAh4Siw+vhWsgVlgJaPEveMf2UBqhAX8JXYdFgGpYRFQlejo62MDsXkFLCUeLj7KDGEL SvyYfI8FxGYW0JJYv/M4E4QtL7F5zVtmiIMUJHacfc0IsUtPYsOCRnaIGhGJfS/eMU5gFJiF ZNQsJKNmIRk1C0nLAkaWVYyiqQXJBcVJ6bmGesWJucWleel6yfm5mxjBsf5MagfjygaLQ4wC HIxKPLwZzlnBQqyJZcWVuYcYJTiYlUR4efyzg4V4UxIrq1KL8uOLSnNSiw8xJgN9OpFZSjQ5 H5iG8kriDY1NzIwsjcwNLYyMzUkTVhLnPdBqHSgkkJ5YkpqdmlqQWgSzhYmDU6qBsaQ0v8Xz U1vif6acunsx0nHLXcJsRU25GSZIiPtK31+U3LGjQCK8VmSRwL8dtYL3GSWlFX//f/zcjed+ nV+Z7P0rb4oWNyn5rFzAPf8LC8u7d1d/1pt47w9Yxf3ydvOp35cbZN+dato1advVlhyGGWpc zRP8//s8aS9+qS4srDfZ/rPV8Rs1SizFGYmGWsxFxYkAbMKYiTkDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1399545323 X-Barracuda-Encrypted: RC4-MD5 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 testcase(030) tries to test various corner cases with delayed extents and pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- tests/generic/030 | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/030.out | 50 +++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 116 insertions(+) create mode 100755 tests/generic/030 create mode 100644 tests/generic/030.out diff --git a/tests/generic/030 b/tests/generic/030 new file mode 100755 index 0000000..02680b7 --- /dev/null +++ b/tests/generic/030 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/030 +# +# Delayed allocation multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/030.out b/tests/generic/030.out new file mode 100644 index 0000000..eed3303 --- /dev/null +++ b/tests/generic/030.out @@ -0,0 +1,50 @@ +QA output created by 030 + 1. into a hole +0: [0..7]: hole +1: [8..23]: extent +2: [24..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..55]: extent +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..39]: extent +1: [40..47]: hole +2: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index f5fe53c..9187d9e 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -32,6 +32,7 @@ 027 auto quick prealloc 028 auto quick prealloc 029 auto quick prealloc +030 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:36:28 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 2E8BD7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:36:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18DD6304048 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:36:27 -0700 (PDT) X-ASG-Debug-ID: 1399545384-04cbb03cc63cfe80001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id KVL3A4u3T2YOEZXO (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:36:26 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5900KH344OIE40@mailout3.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:36:24 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id D6.E5.11120.72E5B635; Thu, 08 May 2014 19:36:24 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-e1-536b5e27678b Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 5C.83.25708.72E5B635; Thu, 08 May 2014 19:36:23 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900GPC44NP060@mmp1.samsung.com>; Thu, 08 May 2014 19:36:23 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 9/9] xfstests: fsstress: Add fallocate insert range Date: Thu, 08 May 2014 19:36:23 +0900 X-ASG-Orig-Subj: [PATCH v2 9/9] xfstests: fsstress: Add fallocate insert range Message-id: <003f01cf6aa9$5ba9b6a0$12fd23e0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqUyE+5riHYd7SUWMy47eodWXvw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkSFcjLjvYYEW9xdKJl5gtthy7x2gx c94dNos9e0+yWFzeNYfNorXnJ7vFor5bjA7sHqcWSXg0nTnK7LH6wlZGj74tqxg9Pm+SC2CN 4rJJSc3JLEst0rdL4MrYcOApW8Es0YoVb48zNTD+FOhi5OSQEDCRuDRzHiuELSZx4d56ti5G Lg4hgaWMEu/ObmKDKTrX84YVIrGIUWLxojOMEM5fRomPb5+wdzFycLAJaEv82SIK0iAi4Cmx +PhWsEnMAisZJe4d/wg2SVjATeLlr0PsIDaLgKrEmfZjYDavgKXE8VUzGCFsQYkfk++xgNjM AloS63ceZ4Kw5SU2r3nLDHGRgsSOs68ZIZbpSWw9fYcVokZEYt+Ld2DHSQhcYpd42L6GFWKZ gMS3yYdYQA6VEJCV2HQAao6kxMEVN1gmMIrNQrJ6FpLVs5CsnoVkxQJGllWMoqkFyQXFSelF xnrFibnFpXnpesn5uZsYgdF4+t+z/h2Mdw9YH2JMBlo/kVlKNDkfGM15JfGGxmZGFqYmpsZG 5pZmpAkrifPef5gUJCSQnliSmp2aWpBaFF9UmpNafIiRiYNTqoHRQExvhUCqhQBP1bwjyYFS nCri61pPfdSJ7Vqx4Cr3kzcunaFZU9dd2B2eH3Vj479PHoG/NeZYb5vvWLvvseVZ8VvedUfe Pfp6bsKGaQzexu92eaq/E5iU9K60R05zUvgU4w0WPpHXpTy2KG+quq3fVfbmtdQL/YajRfxH Tn7MlSuYvubXoRuxSizFGYmGWsxFxYkA/6sqVNwCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOKsWRmVeSWpSXmKPExsVy+t9jAV31uOxgg641ZhZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NaqB0SYjNTEltUghNS85PyUzL91WyTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMH6Awl hbLEnFKgUEBicbGSvh2mCaEhbroWMI0Rur4hQXA9RgZoIGENY8aGA0/ZCmaJVqx4e5ypgfGn QBcjJ4eEgInEuZ43rBC2mMSFe+vZuhi5OIQEFjFKLF50hhHC+cso8fHtE/YuRg4ONgFtiT9b REEaRAQ8JRYf3wrWwCywklHi3vGPbCAJYQE3iZe/DrGD2CwCqhJn2o+B2bwClhLHV81ghLAF JX5MvscCYjMLaEms33mcCcKWl9i85i0zxEUKEjvOvmaEWKYnsfX0HVaIGhGJfS/eMU5gFJiF ZNQsJKNmIRk1C0nLAkaWVYyiqQXJBcVJ6blGesWJucWleel6yfm5mxjB0f5MegfjqgaLQ4wC HIxKPLwZzlnBQqyJZcWVuYcYJTiYlUR4efyzg4V4UxIrq1KL8uOLSnNSiw8xJgN9OpFZSjQ5 H5iI8kriDY1NzIwsjcwNLYyMzUkTVhLnPdhqHSgkkJ5YkpqdmlqQWgSzhYmDU6qBcZ1j3rsP dx7orFv4ICVa6fEsj99s9j+C3113KEg6VOh1pdFav6e0IMhw9YKoN4tn3ZfPv8DL9ujpCe7o XV4rShc2Ffyeq6eSMjMl9NjlyqaeX95Jrd0LxP+EW8TPC7mq55t390TyXauX7737jlZVelxV j/S/UnNb8pn5/tf+xl6Jl2yu/+V2UmIpzkg01GIuKk4EAAaFLNQ6AwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1399545385 X-Barracuda-Encrypted: RC4-MD5 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=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== This commit adds insert operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- ltp/fsstress.c | 19 ++++++++++++++++--- src/global.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index b56fe5c..aa3e0c3 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -72,6 +72,7 @@ typedef enum { OP_PUNCH, OP_ZERO, OP_COLLAPSE, + OP_INSERT, OP_READ, OP_READLINK, OP_RENAME, @@ -170,6 +171,7 @@ void mknod_f(int, long); void punch_f(int, long); void zero_f(int, long); void collapse_f(int, long); +void insert_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -209,6 +211,7 @@ opdesc_t ops[] = { { OP_PUNCH, "punch", punch_f, 1, 1 }, { OP_ZERO, "zero", zero_f, 1, 1 }, { OP_COLLAPSE, "collapse", collapse_f, 1, 1 }, + { OP_INSERT, "insert", insert_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -2176,6 +2179,7 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"}, { -1, NULL} }; @@ -2227,10 +2231,11 @@ do_fallocate(int opno, long r, int mode) off %= maxfsize; len = (off64_t)(random() % (1024 * 1024)); /* - * Collapse range requires off and len to be block aligned, make it - * more likely to be the case. + * Collapse/insert range requires off and len to be block aligned, + * make it more likely to be the case. */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { + if ((mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)) && + (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } @@ -2656,6 +2661,14 @@ collapse_f(int opno, long r) } void +insert_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_INSERT_RANGE); +#endif +} + +void read_f(int opno, long r) { char *buf; diff --git a/src/global.h b/src/global.h index 8180f66..8f64787 100644 --- a/src/global.h +++ b/src/global.h @@ -172,6 +172,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + #endif /* HAVE_LINUX_FALLOC_H */ #endif /* GLOBAL_H */ -- 1.7.11-rc0 From namjae.jeon@samsung.com Thu May 8 05:38:16 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 4F0987F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:38:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38B69304053 for <xfs@oss.sgi.com>; Thu, 8 May 2014 03:38:16 -0700 (PDT) X-ASG-Debug-ID: 1399545493-04cbb03cc73cffc0001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id nKIMnaCPD08Jiqs7 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 03:38:14 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N59001S247PXP70@mailout2.samsung.com> for xfs@oss.sgi.com; Thu, 08 May 2014 19:38:13 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 3E.16.18501.49E5B635; Thu, 08 May 2014 19:38:12 +0900 (KST) X-AuditID: cbfee68d-b7f4e6d000004845-86-536b5e948d1b Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 08.34.25708.49E5B635; Thu, 08 May 2014 19:38:12 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5900I6T47OVU30@mmp1.samsung.com>; Thu, 08 May 2014 19:38:12 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu> Cc: 'linux-ext4' <linux-ext4@vger.kernel.org>, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com> Subject: [PATCH v2 10/10] xfstests: fsx: Add fallocate insert range operation Date: Thu, 08 May 2014 19:38:12 +0900 X-ASG-Orig-Subj: [PATCH v2 10/10] xfstests: fsx: Add fallocate insert range operation Message-id: <004001cf6aa9$9c6dc2d0$d5494870$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9qqX37GwFfohzQSTekN4KH7xYYQg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkSHdKXHawweT/BhZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoErY9/ZJywFTzQr3k++y9LAeEKhi5GTQ0LAROLYvB4WCFtM4sK99Wxd jFwcQgJLGSXuHmhkgSm6P/E1M0RiEaPE4+enGCGcv4wSd358Bari4GAT0Jb4s0UUpEFEwFNi 8fGtYJOYBVYyStw7/pENJCEs4CuxeMkEZhCbRUBV4sKM62AbeAUsJTadP8YGYQtK/Jh8DyzO LKAlsX7ncSYIW15i85q3zBAXKUjsOPuaEWKZnsTkJ11sEDUiEvtevGOEqLnELjG/qx5il4DE t8mHwO6UEJCV2HQAaoykxMEVN1gmMIrNQrJ5FpLNs5BsnoVkwwJGllWMoqkFyQXFSelFhnrF ibnFpXnpesn5uZsYgdF4+t+z3h2Mtw9YH2JMBlo/kVlKNDkfGM15JfGGxmZGFqYmpsZG5pZm pAkrifMmPUwKEhJITyxJzU5NLUgtii8qzUktPsTIxMEp1cDo18Vb/WSbttCaPb37CzYd2xBz 40XRjKi+6nrXHA7d5A+vLW/OWdkiYTp1zZ3+M9en+D4X2Lf919JnLLsvhcUerVleszvlfR5b 1+Hz9R+vT5u9QebB8tqy5+H/H7+YrBto519kMM1BMFjWQtI1x4plqfPdTYkpUmWmV+6/VXk5 Z/9bm5sHeJmPKLEUZyQaajEXFScCAKJEDojcAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOKsWRmVeSWpSXmKPExsVy+t9jAd0pcdnBBs+vqFssnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBn7zj5hKXiiWfF+8l2WBsYT Cl2MnBwSAiYS9ye+ZoawxSQu3FvP1sXIxSEksIhR4vHzU4wQzl9GiTs/vrJ0MXJwsAloS/zZ IgrSICLgKbH4+FawBmaBlYwS945/ZANJCAv4SixeMgFsKouAqsSFGddZQGxeAUuJTeePsUHY ghI/Jt8DizMLaEms33mcCcKWl9i85i3URQoSO86+ZoRYpicx+UkXG0SNiMS+F+8YJzAKzEIy ahaSUbOQjJqFpGUBI8sqRtHUguSC4qT0XCO94sTc4tK8dL3k/NxNjOBofya9g3FVg8UhRgEO RiUe3gznrGAh1sSy4srcQ4wSHMxKIrw8/tnBQrwpiZVVqUX58UWlOanFhxiTgT6dyCwlmpwP TER5JfGGxiZmRpZG5oYWRsbmpAkrifMebLUOFBJITyxJzU5NLUgtgtnCxMEp1cA44facCRlL m3KUGp01/bjM7TT3BAaUCgccfntmzQyTWo5ciQLW74tV3s0T7VcKCDv9+eF7boaCig/Ha4VW WQne0b3DsTR71RJ+3d5LOT+uHN3+zNNzego/9517+fNtrhyfceMcT+dOwc/zXZKbPZ49nqPV dujIxisN9bme9xnPeGUFbG7PLV6nxFKckWioxVxUnAgAC785RzoDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1399545494 X-Barracuda-Encrypted: RC4-MD5 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 commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- ltp/fsx.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 47d3ee8..875460e 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -95,7 +95,8 @@ int logcount = 0; /* total ops */ #define OP_PUNCH_HOLE 6 #define OP_ZERO_RANGE 7 #define OP_COLLAPSE_RANGE 8 -#define OP_MAX_FULL 9 +#define OP_INSERT_RANGE 9 +#define OP_MAX_FULL 10 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -145,6 +146,7 @@ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ int collapse_range_calls = 1; /* -C flag disables */ +int insert_range_calls = 1; /* -i flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -339,6 +341,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******CCCC"); break; + case OP_INSERT_RANGE: + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******CCCC"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_INSERT_RANGE +void +do_insert_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_INSERT_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length insert range\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + if ((loff_t)offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping insert range behind EOF\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + log4(OP_INSERT_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + end_offset = offset + length; + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("insert range: %x to %x\n", offset, length); + prterr("do_insert_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + end_offset, good_buf + offset, + file_size - offset); + memset(good_buf + offset, '\0', length); + file_size += length; +} + +#else +void +do_insert_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1192,6 +1255,12 @@ test(void) goto out; } break; + case OP_INSERT_RANGE: + if (!insert_range_calls) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1244,6 +1313,21 @@ test(void) } do_collapse_range(offset, size); break; + case OP_INSERT_RANGE: + TRIM_OFF_LEN(offset, size, (maxfilelen - 1) - file_size); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + if (file_size + size > maxfilelen) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + + do_insert_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1307,6 +1391,9 @@ usage(void) #ifdef FALLOC_FL_COLLAPSE_RANGE " -C: Do not use collapse range calls\n" #endif +#ifdef FALLOC_FL_INSERT_RANGE +" -i: Do not use insert range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1493,7 +1580,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCiLN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1599,6 +1686,9 @@ main(int argc, char **argv) case 'C': collapse_range_calls = 0; break; + case 'i': + insert_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1758,6 +1848,8 @@ main(int argc, char **argv) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); if (collapse_range_calls) collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); + if (insert_range_calls) + insert_range_calls = test_fallocate(FALLOC_FL_INSERT_RANGE); while (numops == -1 || numops--) test(); -- 1.7.11-rc0 From bfoster@redhat.com Thu May 8 07:02:35 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CE5AE7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 07:02:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1D8930404E for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:02:32 -0700 (PDT) X-ASG-Debug-ID: 1399550551-04bdf02b8b3ffcd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GHUAGFUgC5gdkpic for <xfs@oss.sgi.com>; Thu, 08 May 2014 05:02: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s48C2Uk2012277 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 8 May 2014 08:02:30 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s48C2T9F015741; Thu, 8 May 2014 08:02:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A936C1242A3; Thu, 8 May 2014 08:02:28 -0400 (EDT) Date: Thu, 8 May 2014 08:02:28 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140508120228.GA47272@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> <20140508011256.GS5421@dastard> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="nFreZHaLTZJo0R7j" Content-Disposition: inline In-Reply-To: <20140508011256.GS5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399550551 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 --nFreZHaLTZJo0R7j Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, May 08, 2014 at 11:12:56AM +1000, Dave Chinner wrote: > On Thu, May 08, 2014 at 08:47:55AM +1000, Dave Chinner wrote: > > On Wed, May 07, 2014 at 10:48:22AM -0400, Brian Foster wrote: > > > Note that the Makefile structure between the core and libxfs/ subdir > > > appears to be busted for module compiles. It attempts to create a > > > libxfs.ko and doesn't appear to create any real link dependency between > > > the logical modules: > > > > Ok, I hadn't tested that. I'll look into it. > > > > > ... > > > WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] > > > undefined! > > > WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] > > > undefined! > > > WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! > > > WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! > > > WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] > > > undefined! > > > > That tends to imply I didn't do the right thing with the tracing, > > either. > > > > > CC fs/xfs/xfs.mod.o > > > CC fs/xfs/libxfs/libxfs.mod.o > > > LD [M] fs/xfs/xfs.ko > > > LD [M] fs/xfs/libxfs/libxfs.ko > > > > > > I played with it a bit but didn't get anywhere without just pulling the > > > source file dependency up into fs/xfs/Makefile. :/ > > > > I'll see what I can dig up. > > Well, I can make use of "lib-y" to get around the "libxfs is built > as a module" problem: > > .... > CC fs/xfs/libxfs/xfs_sb.o > CC fs/xfs/libxfs/xfs_symlink_remote.o > CC fs/xfs/libxfs/xfs_trans_resv.o > AR fs/xfs/libxfs/lib.a > > but then there is the issue of adding it as a link flag to the xfs > object itself. That involved a bit of a ld hack, but I have it > compiling as a module now. Patch below. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > libxfs: fix modular build > > From: Dave Chinner <dchinner@redhat.com> > > As reported by Brain Foster: > > Note that the Makefile structure between the core and libxfs/ subdir > appears to be busted for module compiles. It attempts to create a > libxfs.ko and doesn't appear to create any real link dependency between > the logical modules: > > ... > WARNING: "__tracepoint_xfs_dir2_sf_create" [fs/xfs/libxfs/libxfs.ko] > undefined! > WARNING: "__tracepoint_xfs_da_root_join" [fs/xfs/libxfs/libxfs.ko] > undefined! > WARNING: "xfs_trans_mod_sb" [fs/xfs/libxfs/libxfs.ko] undefined! > WARNING: "xfs_extent_busy_insert" [fs/xfs/libxfs/libxfs.ko] undefined! > WARNING: "__tracepoint_xfs_dir2_sf_addname" [fs/xfs/libxfs/libxfs.ko] > undefined! > CC fs/xfs/xfs.mod.o > CC fs/xfs/libxfs/libxfs.mod.o > LD [M] fs/xfs/xfs.ko > LD [M] fs/xfs/libxfs/libxfs.ko > > Fix it by converting libxfs to be a static library, and hack the > fs/xfs/xfs.o linker commands to include it directly and so > completely avoid the need for a libxfs.ko module until we have > sorted out all the circular dependency issues. > > Reported-by: Brian Foster <bfoster@redhat.com> > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/Makefile | 22 +++++++++++++++++++--- > fs/xfs/libxfs/Makefile | 12 +++++++----- > 2 files changed, 26 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile > index c520bff..726cfaa 100644 > --- a/fs/xfs/Makefile > +++ b/fs/xfs/Makefile > @@ -20,10 +20,26 @@ ccflags-y += -I$(src) # needed for trace events > ccflags-y += -I$(src)/libxfs # XXX: temporary! > ccflags-y += -I$(src)/libxfs/include # XXX: temporary! > > -ccflags-$(CONFIG_XFS_DEBUG) += -g > +# libxfs should inheret this as well. > +subdir-ccflags-$(CONFIG_XFS_DEBUG) += -g > > -obj-$(CONFIG_XFS_FS) += xfs.o \ > - libxfs/ > +# When building as a module, we don't want a separate libxfs.ko, > +# so we specifically have to link the libxfs.o object into the > +# xfs.ko module. Hence we need to tell LD to do this appropriately. > +#ldflags-y += -L$(obj)/libxfs -l:libxfs.o > +# > +# The use of --start-group without --endgroup here is a bit of a hack > +# to avoid needing to use symbol exports and real modules. > +# This works around the fact that ldflags-y is included on the linker command > +# line before all the object files built in this directory, and hence > +# it drops all the unreferenced symbols from libxfs. i.e. all the ones that > +# that xfs.ko module actually requires. The lack of an "--end-group" varaible > +# means LD considers all object files on the command line for recursive object > +# searching and hence solves the specification order problem. > +ldflags-y += --start-group $(obj)/libxfs/lib.a > + > +obj-$(CONFIG_XFS_FS) += libxfs/ \ > + xfs.o > > # this one should be compiled first, as the tracing macros can easily blow up > xfs-y += xfs_trace.o > diff --git a/fs/xfs/libxfs/Makefile b/fs/xfs/libxfs/Makefile > index e3de6df..b5f443b 100644 > --- a/fs/xfs/libxfs/Makefile > +++ b/fs/xfs/libxfs/Makefile > @@ -8,11 +8,13 @@ > ccflags-y += -I$(src)/.. > ccflags-y += -I$(src)/include -Werror # needed for trace events > > -ccflags-$(CONFIG_XFS_DEBUG) += -g > +# Use the lib-X directives rather than obj-X so that this doesn't get built as a > +# module itself and have unresolvable circular dependencies with the xfs module. > +# This means the xfs module needs to specifically link libxfs/lib.a because we > +# are not adding fs/xfs/libxfs to the libs-y built-in library search > +# directories. A bit hacky, but it seems to work as desired for modular builds. > > -obj-$(CONFIG_XFS_FS) += libxfs.o > - > -libxfs-y += xfs_alloc.o \ > +lib-(CONFIG_XFS_FS) += xfs_alloc.o \ Missing a $ here... Adding that, the single threaded build still breaks for me. E.g., - rm -rf fs/xfs - git checkout -- . - make ... CC [M] fs/xfs/xfs_qm.o CC [M] fs/xfs/xfs_quotaops.o CC [M] fs/xfs/xfs_acl.o CC [M] fs/xfs/xfs_stats.o CC [M] fs/xfs/xfs_sysctl.o CC [M] fs/xfs/xfs_ioctl32.o LD [M] fs/xfs/xfs.o ld: cannot find fs/xfs/libxfs/lib.a: No such file or directory make[2]: *** [fs/xfs/xfs.o] Error 1 make[1]: *** [fs/xfs] Error 2 make: *** [fs] Error 2 If I repeat and make -j 4 a couple times I can get around it (i.e., it may still create lib.a and fail, so a repeat run will work). I suspect this just means the dependency isn't quite right. It looks like it maybe tries to link the current object (xfs.o) before moving on to the subdir, but the subdir dependency creates the lib.a. It seems to work if I use this in xfs/Makefile: obj-y += libxfs/ obj-$(CONFIG_XFS_FS) += xfs.o ... rather than putting both deps under the CONFIG conditional, but I think that might make the libxfs bits built-in: ... CC fs/xfs/libxfs/xfs_symlink_remote.o CC fs/xfs/libxfs/xfs_trans_resv.o AR fs/xfs/libxfs/lib.a LD fs/xfs/built-in.o CC [M] fs/xfs/xfs_trace.o ... FWIW, the attached diff shows what I mean by pulling things into fs/xfs/Makefile. This works Ok for me. It's not the pure separation we probably want to have, but perhaps good enough for now and avoids weird build infrastructure hacks. Brian > xfs_alloc_btree.o \ > xfs_attr.o \ > xfs_attr_leaf.o \ > @@ -38,4 +40,4 @@ libxfs-y += xfs_alloc.o \ > xfs_symlink_remote.o \ > xfs_trans_resv.o > > -libxfs-$(CONFIG_XFS_RT) += xfs_rtbitmap.o > +lib-$(CONFIG_XFS_RT) += xfs_rtbitmap.o --nFreZHaLTZJo0R7j Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="xfs_make.diff" diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 726cfaa..70082c7 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -36,10 +36,9 @@ subdir-ccflags-$(CONFIG_XFS_DEBUG) += -g # that xfs.ko module actually requires. The lack of an "--end-group" varaible # means LD considers all object files on the command line for recursive object # searching and hence solves the specification order problem. -ldflags-y += --start-group $(obj)/libxfs/lib.a +#ldflags-y += --start-group $(obj)/libxfs/lib.a -obj-$(CONFIG_XFS_FS) += libxfs/ \ - xfs.o +obj-$(CONFIG_XFS_FS) += xfs.o # this one should be compiled first, as the tracing macros can easily blow up xfs-y += xfs_trace.o @@ -105,3 +104,32 @@ xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o xfs-$(CONFIG_PROC_FS) += xfs_stats.o xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o xfs-$(CONFIG_COMPAT) += xfs_ioctl32.o + +# libxfs +xfs-y += libxfs/xfs_alloc.o \ + libxfs/xfs_alloc_btree.o \ + libxfs/xfs_attr.o \ + libxfs/xfs_attr_leaf.o \ + libxfs/xfs_attr_remote.o \ + libxfs/xfs_bmap.o \ + libxfs/xfs_bmap_btree.o \ + libxfs/xfs_btree.o \ + libxfs/xfs_da_btree.o \ + libxfs/xfs_da_format.o \ + libxfs/xfs_dir2.o \ + libxfs/xfs_dir2_block.o \ + libxfs/xfs_dir2_data.o \ + libxfs/xfs_dir2_leaf.o \ + libxfs/xfs_dir2_node.o \ + libxfs/xfs_dir2_sf.o \ + libxfs/xfs_dquot_buf.o \ + libxfs/xfs_ialloc.o \ + libxfs/xfs_ialloc_btree.o \ + libxfs/xfs_inode_fork.o \ + libxfs/xfs_inode_buf.o \ + libxfs/xfs_log_rlimit.o \ + libxfs/xfs_sb.o \ + libxfs/xfs_symlink_remote.o \ + libxfs/xfs_trans_resv.o + +xfs-$(CONFIG_XFS_RT) += libxfs/xfs_rtbitmap.o --nFreZHaLTZJo0R7j-- From BATV+e0dd24052bbf47b1c114+3910+infradead.org+hch@bombadil.srs.infradead.org Thu May 8 07:54:10 2014 Return-Path: <BATV+e0dd24052bbf47b1c114+3910+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 161BB7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 07:54:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DA33304064 for <xfs@oss.sgi.com>; Thu, 8 May 2014 05:54:09 -0700 (PDT) X-ASG-Debug-ID: 1399553647-04cb6c72903ebd30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Ab2KvCllVITIiIga (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 05:54:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e0dd24052bbf47b1c114+3910+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 1WiNpt-0005Jq-Td; Thu, 08 May 2014 12:54:05 +0000 Date: Thu, 8 May 2014 05:54:05 -0700 From: Christoph Hellwig <hch@infradead.org> To: Brian Foster <bfoster@redhat.com> Cc: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140508125405.GA8096@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> <20140508011256.GS5421@dastard> <20140508120228.GA47272@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508120228.GA47272@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1399553647 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.5639 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, May 08, 2014 at 08:02:28AM -0400, Brian Foster wrote: > Missing a $ here... > > Adding that, the single threaded build still breaks for me. E.g., > > - rm -rf fs/xfs > - git checkout -- . > - make The kernel build systems doesn't support building a single module from multiple makefiles. Take a look how to handle a subdirectory in the older XFS versions that still had that linux-2.6 subdirectory, it just pulls the files in the subdirectory in from the main makefile, which requires some tiny hacks for the include path. From stan@hardwarefreak.com Thu May 8 08:04:39 2014 Return-Path: <stan@hardwarefreak.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2251B7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 08:04:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A45A7AC003 for <xfs@oss.sgi.com>; Thu, 8 May 2014 06:04:35 -0700 (PDT) X-ASG-Debug-ID: 1399554271-04cbb03cc43d5880001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id U5FXAbQgO2tiniKM for <xfs@oss.sgi.com>; Thu, 08 May 2014 06:04:31 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id D4E3C6C0F1; Thu, 8 May 2014 08:04:30 -0500 (CDT) Message-ID: <536B80E0.9000406@hardwarefreak.com> Date: Thu, 08 May 2014 08:04:32 -0500 From: Stan Hoeppner <stan@hardwarefreak.com> Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Marc Caubet <mcaubet@pic.es> CC: xfs@oss.sgi.com Subject: Re: Alignment: XFS + LVM2 References: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> <536AEBB9.3020807@hardwarefreak.com> <CAPrERe3v_1mPy6ABAKj4TxTmy1FB2=ipi6Vn3N6dZ7w8B9DeZA@mail.gmail.com> X-ASG-Orig-Subj: Re: Alignment: XFS + LVM2 In-Reply-To: <CAPrERe3v_1mPy6ABAKj4TxTmy1FB2=ipi6Vn3N6dZ7w8B9DeZA@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1399554271 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 5/8/2014 4:12 AM, Marc Caubet wrote: > Hi Stan, > > thanks for your answer. > > Everything begins and ends with the workload. >> >> On 5/7/2014 7:43 AM, Marc Caubet wrote: >>> Hi all, >>> >>> I am trying to setup a storage pool with correct disk alignment and I >> hope >>> somebody can help me to understand some unclear parts to me when >>> configuring XFS over LVM2. >> >> I'll try. But to be honest, after my first read of your post, a few >> things jump out as breaking traditional rules. >> >> The first thing you need to consider is your workload and the type of >> read/write patterns it will generate. This document is unfinished, and >> unformatted, but reading what is there should be informative: >> >> http://www.hardwarefreak.com/xfs/storage-arch.txt >> > > Basically we are moving a lot of data :) It means, parallel large files > (GBs) are being written and read all the time. Basically we have a batch > farm with 3,5k cores processing jobs that are constantly reading and > writing to the storage pools (4PBs). Only few pools (~5% of the total) > contain small files (and only small files). And these pools are tied together with? Gluster? Ceph? >>> Actually we have few storage pools with the following settings each: >>> >>> - LSI Controller with 3xRAID6 >>> - Each RAID6 is configured with 10 data disks + 2 for double-parity. >>> - Each disk has a capacity of 4TB, 512e and physical sector size of 4K. >> >> 512e drives may cause data loss. See: >> http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.html#gmlfz >> > > Haven't experienced this yet. But good to know thanks :) On the other > hand, we do not use zfs This problem affects all filesystems. If the drive loses power during an RMW cycle the physical sector is corrupted. As noted, not all 512e drives may have this problem. And for the bulk of your workload this shouldn't be an issue. If you have sufficient and properly functioning UPS it shouldn't be an issue either. >>> - 3x(10+2) configuration was considered in order to gain best performance >>> and data safety (less disks per RAID less probability of data corruption) >> >> RAID6 is the worst performer of all the RAID levels but gives the best >> resilience to multiple drive failure. The reason for using fewer drives >> per array has less to do with probability of corruption, but >> >> 1. Limiting RMW operations to as few drives as possible, especially for >> controllers that do full stripe scrubbing on RMW >> >> 2. Lowering bandwidth and time required to rebuild a dead drive, fewer >> drives tied up during a rebuild >> > >>> From the O.S. side we see: >>> >>> [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc >> ... >> >> You omitted crucial information. What is the stripe unit size of each >> RAID6? >> > > Actually the stripe size for each RAID6 is 256KB but we plan to increase > some pools to 1MB for all their RAIDs. It will be in order to compare > performance for pools containing large files and if this improves, we will > apply it to the other systems in the future. So currently you have a 2.5MB stripe width per RAID6 and you plan to test with a 10MB stripe width. >>> The idea is to aggregate the above devices and show only 1 storage space. >>> We did as follows: >>> >>> vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc >>> lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a >> >> You've told LVM that its stripe unit is 4MB, and thus the stripe width >> of each RAID6 is 4MB. This is not possible with 10 data spindles. >> Again, show the RAID geometry from the LSI tools. >> > When creating a nested stripe, the stripe unit of the outer stripe (LVM) >> must equal the stripe width of eachinner stripe (RAID6). >> > > Great. Hence, if the RAID6 stripe size is 256k then the LVM should be > defined with 256k as well, isn't it? No. And according to lvcreate(8) you cannot use LVM for the outer stripe because you have 10 data spindles per RAID6. "StripeSize" is limited to power of 2 values. Your RAID6 stripe width is 2560 KB which is not a power of 2 value. So you must use md. See mdadm(8). And be careful with terminology. "Stripe unit" is per disk, called "chunk" by mdadm. "Stripe width" is per array. "Stripe size" is ambiguous. When nesting stripes, the "stripe width" of the RAID6 becomes the "stripe unit" of the outer stripe of the resulting RAID60. In essence, each RAID6 is treated as a "drive" in the outer stripe. For example: RAID6 stripe unit = 256 KB RAID6 stripe width = 2560 KB RAID60 stripe unit = 2560 KB RAID60 stripe width = 7680 KB For RAID6 w/1MB stripe unit RAID6 stripe unit = 1 MB RAID6 stripe width = 10 MB RAID60 stripe unit = 10 MB RAID60 stripe width = 30 MB This is assuming your stated configuration of 12 drives per RAID6, 10 data spindles, and 3 RAID6 arrays per nested stripe. >> Hence, stripe of the 3 RAID6 in a LV. >> >> Each RAID6 has ~1.3GB/s of throughput. By striping the 3 arrays into a >> nested RAID60 this suggests you need single file throughput greater than >> 1.3GB/s and that all files are very large. If not, you'd be better off >> using a concatenation, and using md to accomplish that instead of LVM. >> >>> And here is my first question: How can I check if the storage and the LV >>> are correctly aligned? >> >> Answer is above. But the more important question is whether your >> workload wants a stripe or a concatenation. >> >>> On the other hand, I have formatted XFS as follows: >>> >>> mkfs.xfs -d su=256k,sw=10 -l size=128m,lazy-count=1 /dev/dcvg_a/dcpool lazy-count=1 is the default. No need to specify it. >> This alignment is not correct. XFS must be aligned to the LVM stripe >> geometry. Here you apparently aligned XFS to the RAID6 geometry >> instead. Why are you manually specifying a 128M log? If you knew your >> workload that well, you would not have made these other mistakes. >> > > We receive several parallel writes all the time, and afaik filesystems with > such write load benenfit from a larger log. 128M is the maximum log size. Metadata is journaled, file data is not. Filesystems experiencing a large amount of metadata modification may benefit from a larger journal log, however writing many large files in parallel typically doesn't generate much metadata modification. In addition, with delayed logging now the default, the amount of data written to the journal is much less than it used to be. So specifying a log size should not be necessary with your workload. > So how XFS should be formatted then? As you specify, should be aligned with > the LVM stripe, as we have a LV with 3 stripes then 256k*3 and sw=30? It must be aligned to the outer stripe in the nest, which would be the LVM geometry if it could work. However, as stated, it appears you cannot use lvcreate to make the outer stripe because it does not allow a 2560 KiB StripeSize. Destroy the LVM volume and create an md RAID0 device of the 3 RAID6 devices, eg: $ mdadm -C /dev/md0 --raid_devices=3 --chunk=2560 --level=0 /dev/sd[abc] For making the filesystem and aligning it to the md nested stripe RAID60, this is all that is required: $ mkfs.xfs -d su=2560k,sw=3 /dev/md0 Cheers, Stan From bfoster@redhat.com Thu May 8 08:36:45 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C0D57F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 08:36:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2AE96304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 06:36:42 -0700 (PDT) X-ASG-Debug-ID: 1399556200-04bdf02b8a403c90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RCSe8YdgCzo1UnZJ for <xfs@oss.sgi.com>; Thu, 08 May 2014 06:36: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 (8.14.4/8.14.4) with ESMTP id s48Dad9H018009 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 8 May 2014 09:36:39 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s48Dacqv017403; Thu, 8 May 2014 09:36:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B519F1242A3; Thu, 8 May 2014 09:36:37 -0400 (EDT) Date: Thu, 8 May 2014 09:36:37 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-ID: <20140508133637.GB47272@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range References: <002601cf6aa2$c59cd670$50d68350$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <002601cf6aa2$c59cd670$50d68350$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399556201 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, May 08, 2014 at 06:49:14PM +0900, Namjae Jeon wrote: > There is no need to dip into reserve pool. Reserve pool is used for much > more important things. And xfs_trans_reserve will never return ENOSPC > because punch hole is already done. If we get ENOSPC, collapse range > will be simply failed. > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > --- > fs/xfs/xfs_bmap_util.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 296160b..91a43c5 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > while (!error && !done) { > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > - tp->t_flags |= XFS_TRANS_RESERVE; Makes sense. > /* > * We would need to reserve permanent block for transaction. > * This will come into picture when after shifting extent into > @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > if (error) { > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); The xfs_trans_reserve() call still reserves XFS_DIOSTRAT_SPACE_RES() blocks, so therefore I think ENOSPC is still a possibility. The question is probably whether or not we need to reserve blocks for this transaction. Making a pass through the code... we have the possibility of deleting a btree record in xfs_bmap_shift_extents(). This in turn could potentially free a btree block, which frees space. I _think_ this could mean we want to keep the block reservation because we update the free space trees, but I suppose that could be handled by the freelist... Perhaps Dave can confirm which direction we should go here..? Brian > xfs_trans_cancel(tp, 0); > break; > } > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu May 8 08:45:46 2014 Return-Path: <bfoster@redhat.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 871797F54 for <xfs@oss.sgi.com>; Thu, 8 May 2014 08:45:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5FD8E8F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 06:45:46 -0700 (PDT) X-ASG-Debug-ID: 1399556745-04bdf02b8d4042c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gVj3MJcwnvDYp6tZ for <xfs@oss.sgi.com>; Thu, 08 May 2014 06:45: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 (8.14.4/8.14.4) with ESMTP id s48DjLax000632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 8 May 2014 09:45:22 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s48DjLKu029789; Thu, 8 May 2014 09:45:21 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 92D1A1242A3; Thu, 8 May 2014 09:45:20 -0400 (EDT) Date: Thu, 8 May 2014 09:45:20 -0400 From: Brian Foster <bfoster@redhat.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140508134520.GC47272@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> <20140508011256.GS5421@dastard> <20140508120228.GA47272@bfoster.bfoster> <20140508125405.GA8096@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508125405.GA8096@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399556745 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, May 08, 2014 at 05:54:05AM -0700, Christoph Hellwig wrote: > On Thu, May 08, 2014 at 08:02:28AM -0400, Brian Foster wrote: > > Missing a $ here... > > > > Adding that, the single threaded build still breaks for me. E.g., > > > > - rm -rf fs/xfs > > - git checkout -- . > > - make > > The kernel build systems doesn't support building a single module from > multiple makefiles. Take a look how to handle a subdirectory in the > older XFS versions that still had that linux-2.6 subdirectory, it just > pulls the files in the subdirectory in from the main makefile, which > requires some tiny hacks for the include path. > Good point, I was looking around for some example of this and didn't see anything obvious, but didn't think to look back to that. Indeed it does just reference the files in the subdirectory... thanks. Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From mcaubet@pic.es Thu May 8 08:52:15 2014 Return-Path: <mcaubet@pic.es> X-Spam-Checker-Version: SpamAssassin 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 5FDE37F56 for <xfs@oss.sgi.com>; Thu, 8 May 2014 08:52:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A8A08F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 06:52:14 -0700 (PDT) X-ASG-Debug-ID: 1399557130-04bdf02b8b404790001-NocioJ Received: from mail-oa0-f45.google.com (mail-oa0-f45.google.com [209.85.219.45]) by cuda.sgi.com with ESMTP id iEW9d6rftam5UZ2A (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 06:52:10 -0700 (PDT) X-Barracuda-Envelope-From: mcaubet@pic.es X-Barracuda-Apparent-Source-IP: 209.85.219.45 Received: by mail-oa0-f45.google.com with SMTP id l6so3121901oag.32 for <xfs@oss.sgi.com>; Thu, 08 May 2014 06:52: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:date :message-id:subject:from:to:cc:content-type; bh=mnZFgRiByJoYantU1hTnVxggBrQ0txzHbfEBE/2ADWY=; b=kbx6Gq6XkbUswkwcaYZ3c8YKcVIITq0zeaWqJmf/oUhaUTA+StyiOEr/VtxSahIKhJ 9jAYabdZB/zTOcpPdzZybvXJjhMUVKC5gJ3KgGs0i+xGCNDXueGyb01IiWgTvODYooiF IHjI5ch+2qpxVJHaSKoFa1G6RWCnfU7kG2AfJQ9DVnk95q0p43zBku1hiittLWcllVC9 79A3PnrLURfY+05mHbLb2pPnlgVG/YLvZKESkCBr288B+wVT/uVJbQ4ndQTVJaSX9sD0 PSQYgbpHteYZD6b7JnNtaeJV/hgkxpoOBN/JGmxQcdakHUEyc9V4izP0W0qpkyIPpwMN kIFw== X-Gm-Message-State: ALoCoQnGFnp/thJkJUVbW8BH4yU9DLzN3NHqRpAofIIQzH8mC4n6g/liApREqYNbRjcK/W3OV5hY MIME-Version: 1.0 X-Received: by 10.60.135.106 with SMTP id pr10mr4780097oeb.15.1399557129714; Thu, 08 May 2014 06:52:09 -0700 (PDT) Received: by 10.76.114.48 with HTTP; Thu, 8 May 2014 06:52:09 -0700 (PDT) In-Reply-To: <536B80E0.9000406@hardwarefreak.com> References: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> <536AEBB9.3020807@hardwarefreak.com> <CAPrERe3v_1mPy6ABAKj4TxTmy1FB2=ipi6Vn3N6dZ7w8B9DeZA@mail.gmail.com> <536B80E0.9000406@hardwarefreak.com> Date: Thu, 8 May 2014 15:52:09 +0200 Message-ID: <CAPrERe2K=DhR2frozaranf3JWgrFi81o5bhBF-BhmWcrW=4L=g@mail.gmail.com> Subject: Re: Alignment: XFS + LVM2 From: Marc Caubet <mcaubet@pic.es> X-ASG-Orig-Subj: Re: Alignment: XFS + LVM2 To: stan@hardwarefreak.com Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b41791d91acac04f8e3c928 X-Barracuda-Connect: mail-oa0-f45.google.com[209.85.219.45] X-Barracuda-Start-Time: 1399557130 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5640 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b41791d91acac04f8e3c928 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Stan, once again, thanks for your answer. > Hi Stan, > > > > thanks for your answer. > > > > Everything begins and ends with the workload. > >> > >> On 5/7/2014 7:43 AM, Marc Caubet wrote: > >>> Hi all, > >>> > >>> I am trying to setup a storage pool with correct disk alignment and I > >> hope > >>> somebody can help me to understand some unclear parts to me when > >>> configuring XFS over LVM2. > >> > >> I'll try. But to be honest, after my first read of your post, a few > >> things jump out as breaking traditional rules. > >> > >> The first thing you need to consider is your workload and the type of > >> read/write patterns it will generate. This document is unfinished, an= d > >> unformatted, but reading what is there should be informative: > >> > >> http://www.hardwarefreak.com/xfs/storage-arch.txt > >> > > > > Basically we are moving a lot of data :) It means, parallel large files > > (GBs) are being written and read all the time. Basically we have a batc= h > > farm with 3,5k cores processing jobs that are constantly reading and > > writing to the storage pools (4PBs). Only few pools (~5% of the total) > > contain small files (and only small files). > > And these pools are tied together with? Gluster? Ceph? > We are using dCache (http://www.dcache.org/), where a file is written in a single pool instead of spreading parts among pools as Ceph or Hadoop do. So large files go entirely to a pool. > >>> Actually we have few storage pools with the following settings each: > >>> > >>> - LSI Controller with 3xRAID6 > >>> - Each RAID6 is configured with 10 data disks + 2 for double-parity. > >>> - Each disk has a capacity of 4TB, 512e and physical sector size of 4= K. > >> > >> 512e drives may cause data loss. See: > >> http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.html#gmlfz > >> > > > > Haven't experienced this yet. But good to know thanks :) On the other > > hand, we do not use zfs > > This problem affects all filesystems. If the drive loses power during > an RMW cycle the physical sector is corrupted. As noted, not all 512e > drives may have this problem. And for the bulk of your workload this > shouldn't be an issue. If you have sufficient and properly functioning > UPS it shouldn't be an issue either. > Actually all LSI controllers have batteries so I hope it will not happen. This problems is good to have this in mind when we purchase new storage machines so thanks :) > > >>> - 3x(10+2) configuration was considered in order to gain best > performance > >>> and data safety (less disks per RAID less probability of data > corruption) > >> > >> RAID6 is the worst performer of all the RAID levels but gives the best > >> resilience to multiple drive failure. The reason for using fewer driv= es > >> per array has less to do with probability of corruption, but > >> > >> 1. Limiting RMW operations to as few drives as possible, especially fo= r > >> controllers that do full stripe scrubbing on RMW > >> > >> 2. Lowering bandwidth and time required to rebuild a dead drive, fewe= r > >> drives tied up during a rebuild > >> > > > >>> From the O.S. side we see: > >>> > >>> [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc > >> ... > >> > >> You omitted crucial information. What is the stripe unit size of each > >> RAID6? > >> > > > > Actually the stripe size for each RAID6 is 256KB but we plan to increas= e > > some pools to 1MB for all their RAIDs. It will be in order to compare > > performance for pools containing large files and if this improves, we > will > > apply it to the other systems in the future. > > So currently you have a 2.5MB stripe width per RAID6 and you plan to > test with a 10MB stripe width. > > >>> The idea is to aggregate the above devices and show only 1 storage > space. > >>> We did as follows: > >>> > >>> vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc > >>> lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a > >> > >> You've told LVM that its stripe unit is 4MB, and thus the stripe width > >> of each RAID6 is 4MB. This is not possible with 10 data spindles. > >> Again, show the RAID geometry from the LSI tools. > >> > > When creating a nested stripe, the stripe unit of the outer stripe (LVM= ) > >> must equal the stripe width of eachinner stripe (RAID6). > >> > > > > Great. Hence, if the RAID6 stripe size is 256k then the LVM should be > > defined with 256k as well, isn't it? > > No. And according to lvcreate(8) you cannot use LVM for the outer > stripe because you have 10 data spindles per RAID6. "StripeSize" is > limited to power of 2 values. Your RAID6 stripe width is 2560 KB which > is not a power of 2 value. So you must use md. See mdadm(8). > Great thanks, this is exactly what I needed and I think I am starting to understand then :) So a RAID6 of 16+2 disks, stripe width of 256KB will have a stripe width of 256*16=3D4096 which is a power of 2. Then in this ca= se LVM2 can be used. Am I correct? Then seems clear to me that new purchases will go in this way (we have planned a new purchase in the next month and I am trying to understand this) > And be careful with terminology. "Stripe unit" is per disk, called > "chunk" by mdadm. "Stripe width" is per array. "Stripe size" is > ambiguous. > Yes correct, sorry for the wrong terminology is something that I don't use to manage :) > > When nesting stripes, the "stripe width" of the RAID6 becomes the > "stripe unit" of the outer stripe of the resulting RAID60. In essence, > each RAID6 is treated as a "drive" in the outer stripe. For example: > > RAID6 stripe unit =3D 256 KB > RAID6 stripe width =3D 2560 KB > RAID60 stripe unit =3D 2560 KB > RAID60 stripe width =3D 7680 KB > > For RAID6 w/1MB stripe unit > > RAID6 stripe unit =3D 1 MB > RAID6 stripe width =3D 10 MB > RAID60 stripe unit =3D 10 MB > RAID60 stripe width =3D 30 MB > > This is assuming your stated configuration of 12 drives per RAID6, 10 > data spindles, and 3 RAID6 arrays per nested stripe. > > >> Hence, stripe of the 3 RAID6 in a LV. > >> > >> Each RAID6 has ~1.3GB/s of throughput. By striping the 3 arrays into = a > >> nested RAID60 this suggests you need single file throughput greater th= an > >> 1.3GB/s and that all files are very large. If not, you'd be better of= f > >> using a concatenation, and using md to accomplish that instead of LVM. > >> > >>> And here is my first question: How can I check if the storage and the > LV > >>> are correctly aligned? > >> > >> Answer is above. But the more important question is whether your > >> workload wants a stripe or a concatenation. > >> > >>> On the other hand, I have formatted XFS as follows: > >>> > >>> mkfs.xfs -d su=3D256k,sw=3D10 -l size=3D128m,lazy-count=3D1 /dev/dcvg= _a/dcpool > > lazy-count=3D1 is the default. No need to specify it. > Ok thanks :) > > >> This alignment is not correct. XFS must be aligned to the LVM stripe > >> geometry. Here you apparently aligned XFS to the RAID6 geometry > >> instead. Why are you manually specifying a 128M log? If you knew you= r > >> workload that well, you would not have made these other mistakes. > >> > > > > We receive several parallel writes all the time, and afaik filesystems > with > > such write load benenfit from a larger log. 128M is the maximum log siz= e. > > Metadata is journaled, file data is not. Filesystems experiencing a > large amount of metadata modification may benefit from a larger journal > log, however writing many large files in parallel typically doesn't > generate much metadata modification. In addition, with delayed logging > now the default, the amount of data written to the journal is much less > than it used to be. So specifying a log size should not be necessary > with your workload. > Ok. Then I'll try to remove that. > > So how XFS should be formatted then? As you specify, should be aligned > with > > the LVM stripe, as we have a LV with 3 stripes then 256k*3 and sw=3D30? > > It must be aligned to the outer stripe in the nest, which would be the > LVM geometry if it could work. However, as stated, it appears you > cannot use lvcreate to make the outer stripe because it does not allow a > 2560 KiB StripeSize. Destroy the LVM volume and create an md RAID0 > device of the 3 RAID6 devices, eg: > > $ mdadm -C /dev/md0 --raid_devices=3D3 --chunk=3D2560 --level=3D0 /dev/sd= [abc] > > For making the filesystem and aligning it to the md nested stripe > RAID60, this is all that is required: > > $ mkfs.xfs -d su=3D2560k,sw=3D3 /dev/md0 > Perfect! I'll try this with the current server having 3xRAID6(10+2). You really helped me with that. Just one final question, if I had 3*RAID6(16+2) the Stripe Width should be 4096 (256KB*16) and when applying this to LVM2 should be: lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a And then the XFS format should be: mkfs.xfs -d su=3D4096k, sw=3D3 /dev/dcvg_a/dcpool Is it correct? Thanks a lot for your help, --=20 Marc Caubet Serrabou PIC (Port d'Informaci=C3=B3 Cient=C3=ADfica) Campus UAB, Edificio D E-08193 Bellaterra, Barcelona Tel: +34 93 581 33 22 Fax: +34 93 581 41 10 http://www.pic.es Avis - Aviso - Legal Notice: http://www.ifae.es/legal.html --047d7b41791d91acac04f8e3c928 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div>Hi Stan,<br><br></div>once again, thanks for your ans= wer.<br><br><div class=3D"gmail_extra"><div class=3D"gmail_quote"><blockquo= te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px = solid rgb(204,204,204);padding-left:1ex"> <div class=3D""> > Hi Stan,<br> ><br> > thanks for your answer.<br> ><br> > Everything begins and ends with the workload.<br> >><br> >> On 5/7/2014 7:43 AM, Marc Caubet wrote:<br> >>> Hi all,<br> >>><br> >>> I am trying to setup a storage pool with correct disk alignmen= t and I<br> >> hope<br> >>> somebody can help me to understand some unclear parts to me wh= en<br> >>> configuring XFS over LVM2.<br> >><br> >> I'll try. =C2=A0But to be honest, after my first read of your = post, a few<br> >> things jump out as breaking traditional rules.<br> >><br> >> The first thing you need to consider is your workload and the type= of<br> >> read/write patterns it will generate. =C2=A0This document is unfin= ished, and<br> >> unformatted, but reading what is there should be informative:<br> >><br> >> <a href=3D"http://www.hardwarefreak.com/xfs/storage-arch.txt" targ= et=3D"_blank">http://www.hardwarefreak.com/xfs/storage-arch.txt</a><br> >><br> ><br> > Basically we are moving a lot of data :) It means, parallel large file= s<br> > (GBs) are being written and read all the time. Basically we have a bat= ch<br> > farm with 3,5k cores processing jobs that are constantly reading and<b= r> > writing to the storage pools (4PBs). Only few pools (~5% of the total)= <br> > contain small files (and only small files).<br> <br> </div>And these pools are tied together with? =C2=A0Gluster? =C2=A0Ceph?<br= ></blockquote><div><br></div><div>We are using dCache (<a href=3D"http://ww= w.dcache.org/">http://www.dcache.org/</a>), where a file is written in a si= ngle pool instead of spreading parts among pools as Ceph or Hadoop do. So l= arge files go entirely to a pool.<br> </div><div>=C2=A0<br></div><blockquote class=3D"gmail_quote" style=3D"margi= n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex= "><div class=3D""> >>> Actually we have few storage pools with the following settings= each:<br> >>><br> >>> - LSI Controller with 3xRAID6<br> >>> - Each RAID6 is configured with 10 data disks + 2 for double-p= arity.<br> >>> - Each disk has a capacity of 4TB, 512e and physical sector si= ze of 4K.<br> >><br> >> 512e drives may cause data loss. =C2=A0See:<br> >> <a href=3D"http://docs.oracle.com/cd/E26502_01/html/E28978/gmkgj.h= tml#gmlfz" target=3D"_blank">http://docs.oracle.com/cd/E26502_01/html/E2897= 8/gmkgj.html#gmlfz</a><br> >><br> ><br> > Haven't experienced this yet. But good to know thanks :) =C2=A0On = the other<br> > hand, we do not use zfs<br> <br> </div>This problem affects all filesystems. =C2=A0If the drive loses power = during<br> an RMW cycle the physical sector is corrupted. =C2=A0As noted, not all 512e= <br> drives may have this problem. =C2=A0And for the bulk of your workload this<= br> shouldn't be an issue. =C2=A0If you have sufficient and properly functi= oning<br> UPS it shouldn't be an issue either.<br></blockquote><div><br></div><di= v>=C2=A0Actually all LSI controllers have batteries so I hope it will not h= appen. This problems is good to have this in mind when we purchase new stor= age machines so thanks :)<br> </div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0p= x 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <div class=3D""><br> >>> - 3x(10+2) configuration was considered in order to gain best = performance<br> >>> and data safety (less disks per RAID less probability of data = corruption)<br> >><br> >> RAID6 is the worst performer of all the RAID levels but gives the = best<br> >> resilience to multiple drive failure. =C2=A0The reason for using f= ewer drives<br> >> per array has less to do with probability of corruption, but<br> >><br> >> 1. Limiting RMW operations to as few drives as possible, especiall= y for<br> >> controllers that do full stripe scrubbing on RMW<br> >><br> >> 2. =C2=A0Lowering bandwidth and time required to rebuild a dead dr= ive, fewer<br> >> drives tied up during a rebuild<br> >><br> ><br> >>> From the O.S. side we see:<br> >>><br> >>> [root@stgpool01 ~]# fdisk -l /dev/sda /dev/sdb /dev/sdc<br> >> ...<br> >><br> >> You omitted crucial information. =C2=A0What is the stripe unit siz= e of each<br> >> RAID6?<br> >><br> ><br> > Actually the stripe size for each RAID6 is 256KB but we plan to increa= se<br> > some pools to 1MB for all their RAIDs. It will be in order to compare<= br> > performance for pools containing large files and if this improves, we = will<br> > apply it to the other systems in the future.<br> <br> </div>So currently you have a 2.5MB stripe width per RAID6 and you plan to<= br> test with a 10MB stripe width.<br></blockquote><blockquote class=3D"gmail_q= uote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,2= 04);padding-left:1ex"> <div class=3D""><br> >>> The idea is to aggregate the above devices and show only 1 sto= rage space.<br> >>> We did as follows:<br> >>><br> >>> vgcreate dcvg_a /dev/sda /dev/sdb /dev/sdc<br> >>> lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a<br> >><br> >> You've told LVM that its stripe unit is 4MB, and thus the stri= pe width<br> >> of each RAID6 is 4MB. =C2=A0This is not possible with 10 data spin= dles.<br> >> Again, show the RAID geometry from the LSI tools.<br> >><br> > When creating a nested stripe, the stripe unit of the outer stripe (LV= M)<br> >> must equal the stripe width of eachinner stripe (RAID6).<br> >><br> ><br> > Great. Hence, if the RAID6 stripe size is 256k then the LVM should be<= br> > defined with 256k as well, isn't it?<br> <br> </div>No. =C2=A0And according to lvcreate(8) you cannot use LVM for the out= er<br> stripe because you have 10 data spindles per RAID6. =C2=A0"StripeSize&= quot; is<br> limited to power of 2 values. =C2=A0Your RAID6 stripe width is 2560 KB whic= h<br> is not a power of 2 value. =C2=A0So you must use md. =C2=A0See mdadm(8).<br= ></blockquote><div><br></div><div>Great thanks, this is exactly what I need= ed and I think I am starting to understand then :) So a RAID6 of 16+2 disks= , stripe width of 256KB will have a stripe width of 256*16=3D4096 which is = a power of 2. Then in this case LVM2 can be used. Am I correct? Then seems = clear to me that new purchases will go in this way (we have planned a new p= urchase in the next month and I am trying to understand this)<br> </div><div>=C2=A0<br></div><blockquote class=3D"gmail_quote" style=3D"margi= n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex= "> And be careful with terminology. =C2=A0"Stripe unit" is per disk,= called<br> "chunk" by mdadm. =C2=A0"Stripe width" is per array. = =C2=A0"Stripe size" is ambiguous.<br></blockquote><div><br></div>= <div>Yes correct, sorry for the wrong terminology is something that I don&#= 39;t use to manage :)<br> </div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0p= x 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <br> When nesting stripes, the "stripe width" of the RAID6 becomes the= <br> "stripe unit" of the outer stripe of the resulting RAID60. =C2=A0= In essence,<br> each RAID6 is treated as a "drive" in the outer stripe. =C2=A0For= example:<br> <br> RAID6 =C2=A0stripe unit =C2=A0=3D =C2=A0256 KB<br> RAID6 =C2=A0stripe width =3D 2560 KB<br> RAID60 stripe unit =C2=A0=3D 2560 KB<br> RAID60 stripe width =3D 7680 KB<br> <br> For RAID6 w/1MB stripe unit<br> <br> RAID6 =C2=A0stripe unit =C2=A0=3D =C2=A01 MB<br> RAID6 =C2=A0stripe width =3D 10 MB<br> RAID60 stripe unit =C2=A0=3D 10 MB<br> RAID60 stripe width =3D 30 MB<br> <br> This is assuming your stated configuration of 12 drives per RAID6, 10<br> data spindles, and 3 RAID6 arrays per nested stripe.<br> <div class=3D""><br> >> Hence, stripe of the 3 RAID6 in a LV.<br> >><br> >> Each RAID6 has ~1.3GB/s of throughput. =C2=A0By striping the 3 arr= ays into a<br> >> nested RAID60 this suggests you need single file throughput greate= r than<br> >> 1.3GB/s and that all files are very large. =C2=A0If not, you'd= be better off<br> >> using a concatenation, and using md to accomplish that instead of = LVM.<br> >><br> >>> And here is my first question: How can I check if the storage = and the LV<br> >>> are correctly aligned?<br> >><br> >> Answer is above. =C2=A0But the more important question is whether = your<br> >> workload wants a stripe or a concatenation.<br> >><br> >>> On the other hand, I have formatted XFS as follows:<br> >>><br> >>> mkfs.xfs -d su=3D256k,sw=3D10 -l size=3D128m,lazy-count=3D1 /d= ev/dcvg_a/dcpool<br> <br> </div>lazy-count=3D1 is the default. =C2=A0No need to specify it.<br></bloc= kquote><div><br></div><div>Ok thanks :)<br></div><div>=C2=A0</div><blockquo= te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px = solid rgb(204,204,204);padding-left:1ex"> <div class=3D""><br> >> This alignment is not correct. =C2=A0XFS must be aligned to the LV= M stripe<br> >> geometry. =C2=A0Here you apparently aligned XFS to the RAID6 geome= try<br> >> instead. =C2=A0Why are you manually specifying a 128M log? =C2=A0I= f you knew your<br> >> workload that well, you would not have made these other mistakes.<= br> >><br> ><br> > We receive several parallel writes all the time, and afaik filesystems= with<br> > such write load benenfit from a larger log. 128M is the maximum log si= ze.<br> <br> </div>Metadata is journaled, file data is not. =C2=A0Filesystems experienci= ng a<br> large amount of metadata modification may benefit from a larger journal<br> log, however writing many large files in parallel typically doesn't<br> generate much metadata modification. =C2=A0In addition, with delayed loggin= g<br> now the default, the amount of data written to the journal is much less<br> than it used to be. =C2=A0So specifying a log size should not be necessary<= br> with your workload.<br></blockquote><div><br></div><div>Ok. Then I'll t= ry to remove that.<br>=C2=A0<br></div><blockquote class=3D"gmail_quote" sty= le=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);paddi= ng-left:1ex"> <div class=3D""> > So how XFS should be formatted then? As you specify, should be aligned= with<br> > the LVM stripe, as we have a LV with 3 stripes then 256k*3 and sw=3D30= ?<br> <br> </div>It must be aligned to the outer stripe in the nest, which would be th= e<br> LVM geometry if it could work. =C2=A0However, as stated, it appears you<br> cannot use lvcreate to make the outer stripe because it does not allow a<br= > 2560 KiB StripeSize. =C2=A0Destroy the LVM volume and create an md RAID0<br= > device of the 3 RAID6 devices, eg:<br> <br> $ mdadm -C /dev/md0 --raid_devices=3D3 --chunk=3D2560 --level=3D0 /dev/sd[a= bc]<br> <br> For making the filesystem and aligning it to the md nested stripe<br> RAID60, this is all that is required:<br> <br> $ mkfs.xfs -d su=3D2560k,sw=3D3 /dev/md0<br></blockquote><div><br></div><di= v>Perfect! I'll try this with the current server having 3xRAID6(10+2). = You really helped me with that.<br><br></div><div>Just one final question, = if I had 3*RAID6(16+2) the Stripe Width should be 4096 (256KB*16) and when = applying this to LVM2 should be:<br> <br> lvcreate -i 3 -I 4096 -n dcpool -l 100%FREE -v dcvg_a<br><br></div><di= v></div><div>And then the XFS format should be:<br><br>mkfs.xfs -d su=3D409= 6k, sw=3D3 /dev/dcvg_a/dcpool<br><br></div><div>Is it correct?<br></div> </div><br></div><div class=3D"gmail_extra">Thanks a lot for your help,<br>-= - <br>Marc Caubet Serrabou<br>PIC (Port d'Informaci=C3=B3 Cient=C3=ADfi= ca)<br>Campus UAB, Edificio D<br>E-08193 Bellaterra, Barcelona<br>Tel: +34 = 93 581 33 22<br> Fax: +34 93 581 41 10<br><a href=3D"http://www.pic.es" target=3D"_blank">ht= tp://www.pic.es</a><br>Avis - Aviso - Legal Notice: <a href=3D"http://www.i= fae.es/legal.html" target=3D"_blank">http://www.ifae.es/legal.html</a> </div></div> --047d7b41791d91acac04f8e3c928-- From install@vtxmail.ch Thu May 8 10:57:27 2014 Return-Path: <install@vtxmail.ch> X-Spam-Checker-Version: SpamAssassin 3.3.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B6D877F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 10:57:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 350E4AC012 for <xfs@oss.sgi.com>; Thu, 8 May 2014 08:57:27 -0700 (PDT) X-ASG-Debug-ID: 1399564638-04cb6c1fcc2a1820001-NocioJ Received: from smtp-02.datacomm.ch (smtp-02-4.datacomm.ch [212.40.2.24]) by cuda.sgi.com with ESMTP id xTUbZXEmEUS6QuNF; Thu, 08 May 2014 08:57:19 -0700 (PDT) X-Barracuda-Envelope-From: install@vtxmail.ch X-Barracuda-Apparent-Source-IP: 212.40.2.24 Received: from webmail.vtx.ch (bas-flu-webmail-02.vtxnet.net [212.40.2.42]) by smtp-02.datacomm.ch (VTX Datacomm AG) with ESMTP id A2F16120FCB; Thu, 8 May 2014 17:57:16 +0200 (CEST) Received: from 227.Red-79-157-223.dynamicIP.rima-tde.net ([79.157.223.227]) by webmail.vtx.ch with HTTP (HTTP/1.1 POST); Thu, 08 May 2014 17:57:16 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 08 May 2014 17:57:16 +0200 From: Gva Abogado <install@vtxmail.ch> To: undisclosed-recipients:; Subject: Please Acknowledge My Proposal!! Reply-To: install@vtxmail.ch X-ASG-Orig-Subj: Please Acknowledge My Proposal!! Mail-Reply-To: install@vtxmail.ch Message-ID: <d297c1843618e968fce1399bdd2070a6@vtxmail.ch> X-Sender: install@vtxmail.ch User-Agent: Roundcube Webmail/0.9.2 X-Barracuda-Connect: smtp-02-4.datacomm.ch[212.40.2.24] X-Barracuda-Start-Time: 1399564639 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com 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_SA620a, BSF_SC0_SA620b, BSF_SC7_SA298e, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5642 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.50 BSF_SC0_SA620b Custom Rule SA620b 0.20 BSF_SC7_SA298e Custom Rule SA298e -- Please Acknowledge My Proposal!! My name is Mr.Miguel Martinez Moreno a lawyer resident in Spain. I am writing to let you know I have some FUNDS I want to transfer and am seeking if you can be a beneficiary...Do not hesitate to Contact me formore information if interested: martinezmoreno2011@aim.com Sincerely Miguel Martinez Moreno. martinezmoreno2011@aim.com From prvs=0205732ace=jbacik@fb.com Thu May 8 13:33:47 2014 Return-Path: <prvs=0205732ace=jbacik@fb.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=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 CB9E77F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:33:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B065430405F for <xfs@oss.sgi.com>; Thu, 8 May 2014 11:33:44 -0700 (PDT) X-ASG-Debug-ID: 1399574020-04cbb03cc73e4450001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id deRSFmKy1zHJHf0f for <xfs@oss.sgi.com>; Thu, 08 May 2014 11:33:40 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0205732ace=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004060 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s48ITG0i010139; Thu, 8 May 2014 11:33:31 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=HPhuP1xDAJbY9zQOjuzF1cZ1qyWSuoTLuP9HB8dwVKI=; b=ETZ+WydRUFqXiQ404XEFnxn39FYseBIJb5SlQHYUHt/66Kv51fMqN+Di9oDm+Vul7kIx 7yQejVVlrpQxC2eSLeskySjv30h0mGqGycGmSTQ4AhyXyd0npBAedq9zz9J7tzAW+GBC vGU4gtHfEJGH9rGaAOFMYSWF3ir5D6TJW+U= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1krct4rpvn-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Thu, 08 May 2014 11:33:31 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.23) with Microsoft SMTP Server (TLS) id 14.3.174.1; Thu, 8 May 2014 11:33:29 -0700 Message-ID: <536BCDF7.7070404@fb.com> Date: Thu, 8 May 2014 14:33:27 -0400 From: Josef Bacik <jbacik@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Wang Shilong <wangsl.fnst@cn.fujitsu.com> CC: <xfs@oss.sgi.com>, <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> <536AFC3B.7070502@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <536AFC3B.7070502@cn.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-08_07:2014-05-08,2014-05-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.31639595019651e-08 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405080179 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1399574020 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 05/07/2014 11:38 PM, Wang Shilong wrote: > On 05/08/2014 04:58 AM, Josef Bacik wrote: >> On 03/09/2014 11:44 PM, Wang Shilong wrote: >>> Test flow is to run fsstress after triggering quota rescan. >>> the ruler is simple, we just remove all files and directories, >>> sync filesystem and see if qgroup's ref and excl are nodesize. >>> >>> Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> >>> --- >>> v1->v2: >>> switch into new helper _run_btrfs_util_prog() >>> --- >>> tests/btrfs/041 | 76 >>> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >>> tests/btrfs/041.out | 3 +++ >>> tests/btrfs/group | 1 + >>> 3 files changed, 80 insertions(+) >>> create mode 100644 tests/btrfs/041 >>> create mode 100644 tests/btrfs/041.out >>> >>> diff --git a/tests/btrfs/041 b/tests/btrfs/041 >>> new file mode 100644 >>> index 0000000..92bd080 >>> --- /dev/null >>> +++ b/tests/btrfs/041 >>> @@ -0,0 +1,76 @@ >>> +#! /bin/bash >>> +# FSQA Test No. btrfs/041 >>> +# >>> +# Quota rescan stress test, we run fsstress and quota rescan >>> concurrently >>> +# >>> +#----------------------------------------------------------------------- >>> >>> +# Copyright (C) 2014 Fujitsu. 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 >>> + >>> +_cleanup() >>> +{ >>> + cd / >>> + rm -f $tmp.* >>> +} >>> +trap "_cleanup; exit \$status" 0 1 2 3 15 >>> + >>> +# get standard environment, filters and checks >>> +. ./common/rc >>> +. ./common/filter >>> + >>> +# real QA test starts here >>> +_need_to_be_root >>> +_supported_fs btrfs >>> +_supported_os Linux >>> +_require_scratch >>> + >>> +rm -f $seqres.full >>> + >>> +run_check _scratch_mkfs "-b 1g --nodesize 4096" >>> +run_check _scratch_mount >>> + >> >> Add "-o nospace_cache" here please, otherwise I don't get the same >> output. > > I am little confused why we need specify this mount option explicitly? > As far as i know, space cache is not included into qgroup accounting space. > It is. Thanks, Josef From prvs=0205732ace=jbacik@fb.com Thu May 8 13:38:41 2014 Return-Path: <prvs=0205732ace=jbacik@fb.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=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 322887F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:38:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A864CAC012 for <xfs@oss.sgi.com>; Thu, 8 May 2014 11:38:40 -0700 (PDT) X-ASG-Debug-ID: 1399574319-04cbb03cc43e4700001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id NTMts31h5dVH0iz0 for <xfs@oss.sgi.com>; Thu, 08 May 2014 11:38:39 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0205732ace=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004077 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s48IZi9W025844; Thu, 8 May 2014 11:38:38 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=kRzl2i6qv+WyFk8GeVcCb1qA+RZoEUtKMbzkZ2pwXtc=; b=LCvjfgOqv3PBDT07+B3s5ZKHV7iQa0HDRc1XA5QbcpkDuA+lABnknMTd//AIbO1aCYvG 1tBclf7XRI8GZpeGM26XZozmjlivkrG1UUzeB6fLG7KRqIFYvUCiTLNkBipR60NZPvwt xc6e4HlxEBA5lU7UN0h0qIk+zPTahCOFkC8= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1kqvva4105-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Thu, 08 May 2014 11:38:38 -0700 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.23) with Microsoft SMTP Server (TLS) id 14.3.174.1; Thu, 8 May 2014 11:38:31 -0700 From: Josef Bacik <jbacik@fb.com> To: <linux-btrfs@vger.kernel.org>, <xfs@oss.sgi.com>, <sandeen@redhat.com> Subject: [PATCH] xfstests: fix flink test V2 Date: Thu, 8 May 2014 14:38:30 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: fix flink test V2 Message-ID: <1399574310-13718-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-08_07:2014-05-08,2014-05-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.31639595019651e-08 kscore.compositescore=0 circleOfTrustscore=104.175033599216 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405080179 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1399574319 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 I don't have flink support in my xfsprogs, but it doesn't fail with "command not found" or whatever, it fails because I don't have the -T option, whereas Eric gets an error about $TEST_DIR being a directory because his xfs_io tries to open the directory first before it parses the options. So fix this by checking flink with these two cases and don't run if we hit either of them. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> --- V1->V2: check for "Is a directory" errors that Eric mentioned, move test up into the flink specific case. common/rc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/rc b/common/rc index 5c13db5..f37b310 100644 --- a/common/rc +++ b/common/rc @@ -1248,6 +1248,8 @@ _require_xfs_io_command() "flink" ) testio=`$XFS_IO_PROG -T -F -c "flink $testfile" \ $TEST_DIR 2>&1` + echo $testio | egrep -q "invalid option|Is a directory" && \ + _notrun "xfs_io $command support is missing" ;; *) testio=`$XFS_IO_PROG -c "$command help" 2>&1` -- 1.8.3.1 From sandeen@sandeen.net Thu May 8 13:40:24 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5152D7F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:40:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2AD408F8035 for <xfs@oss.sgi.com>; Thu, 8 May 2014 11:40:20 -0700 (PDT) X-ASG-Debug-ID: 1399574418-04bdf02b8d412580001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jt9tXnsUgHi24fA1 for <xfs@oss.sgi.com>; Thu, 08 May 2014 11:40: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B94BC63C5FF2 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:40:18 -0500 (CDT) Message-ID: <536BCF95.201@sandeen.net> Date: Thu, 08 May 2014 13:40:21 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> Subject: Remove xfs_check for 3.2.0? X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: Remove xfs_check for 3.2.0? Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399574418 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.5645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I think we had stated removal in June 2014, but it seems close enough. Should xfs_check be removed prior to 3.2.0's release? -Eric From sandeen@redhat.com Thu May 8 13:41:57 2014 Return-Path: <sandeen@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0DF3B7F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:41:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84983AC014 for <xfs@oss.sgi.com>; Thu, 8 May 2014 11:41:56 -0700 (PDT) X-ASG-Debug-ID: 1399574514-04cb6c72913fa610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f93bRCsgWm0WQbCB for <xfs@oss.sgi.com>; Thu, 08 May 2014 11:41: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s48Ifr8B003544 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 8 May 2014 14:41:53 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s48IfqYc003926 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 8 May 2014 14:41:52 -0400 Message-ID: <536BCFF3.70302@redhat.com> Date: Thu, 08 May 2014 13:41:55 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix flink test V2 References: <1399574310-13718-1-git-send-email-jbacik@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix flink test V2 In-Reply-To: <1399574310-13718-1-git-send-email-jbacik@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399574514 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 5/8/14, 1:38 PM, Josef Bacik wrote: > I don't have flink support in my xfsprogs, but it doesn't fail with "command not > found" or whatever, it fails because I don't have the -T option, whereas Eric > gets an error about $TEST_DIR being a directory because his xfs_io tries to open > the directory first before it parses the options. So fix this by checking flink > with these two cases and don't run if we hit either of them. Thanks, > > Signed-off-by: Josef Bacik <jbacik@fb.com> Looks good to me, thanks. Reviewed-by: Eric Sandeen <sandeen@redhat.com> > --- > V1->V2: check for "Is a directory" errors that Eric mentioned, move test up into > the flink specific case. > > common/rc | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/common/rc b/common/rc > index 5c13db5..f37b310 100644 > --- a/common/rc > +++ b/common/rc > @@ -1248,6 +1248,8 @@ _require_xfs_io_command() > "flink" ) > testio=`$XFS_IO_PROG -T -F -c "flink $testfile" \ > $TEST_DIR 2>&1` > + echo $testio | egrep -q "invalid option|Is a directory" && \ > + _notrun "xfs_io $command support is missing" > ;; > *) > testio=`$XFS_IO_PROG -c "$command help" 2>&1` > From stan@hardwarefreak.com Thu May 8 14:49:05 2014 Return-Path: <stan@hardwarefreak.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D2CB7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:49:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9CAEEAC013 for <xfs@oss.sgi.com>; Thu, 8 May 2014 12:49:01 -0700 (PDT) X-ASG-Debug-ID: 1399578540-04cb6c72913fcd60001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id mFdo0QmQP1y1dU3q for <xfs@oss.sgi.com>; Thu, 08 May 2014 12:49:00 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 0B71C6C11B; Thu, 8 May 2014 14:49:00 -0500 (CDT) Message-ID: <536BDFAD.1090700@hardwarefreak.com> Date: Thu, 08 May 2014 14:49:01 -0500 From: Stan Hoeppner <stan@hardwarefreak.com> Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Marc Caubet <mcaubet@pic.es> CC: xfs@oss.sgi.com Subject: Re: Alignment: XFS + LVM2 References: <CAPrERe02bfrW6+5c+oZPgd9c_7AUx=BEUcAOAj2dT_iYn=P_1w@mail.gmail.com> <536AEBB9.3020807@hardwarefreak.com> <CAPrERe3v_1mPy6ABAKj4TxTmy1FB2=ipi6Vn3N6dZ7w8B9DeZA@mail.gmail.com> <536B80E0.9000406@hardwarefreak.com> <CAPrERe2K=DhR2frozaranf3JWgrFi81o5bhBF-BhmWcrW=4L=g@mail.gmail.com> X-ASG-Orig-Subj: Re: Alignment: XFS + LVM2 In-Reply-To: <CAPrERe2K=DhR2frozaranf3JWgrFi81o5bhBF-BhmWcrW=4L=g@mail.gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1399578540 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 5/8/2014 8:52 AM, Marc Caubet wrote: > Hi Stan, > > once again, thanks for your answer. You bet. ... > Actually all LSI controllers have batteries so I hope it will not happen. > This problems is good to have this in mind when we purchase new storage > machines so thanks :) Battery or flash backed cache on the controller does not prevent this problem. This read-modify-write operation is internal to the drive and transparent to the controller. ... > Great thanks, this is exactly what I needed and I think I am starting to > understand then :) So a RAID6 of 16+2 disks, stripe width of 256KB will > have a stripe width of 256*16=4096 which is a power of 2. Then in this case > LVM2 can be used. Am I correct? Then seems clear to me that new purchases > will go in this way (we have planned a new purchase in the next month and I > am trying to understand this) Use md for the outer stripe so you have no hardware and no stripe unit limitations. If you need features of LVM such as snapshots simply layer a PV and LV atop the md RAID0 device. ... >> It must be aligned to the outer stripe in the nest, which would be the >> LVM geometry if it could work. However, as stated, it appears you >> cannot use lvcreate to make the outer stripe because it does not allow a >> 2560 KiB StripeSize. Destroy the LVM volume and create an md RAID0 >> device of the 3 RAID6 devices, eg: >> >> $ mdadm -C /dev/md0 --raid_devices=3 --chunk=2560 --level=0 /dev/sd[abc] >> >> For making the filesystem and aligning it to the md nested stripe >> RAID60, this is all that is required: >> >> $ mkfs.xfs -d su=2560k,sw=3 /dev/md0 >> > > Perfect! I'll try this with the current server having 3xRAID6(10+2). You > really helped me with that. > > Just one final question, if I had 3*RAID6(16+2) the Stripe Width should be > 4096 (256KB*16) and when applying this to LVM2 should be: Again, do not use LVM for the outer stripe. $ mdadm -C /dev/md0 --raid_devices=3 --chunk=4096 --level=0 /dev/sd[abc] > And then the XFS format should be: $ mkfs.xfs -d su=4096k,sw=3 /dev/md0 > Is it correct? It is now. > Thanks a lot for your help, Sure thing. Cheers, Stan From david@fromorbit.com Thu May 8 15:39:53 2014 Return-Path: <david@fromorbit.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 543F67F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 15:39:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 395C78F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:39:53 -0700 (PDT) X-ASG-Debug-ID: 1399581587-04cbb03cc53e81f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id HOmvYUnGupbpfbQL for <xfs@oss.sgi.com>; Thu, 08 May 2014 13:39:48 -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: Aq1+ADLra1N5LL1sPGdsb2JhbABZgwaIR6QhAQEBAQEBBpoQAwIBgRMXAwEBAQE4NYIlAQEFOhweBRAIAxgJJQ8FJQMHGhOIQNBfFxaFQIh8B4Q/AQOZN4sBi0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 06:09:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiV6P-0003cq-16; Fri, 09 May 2014 06:39:37 +1000 Date: Fri, 9 May 2014 06:39:37 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: xfs-oss <xfs@oss.sgi.com> Subject: Re: Remove xfs_check for 3.2.0? Message-ID: <20140508203936.GV5421@dastard> X-ASG-Orig-Subj: Re: Remove xfs_check for 3.2.0? References: <536BCF95.201@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536BCF95.201@sandeen.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: 1399581587 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.5650 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 01:40:21PM -0500, Eric Sandeen wrote: > I think we had stated removal in June 2014, but it seems close enough. > > Should xfs_check be removed prior to 3.2.0's release? I'd prefer to do it slightly later than earlier. As it is, 3.2.0 is really in the "critical fixes only" stage - like that repair prefetch bug. So apart from fixes like that, I don't want to be changing things right now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu May 8 15:40:55 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BEA537F55 for <xfs@oss.sgi.com>; Thu, 8 May 2014 15:40:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A254E8F8035 for <xfs@oss.sgi.com>; Thu, 8 May 2014 13:40:55 -0700 (PDT) X-ASG-Debug-ID: 1399581654-04cbb03cc53e8240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HWSTrqRqGAh9h4RU for <xfs@oss.sgi.com>; Thu, 08 May 2014 13:40: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id ECC2E63C5FF2; Thu, 8 May 2014 15:40:53 -0500 (CDT) Message-ID: <536BEBD9.4060604@sandeen.net> Date: Thu, 08 May 2014 15:40:57 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs-oss <xfs@oss.sgi.com> Subject: Re: Remove xfs_check for 3.2.0? References: <536BCF95.201@sandeen.net> <20140508203936.GV5421@dastard> X-ASG-Orig-Subj: Re: Remove xfs_check for 3.2.0? In-Reply-To: <20140508203936.GV5421@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399581654 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.5650 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/8/14, 3:39 PM, Dave Chinner wrote: > On Thu, May 08, 2014 at 01:40:21PM -0500, Eric Sandeen wrote: >> I think we had stated removal in June 2014, but it seems close enough. >> >> Should xfs_check be removed prior to 3.2.0's release? > > I'd prefer to do it slightly later than earlier. > > As it is, 3.2.0 is really in the "critical fixes only" stage - like > that repair prefetch bug. So apart from fixes like that, I don't > want to be changing things right now. > > Cheers, > > Dave. > *shrug* ok. Let a thousand "hey my xfs_check OOM'd" emails blossom! :) FWIW, I did not have time to work on that prefetch bug yet today. :( -Eric From david@fromorbit.com Thu May 8 16:12:28 2014 Return-Path: <david@fromorbit.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 3CF3B7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:12:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 151658F8040 for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:12:24 -0700 (PDT) X-ASG-Debug-ID: 1399583539-04cb6c72913feca0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id rfcQJbaQE1l45HRp for <xfs@oss.sgi.com>; Thu, 08 May 2014 14:12:19 -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: ApxSAD/ya1N5LL1sPGdsb2JhbABZgwZPh3ikIQEBAQEBAQaaFYEUFwMBAQEBODWCUxMcIxgkNAUlAwctiEDQfxaFQIh8HYMUgRUEhUmTbpZEKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 06:42:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiVc1-0003kQ-3U; Fri, 09 May 2014 07:12:17 +1000 Date: Fri, 9 May 2014 07:12:17 +1000 From: Dave Chinner <david@fromorbit.com> To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: fixes for 3.15-rc5 Message-ID: <20140508211217.GC26353@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: fixes for 3.15-rc5 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1399583539 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.5651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the updates listed below? The main fix is adding support for default ACLs on O_TMPFILE opened inodes to bring XFS into line with other filesystems. Metadata CRCs are now also considered well enough tested to be fully supported, so we're removing the shouty warnings issued at mount time for filesystems with that format. And there's transaction block reservation overrun fix. BTW, will GPG signing these pull requests cause you problems? I've been signing everything "official" I send as the XFS maintainer (e.g. notifications of tree updates) and I figured that pull requests are about as "official" as it gets. The tag is signed, so I'm not particularly worried either way... -Dave. The following changes since commit 330033d697ed8d296fa52b5303db9d802ad901cc: xfs: fix tmpfile/selinux deadlock and initialize security (2014-04-17 08:15:30 +1000) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git xfs-fixes-for-3.15-rc5 for you to fetch changes up to 8275cdd0e7ac550dcce2b3ef6d2fb3b808c1ae59: xfs: remote attribute overwrite causes transaction overrun (2014-05-06 07:37:31 +1000) ---------------------------------------------------------------- Fixes for 3.15-rc5: - fix a remote attribute size calculation bug that leads to a transaction overrun - add default ACLs to O_TMPFILE files - Remove the EXPERIMENTAL tag from filesystems with metadata CRC support ---------------------------------------------------------------- Brian Foster (1): xfs: initialize default acls for ->tmpfile() Dave Chinner (2): xfs: fully support v5 format filesystems xfs: remote attribute overwrite causes transaction overrun fs/xfs/xfs_attr.c | 24 +++++++++++++++++++- fs/xfs/xfs_attr_leaf.c | 21 +++++++++--------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 8 ++++--- fs/xfs/xfs_da_btree.h | 2 ++ fs/xfs/xfs_iops.c | 55 ++++++++++++++++++++++++---------------------- fs/xfs/xfs_log.c | 10 +++++---- fs/xfs/xfs_mount.c | 2 -- fs/xfs/xfs_sb.c | 4 ---- 9 files changed, 77 insertions(+), 50 deletions(-) -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 8 16:17:17 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8A547F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:17:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AC3C430404E for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:17:16 -0700 (PDT) X-ASG-Debug-ID: 1399583834-04bdf02b8b417510001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id VvfS3ZVE1VOfpet4 for <xfs@oss.sgi.com>; Thu, 08 May 2014 14:17:14 -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: AqdSAG/za1N5LL1sPGdsb2JhbABZgwaIR6QhAQEBAQEBBpoVAYETFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hA0GoXFoVAiHwHgyqBFQSZN4sBi0Mr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 06:47:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiVgm-0003lW-RY; Fri, 09 May 2014 07:17:12 +1000 Date: Fri, 9 May 2014 07:17:12 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: Namjae Jeon <namjae.jeon@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-ID: <20140508211712.GD26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range References: <002601cf6aa2$c59cd670$50d68350$@samsung.com> <20140508133637.GB47272@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508133637.GB47272@bfoster.bfoster> 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: 1399583834 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.5651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 09:36:37AM -0400, Brian Foster wrote: > On Thu, May 08, 2014 at 06:49:14PM +0900, Namjae Jeon wrote: > > There is no need to dip into reserve pool. Reserve pool is used for much > > more important things. And xfs_trans_reserve will never return ENOSPC > > because punch hole is already done. If we get ENOSPC, collapse range > > will be simply failed. > > > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > > --- > > fs/xfs/xfs_bmap_util.c | 3 +-- > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > index 296160b..91a43c5 100644 > > --- a/fs/xfs/xfs_bmap_util.c > > +++ b/fs/xfs/xfs_bmap_util.c > > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > > > while (!error && !done) { > > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > - tp->t_flags |= XFS_TRANS_RESERVE; > > Makes sense. > > > /* > > * We would need to reserve permanent block for transaction. > > * This will come into picture when after shifting extent into > > @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > if (error) { > > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > The xfs_trans_reserve() call still reserves XFS_DIOSTRAT_SPACE_RES() > blocks, so therefore I think ENOSPC is still a possibility. The question > is probably whether or not we need to reserve blocks for this > transaction. > > Making a pass through the code... we have the possibility of deleting a > btree record in xfs_bmap_shift_extents(). This in turn could potentially > free a btree block, which frees space. I _think_ this could mean we > want to keep the block reservation because we update the free space > trees, but I suppose that could be handled by the freelist... > > Perhaps Dave can confirm which direction we should go here..? Having collapse range fail with ENOSPC is not an issue - it is being executed in a context where we can fail safely and return an error to the user. XFS_TRANS_RESERVE is used in places where a failure is unrecoverable or there is no one to report the error to. e.g. prevent data loss due to ENOSPC in unwritten extent conversion during background buffered write IO completion So here there is no need for it at all.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Thu May 8 16:21:09 2014 Return-Path: <eflorac@intellique.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7167B7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:21:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA00FAC013 for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:21:05 -0700 (PDT) X-ASG-Debug-ID: 1399584063-04cbb03cc43e90c0001-NocioJ Received: from smtp2-g21.free.fr (smtp2-g21.free.fr [212.27.42.2]) by cuda.sgi.com with ESMTP id jryAxieqYPzsikNl for <xfs@oss.sgi.com>; Thu, 08 May 2014 14:21:04 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.2 Received: from galadriel.home (unknown [82.235.234.79]) by smtp2-g21.free.fr (Postfix) with ESMTP id 2B7134B0076; Thu, 8 May 2014 23:19:51 +0200 (CEST) Date: Thu, 8 May 2014 23:04:10 +0200 From: Emmanuel Florac <eflorac@intellique.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: Dave Chinner <david@fromorbit.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: Remove xfs_check for 3.2.0? Message-ID: <20140508230410.02b19431@galadriel.home> X-ASG-Orig-Subj: Re: Remove xfs_check for 3.2.0? In-Reply-To: <536BEBD9.4060604@sandeen.net> References: <536BCF95.201@sandeen.net> <20140508203936.GV5421@dastard> <536BEBD9.4060604@sandeen.net> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp2-g21.free.fr[212.27.42.2] X-Barracuda-Start-Time: 1399584063 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.5651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Thu, 08 May 2014 15:40:57 -0500 vous =C3=A9criviez: > *shrug* ok. Let a thousand "hey my xfs_check OOM'd" emails > blossom! :) >=20 > FWIW, I did not have time to work on that prefetch bug yet today. :( >=20 Why not replace it by a script that simply states that it's useless and to run xfs_repair -n instead? It has been completely useless for the best part of the past ten years... This way you don't remove it but you'll sort of fix it :) --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | <eflorac@intellique.com> | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Thu May 8 16:21:24 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 164F67F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:21:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC0B330404E for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:21:23 -0700 (PDT) X-ASG-Debug-ID: 1399584081-04cb6c1fcc2ad100001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WXxxbQPKaho85ArX for <xfs@oss.sgi.com>; Thu, 08 May 2014 14:21:22 -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: AqdSAJD0a1N5LL1sPGdsb2JhbABZgwaIR6QhAQEBAQEBBpoVAYETFwMBAQEBODWCJQEBBTocIxAIAw4KCRoLDwUlAwcaE4hA0GsXFoVAiHwHgyqBFQSZN5RzgVEr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 06:51:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiVkm-0003mk-8y; Fri, 09 May 2014 07:21:20 +1000 Date: Fri, 9 May 2014 07:21:20 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140508212120.GE26353@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> <20140508011256.GS5421@dastard> <20140508120228.GA47272@bfoster.bfoster> <20140508125405.GA8096@infradead.org> <20140508134520.GC47272@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508134520.GC47272@bfoster.bfoster> 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: 1399584081 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.5651 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 09:45:20AM -0400, Brian Foster wrote: > On Thu, May 08, 2014 at 05:54:05AM -0700, Christoph Hellwig wrote: > > On Thu, May 08, 2014 at 08:02:28AM -0400, Brian Foster wrote: > > > Missing a $ here... > > > > > > Adding that, the single threaded build still breaks for me. E.g., > > > > > > - rm -rf fs/xfs > > > - git checkout -- . > > > - make > > > > The kernel build systems doesn't support building a single module from > > multiple makefiles. Take a look how to handle a subdirectory in the > > older XFS versions that still had that linux-2.6 subdirectory, it just > > pulls the files in the subdirectory in from the main makefile, which > > requires some tiny hacks for the include path. > > > > Good point, I was looking around for some example of this and didn't see > anything obvious, but didn't think to look back to that. Indeed it does > just reference the files in the subdirectory... thanks. I haven't looked at that, but I'm assuming that it is just a -include libxfs/Makefile directive rather than using: obj-y += libxfs/ If that's all it takes, then I'll rebase the patch on that.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Thu May 8 16:51:28 2014 Return-Path: <bfoster@redhat.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 CDAFF7F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:51:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B43A38F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 14:51:28 -0700 (PDT) X-ASG-Debug-ID: 1399585887-04cb6c1fcc2add30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TvUUEPxqD73TvEaH for <xfs@oss.sgi.com>; Thu, 08 May 2014 14:51: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s48LpJjW015476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 8 May 2014 17:51:20 -0400 Received: from laptop.bfoster (vpn-48-147.rdu2.redhat.com [10.10.48.147]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s48LpIq1007295; Thu, 8 May 2014 17:51:19 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 75C0C120AC3; Thu, 8 May 2014 17:51:18 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s48LpGZ7032055; Thu, 8 May 2014 17:51:16 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Thu, 8 May 2014 17:51:16 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: Namjae Jeon <namjae.jeon@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-ID: <20140508215115.GA30141@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range References: <002601cf6aa2$c59cd670$50d68350$@samsung.com> <20140508133637.GB47272@bfoster.bfoster> <20140508211712.GD26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508211712.GD26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399585887 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, May 09, 2014 at 07:17:12AM +1000, Dave Chinner wrote: > On Thu, May 08, 2014 at 09:36:37AM -0400, Brian Foster wrote: > > On Thu, May 08, 2014 at 06:49:14PM +0900, Namjae Jeon wrote: > > > There is no need to dip into reserve pool. Reserve pool is used for much > > > more important things. And xfs_trans_reserve will never return ENOSPC > > > because punch hole is already done. If we get ENOSPC, collapse range > > > will be simply failed. > > > > > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > > > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > > > --- > > > fs/xfs/xfs_bmap_util.c | 3 +-- > > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > > index 296160b..91a43c5 100644 > > > --- a/fs/xfs/xfs_bmap_util.c > > > +++ b/fs/xfs/xfs_bmap_util.c > > > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > > > > > while (!error && !done) { > > > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > > - tp->t_flags |= XFS_TRANS_RESERVE; > > > > Makes sense. > > > > > /* > > > * We would need to reserve permanent block for transaction. > > > * This will come into picture when after shifting extent into > > > @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( > > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > > if (error) { > > > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > > > The xfs_trans_reserve() call still reserves XFS_DIOSTRAT_SPACE_RES() > > blocks, so therefore I think ENOSPC is still a possibility. The question > > is probably whether or not we need to reserve blocks for this > > transaction. > > > > Making a pass through the code... we have the possibility of deleting a > > btree record in xfs_bmap_shift_extents(). This in turn could potentially > > free a btree block, which frees space. I _think_ this could mean we > > want to keep the block reservation because we update the free space > > trees, but I suppose that could be handled by the freelist... > > > > Perhaps Dave can confirm which direction we should go here..? > > Having collapse range fail with ENOSPC is not an issue - it is being > executed in a context where we can fail safely and return an error > to the user. > > XFS_TRANS_RESERVE is used in places where a failure is unrecoverable > or there is no one to report the error to. e.g. prevent data loss > due to ENOSPC in unwritten extent conversion during background > buffered write IO completion > > So here there is no need for it at all.... > Yeah, dropping XFS_TRANS_RESERVE makes sense. The question I have is whether we should reserve blocks for this transaction (for a potential bmbt block free). If we do reserve blocks, then I assume the ENOSPC assert should stick around. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Thu May 8 17:02:23 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 568307F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 17:02:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E277304059 for <xfs@oss.sgi.com>; Thu, 8 May 2014 15:02:19 -0700 (PDT) X-ASG-Debug-ID: 1399586537-04bdf02b8d4187c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1sH6rADPll5x4P28 for <xfs@oss.sgi.com>; Thu, 08 May 2014 15:02: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: ArNSAC7+a1N5LL1sPGdsb2JhbABZgwaIR6QhAQEBAQEBBpoLCgGBFBcDAQEBATg1giUBAQUyASMjEAgDDgoJJQ8FJQMHGhOIQNBjFxaFQIh8B4MqgRUBA5k3iwGLQys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 07:32:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiWOM-0003vt-30; Fri, 09 May 2014 08:02:14 +1000 Date: Fri, 9 May 2014 08:02:14 +1000 From: Dave Chinner <david@fromorbit.com> To: Emmanuel Florac <eflorac@intellique.com> Cc: Eric Sandeen <sandeen@sandeen.net>, xfs-oss <xfs@oss.sgi.com> Subject: Re: Remove xfs_check for 3.2.0? Message-ID: <20140508220214.GF26353@dastard> X-ASG-Orig-Subj: Re: Remove xfs_check for 3.2.0? References: <536BCF95.201@sandeen.net> <20140508203936.GV5421@dastard> <536BEBD9.4060604@sandeen.net> <20140508230410.02b19431@galadriel.home> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140508230410.02b19431@galadriel.home> 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: 1399586537 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.5652 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 11:04:10PM +0200, Emmanuel Florac wrote: > Le Thu, 08 May 2014 15:40:57 -0500 vous écriviez: > > > *shrug* ok. Let a thousand "hey my xfs_check OOM'd" emails > > blossom! :) > > > > FWIW, I did not have time to work on that prefetch bug yet today. :( > > > > Why not replace it by a script that simply states that it's useless and > to run xfs_repair -n instead? It has been completely useless for the > best part of the past ten years... This way you don't remove it but > you'll sort of fix it :) xfs_check is already just a script that wraps xfs_db. However, there's all the man page updates, all the external documentation needs to be updated, etc. IOWs, it's not just a case of a simply patching out the xfs_check script.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 8 17:05:27 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D4AC07F52 for <xfs@oss.sgi.com>; Thu, 8 May 2014 17:05:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AC8C304051 for <xfs@oss.sgi.com>; Thu, 8 May 2014 15:05:27 -0700 (PDT) X-ASG-Debug-ID: 1399586725-04bdf02b8c4188c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id LIvz3n8QkdVu35Pc for <xfs@oss.sgi.com>; Thu, 08 May 2014 15:05: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: AqdSAFn/a1N5LL1sPGdsb2JhbABZgwaIR6QhAQEBAQEBBpoVAYEUFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hA0GUXFoVAiHwHhD8EmTeLAYtDKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 07:35:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiWR7-0003wC-Ae; Fri, 09 May 2014 08:05:05 +1000 Date: Fri, 9 May 2014 08:05:05 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: Namjae Jeon <namjae.jeon@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-ID: <20140508220505.GG26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range References: <002601cf6aa2$c59cd670$50d68350$@samsung.com> <20140508133637.GB47272@bfoster.bfoster> <20140508211712.GD26353@dastard> <20140508215115.GA30141@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508215115.GA30141@laptop.bfoster> 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: 1399586725 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.5652 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 05:51:16PM -0400, Brian Foster wrote: > On Fri, May 09, 2014 at 07:17:12AM +1000, Dave Chinner wrote: > > On Thu, May 08, 2014 at 09:36:37AM -0400, Brian Foster wrote: > > > On Thu, May 08, 2014 at 06:49:14PM +0900, Namjae Jeon wrote: > > > > There is no need to dip into reserve pool. Reserve pool is used for much > > > > more important things. And xfs_trans_reserve will never return ENOSPC > > > > because punch hole is already done. If we get ENOSPC, collapse range > > > > will be simply failed. > > > > > > > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > > > > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > > > > --- > > > > fs/xfs/xfs_bmap_util.c | 3 +-- > > > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > > > index 296160b..91a43c5 100644 > > > > --- a/fs/xfs/xfs_bmap_util.c > > > > +++ b/fs/xfs/xfs_bmap_util.c > > > > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > > > > > > > while (!error && !done) { > > > > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > > > - tp->t_flags |= XFS_TRANS_RESERVE; > > > > > > Makes sense. > > > > > > > /* > > > > * We would need to reserve permanent block for transaction. > > > > * This will come into picture when after shifting extent into > > > > @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( > > > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > > > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > > > if (error) { > > > > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > > > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > > > > > The xfs_trans_reserve() call still reserves XFS_DIOSTRAT_SPACE_RES() > > > blocks, so therefore I think ENOSPC is still a possibility. The question > > > is probably whether or not we need to reserve blocks for this > > > transaction. > > > > > > Making a pass through the code... we have the possibility of deleting a > > > btree record in xfs_bmap_shift_extents(). This in turn could potentially > > > free a btree block, which frees space. I _think_ this could mean we > > > want to keep the block reservation because we update the free space > > > trees, but I suppose that could be handled by the freelist... > > > > > > Perhaps Dave can confirm which direction we should go here..? > > > > Having collapse range fail with ENOSPC is not an issue - it is being > > executed in a context where we can fail safely and return an error > > to the user. > > > > XFS_TRANS_RESERVE is used in places where a failure is unrecoverable > > or there is no one to report the error to. e.g. prevent data loss > > due to ENOSPC in unwritten extent conversion during background > > buffered write IO completion > > > > So here there is no need for it at all.... > > > > Yeah, dropping XFS_TRANS_RESERVE makes sense. The question I have is > whether we should reserve blocks for this transaction (for a potential > bmbt block free). If we do reserve blocks, then I assume the ENOSPC > assert should stick around. Yes, the assert is wrong because xfs_trans_reserve() can return ENOMEM as well as ENOSPC. It should just be removed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From linus971@gmail.com Thu May 8 18:13:06 2014 Return-Path: <linus971@gmail.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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,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 ACBFB7F47 for <xfs@oss.sgi.com>; Thu, 8 May 2014 18:13:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3FA07AC013 for <xfs@oss.sgi.com>; Thu, 8 May 2014 16:13:03 -0700 (PDT) X-ASG-Debug-ID: 1399590780-04bdf02b8d419f20001-NocioJ Received: from mail-ve0-f172.google.com (mail-ve0-f172.google.com [209.85.128.172]) by cuda.sgi.com with ESMTP id GHdTzgwno68WAiBG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 08 May 2014 16:13:01 -0700 (PDT) X-Barracuda-Envelope-From: linus971@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] Received: by mail-ve0-f172.google.com with SMTP id oz11so4199909veb.17 for <xfs@oss.sgi.com>; Thu, 08 May 2014 16:13:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=fqfXAohN/bisb2IKeJZdy6GUA230pfw1vuVugsEDIFU=; b=PpInbubRN7uvYZOx4bPbEPTxo3+AHG84hF/4a7bsi3GiD0ujGJ54hW7901KTSusV9B hq0BJjZRuG0ygqNogLIT1NZOiualR9HLn0lTcs3C96UoRpirlEWAG/lKMw19seHLVV/g 4fQaUZa7AJY2R4NojT5MKahTc6gVrL+svR7TxhBBCgiKSfoVQqKeXthtSNkBFre0OOqQ StDFWN+sp/g+ZPbVWY1L4gZJyNdJECxtFTtx7W8OW1z7ATBlsKSO9EkbWbHRZAYyy65T 7kzOmBIio9bYTeX/WdVUpGS2pJuiX3/TFTD6to817K5elAMV/RS56LLk5jkYRHrOqp4g nFOw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux-foundation.org; s=google; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=fqfXAohN/bisb2IKeJZdy6GUA230pfw1vuVugsEDIFU=; b=UXeYW1O6vVWjk7Jx2+/31r3UrAzsNMiInoEKGQe36/5QS3YRtM7UgwQtkLgHuSdk8D bCCzfz7igL1907cuJ7m8JZ6Rq52iwMqgfLcvH0VAcuZ2/5v3YDTbY0CynfwpydKX6+ZM zeZj4jmytUuD5N8sdy1zop9fUaTp3L7omnAGs= MIME-Version: 1.0 X-Received: by 10.58.171.229 with SMTP id ax5mr5174726vec.24.1399590780514; Thu, 08 May 2014 16:13:00 -0700 (PDT) Sender: linus971@gmail.com Received: by 10.220.2.205 with HTTP; Thu, 8 May 2014 16:13:00 -0700 (PDT) In-Reply-To: <20140508211217.GC26353@dastard> References: <20140508211217.GC26353@dastard> Date: Thu, 8 May 2014 16:13:00 -0700 X-Google-Sender-Auth: W8ZLQuKCVYwjMGpzk2_6Ljoz8DM Message-ID: <CA+55aFy9B=OcqfniMiq+EhDa_rzc0-owcmbUck1FmBOU+Q-Dvw@mail.gmail.com> Subject: Re: [GIT PULL] xfs: fixes for 3.15-rc5 From: Linus Torvalds <torvalds@linux-foundation.org> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: fixes for 3.15-rc5 To: Dave Chinner <david@fromorbit.com> Cc: Andrew Morton <akpm@linux-foundation.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ve0-f172.google.com[209.85.128.172] X-Barracuda-Start-Time: 1399590781 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.5653 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 Thu, May 8, 2014 at 2:12 PM, Dave Chinner <david@fromorbit.com> wrote: > > BTW, will GPG signing these pull requests cause you problems? Nope. But I won't be checking email signatures. GPG email signing is so badly done that afaik only one or two email clients support it. > I've > been signing everything "official" I send as the XFS maintainer > (e.g. notifications of tree updates) and I figured that pull > requests are about as "official" as it gets. The tag is signed, so > I'm not particularly worried either way... .. what tag? You point me at > git://oss.sgi.com/xfs/xfs.git xfs-fixes-for-3.15-rc5 and that is definitely not a tag. Did you *mean* to point me at refs/tags/xfs-for-linus-3.15-rc5, perhaps? I've not pulled due to the ambiguity of the pull request. Linus From david@fromorbit.com Thu May 8 19:47:41 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 40AC27F53 for <xfs@oss.sgi.com>; Thu, 8 May 2014 19:47:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 252E830404E for <xfs@oss.sgi.com>; Thu, 8 May 2014 17:47:41 -0700 (PDT) X-ASG-Debug-ID: 1399596431-04cb6c7290404230001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aQ67anDYIyaHtT3e for <xfs@oss.sgi.com>; Thu, 08 May 2014 17:47:11 -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: ArRSANkkbFN5LL1sPGdsb2JhbABZgwZPh3ikJQEBAQEBAQaaFQGBEhcDAQEBATg1giUBAQQBJxMcIwULCAMYCSUPBSUDBxoTiDkH0G4XFoVAiBoRAVAHhD8EhUmTbpZEK4E5 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 10:17:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WiYxw-0004GM-C5; Fri, 09 May 2014 10:47:08 +1000 Date: Fri, 9 May 2014 10:47:08 +1000 From: Dave Chinner <david@fromorbit.com> To: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: fixes for 3.15-rc5 Message-ID: <20140509004708.GH26353@dastard> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: fixes for 3.15-rc5 References: <20140508211217.GC26353@dastard> <CA+55aFy9B=OcqfniMiq+EhDa_rzc0-owcmbUck1FmBOU+Q-Dvw@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CA+55aFy9B=OcqfniMiq+EhDa_rzc0-owcmbUck1FmBOU+Q-Dvw@mail.gmail.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: 1399596431 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.5657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 04:13:00PM -0700, Linus Torvalds wrote: > On Thu, May 8, 2014 at 2:12 PM, Dave Chinner <david@fromorbit.com> wrote: > > > > BTW, will GPG signing these pull requests cause you problems? > > Nope. But I won't be checking email signatures. GPG email signing is > so badly done that afaik only one or two email clients support it. > > > I've > > been signing everything "official" I send as the XFS maintainer > > (e.g. notifications of tree updates) and I figured that pull > > requests are about as "official" as it gets. The tag is signed, so > > I'm not particularly worried either way... > > .. what tag? You point me at > > > git://oss.sgi.com/xfs/xfs.git xfs-fixes-for-3.15-rc5 > > and that is definitely not a tag. Hmmm, I didn't notice the output of the pull request command I ran converted the tag to a branch. Checking my command history, it looks like I ran request-pull before I pushed the tag. Sure be nice to get a "tag doesn't exist upstream" error, but I'll make sure I don't do that again. > Did you *mean* to point me at refs/tags/xfs-for-linus-3.15-rc5, perhaps? Yup, updated request below. -Dave. The following changes since commit 330033d697ed8d296fa52b5303db9d802ad901cc: xfs: fix tmpfile/selinux deadlock and initialize security (2014-04-17 08:15:30 +1000) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git tags/xfs-for-linus-3.15-rc5 for you to fetch changes up to 8275cdd0e7ac550dcce2b3ef6d2fb3b808c1ae59: xfs: remote attribute overwrite causes transaction overrun (2014-05-06 07:37:31 +1000) ---------------------------------------------------------------- Fixes for 3.15-rc5: - fix a remote attribute size calculation bug that leads to a transaction overrun - add default ACLs to O_TMPFILE files - Remove the EXPERIMENTAL tag from filesystems with metadata CRC support ---------------------------------------------------------------- Brian Foster (1): xfs: initialize default acls for ->tmpfile() Dave Chinner (2): xfs: fully support v5 format filesystems xfs: remote attribute overwrite causes transaction overrun fs/xfs/xfs_attr.c | 24 +++++++++++++++++++- fs/xfs/xfs_attr_leaf.c | 21 +++++++++--------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 8 ++++--- fs/xfs/xfs_da_btree.h | 2 ++ fs/xfs/xfs_iops.c | 55 ++++++++++++++++++++++++---------------------- fs/xfs/xfs_log.c | 10 +++++---- fs/xfs/xfs_mount.c | 2 -- fs/xfs/xfs_sb.c | 4 ---- 9 files changed, 77 insertions(+), 50 deletions(-) -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Thu May 8 20:17:20 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E6897F54 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:17:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9A1F30404E for <xfs@oss.sgi.com>; Thu, 8 May 2014 18:17:19 -0700 (PDT) X-ASG-Debug-ID: 1399598233-04cbb03cc43eebd0002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 37hbA7cW78L58ELe for <xfs@oss.sgi.com>; Thu, 08 May 2014 18:17:18 -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: AolSABYsbFN5LL1sPGdsb2JhbABZgwaIR6QBAQEBAQEBBpspFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDRCoVWjUIElUGaOis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 10:47:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiZQu-0004KG-Rd for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiZQu-00019H-Qv for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 2/2] repair: don't grind CPUs with large extent lists Date: Fri, 9 May 2014 11:17:02 +1000 X-ASG-Orig-Subj: [PATCH 2/2] repair: don't grind CPUs with large extent lists Message-Id: <1399598222-4349-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399598222-4349-1-git-send-email-david@fromorbit.com> References: <1399598222-4349-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399598237 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.5657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> When repairing a large filesystem with fragemented files, xfs_repair can grind to a halt burning multiple CPUs in blkmap_set_ext(). blkmap_set_ext() inserts extents into the blockmap for the inode fork and it keeps them in order, even if the inserts are not done in order. The ordered insert is highly inefficient - it starts at the first extent, and simple walks the array to find the insertion point. i.e. it is an O(n) operation. When we have a fragemented file with a large number of extents, the cost of the entire mapping operation is rather costly. The thing is, we are doing the insertion from an *ordered btree scan* which is inserting the extents in ascending offset order. IOWs, we are always inserting the extent at the end of the array after searching the entire array. i.e. the mapping operation cost is O(N^2). Fix this simply by reversing the order of the insert slot search. Start at the end of the blockmap array when we do almost all insertions, which brings the overhead of each insertion down to O(1) complexity. This, in turn, results in the overall map building operation being reduced to an O(N) operation, and so performance degrades linearly with increasing extent counts rather than exponentially. The result is that the test filesystem (27TB, 30M inodes, at ENOSPC) takes 5m10s to *fully repair* on my test system, rather that getting 15 (of 60) AGs into phase three and sitting there burning 3-4 CPUs making no progress for over half an hour. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- repair/bmap.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/repair/bmap.c b/repair/bmap.c index 14161cb..1e913c5 100644 --- a/repair/bmap.c +++ b/repair/bmap.c @@ -260,7 +260,15 @@ blkmap_grow( { pthread_key_t key = dblkmap_key; blkmap_t *new_blkmap; - int new_naexts = blkmap->naexts + 4; + int new_naexts; + + /* reduce the number of reallocations for large files */ + if (blkmap->naexts < 1000) + new_naexts = blkmap->naexts + 4; + else if (blkmap->naexts < 10000) + new_naexts = blkmap->naexts + 100; + else + new_naexts = blkmap->naexts + 1000; if (pthread_getspecific(key) != blkmap) { key = ablkmap_key; @@ -308,7 +316,7 @@ blkmap_set_ext( xfs_dfilblks_t c) { blkmap_t *blkmap = *blkmapp; - xfs_extnum_t i; + xfs_extnum_t i = 0; if (blkmap->nexts == blkmap->naexts) { blkmap = blkmap_grow(blkmap); @@ -318,15 +326,27 @@ blkmap_set_ext( } ASSERT(blkmap->nexts < blkmap->naexts); - for (i = 0; i < blkmap->nexts; i++) { - if (blkmap->exts[i].startoff > o) { - memmove(blkmap->exts + i + 1, - blkmap->exts + i, - sizeof(bmap_ext_t) * (blkmap->nexts - i)); + + if (blkmap->nexts == 0) + goto insert; + + /* + * Do a reverse order search as the most common insertion during + * a bmapbt scan is at the end of the map. Use "plus 1" indexing + * for the loop counter so when we break out we are at the correct index + * for insertion. + */ + for (i = blkmap->nexts; i > 0; i--) { + if (blkmap->exts[i - 1].startoff < o) break; - } } + /* make space for the new extent */ + memmove(blkmap->exts + i + 1, + blkmap->exts + i, + sizeof(bmap_ext_t) * (blkmap->nexts - i)); + +insert: blkmap->exts[i].startoff = o; blkmap->exts[i].startblock = b; blkmap->exts[i].blockcount = c; -- 1.9.0 From dave@fromorbit.com Thu May 8 20:17:21 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C44947F5A for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:17:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA138304051 for <xfs@oss.sgi.com>; Thu, 8 May 2014 18:17:18 -0700 (PDT) X-ASG-Debug-ID: 1399598233-04cbb03cc43eebd0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id iwkSneYV0e06TiG0 for <xfs@oss.sgi.com>; Thu, 08 May 2014 18:17:13 -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: AopSABYsbFN5LL1sPGdsb2JhbABRCIMGiEekAQEBAQEBAQabKRcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0QqFVogmhRwEr3sr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 10:47:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiZQu-0004KF-RB for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiZQu-00019C-QT for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers Date: Fri, 9 May 2014 11:17:01 +1000 X-ASG-Orig-Subj: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers Message-Id: <1399598222-4349-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399598222-4349-1-git-send-email-david@fromorbit.com> References: <1399598222-4349-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399598233 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.5657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The way discontiguous buffers are currently handled in prefetch is by unlocking the prefetch tree and reading them one at a time in pf_read_discontig(), inside the normal loop of searching for buffers to read in a more optimized fashion. But by unlocking the tree, we allow other threads to come in and find buffers which we've already stashed locally on our bplist[]. If 2 threads think they own the same set of buffers, they may both try to delete them from the prefetch btree, and the second one to arrive will not find it, resulting in: fatal error -- prefetch corruption To fix this, simply abort the buffer gathering loop when we come across a discontiguous buffer, process the gathered list as per normal, and then after running the large optimised read, check to see if the last buffer on the list is a discontiguous buffer. If is is discontiguous, then issue the discontiguous buffer read while the locks are not held. We only ever have one discontiguous buffer per read loop, so it is safe just to check the last buffer in the list. The fix is loosely based on a a patch provided by Eric Sandeen, who did all the hard work of finding the bug and demonstrating how to fix it. Reported-by:Eric Sandeen <sandeen@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- repair/prefetch.c | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/repair/prefetch.c b/repair/prefetch.c index 65fedf5..e269f1f 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -444,27 +444,6 @@ pf_read_inode_dirs( } /* - * Discontiguous buffers require multiple IOs to fill, so we can't use any - * linearising, hole filling algorithms on them to avoid seeks. Just remove them - * for the prefetch queue and read them straight into the cache and release - * them. - */ -static void -pf_read_discontig( - struct prefetch_args *args, - struct xfs_buf *bp) -{ - if (!btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, bp->b_bn))) - do_error(_("prefetch corruption\n")); - - pthread_mutex_unlock(&args->lock); - libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); - bp->b_flags |= LIBXFS_B_UNCHECKED; - libxfs_putbuf(bp); - pthread_mutex_lock(&args->lock); -} - -/* * pf_batch_read must be called with the lock locked. */ static void @@ -496,13 +475,19 @@ pf_batch_read( } while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) { /* - * Handle discontiguous buffers outside the seek - * optimised IO loop below. + * Discontiguous buffers need special handling, so stop + * gathering new buffers and process the list and this + * discontigous buffer immediately. This avoids the + * complexity of keeping a separate discontigous buffer + * list and seeking back over ranges we've already done + * optimised reads for. */ if ((bplist[num]->b_flags & LIBXFS_B_DISCONTIG)) { - pf_read_discontig(args, bplist[num]); - bplist[num] = NULL; - } else if (which != PF_META_ONLY || + num++; + break; + } + + if (which != PF_META_ONLY || !B_IS_INODE(XFS_BUF_PRIORITY(bplist[num]))) num++; if (num == MAX_BUFS) @@ -570,6 +555,22 @@ pf_batch_read( * now read the data and put into the xfs_but_t's */ len = pread64(mp_fd, buf, (int)(last_off - first_off), first_off); + + /* + * Check the last buffer on the list to see if we need to + * process a discontiguous buffer. The gather loop guarantees + * we only ever have a single discontig buffer on the list, + * and that it is the last buffer, so it is safe to do this + * check and read here like this while we aren't holding any + * locks. + */ + if ((bplist[num - 1]->b_flags & LIBXFS_B_DISCONTIG)) { + libxfs_readbufr_map(mp->m_ddev_targp, bplist[num - 1], 0); + bplist[num - 1]->b_flags |= LIBXFS_B_UNCHECKED; + libxfs_putbuf(bplist[num - 1]); + num--; + } + if (len > 0) { /* * go through the xfs_buf_t list copying from the -- 1.9.0 From dave@fromorbit.com Thu May 8 20:17:24 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2677B7F60 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:17:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BDFAFAC013 for <xfs@oss.sgi.com>; Thu, 8 May 2014 18:17:20 -0700 (PDT) X-ASG-Debug-ID: 1399598238-04cb6c1fcc2b2fd0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id hs6NZasx4zqY1mkt for <xfs@oss.sgi.com>; Thu, 08 May 2014 18:17:18 -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: An1SABYsbFN5LL1sPGdsb2JhbABZgwaIR6QBAQEBAQEBBpspFwMBAQEBODWDAjuBAgMHiG2dBbQFhVaJGYQpBK10ggcr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 10:47:07 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WiZQu-0004KE-Qt for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WiZQu-000197-Pj for xfs@oss.sgi.com; Fri, 09 May 2014 11:17:04 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 0/2] repair: fixes for 3.2.0-rc2 Date: Fri, 9 May 2014 11:17:00 +1000 X-ASG-Orig-Subj: [PATCH 0/2] repair: fixes for 3.2.0-rc2 Message-Id: <1399598222-4349-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1399598238 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.5657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, A couple of fixes identified for xfs_repair follow. The first is a regression introduced by the discontiguous buffer support in the prefetch code, which Eric Sandeen found. I've written a slightly different fix for it than Eric did, but the concept for the fix is all Eric's work. The second patch is not actually a regression, but the filesystem that triggered the above regression can't actually be repaired in a sane amount of time because of an array insertion algorithm with exponential cost. It's trivial to fix, and it means xfs_repair can actually run to completion quickly rather than burn CPU for hours getting nothing done. These fixes mean I'll probably release a 3.2.0-rc3 once they've been reviewed and go into the tree.... Cheers, Dave. From wangsl.fnst@cn.fujitsu.com Thu May 8 20:20:54 2014 Return-Path: <wangsl.fnst@cn.fujitsu.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 61F207F58 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:20:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49DA58F8037 for <xfs@oss.sgi.com>; Thu, 8 May 2014 18:20:53 -0700 (PDT) X-ASG-Debug-ID: 1399598451-04cbb03cc63eee10001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id p02gETjXfBZqItpx for <xfs@oss.sgi.com>; Thu, 08 May 2014 18:20:52 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,1014,1389715200"; d="scan'208";a="30283227" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 09 May 2014 09:18:15 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s491KjHo021505; Fri, 9 May 2014 09:20:45 +0800 Received: from [10.167.226.104] (10.167.226.104) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server id 14.3.146.2; Fri, 9 May 2014 09:20:46 +0800 Message-ID: <536C2C99.6020506@cn.fujitsu.com> Date: Fri, 9 May 2014 09:17:13 +0800 From: Wang Shilong <wangsl.fnst@cn.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130612 Thunderbird/17.0.6 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com> CC: <xfs@oss.sgi.com>, <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> <536AFC3B.7070502@cn.fujitsu.com> <536BCDF7.7070404@fb.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <536BCDF7.7070404@fb.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.167.226.104] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1399598451 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.5657 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/09/2014 02:33 AM, Josef Bacik wrote: > On 05/07/2014 11:38 PM, Wang Shilong wrote: >> On 05/08/2014 04:58 AM, Josef Bacik wrote: >>> On 03/09/2014 11:44 PM, Wang Shilong wrote: >>>> Test flow is to run fsstress after triggering quota rescan. >>>> the ruler is simple, we just remove all files and directories, >>>> sync filesystem and see if qgroup's ref and excl are nodesize. >>>> >>>> Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> >>>> --- >>>> v1->v2: >>>> switch into new helper _run_btrfs_util_prog() >>>> --- >>>> tests/btrfs/041 | 76 >>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> tests/btrfs/041.out | 3 +++ >>>> tests/btrfs/group | 1 + >>>> 3 files changed, 80 insertions(+) >>>> create mode 100644 tests/btrfs/041 >>>> create mode 100644 tests/btrfs/041.out >>>> >>>> diff --git a/tests/btrfs/041 b/tests/btrfs/041 >>>> new file mode 100644 >>>> index 0000000..92bd080 >>>> --- /dev/null >>>> +++ b/tests/btrfs/041 >>>> @@ -0,0 +1,76 @@ >>>> +#! /bin/bash >>>> +# FSQA Test No. btrfs/041 >>>> +# >>>> +# Quota rescan stress test, we run fsstress and quota rescan >>>> concurrently >>>> +# >>>> +#----------------------------------------------------------------------- >>>> >>>> >>>> +# Copyright (C) 2014 Fujitsu. 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 >>>> + >>>> +_cleanup() >>>> +{ >>>> + cd / >>>> + rm -f $tmp.* >>>> +} >>>> +trap "_cleanup; exit \$status" 0 1 2 3 15 >>>> + >>>> +# get standard environment, filters and checks >>>> +. ./common/rc >>>> +. ./common/filter >>>> + >>>> +# real QA test starts here >>>> +_need_to_be_root >>>> +_supported_fs btrfs >>>> +_supported_os Linux >>>> +_require_scratch >>>> + >>>> +rm -f $seqres.full >>>> + >>>> +run_check _scratch_mkfs "-b 1g --nodesize 4096" >>>> +run_check _scratch_mount >>>> + >>> >>> Add "-o nospace_cache" here please, otherwise I don't get the same >>> output. >> >> I am little confused why we need specify this mount option explicitly? >> As far as i know, space cache is not included into qgroup accounting >> space. >> > > It is. Thanks, Free space cache are inserted in tree root, they can not be shared with other trees(fs/file tree). So normal fs/file tree's qgroup accounting is independeng of free space cache. With or without the option, subvolume qgroup's value should not have any differences. Did i miss something here?:-) Thanks, Wang > > Josef > > . > From prvs=0206026da8=jbacik@fb.com Thu May 8 21:13:26 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 3768C7F5D for <xfs@oss.sgi.com>; Thu, 8 May 2014 21:13:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5457304043 for <xfs@oss.sgi.com>; Thu, 8 May 2014 19:13:22 -0700 (PDT) X-ASG-Debug-ID: 1399601598-04bdf02b8c41ee10001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id VrGAYJsvwoCWhoAg for <xfs@oss.sgi.com>; Thu, 08 May 2014 19:13:18 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004077 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s492CpAb011326; Thu, 8 May 2014 19:13:05 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=facebook; bh=lkQkUZzgdG7EhnuY+o1aC6gXrQSL4mTnyRxEltQV2oM=; b=M6waAAOeErsOsLq0nFk+EdIAyDfSAYj8SJFsDWJe0mLz1qpgVowrbOKG3lnmhLkCVR9G n+kyXfVBci7+GJR7j+vDMwciAaAUBAvZcOJXnTlX6k/6woyaIVJJIx90lad+uAFO7IVJ ZJqBbCnPtIwdajzprjYOgkZikp9nEBX8khk= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1krm6pgd20-2 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Thu, 08 May 2014 19:13:04 -0700 Received: from PRN-MBX01-2.TheFacebook.com ([169.254.4.16]) by PRN-CHUB14.TheFacebook.com ([fe80::5977:3d0b:700b:8bb%12]) with mapi id 14.03.0174.001; Thu, 8 May 2014 19:13:02 -0700 From: Josef Bacik <jbacik@fb.com> To: Wang Shilong <wangsl.fnst@cn.fujitsu.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com>, "linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test Thread-Topic: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test Thread-Index: AQHPPBNeo/hB+ZLgc0mXHbZY1fowKZs2KFOAgACy2oCAALb3gIAAs96A//+aP6I= Date: Fri, 9 May 2014 02:13:01 +0000 Message-ID: <xmifb9cukl6cxjty7n8malrf.1399601580721@email.android.com> References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> <536AFC3B.7070502@cn.fujitsu.com> <536BCDF7.7070404@fb.com>,<536C2C99.6020506@cn.fujitsu.com> In-Reply-To: <536C2C99.6020506@cn.fujitsu.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_01:2014-05-08,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.39505069110635e-08 kscore.compositescore=0 circleOfTrustscore=46.7934627885764 compositescore=0.999739589658025 urlsuspect_oldscore=0.999739589658025 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=60 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=62764 rbsscore=0.999739589658025 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090031 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1399601598 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 inode cache is saved in the FS tree itself for every individual FS tree= , that affects the sizes reported by qgroup show so we need to explicitly t= urn it off to get consistent values. Thanks, Josef Wang Shilong <wangsl.fnst@cn.fujitsu.com> wrote: On 05/09/2014 02:33 AM, Josef Bacik wrote: > On 05/07/2014 11:38 PM, Wang Shilong wrote: >> On 05/08/2014 04:58 AM, Josef Bacik wrote: >>> On 03/09/2014 11:44 PM, Wang Shilong wrote: >>>> Test flow is to run fsstress after triggering quota rescan. >>>> the ruler is simple, we just remove all files and directories, >>>> sync filesystem and see if qgroup's ref and excl are nodesize. >>>> >>>> Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> >>>> --- >>>> v1->v2: >>>> switch into new helper _run_btrfs_util_prog() >>>> --- >>>> tests/btrfs/041 | 76 >>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> tests/btrfs/041.out | 3 +++ >>>> tests/btrfs/group | 1 + >>>> 3 files changed, 80 insertions(+) >>>> create mode 100644 tests/btrfs/041 >>>> create mode 100644 tests/btrfs/041.out >>>> >>>> diff --git a/tests/btrfs/041 b/tests/btrfs/041 >>>> new file mode 100644 >>>> index 0000000..92bd080 >>>> --- /dev/null >>>> +++ b/tests/btrfs/041 >>>> @@ -0,0 +1,76 @@ >>>> +#! /bin/bash >>>> +# FSQA Test No. btrfs/041 >>>> +# >>>> +# Quota rescan stress test, we run fsstress and quota rescan >>>> concurrently >>>> +# >>>> +#--------------------------------------------------------------------= --- >>>> >>>> >>>> +# Copyright (C) 2014 Fujitsu. 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=3D`basename $0` >>>> +seqres=3D$RESULT_DIR/$seq >>>> +echo "QA output created by $seq" >>>> + >>>> +here=3D`pwd` >>>> +tmp=3D/tmp/$$ >>>> +status=3D1 >>>> + >>>> +_cleanup() >>>> +{ >>>> + cd / >>>> + rm -f $tmp.* >>>> +} >>>> +trap "_cleanup; exit \$status" 0 1 2 3 15 >>>> + >>>> +# get standard environment, filters and checks >>>> +. ./common/rc >>>> +. ./common/filter >>>> + >>>> +# real QA test starts here >>>> +_need_to_be_root >>>> +_supported_fs btrfs >>>> +_supported_os Linux >>>> +_require_scratch >>>> + >>>> +rm -f $seqres.full >>>> + >>>> +run_check _scratch_mkfs "-b 1g --nodesize 4096" >>>> +run_check _scratch_mount >>>> + >>> >>> Add "-o nospace_cache" here please, otherwise I don't get the same >>> output. >> >> I am little confused why we need specify this mount option explicitly? >> As far as i know, space cache is not included into qgroup accounting >> space. >> > > It is. Thanks, Free space cache are inserted in tree root, they can not be shared with other trees(fs/file tree). So normal fs/file tree's qgroup accounting is independeng of free space cache. With or without the option, subvolume qgroup's value should not have any differences. Did i miss something here?:-) Thanks, Wang > > Josef > > . > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at https://urldefense.proofpoint.com/v1/url?u=3Dhttp:/= /vger.kernel.org/majordomo-info.html&k=3DZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r= =3DcKCbChRKsMpTX8ybrSkonQ%3D%3D%0A&m=3DG4HqImi%2Fy7KWWbAvCZf%2Bl8CSV3XzU9OD= KrgtdQCTPYQ%3D%0A&s=3De27422f119365ab04dddfb06e08c152eec84c4de29e19b6811310= 607e6a15c99 From sandeen@sandeen.net Thu May 8 21:14:30 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1AD157F5D for <xfs@oss.sgi.com>; Thu, 8 May 2014 21:14:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2AC4304043 for <xfs@oss.sgi.com>; Thu, 8 May 2014 19:14:29 -0700 (PDT) X-ASG-Debug-ID: 1399601667-04bdf02b8a41ee80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QADrpC64gXE2JHkB for <xfs@oss.sgi.com>; Thu, 08 May 2014 19: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0C77663C5FF2; Thu, 8 May 2014 21:14:27 -0500 (CDT) Message-ID: <536C3A07.2050100@sandeen.net> Date: Thu, 08 May 2014 21:14:31 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers References: <1399598222-4349-1-git-send-email-david@fromorbit.com> <1399598222-4349-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers In-Reply-To: <1399598222-4349-2-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399601667 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.5658 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/8/14, 8:17 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > The way discontiguous buffers are currently handled in prefetch is > by unlocking the prefetch tree and reading them one at a time in > pf_read_discontig(), inside the normal loop of searching for buffers > to read in a more optimized fashion. > > But by unlocking the tree, we allow other threads to come in and > find buffers which we've already stashed locally on our bplist[]. > If 2 threads think they own the same set of buffers, they may both > try to delete them from the prefetch btree, and the second one to > arrive will not find it, resulting in: > > fatal error -- prefetch corruption > > To fix this, simply abort the buffer gathering loop when we come > across a discontiguous buffer, process the gathered list as per > normal, and then after running the large optimised read, check to > see if the last buffer on the list is a discontiguous buffer. > If is is discontiguous, then issue the discontiguous buffer read > while the locks are not held. We only ever have one discontiguous > buffer per read loop, so it is safe just to check the last buffer in > the list. > > The fix is loosely based on a a patch provided by Eric Sandeen, who > did all the hard work of finding the bug and demonstrating how to > fix it. Ok, this makes sense to me. The comment above the discontig read seems a bit confusing; you say it's safe to read while unlocked, but I wouldn't have expected it not to be - the lock is just for btree manipulation, and that's not being done. So I think the comment adds a little confusion rather than clarification. But the code looks fine. Reviewed-by: Eric Sandeen <sandeen@redhat.com> > Reported-by:Eric Sandeen <sandeen@redhat.com> > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > repair/prefetch.c | 53 +++++++++++++++++++++++++++-------------------------- > 1 file changed, 27 insertions(+), 26 deletions(-) > > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 65fedf5..e269f1f 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -444,27 +444,6 @@ pf_read_inode_dirs( > } > > /* > - * Discontiguous buffers require multiple IOs to fill, so we can't use any > - * linearising, hole filling algorithms on them to avoid seeks. Just remove them > - * for the prefetch queue and read them straight into the cache and release > - * them. > - */ > -static void > -pf_read_discontig( > - struct prefetch_args *args, > - struct xfs_buf *bp) > -{ > - if (!btree_delete(args->io_queue, XFS_DADDR_TO_FSB(mp, bp->b_bn))) > - do_error(_("prefetch corruption\n")); > - > - pthread_mutex_unlock(&args->lock); > - libxfs_readbufr_map(mp->m_ddev_targp, bp, 0); > - bp->b_flags |= LIBXFS_B_UNCHECKED; > - libxfs_putbuf(bp); > - pthread_mutex_lock(&args->lock); > -} > - > -/* > * pf_batch_read must be called with the lock locked. > */ > static void > @@ -496,13 +475,19 @@ pf_batch_read( > } > while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) { > /* > - * Handle discontiguous buffers outside the seek > - * optimised IO loop below. > + * Discontiguous buffers need special handling, so stop > + * gathering new buffers and process the list and this > + * discontigous buffer immediately. This avoids the > + * complexity of keeping a separate discontigous buffer > + * list and seeking back over ranges we've already done > + * optimised reads for. > */ > if ((bplist[num]->b_flags & LIBXFS_B_DISCONTIG)) { > - pf_read_discontig(args, bplist[num]); > - bplist[num] = NULL; > - } else if (which != PF_META_ONLY || > + num++; > + break; > + } > + > + if (which != PF_META_ONLY || > !B_IS_INODE(XFS_BUF_PRIORITY(bplist[num]))) > num++; > if (num == MAX_BUFS) > @@ -570,6 +555,22 @@ pf_batch_read( > * now read the data and put into the xfs_but_t's > */ > len = pread64(mp_fd, buf, (int)(last_off - first_off), first_off); > + > + /* > + * Check the last buffer on the list to see if we need to > + * process a discontiguous buffer. The gather loop guarantees > + * we only ever have a single discontig buffer on the list, > + * and that it is the last buffer, so it is safe to do this > + * check and read here like this while we aren't holding any > + * locks. > + */ > + if ((bplist[num - 1]->b_flags & LIBXFS_B_DISCONTIG)) { > + libxfs_readbufr_map(mp->m_ddev_targp, bplist[num - 1], 0); > + bplist[num - 1]->b_flags |= LIBXFS_B_UNCHECKED; > + libxfs_putbuf(bplist[num - 1]); > + num--; > + } > + > if (len > 0) { > /* > * go through the xfs_buf_t list copying from the > From wangsl.fnst@cn.fujitsu.com Thu May 8 21:47:26 2014 Return-Path: <wangsl.fnst@cn.fujitsu.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3490A7F61 for <xfs@oss.sgi.com>; Thu, 8 May 2014 21:47:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFD6C304043 for <xfs@oss.sgi.com>; Thu, 8 May 2014 19:47:25 -0700 (PDT) X-ASG-Debug-ID: 1399603643-04bdf02b8b41fc00001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id NynIibG0nDGmlBa9 for <xfs@oss.sgi.com>; Thu, 08 May 2014 19:47:23 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,1015,1389715200"; d="scan'208";a="30286610" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 09 May 2014 10:44:52 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s492lMpo026778; Fri, 9 May 2014 10:47:22 +0800 Received: from [10.167.226.104] (10.167.226.104) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server id 14.3.146.2; Fri, 9 May 2014 10:47:23 +0800 Message-ID: <536C40E7.5090502@cn.fujitsu.com> Date: Fri, 9 May 2014 10:43:51 +0800 From: Wang Shilong <wangsl.fnst@cn.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130612 Thunderbird/17.0.6 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com>, "linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> <536AFC3B.7070502@cn.fujitsu.com> <536BCDF7.7070404@fb.com>,<536C2C99.6020506@cn.fujitsu.com> <xmifb9cukl6cxjty7n8malrf.1399601580721@email.android.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <xmifb9cukl6cxjty7n8malrf.1399601580721@email.android.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.167.226.104] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1399603643 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_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5658 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On 05/09/2014 10:13 AM, Josef Bacik wrote: > The inode cache is saved in the FS tree itself for every individual FS tree, that affects the sizes reported by qgroup show so we need to explicitly turn it off to get consistent values. Thanks, Right, so we need turn off inode_cache explicitly rather than free_space option. I will fix all your addressed comments and resend the patch. Thanks, Wang > Josef > > Wang Shilong<wangsl.fnst@cn.fujitsu.com> wrote: > > > On 05/09/2014 02:33 AM, Josef Bacik wrote: >> On 05/07/2014 11:38 PM, Wang Shilong wrote: >>> On 05/08/2014 04:58 AM, Josef Bacik wrote: >>>> On 03/09/2014 11:44 PM, Wang Shilong wrote: >>>>> Test flow is to run fsstress after triggering quota rescan. >>>>> the ruler is simple, we just remove all files and directories, >>>>> sync filesystem and see if qgroup's ref and excl are nodesize. >>>>> >>>>> Signed-off-by: Wang Shilong<wangsl.fnst@cn.fujitsu.com> >>>>> --- >>>>> v1->v2: >>>>> switch into new helper _run_btrfs_util_prog() >>>>> --- >>>>> tests/btrfs/041 | 76 >>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>>> tests/btrfs/041.out | 3 +++ >>>>> tests/btrfs/group | 1 + >>>>> 3 files changed, 80 insertions(+) >>>>> create mode 100644 tests/btrfs/041 >>>>> create mode 100644 tests/btrfs/041.out >>>>> >>>>> diff --git a/tests/btrfs/041 b/tests/btrfs/041 >>>>> new file mode 100644 >>>>> index 0000000..92bd080 >>>>> --- /dev/null >>>>> +++ b/tests/btrfs/041 >>>>> @@ -0,0 +1,76 @@ >>>>> +#! /bin/bash >>>>> +# FSQA Test No. btrfs/041 >>>>> +# >>>>> +# Quota rescan stress test, we run fsstress and quota rescan >>>>> concurrently >>>>> +# >>>>> +#----------------------------------------------------------------------- >>>>> >>>>> >>>>> +# Copyright (C) 2014 Fujitsu. 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 >>>>> + >>>>> +_cleanup() >>>>> +{ >>>>> + cd / >>>>> + rm -f $tmp.* >>>>> +} >>>>> +trap "_cleanup; exit \$status" 0 1 2 3 15 >>>>> + >>>>> +# get standard environment, filters and checks >>>>> +. ./common/rc >>>>> +. ./common/filter >>>>> + >>>>> +# real QA test starts here >>>>> +_need_to_be_root >>>>> +_supported_fs btrfs >>>>> +_supported_os Linux >>>>> +_require_scratch >>>>> + >>>>> +rm -f $seqres.full >>>>> + >>>>> +run_check _scratch_mkfs "-b 1g --nodesize 4096" >>>>> +run_check _scratch_mount >>>>> + >>>> Add "-o nospace_cache" here please, otherwise I don't get the same >>>> output. >>> I am little confused why we need specify this mount option explicitly? >>> As far as i know, space cache is not included into qgroup accounting >>> space. >>> >> It is. Thanks, > Free space cache are inserted in tree root, they can not be shared with > other trees(fs/file tree). > So normal fs/file tree's qgroup accounting is independeng of free space > cache. > > With or without the option, subvolume qgroup's value should not have any > differences. > Did i miss something here?:-) > > Thanks, > Wang >> Josef >> >> . >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message tomajordomo@vger.kernel.org > More majordomo info athttps://urldefense.proofpoint.com/v1/url?u=http://vger.kernel.org/majordomo-info.html&k=ZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r=cKCbChRKsMpTX8ybrSkonQ%3D%3D%0A&m=G4HqImi%2Fy7KWWbAvCZf%2Bl8CSV3XzU9ODKrgtdQCTPYQ%3D%0A&s=e27422f119365ab04dddfb06e08c152eec84c4de29e19b6811310607e6a15c99 > . > From sandeen@sandeen.net Thu May 8 22:01:38 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 36BA97F66 for <xfs@oss.sgi.com>; Thu, 8 May 2014 22:01:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 246B38F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:01:34 -0700 (PDT) X-ASG-Debug-ID: 1399604492-04bdf02b8c420310001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wJm8eJ5eKNTebwv4 for <xfs@oss.sgi.com>; Thu, 08 May 2014 20:01: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A237F63C5FF2; Thu, 8 May 2014 22:01:32 -0500 (CDT) Message-ID: <536C4511.3050201@sandeen.net> Date: Thu, 08 May 2014 22:01:37 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists References: <1399598222-4349-1-git-send-email-david@fromorbit.com> <1399598222-4349-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists In-Reply-To: <1399598222-4349-3-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399604492 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.5659 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/8/14, 8:17 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > When repairing a large filesystem with fragemented files, xfs_repair > can grind to a halt burning multiple CPUs in blkmap_set_ext(). > blkmap_set_ext() inserts extents into the blockmap for the inode > fork and it keeps them in order, even if the inserts are not done in > order. > > The ordered insert is highly inefficient - it starts at the first > extent, and simple walks the array to find the insertion point. i.e. > it is an O(n) operation. When we have a fragemented file with a > large number of extents, the cost of the entire mapping operation > is rather costly. > > The thing is, we are doing the insertion from an *ordered btree > scan* which is inserting the extents in ascending offset order. > IOWs, we are always inserting the extent at the end of the array > after searching the entire array. i.e. the mapping operation cost is > O(N^2). > > Fix this simply by reversing the order of the insert slot search. > Start at the end of the blockmap array when we do almost all > insertions, which brings the overhead of each insertion down to O(1) > complexity. This, in turn, results in the overall map building > operation being reduced to an O(N) operation, and so performance > degrades linearly with increasing extent counts rather than > exponentially. > > The result is that the test filesystem (27TB, 30M inodes, at ENOSPC) > takes 5m10s to *fully repair* on my test system, rather that getting > 15 (of 60) AGs into phase three and sitting there burning 3-4 CPUs > making no progress for over half an hour. Did the blkmap_grow() changes sneak in here accidentally? > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > repair/bmap.c | 36 ++++++++++++++++++++++++++++-------- > 1 file changed, 28 insertions(+), 8 deletions(-) > > diff --git a/repair/bmap.c b/repair/bmap.c > index 14161cb..1e913c5 100644 > --- a/repair/bmap.c > +++ b/repair/bmap.c > @@ -260,7 +260,15 @@ blkmap_grow( > { > pthread_key_t key = dblkmap_key; > blkmap_t *new_blkmap; > - int new_naexts = blkmap->naexts + 4; > + int new_naexts; > + > + /* reduce the number of reallocations for large files */ > + if (blkmap->naexts < 1000) > + new_naexts = blkmap->naexts + 4; > + else if (blkmap->naexts < 10000) > + new_naexts = blkmap->naexts + 100; > + else > + new_naexts = blkmap->naexts + 1000; > > if (pthread_getspecific(key) != blkmap) { > key = ablkmap_key; > @@ -308,7 +316,7 @@ blkmap_set_ext( > xfs_dfilblks_t c) > { > blkmap_t *blkmap = *blkmapp; > - xfs_extnum_t i; > + xfs_extnum_t i = 0; I wonder if rather than initializing i here... > > if (blkmap->nexts == blkmap->naexts) { > blkmap = blkmap_grow(blkmap); > @@ -318,15 +326,27 @@ blkmap_set_ext( > } > > ASSERT(blkmap->nexts < blkmap->naexts); > - for (i = 0; i < blkmap->nexts; i++) { > - if (blkmap->exts[i].startoff > o) { > - memmove(blkmap->exts + i + 1, > - blkmap->exts + i, > - sizeof(bmap_ext_t) * (blkmap->nexts - i)); > + > + if (blkmap->nexts == 0) ... setting i = 0 here would be a bit more explicit & clear? > + goto insert; > + > + /* > + * Do a reverse order search as the most common insertion during > + * a bmapbt scan is at the end of the map. Use "plus 1" indexing > + * for the loop counter so when we break out we are at the correct index > + * for insertion. > + */ perhaps say why it's most common at the end? > + for (i = blkmap->nexts; i > 0; i--) { > + if (blkmap->exts[i - 1].startoff < o) > break; > - } > } > > + /* make space for the new extent */ > + memmove(blkmap->exts + i + 1, > + blkmap->exts + i, > + sizeof(bmap_ext_t) * (blkmap->nexts - i)); > + > +insert: > blkmap->exts[i].startoff = o; > blkmap->exts[i].startblock = b; > blkmap->exts[i].blockcount = c; > From david@fromorbit.com Thu May 8 22:54:05 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6E9A17F47 for <xfs@oss.sgi.com>; Thu, 8 May 2014 22:54:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2EDA6304051 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:54:02 -0700 (PDT) X-ASG-Debug-ID: 1399607639-04bdf02b8c4219e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id f6NlMW2uX5poWqg5 for <xfs@oss.sgi.com>; Thu, 08 May 2014 20:54:00 -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: AqRBAHdQbFN5LL1sPGdsb2JhbABZgwaDPYUKo3sGmhYBgRMXAwEBAQE4NYIlAQEFOhwjEAgDFQMJJQ8FJQMHGhOIQNBzFxaFQIh8B4RABJlBlkUr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 13:23:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wibsi-0004dj-5F; Fri, 09 May 2014 13:53:56 +1000 Date: Fri, 9 May 2014 13:53:56 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers Message-ID: <20140509035356.GI26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] repair: don't unlock prefetch tree to read discontig buffers References: <1399598222-4349-1-git-send-email-david@fromorbit.com> <1399598222-4349-2-git-send-email-david@fromorbit.com> <536C3A07.2050100@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536C3A07.2050100@sandeen.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: 1399607639 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.5660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 09:14:31PM -0500, Eric Sandeen wrote: > On 5/8/14, 8:17 PM, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > The way discontiguous buffers are currently handled in prefetch is > > by unlocking the prefetch tree and reading them one at a time in > > pf_read_discontig(), inside the normal loop of searching for buffers > > to read in a more optimized fashion. > > > > But by unlocking the tree, we allow other threads to come in and > > find buffers which we've already stashed locally on our bplist[]. > > If 2 threads think they own the same set of buffers, they may both > > try to delete them from the prefetch btree, and the second one to > > arrive will not find it, resulting in: > > > > fatal error -- prefetch corruption > > > > To fix this, simply abort the buffer gathering loop when we come > > across a discontiguous buffer, process the gathered list as per > > normal, and then after running the large optimised read, check to > > see if the last buffer on the list is a discontiguous buffer. > > If is is discontiguous, then issue the discontiguous buffer read > > while the locks are not held. We only ever have one discontiguous > > buffer per read loop, so it is safe just to check the last buffer in > > the list. > > > > The fix is loosely based on a a patch provided by Eric Sandeen, who > > did all the hard work of finding the bug and demonstrating how to > > fix it. > > Ok, this makes sense to me. The comment above the discontig read > seems a bit confusing; you say it's safe to read while unlocked, > but I wouldn't have expected it not to be - the lock is just for > btree manipulation, and that's not being done. So I think the > comment adds a little confusion rather than clarification. Ok, I'll just drop the bit about it being safe to read - the bit about being the last buffer on the list is the important bit... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 8 22:57:09 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71E397F47 for <xfs@oss.sgi.com>; Thu, 8 May 2014 22:57:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F5EF304066 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:57:09 -0700 (PDT) X-ASG-Debug-ID: 1399607825-04cb6c7290409520001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1lf2qz5lJR7az9Js for <xfs@oss.sgi.com>; Thu, 08 May 2014 20:57:05 -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: AqZBAKpRbFN5LL1sPGdsb2JhbABZgwaDPYUKo3sGmhYBgRMXAwEBAQE4NYIlAQEEAScTHCMQCAMVAwklDwUlAwcaE4g5B9B1FxaFQIh8B4RABJVLg3aWRSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 13:26:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WibvZ-0004e1-2Q; Fri, 09 May 2014 13:56:53 +1000 Date: Fri, 9 May 2014 13:56:53 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists Message-ID: <20140509035653.GJ26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists References: <1399598222-4349-1-git-send-email-david@fromorbit.com> <1399598222-4349-3-git-send-email-david@fromorbit.com> <536C4511.3050201@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <536C4511.3050201@sandeen.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: 1399607825 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.5660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 10:01:37PM -0500, Eric Sandeen wrote: > On 5/8/14, 8:17 PM, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > When repairing a large filesystem with fragemented files, xfs_repair > > can grind to a halt burning multiple CPUs in blkmap_set_ext(). > > blkmap_set_ext() inserts extents into the blockmap for the inode > > fork and it keeps them in order, even if the inserts are not done in > > order. > > > > The ordered insert is highly inefficient - it starts at the first > > extent, and simple walks the array to find the insertion point. i.e. > > it is an O(n) operation. When we have a fragemented file with a > > large number of extents, the cost of the entire mapping operation > > is rather costly. > > > > The thing is, we are doing the insertion from an *ordered btree > > scan* which is inserting the extents in ascending offset order. > > IOWs, we are always inserting the extent at the end of the array > > after searching the entire array. i.e. the mapping operation cost is > > O(N^2). > > > > Fix this simply by reversing the order of the insert slot search. > > Start at the end of the blockmap array when we do almost all > > insertions, which brings the overhead of each insertion down to O(1) > > complexity. This, in turn, results in the overall map building > > operation being reduced to an O(N) operation, and so performance > > degrades linearly with increasing extent counts rather than > > exponentially. > > > > The result is that the test filesystem (27TB, 30M inodes, at ENOSPC) > > takes 5m10s to *fully repair* on my test system, rather that getting > > 15 (of 60) AGs into phase three and sitting there burning 3-4 CPUs > > making no progress for over half an hour. > > Did the blkmap_grow() changes sneak in here accidentally? Ah, forgot to mention them. Do a realloc every 4 entries when we have hundreds of thousands of extents is just silly ;) > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > --- > > repair/bmap.c | 36 ++++++++++++++++++++++++++++-------- > > 1 file changed, 28 insertions(+), 8 deletions(-) > > > > diff --git a/repair/bmap.c b/repair/bmap.c > > index 14161cb..1e913c5 100644 > > --- a/repair/bmap.c > > +++ b/repair/bmap.c > > @@ -260,7 +260,15 @@ blkmap_grow( > > { > > pthread_key_t key = dblkmap_key; > > blkmap_t *new_blkmap; > > - int new_naexts = blkmap->naexts + 4; > > + int new_naexts; > > + > > + /* reduce the number of reallocations for large files */ > > + if (blkmap->naexts < 1000) > > + new_naexts = blkmap->naexts + 4; > > + else if (blkmap->naexts < 10000) > > + new_naexts = blkmap->naexts + 100; > > + else > > + new_naexts = blkmap->naexts + 1000; > > > > if (pthread_getspecific(key) != blkmap) { > > key = ablkmap_key; > > @@ -308,7 +316,7 @@ blkmap_set_ext( > > xfs_dfilblks_t c) > > { > > blkmap_t *blkmap = *blkmapp; > > - xfs_extnum_t i; > > + xfs_extnum_t i = 0; > > I wonder if rather than initializing i here... > > > > > if (blkmap->nexts == blkmap->naexts) { > > blkmap = blkmap_grow(blkmap); > > @@ -318,15 +326,27 @@ blkmap_set_ext( > > } > > > > ASSERT(blkmap->nexts < blkmap->naexts); > > - for (i = 0; i < blkmap->nexts; i++) { > > - if (blkmap->exts[i].startoff > o) { > > - memmove(blkmap->exts + i + 1, > > - blkmap->exts + i, > > - sizeof(bmap_ext_t) * (blkmap->nexts - i)); > > + > > + if (blkmap->nexts == 0) > > ... setting i = 0 here would be a bit more explicit & clear? *nod*. Will do. > > + goto insert; > > + > > + /* > > + * Do a reverse order search as the most common insertion during > > + * a bmapbt scan is at the end of the map. Use "plus 1" indexing > > + * for the loop counter so when we break out we are at the correct index > > + * for insertion. > > + */ > > perhaps say why it's most common at the end? OK, I'll add "because we are doing an ascending offset order scan of the bmapbt" or words to that effect. Thanks! Cheers, Dave. -- Dave Chinner david@fromorbit.com From dirley.glizt@cejam.org.br Thu May 8 22:59:56 2014 Return-Path: <dirley.glizt@cejam.org.br> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=TVD_SPACE_RATIO 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 82D1D7F47 for <xfs@oss.sgi.com>; Thu, 8 May 2014 22:59:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B3268F8035 for <xfs@oss.sgi.com>; Thu, 8 May 2014 20:59:55 -0700 (PDT) X-ASG-Debug-ID: 1399607990-04cbb03cc73f3370001-NocioJ Received: from mhumtapostzb02-tvt-db.zcs8db.jetmailx.com.br (mhumtapostzb02-tvt-db.zcs8db.jetmailx.com.br [200.170.91.19]) by cuda.sgi.com with ESMTP id jvIqi4vnSlVRLvRe; Thu, 08 May 2014 20:59:51 -0700 (PDT) X-Barracuda-Envelope-From: dirley.glizt@cejam.org.br X-Barracuda-Apparent-Source-IP: 200.170.91.19 Received: from mhutrzb01-tvt-db.zcs8db.jetmailx.com.br (mhutrzb01-tvt-db.zcs8db.jetmailx.com.br [200.170.91.12]) by mhumtapostzb02-tvt-db.zcs8db.jetmailx.com.br (Postfix) with ESMTP id 25F291A0C5D; Fri, 9 May 2014 01:16:49 -0300 (BRT) Received: from mhuzb01-tvt-db.zcs8db.jetmailx.com.br (mhuzb01-tvt-db.zcs8db.jetmailx.com.br [200.170.91.10]) by mhutrzb01-tvt-db.zcs8db.jetmailx.com.br (Postfix) with ESMTP id 893DFE002E; Fri, 9 May 2014 00:59:08 -0300 (BRT) Date: Fri, 9 May 2014 00:59:40 -0300 (BRT) From: "Dirley.glizt Cejam" <dirley.glizt@cejam.org.br> Message-ID: <1147115286.2088332.1399607980415.JavaMail.zimbra@cejam.org.br> In-Reply-To: <730659199.2088237.1399607963834.JavaMail.zimbra@cejam.org.br> Subject: hello MIME-Version: 1.0 X-ASG-Orig-Subj: hello Content-Type: multipart/mixed; boundary="----=_Part_2088330_1630004527.1399607980397" X-Originating-IP: [116.203.9.166] X-Mailer: Zimbra 8.0.4_GA_5737 (ZimbraWebClient - FF28 (Win)/8.0.4_GA_5737) Thread-Topic: hello Thread-Index: v6slrhGtZB8oQteba+lDgpmOTUx3FQ== X-Barracuda-Connect: mhumtapostzb02-tvt-db.zcs8db.jetmailx.com.br[200.170.91.19] X-Barracuda-Start-Time: 1399607991 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: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_2088330_1630004527.1399607980397 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit ------=_Part_2088330_1630004527.1399607980397 Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document; name="coca cola.docx" Content-Disposition: attachment; filename="coca cola.docx" Content-Transfer-Encoding: base64 UEsDBBQABgAIAAAAIQAy31TLsQEAAHMHAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 VctOwzAQvCPxD5GvqHHLASHUlAOPIyBRPsCxN62LX7K3QP+eTUojVKWpSuklUmLtzHhndjO+/bIm +4CYtHcFG+VDloGTXmk3K9jb9HFwzbKEwilhvIOCrSCx28n52Xi6CpAyqnapYHPEcMN5knOwIuU+ gKOTykcrkF7jjAch38UM+OVweMWldwgOB1hjsMn4mQRErSB7ERGfhCUe/umj4pX36DxCygmOZXfr upq6YCIEo6VAEs4/nNoiHfiq0hKUl0tLVHkNF6KXkBJdzZq8hb6ooflkfA+VWBrMHr5I27odwc22 SLWtL1F/764otduqOEymN/BcLkDiDvxFgG5JzUG3pggmHSYqrM3KqbLpb5rrkHr61G/OT393mtx6 1A/zB49bZCu02+jfqcMtbQmR0vH/YWuh94pIuDKniPsady89OHWiedsg90kgv16iD4nT0BxtAtRz rEANaOwDRNTQRnhnBBIgUgBOsG42yH3Xb1Ye0goF3jxHR/eggdlLWdFanYrSwNF8HVv2B3qviE8o X0/W/V/gfULa/Ekf/9CMzdqsqztSx5tf5uQbAAD//wMAUEsDBBQABgAIAAAAIQAekRq38wAAAE4C AAALAAgCX3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9hyH032woi0tneSKF3IusDhJnsAXcO zKTavr2jILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99reG23iwdQWchbmoJnDUfOsGlub9Yv PJGUoTyMMaui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1jKu6vsf0VwOamabaWQ1pZ+9AtcdY Nl/WDl03Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDPJZ2RYqwKNuBpotX1RP9fi46FLAmh CYnP83x1nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD//wMAUEsDBBQABgAIAAAAIQCqdUE3 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 cahCaUT9voDGwdQOiBa4i4VpCCq4TDb/BTnU/23OWRomreHAp/ZpiASF/UhFgpA9KEsm+k4hVs/2 LkuSZYRMRJXElakVe0QOCRvqGriq93YPRRDqpppkZcDgTsaf+55l0CjUTU4535waUuy9Ngf+6c7H JjMo5dZh09Dk9i9ErNhV7XqzPN97y4roiVmb1cizApiVtoJWlvavKcI5t1pbseY0Xm7mwoEX5zWG waIhSuG+B+k/sP9R4TP7ZUJvqEO+D7UVwYcGTQzCBqL6km08kC6QdnAEjZMdtMGkSVnTZq2Ttlq+ WV9wp1vwPWFsLdlZ/H1OYxfNmcvOycWLNHZmYcfWdmyhqcGzJ1MUhsb5QcY4xnzSKn914qN74Ogt uN+fMCVNMME3JYGh9RyYPIDktxzN0o2/AAAA//8DAFBLAwQKAAAAAAAAACEAqR3K5VE4AABROAAA FgAAAHdvcmQvbWVkaWEvaW1hZ2U3LmpwZWf/2P/gABBKRklGAAEBAQBgAGAAAP/hAFpFeGlmAABJ SSoACAAAAAUAAQMFAAEAAABKAAAAAwMBAAEAAAAAAQAAEFEBAAEAAAABAwMDEVEEAAEAAADDDgAA ElEEAAEAAADDDgAAAAAAAKCGAQCPsQAA/9sAQwACAQEBAQECAQEBAgICAgIEAwICAgIFBAQDBAYF BgYGBQYGBgcJCAYHCQcGBggLCAkKCgoKCgYICwwLCgwJCgoK/9sAQwECAgICAgIFAwMFCgcGBwoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK/8AAEQgAyAD8 AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMF BQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkq NDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/E AB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMR 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 AAAAd29yZC9tZWRpYS9pbWFnZTEwLnBuZ4lQTkcNChoKAAAADUlIRFIAAAHzAAAAtQgDAAAAfKfm vAAAAAFzUkdCAK7OHOkAAAMAUExURQAAAP///8+M+/fQ+tBw/bFs+/qN/LBO+NGv+vfO0I5O9fSr zs5S+JM66I1x/fmt+fhv+n064smuuNaLrc5Pj9iHlW83yq+Q/dJKzqs40q9MsPBY7sQ95Mw7xbAx q/3Lr2wtstHP/G+O/K/Q/o3Q/M73/W6u/f7+/tKM09ZxiJExzYxJ0K34/E6P9Y4qsK0qkY74/ZKM +7JMjPyUyfpt0LOt/PRRzfdLsVR06PVNjuo4kP3s0uk8qHDQ/fxwrsw2cXBt9Y6x/Tx94kxp1GuO 0F1b5Eyw+jF2zJGO1rHy1DxewW9t04+xzehQd3D3+o/z0lRTy/xpkbMua1LN+Wrqtc/r0XNU6lf0 7TzG40yvs8HnvdNNavmNszvJyS+vraLSnak0Vk9Pr2azemlK0V09w1c2rzetzyqSrYa3krZGUDdS qySOkEuvjCqwj6zSs8pRVPiRj3HI1InMl/iyq7thcG+zjo9r0eE9xM8xjtFodI7Rqc84rrHPyE2S j6/ntY7sr0sslEbayq+M1czRz5IpcrlkgnLMs2EeonDIk0eUeP2tkYgdbZCvrPNubCV2ko5xq2j8 1kfwuFD2zUzRlS/IlWuurTThnz3owyZwrySodzjQrkfRsh2LbE1vd1St1StvcjBHkhpwcI7N0itY eTM8jf6OboccVB1rjXKszpEtSlRRdEuO0hlNd02PsDup6pSRrm6UshtWijmP6Op2U/WIVP7rsak8 6DGM0DvlrhxZXP7Ojv2scCKUds5p0NNqRsNePMprO4B8lORcXBqFWrpkNo9JsSw1dq9WNf/vjXMo lZBGjpVHL5thJWgdjP7Kef2iWbNJ0WVDaU8sd5EnjYUegtBmreWSOVcbiG4tbs9Qr1QXdHQZUoxF WLNtz3Iaa5NHb7NQa6ttr1kdUBhyVGbnmDJSSGmWlFEsSmscOhw9arOwy3AtTogzOGlmbUtOU3hD JzoxXHYqN3ZDUms5G8+KbduictKNV4RMG3JAGr6DSLKut4uNnsy1ywAAAAAAAAAAAByC/fYAADvw SURBVHhe7Z15XJRXmu+nqqiiWKvoKEujSLEmyCpQoIBsARIdkaVFE5GBCyUXbAMZkkjaLCSh245G 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 BgYGBQYGBgcJCAYHCQcGBggLCAkKCgoKCgYICwwLCgwJCgoK/9sAQwECAgICAgIFAwMFCgcGBwoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK/8AAEQgA1wHJ AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMF BQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkq NDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/E AB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMR BAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVG R0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A /Yf4T/tH33jz9rj4zfA6G41ox/DzUNDgYXzWZs0+2aVBeH7OIoFnA/efN58kmXZtm1dqjyj/AILw /tV/H79iz/glr8R/2kf2bviKPD/jLQLrQ10nVxpVpdiBbjWbK2mHlXUUsTboppF+ZCRuyMEAj1b4 S6/4l1T9rv40aDrfwIs9A0zTb7QxpPjKHTZI5fFKvpUDySSSt8s3kOTbjb90R7T0r5f/AODnhbVf +CLfxZsUmZkkvfDTFVwc/wDFQafxntXm4Oc3nMYzfu823Npb0NqkHO0YLVpH4ap/wc5/8Fx53LJ+ 24VHZU+Gnhoj8/7NzTJ/+DnH/gudE2G/bcZRgHP/AArXwz/8ra+fPg98PvC/gTQrjxj8W/h3rc1t cOqW0s2jubeGNujmQkDJA7Z4ziuh/be/Z7+H3w/m0LxD8OtTsgNQ0lZbjTrV3YuAzH7UnGBGwwvJ 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 4aWlzDMz1tbW9/f3Ojo6zGZmmZmZ6tXVxSMjc3Nz4ZKSMzMzuT8/+Obm/2ZmsRkZx1JSzMzM8Gpq 7l5etbW178/P74SE7LW1ISEhzEpKWlpaxBkZyTo6uQkJ4SMj2Ftb85SUlVhY8FRU5mpq801N7+/v 7klJ9KSk/zs799/f3t7eoYOD+b6+xBAQ////6FFRra2t7Dk5qxAQ3klJ/e/v6DIyxcXF6EJC5Tk5 e3t78nx8tSEhmZmZ0yEhUlJStTAwGRkZ94eHZmZmzxkZvlhY21JSzGZm/8zMuBAQ5l5e0nl54pyc +La2zQ4O3nh49pyc1o2N4Soq+MbG862tQkJC2zAw+tbW5K6u2Tw8vRgYKSkp2UNDulRUn3Jy8cfH 3RgYvTo62wkJqAoK/97e1Ckp7YuL73Jy2r293GNjtZiYDw8P//f33BER/+XlvyAg0HJyjIyM//// BzR+iQAAAIB0Uk5T//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////wA4BUtnAAAAAWJLR0QAiAUdSAAAAARnSUZnAQAAFD7q t1UAAAAMY21QUEpDbXAwNzEyAAAAA0gAc7wAAA65SURBVGhDzZr7W9rYuoCbVEnQqAFSInVjJFoN ioye1GMOYCbGaPQx6uP4QIV6QUTROW0HL9spUrP+9bNWAsgtiNU53esXNa5kvfnu3wdvwK9eIk0C ieHaY7z51XSAZzUPy0r/iXgyBYCsa6aAJf4D8fgcDoBIYgTlQAd+pXIxg6Ch0CSG9ziZ2C/E03Ad 0ck640j3C6WnEZTESUATTNLZPV9TelKHc1oISIEgMUhGsM6yA68pPcrLdB+lRJOlaZMDOME5uQV6 2OtJTwvkkCl1uRiCRrFYJrROdK+HR10Iz6DjBYbDNcATfEe618ITmUn3M+iQW+AMwNxMZ7pXwiNx L9ulVtE2zo2TPCVq8McTd72K7ZF6AGanuiVhnY6lBZZmGAipO2Tax5tfA080J2FyqlsibnTAIwmW NgkAf3R0WusJr4FHBYhGJWm5Tqo2BY2C2cxksU4Rz36/V8CTA0Yjncg2XWgQJZPjeQIDJtEF3Svg 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 BiJCY0l9AT7KVFCh76bn3a5RJEmsVIaFhJBI62x8BFKiS8SsXOeBAfaTf+LV/DrmkJIBM2LkpCiR NZF+tpf8OuFqS1RvD7JNKuZ7Jty/NL/h0tKSPQ8DNjpAMls26m1fCqnUXKLbIwbrw0qlaQeeltPw k0qLqGSPDvEyjeVIkuA80pUlsH8lN/fpUSUvCbF2thpH1rHwENzCko+tLJcdCTzAWoki/ZXV2qP2 pLiywpJLKSSykkspJLKSSykkspJLKSSykkspJLKSSykkspJLKSSykkspJLKSSykkspJLKSSykksp JLKSSykkspJLKSSykkspJLKSSykkspJLOFJJZSSWcKSSVdywvDmXOSnPnHJyASNP1h5tl/Tbhx1I XakkosTbOxBxgTg2k8gzMCx76l1wpIrFw8NtH6vklKT8W5aWPRXKJKUYMkIsJ6dPWptJ9BFKiSD5 LCPug95mIzd/ltj/AKwUqLqBPbSaUu53JBSeru0/9dSSqFPx22mmim2djOEctCUf9YqkkmJjHaUW +0EqHYlFvTSXFolYfHuA/WMiR1+s2j4KVEkJk7a8PderITW3AOh+YEjzgKRXaJIvthnZDKnm9uGA VgfrJhracXb+MUgqV7prqSPi1uHKkkspJLKSSykks4UkllJJZwpJLOFJJZSSWUkllJJZSSWUkllJ JZSSWUkllJJZSSWUkllJJZSSWUkllJJf/9lQSwMEFAAGAAgAAAAhACCmuXnNRAAAAHYBAB4AAAB3 b3JkL2VtYmVkZGluZ3Mvb2xlT2JqZWN0Mi5iaW7snQ1AVFXe/8+8MrwObMpLg8gYvqGAyDCAgGCu uFkQDAoV5H94YGAHMlBcwaUMix5LBYUlX6gt7UmKFN8wdNfW3NQMFUXBfM1cazc32W3NbXvZrP/3 d+4dGEz/D8NfmFw9488Z7tx7zzm/z/n+zrnn3rm37YjH+bVb7v4TuyZNZDL2/Q+OTGm1XIrPEsvf 7oxZ/v7+hx9+sCxW4AP+vJNuEQ9cRTnlYEYMLUbLHLBMBXOEOcGcYS4wV5gbTA1zh3nAfga7CzYI NhjmCfOCecN8YHfDNDBf2BCYH2wozB+mhQ2D3QMLgA2HjYCNhI2CjYYFwsbAxsKCYMGwENg4WChs PCwMpoOFw/SwCFgkLAo2ARYNi4HFwibC4mDxsEmwe2GTYT+HTYElwKbCfgG7DzYNdj/sAVgiLAn2 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 SUYAAQEAAAEAAQAA//4AO0NSRUFUT1I6IGdkLWpwZWcgdjEuMCAodXNpbmcgSUpHIEpQRUcgdjYy KSwgcXVhbGl0eSA9IDkwCv/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0O EhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/AABEIASwBLAMBIgACEQED EQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0B AgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpD REVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFR B2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVW V1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC w8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APC6DRRX4kf6 dhRiiigAxRiiigApaTNGaQBRRmjNAC0lGaKADIoyKWkpgGaMilopAJkUZopaAEyKMilpKYBmjIpa KQCdaMUtJmgAoxRmlpgJiijNGaADFGKWkzQAUYozS0AJiijNGaADFGKWkzQAUuKTNL+NIBKKWkNM QUUUUDCiiigQfnR+dH+etFAw/Oj86P8APWj/AD1oAPzoFFH+etABxR+dFH+etIQcUcUUUDD86OKP 89aKADij86KP89aBBxRxRRQMKO1H+etFMQUd6KKADtRRRQAd6O1FFABR3oooAO1FFFAB3o7UUUAF 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 nv8A48/bh+KPjUSQ22qQeGrN8jytHi8t8f8AXVizg+6kV4TqeqXmtXst5qF5Pf3kpzJcXMpkkc+7 Ekmq1FeHWxFbEO9WTfqfqeXZPl2UQ5MBQjTX91JN+r3fzE/H9aPx/WlornPYE/z1o/H9aWigBKP8 9aKKBBRRRQAf560UUUAFH+etFFABRRRQAf560UUUAFH+etFFABR/nrRRQAUGig0DCj8aKKAD8aBR QKBC0d6KO9AxO1LSdqWgA70gpe9J/nrQAtFJ+P60fj+tAhaKT/PWj8f1oGLRSfj+tH+etAC0Un4/ rR+P60CFopP89aPx/WgYUUUf560CCiiigAoo/wA9aKACiij/AD1oAKKKKACij/PWigAooo/z1oAK P89KKP8APWgApTSUGgYUc0UfjQAUUfjQKBC0UUd6BidqWk7UtABSCl70goAWiiigQUUUUDCiiigA ooooEFFFFAxKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR/npQAUGjNKaBiUUUmaAFoFJm lBoELR3oooGJ2paTtS0AHek/z1paO1ACfj+tH4/rS0UCE/z1o/H9aWigYn4/rR/nrS0UAJ+P60fj +tLRQIT/AD1o/H9aWigYlH+etLSUCCiijFAB/nrRRRQAUf560YooAKKKMUAH+etFFFABR/nrRiig Ao/z1opQKAP/2VBLAwQKAAAAAAAAACEAV6/wHsAtAADALQAAFgAAAHdvcmQvbWVkaWEvaW1hZ2Uz LmpwZWf/2P/gABBKRklGAAEBAQBgAGAAAP/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQQEAwQG BQYGBgUGBgYHCQgGBwkHBgYICwgJCgoKCgoGCAsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoHBgcK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIAJ4A swMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQD BQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/ xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RF RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/ APzvvNX8KeM/DX9j3Vt5GoRj5JgOP88VwuqaYtufJhY7wcfLwPwrvda8I20E5fTIhtfkEdjWLqfh /wCywmWX7wGee3sK+LoVoQdk9D6SOBUaN49e/Q45Le6SVhtxk8gHOPxrJ1TRpvO85QSc8n/Cuxg0 2a5by0jIBOTxUs+hLFA7SpgjkZ613LEqlK5y/U/bLlT2PN72O4s5hsB3dM9j7flUjW0kwFy2QCMl cYGa6DUdMiMg4zgnJ7VUv7Qi18pR93qMDn2rujU9pY86dFwbTMqRbqKMyWt06KRj5TjNU3+bKMzM F5OT05/kTV+fzrW0KvGN+MjPb2qhaQXM0jSScHPB659K1s3qc60RsaZdWpsSnm4PJ4PT1q9YaFrO rhxotldSPgbjGp2r7k9B+NbPw3+FL3ijxB4t86GzUB4bZEO6c+pA5C+w5PQYHNfZf7LP7E2v+M1t PEfjPTJLewuEDaboiRmBinGHkA5APHBJOPeuLE1aOFjzTf8AwT2cvwOIx9oqOh80/AP4OfFpdWW9 0iAXUj4B2ozKnr3GRnjivcLL9jP4seKb2XUtTnWOdiC8BTJjBxg4x0z3/Wv0s+DH7G2g6PocFmNB s4UVV2wxxKFUehI569+tdjqn7MOl2qxXVuiwLC3yqOTj+6O+MV48sdUqS54RS/M+kjk2Gow9nJ3P yr8R/sT/ABR8M6Qq3TR3cLnlCSp54AXtye5rhvEnwg8Q+FAsc/ht4GCAxtKOHHt6/Qfyr9c/HXwd 8P6xZCIssbIpXY4+UnocHuenNeNeJ/2dotbMmjahocclodyTIWyrA+ncHIxntzWazKtHSaTRdXh7 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 OQ8M8ayoc9+GFfyx/EeOK1trW4twF/szTbiZVKZEijy1KHnjOc59R054/Zv/AIN1f2pfGnxw/Y71 T4O+PJZbs/DfUYINDv5X3N9gn3lLY57ROjhT/ccLxsFc9Wcfbypu10l062R2Ri1GM+9/uufZ/wAa LCeTwPrkdgMXFtCl9b46lowHA/OMj8a/l+/bH8DxfDP9pzx/4HjQJFYeLb1bZcceS0zSRH6bHUiv 6p/GFpFJqLW7jMc1gRIpHUA4x+TGv5uP+CzHgu18J/tva3JauuL/AEuzmkCr1dFa3JPrnyAfxqcZ DmwifZmWHlbFyXdf5HynBI1s4KNnaM9efqR/nrVu4vA0ISAEM/DFBkD39uDj61nyFTslCDkjg/Sn RMd68nJ6815EdD0XuXQHeFWiUfJjbjnPXp7U+0aE5YjHQNgfrj1pLchoPMYnA9Cc/wA6bFvikxkH a+Dx1FVpcRZLsjqmMkKOcZx+PWotRmie1d1fAVlYHGeQeuPzpx+e5BC445+c81BqUcf2WUFeqHJx z2oew92WzcM53LNsBHC7+lFV96sAwyMqOPwooshH/9lQSwMECgAAAAAAAAAhAB5z56LhmAEA4ZgB ABYAAAB3b3JkL21lZGlhL2ltYWdlNS5qcGVn/9j/4AAQSkZJRgABAQEAeAB4AAD/4QA2RXhpZgAA SUkqAAgAAAACAAEDBQABAAAAJgAAAAMDAQABAAAAALEAAAAAAACghgEAj7EAAP/bAEMAAgEBAQEB AgEBAQICAgICBAMCAgICBQQEAwQGBQYGBgUGBgYHCQgGBwkHBgYICwgJCgoKCgoGCAsMCwoMCQoK Cv/bAEMBAgICAgICBQMDBQoHBgcKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCv/AABEIAeQB9AMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQID BAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHB FVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2 d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna 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 W4TaT/sbfloED/vGXZu/h+7S/JHt2I33/wDepHZ22791Hmu3zlM7f9mgA2/7CqP/AB6hWkZvJ3qP +A0NIm75EUfw0bp5G/dn7v8ACtJuwCgIMP52PkpnmIv+8tSrDO277uP92j7I7MW7/eouiuVkUlxI pEe9VoMm3bKEb/d/harEdjM23e9C2abfvstLmQKEr3IW2DPf5Pu7KTzHVm+6zVbFmmNiJ916lWxG 1dkO2k5Kw1TlfUoJJ829IN38XzURw3LLsQ1pC3x8+z5f7y0v2X5ldHYs1TzWK9kzOFjNj7maK01t yRlkbNFHOyvZI5uHT9Qlb5LORv8Aa21bt/C2tzMvl2OP951WuojvreNW+bP+7RuvFj84PGm5vut/ 8VVe1d9jCOHlI5i88O6lYusdz5e6T5vlpkOj+YP3k1dLrNrJJcW3nzb/AN0zM397/dqL7HD9+Tov 3l+7UyqSsehQwtFwTktTHt9DWRvkSRmX+FUq7p2hwR30Ims/laVfvLV86bI3+jQbUHyq+3726po4 Zo9WtUfd/rV+Vn+783y1i5ztudsMNQWiibo+wWt19mhs41+f52VVXy6sHU7IR+XbbpX37U2/d3f7 1VLfSLm6V3dG85WZmjZdq7t277zfw7dtT2vh28aOLemPkbf5kqtt/u/drGTm9zljh8PF3bJZri/t 3TGpRo8ituVotqx/7W6qiWNzP4ons4RudmjVWb/drQtfCMyTLM94u1UXcqru3N/F8zVXikmsfE80 6P5rxsu5m/i+WuOvJqkz6XhqFOeaQ5Hd2ZNfaWsOHsUmlRfvSf3v9r/ZrOu9FtNTQpeWfmD1b+H/ AIFXQaXqcUbhLmf5I/miWT5furtVdy/7P+zVmW11K6t4ks59pZVd/wCHdJJ/nb/wGvNjVlTd0z9N nh6dSPJWimn31RwI+Ez6xqCWegXSrJMf3cdyeP8Avquc8TeDPE3hC4Fvr2jzWxz8jsPkb/davavD lmi+NNPCWmzzJWbzN/yyfK3zf7NdvZzaT4mjmtJrDzLZl+TzlVlmX7v3W/4F/vV2U82q0mlNcy+5 nw+e8JYSVRSw0eXS+mq+7dHyRt3N8/8AvURDazCMba+iPF/7NfhDxCHuPD7yaTOfm/d/NB/3z/D/ AMBryjxz8FvHPgIm51KwSW1Em1by1fen/Av4lr2MNmOGxDtGVn2eh8Hi8jx+Fd3Dmj3WqOMfr+FO 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 rdhJqWpSNseZv+A1C91eS/8ALzI3+89Xl0PU5Pnhs5n/AO2TVIvhvWGbe9my/wC9S9pGO5UKNeo/ dTZlOsr/AMf/AI9SeRtbea2k8I6rIu/yYwv+/VuH4f6q5D/+gxM1R9ZoR3aOyllGZVnaFKTfoc2s WT15/wByh4dzYr0Lwr8CfHPjTWIPD3hXwxqmqX91u+z2djZNJLJ8u5tq/wC781el6H/wTa/ao1ZV eP4G69EG/ivpYYNv/fUm6nHFUZ35Wn6Dr5VjsI1GtBwb1XMrad9T5zeFM/e/8dor6vt/+CVX7Urx Bm+G2mof7sviaz3UVp7SXY4/qz7o+cbdXi/4/wDXlZf9nbuqwmr6Db/8vMbN/u7mrmVj5/1eKtw2 c24Q713bN21mrNySPQWEg3dyNe6h/wCEokT+ytqiH/WsybfvVPB4LuZG2Tarx/dVWao/CkqWS3bz Sbtu1vlrUj1uGCN/Njy38Kxp92snJW1Jl7anNxp7KxHb+B9NVf311Mx/j2/LVqTwro9jYyXMNk3m RxM6Mz/dZadFqD3Vz5b3LW0SttdY3+Zmp9nIbrTruaa8mkaO3b5WTbtXa33v7zVjOXQ0pyxDd5SZ zL6hqV1/rtQuHDf9NWqPDzMqHlm+X5q0oLW1gtVhd1X5F81Vf5mZl3bf/QauR2dnAzvCi741X5lX 7sjfd/8AZv8Ax2sZystT6XD+yWltShDo9+3zfZs7n27dy/L/AMBr1T4HpND4fSFLfcu+RXbf935m rgI9Kit7aaS5kV9vyys0qq3y/wAP/fVdx8LYbwfD+8hsNyuqSKnl/wAXzfM1cWJmvYyO1pTrU4rb mS/A721k0TXvNttkN2qttdZE3L/u/wDjv8NZuq/B3w3fZew8ywl/6Zvuj/75b/4qqa3GsaJI02lT b4dn+iw2+112q3yrt+9t2/Nt+8zVt6ZrOt6pdfYv7Vt7Y27qkrLB96Tb825W/hVvl+X7zbq8KTmn eL0PrqOHxdD3qM/d9X+XqcvbfDS68OatHea/NbzaSrbbuZXZdsbfL8y/e+9tre0XQ/EHhhmk8GXM es6XI+77L9oVXj/3Wqz4l1G91rwBqU1zpflpHFHsuIvuTfMvzL/s151Z3Gq6TIl7YzTQFvuSKzLu /wDiqlTclc+iwWGxOZUZe0krrSzV09N9Nb+Z7JZ60k0O+bRNStm/jVrXd/6Du3Vz3xAks/GeiSab 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 mZmrHsviBc3Wlp4813weuu6rfaR/aUEN5Ksttb2cjLDBH5ar8qq00ayKvzN++kb5tq19BR6Do8d0 t5Do9mkyrtWaOzjWTb/d3bd1Siz+zoqWyLGq/cWNNv8A46tfWRw1R68x/N8uI8vg7rDJPrZ2b1u9 ex4P8Nbe2vPhv4qRPCsdubjw/dW9lqTaXNE91ttZGk3eZtWOP95H5caqq/Nt/wCWdfM+k/E74XeB vDfhPREsNL1XSIdE012jbUI22yTRtJqyzwbWmW4km8mPdt/1Nuq7trNu/QTxbCkmh3lnqV/HAbyy mgia8uFj3NJGyr97/aavyw+JfwD+Lvwduf7K+IfgbULAJ8i3nkNLbSbf4llj3K3/AKFXi5xGrRjB wXNa932vY/YfC2rl2d1MRHFS9ipOLir2vZWbT0u0e22/7S/wt8K2dvo9qdI1x0tozd6pJfXcDTzl B5jFfsPXdnp8q/dX5VWivmDMI4+0x/8Af2ivF+u1/wCVfcfsf+peTf8AQRL/AMCR8zw6resvybQi p8u2L/vmnyXVtDbmH7Lwz/M0zfN8takOl6axZJIFw3zffb71XLfTrAfOLOH/AL5r9DldH8Bwr0Yt WiZGseRIti8KLmOCRkhX7vmKv3f++qrwz2215kOTGjN8zqrSf3fvf8Cqfx0qRR2f7tV2tJ92sKNU 3bNlYSspH0eWU3VoKTZsvJpczIl3MrpGsa7mdm3bvvNUkt1ZzaravaSLKy3EbOyxbdzbl+Xd/s1k Kxb/AL63fLVuwzHeRzRwyMkMqu/lpu+61crlrqe2sPyRupa2PQ7XwvK3mJN5bM0shSbczfL5nmL8 v97dV3S/BaR+Tuuo0eFmZvJtdvmbl/2m+VvlX5qu6Ffabq8IudNuFmRv7tbFvFubYE5aom02fI1c XjKU+V6GVZ/D/TVaOZ7y4dY0jXy1ZVWRlX+L5axNTZ9H+IEstpM2+1it3iZn3NuWuxvNc0rS4SJr ppZP4Le3iZ5P++VrB8HafYfET4mTWN4LixW4s9sX2hNrrIq/K23+L5v4a4cTKKpSZ9vwNWxE84hU rXcIp7/5FvRfEi2U7S3MM2zZ+6WOVWWNtrKvyyfw/My7a0re68O65DbWl/drEVgVZW+ZG8yST963 93+9J/8As1keJfB2teD9UOm63Z7N3+qmX5o5F/vK1VYlwa+dnO5/ReGweGxkVUpPR7NHf6HGmm/E zQXS4Z4Y5WlaGGVZIoV8ttqx7f8AZWuz0vxdqXh2dtY1iwWU3VqstxNcXDRruZVk8uPd8vyrIsa7 f7sjNXnHwWhJ+J2h7o+Ptn/srV9DzeAdEvNPSyT7RBHGytEsN0zKq/3drblZf9nbXNOWh8zxHLDY LFQpV48ycdX5XMjT/FevaxNu0bR7WNIYt1011P8AxeX5m1WX7qqu35mX73/Aq4L9qT4kaJp3witN av7S4hMmsqtra3C7ZLhljb5l/vL8y16DrXwlvLxZ59K1KHfNLNL5MytFuaRlbazL/d/eL937rf3v mr4j/ak8ea94q+KVzoOpX8jw+H2ksLaHz96xsrfvNrf73/oNehk2BWPxln8K1f8Al8z4XP8AOcJk WBWKwbXtLpRT3Wmrae9iCH9pT4u2Nwz+HfGN5p0Kn5Le3kYqv/fVXNN/a4/aE0aCK2sPijfKkf3V kRX/APQlrz23tZJlHl7lX+KobiF412FP9yvvY5bguXldNfcj8axGf5via7rVKz5m7t3f/DH0z8Jf 2vvGfinxVNYX8Vi91rjqlzp0kStZ3cm1V/1bf6tm2/wt81dV4wOlWOpf6d8MrjQp9/721+0zKn+1 tWRdy/8AfVfG4eSNgQ+Du/h+9X6G/sR/HvQ/ix8D4NI+I+o2k1/oFwunXTakVf7VHt3RSbW3bvlX azf9M/8Aar5HiHKaeEh9YoL3bpNdr9V5XP3Hw68TMQ5LB4qnzSitGm02l0aWjdupy/wa8OeG/GXx W0aCw0Oa1TT7ea8v1muvPWZo/wDV7fl+X5ivy1Y+MN6njz9oG28J3dz/AKJaX9vpu/8Ah+Zl81v+ +mb/AL5r1ltP+HXgX9oXRLbRNN0/TY9e8OXEHmWv7uKS4aZWj/2V3bdvy/3q8p+PPwh8faL8T9T1 jTfDmoXNnqV+1xZ3FnbSSf6xt21tq/KytXyyalZ+R+sYTGUsyzxVKl4KVN8vM9pN2dm+qOz/AGkr HT/DXi2x8Ya1PatDp1gsXh/w8r/O9xubc0i/wwr+7Zv721V/vVZ8RaHo3i39mbw3Db/ETTLG1Wf7 XrdzqFxukmm/eNL+7X5pJPMk3bf4vlrye4+G/ja4m/tX4i6xDo/mL802v3jfaZFX+7D80zf981te E0/Zj0K6WPxbc+KteKt87WdnHawf98tJ5jf+O1Dm1Gx61LJfZYSklUlKdOXNeKTT6tevmej6T4w+ B8H7OB8Nza9JY291eMlzp1rKrahdbZl/1n93zFVWZvuqvyrVD9oj4u/D+4ltNA+F1x9qez0xtPjv 4ty29jat96O2Vv8AlpIu1Wk/urtX5mZq6HW0/Ym0jwdY6vL4fgnh1JWa1h06S4N4u35W8xfM/d7W /vf8B3V478QNG+F2f7X+GXii7mtmf97petW3lXVv/uyLujmX/vll/u1jKTPQyPLsNi8a60oVE7t+ 8rJtpKzt26HuPi3ToPhr+xjpHhyG6W3fxB9jivJ/4V+1M1xM3/ftVWue8UeNdH+K3ifTI/DGhSJ4 O+HlvH9jik3btSm3LHBHt/haeRVVV+95bSM33a0dD+PfwO8c/Aqx+HPxottWjudOihRG02DdJI0K 7YpI5Puq3l/KytXn1/8AF6wtfEuhr4M8Jrpfh3w9q0N9ZaO0++W6lR1ZprmXH7yZlXb/AHVX5V/i 3ZyqHoZVkuMdWt7Sm+dSk03orOyVu700PY/izceL/hnL4S+AXw81aODWrp5Ne8V60yqI2mZmaWaX +Hyf9ezbv+WaxrV/SfFsOk/s0eKvin4J8MWunvqUv9h+FV0+yaOX7L53kxNt+b5mkmmk2r/E1ea/ tEftVj4wh9J8KeFF0OzuIVi1G6k8try8jVtywySKv+pVvm8tfvN96szwx+1l8QfCHwUT4O6Bplnb rH5yRa0pb7TDDIzMyp/Csm5m2yfeXdQpXfqclThnNK+V026aVRzTkm1qr3u2tPkeuQfBXxn8K/2f 9P8AhF4K0tj4p8c6gsGu6hFGzCyi8vdLuk/hWOP93/tM0n96qv7R1lo/wx0Hw78PP7KX/hF/DFvH /Z1jefKviLWGX92rL/FDDu86Zvu7pPL+9XmGq/tm/Gy8i8P29rqdjaR+H/JkWO1svlv5o12q1yN3 zfL/AA/d/irgfiN8UPGfxa8Sy+K/Husve3TIURcbY4Y/+eaRr8sa/wC7/wAC3U1JJmOB4QzuWOjU xbSjdydndt7L5JbHR+Ofg9oXh7wTLr9rq073cXzv53lrHJtmWGRfLVd0PzMu3czbl3f8B8yRNtwD tbHzfdro9V8eeLfEGnrpWs61LPFujeXdFGrTNGu2NpWVVaVlX7rSM1Y1nbXNxqEUMMG523Kir95m 20OUW9D7zB4bE4fDyVed23p5LodfZfDbwxHbQeGbybdqc1pDPLHGm6eSSSOO4WOP+7H5cka7tvzN 5391avr8O/Dehw3Fx4cvFWb7RJZxX15Ez+X9nh865kVW2+XJtZVVfvfK23du+XznULjxAt0lpq95 drNYr5KwzyyCS32t/q1Vvu7f7tVCZpQzyuzf3tz11Od1ofNxy7EVZcyrOz1fZ+h6L8SdJl0bwHaW s/i9byaVY43VZYZGmVVaRmZl3SKq7lVVr6R1Lwf428Ra9f6rbXN5aSQzxpYeXE3zWsa27Q+VJ93b JuuWb+LzGj/55rXyJ4X+HPjvxzIY/Bng3VNVLfe/s3TpJf8Ax5Vr7i+GXx1+E3xE0y2t9I8Y29ve LCqS6XqUq21zHIq7WXa3yt8y/eVmrNydrHwHHVHE4KhTlQSqSTd2leybW66Kxx2nfC/4lhbbVfsc 73O+4vPs98yr5M0caraW7bppP3e1pPmVvlbb/EqtVfxfrWv/AAX1aP4hfFr4iaLpWjx/uLWa81Fo mvNsbMtqsMcbNt3MzNt/2f7q10v7W3xkf4E/AbWPHOlarZ2+p/ubXSdzRyf6RI33lX+LaqyN/d+7 X5dfFP4ufEX4seIf+Eh+IHi7UNZmVdlq19cbvJX+7Gv3VX/dr18pyepmd5N8sFpfrfyPxPNuNMTl 0XB0o8zTWq2T/HbY+lfjH+2P8LbzxVrp8F399cR3eu3V0uow2KtHNDNDbx7trfNHIvlMq/K3yyMv 8VULL9s/wpr16qW8LWzrZ3i7bqdV/wBKut264jZY/lb943ytuXazL/FXyjDeXPnR2p2p5jfMzP8A +hVEsf3nR1Q+b91Zd21a+lfDOF5LczUu90Y5d4u5vhqlOE6MJU42VmmnayW9+qPtrTPj7r+n+Ymn eGtN+ZI/LkkaZ2hZYPL3L8/3mbdJ8275pGr6o/4JgeD9F8afDzxDeajDJDLpni21u7Cazl8to5Ps MkLf7ytHJIrK33lkavzW/Z2+L/hix8UJ4e+NF1rE2kvFtjl0fyfP8z+Fd0nyqrfN83zf7tfot+yx 4L8ZeL9NuvHP7CPii/8ADY0uWO38S6H461Fbu21aRgzRSJ5cO1VWPd95Vbd91q+a/s6tl+YJVVzL pbr6eh+8V+I8h4w4Nm8vk6c5NKTb0i01o9b2eyaTPsW2+Gvhhdci8Sf2bMbyOBoEm+3zKrR/3Wj3 eW3y/L8y/dpdP+Dvwzs9PTSofAekm2jso7NYbi181fs8bM0cf7zduVWZtq1y3gnVf23pAlp4v+CH gFtu1W1C18UXUUbf9s1hkb/0GvQ7XTPGP2P/AIqrxHpumO38Okpt2/8AbS53f+g19PSqYdx0VvXT 8z8drZTnWGmourzLo4tvbbbb5nnn7W/wxfUv2UfGXhrwD4LVp5NHjW1stK01dxWO6jmZVWJf+ujb f96vy41b+0bi6K6vPPNND+6YXblmXb/D83zL/u1+oHxw0LRfA+gXvxZ+GnxN1vVvHOiRLceHtIuf GDX0N9NuVfJawiZVn3KzfLGq/d/2a8S8QeOP2hfjOPtHxD/4JoaV4gvWj/5Cdxod1bS/99na3/j1 eBm2Fhi6qs2mlpZNrfrbY/dfDLM8Tw7l81VpqpGUrtzkoSTaV7KTV1a3VHw/9nTd+8X6V0Xgj4Uf Er4hztH8P/A2q6sFDNLJZ2MkkUar95pJP9Wq/wC81fRuu/sp/tZeKZ2Xwh+xl4e8LwsnytGlu7r/ ANtLu6k2t/uqrV8X/tb/ABU+Kng/xrrfwL1/xVemfQrhrDW7eDWWliWZf9Zbr5beWyr91lX/AGq8 vDZNia+IVOSdu9rfmffcVeJmS5HkM8ZGUPaLSMFJSk29k1FtL1vofc/wW/4Ks/sqfBT4A6B8PvGl 5r1xr3h6z/s+40/SdKW4jm8tm/eRy7lj2/w/M27dXX+Dv+Cyn7EniiZLXW9b8SeHnkfZ5mseH2aL /eaSBm2rX45vePHGudw3fw1Wkmubh1ea/aIb/uxvX6FhsIqNKNPmbUbK5/Aue8Q1s1zOri+VR55O TirtJt3e7P6BPBn7R3wM+J1it/8ACr4i6f4qaS389LXw3L9qnWP+80fytGv97dXEfH7UvD3xI8IX nw+/aE+E2v8AhDwRdOry+Nb7WbMJa3St/o26OFpGXc3yru+X+9X4meCvin4w+FXjKy8c+A9buNM1 LT7hZbW+tZdjblb7rbfvK392v0K/ZZ/bc1v/AIKIfECX9mD4qWENponiRWv55NJZku7VrWPzljiZ ty7WZV3bl+792scbSqxg7ap9Lfn5HrcJZhg45jTnU9xwfM5XaaS1bir2bXZkfi39grwfK0mo/C39 rL4d6nYN8yrq+sx2cq/721mX/wBBryzxZ8E/D3gaZ7fXPjl4RvpV+9B4Zu7jUZP93dHGsa/8Ckr7 30v/AIJi/sn2bedc+Fdcv/8AauteZf8A0GNa39N/YJ/ZL04jZ8ErGfb/AM/l/dS/+hTV4E8llVV1 FR+bZ+94bxmyvLvdnXqVktvcim/V3/Q/OPwrrfwT8MSrda/8MdW8UN3TUNe/s+D/AL92ytJ/5Er6 o/Z6+BXjz4n+FIvj7+yn4/k+GVpfTyWk/hFvtGo2fnW+1ZJGkfdu8zcrbWj3L93dX0TpX7Ov7J+m b59I+EXgQ/Z9u9/sdvP5e77u7du+81fH/wDwUPXW/Dn7Q1h8PfhW95YWV54e09rDQfDrSQRSXEjS K3lwQ7VaSRlX7q7mohgv7MpupKSkuy0d35ma4voeIeO/s/BRlRk05OVT3otLVpxfu38z6g0HQ/2y dJk8nxz8Uvhi8K/K95J4fullb/gPmQrurpJvFXhbSbMx+Ofjro+7Z+9+z6pZ6en/AHysjSf99NX5 aeKtC8W6Hq7aD4ktrhr3ZGzx/aPtLfMu5fmVmWrNh8NtSk8KzeOvE1/pPh7RraZoP7U8RytbxySL 8zRwr5bSSMqsu7avy7l/iarpZ1NS5Ywb9W2c+Y+D+XTo/WMXjYQjveMUl37n3/441T9gbWDNP438 Q/D+/vPKZori41Rrq5WTb+72ybmbdu2/drzfwtqn/BVuG18m78N2t3FJ/wBDFb6fuZf4d3zL/D/e r87PFP7QOi6Nqcmn+DbUam8N1sS+WJorZ9rf6xdyrI3/AAJVr1HXv+Cw37bGseIIdesPFWi6TbWr r/xKdN8PQtbTfL92TzN0jf8AfS16lClicW3KvHkXSz1fqfnec5vkPBqjhsrqLGOWsnNNqFtuV6fm fYl58N/+ChuoXDXd54O+FMMjfeR9D0rP1+7RXgXhz/gvR8VLHSIrbxP8AfDmpXqj97eWmpXNqkn/ AGz+bafxorq/s6h/M/vPA/4ihmf/AEC0v/AX/mfCdn4g0eRfkvldv7qo26tFZbmZf9As/vJ964bZ /wDZVzEPjF4l/wBD0e3jb/Zp6+Ntbldk8m3X/a2M1ejKbPzdZXWcvdjp5tGveahNpeYfF1tDcwXH +q+zp/q6zru38EyKz2d5fI3/ADzWLd/6FWj4bUeLpJk13bMLdd0Sr8q/N96uhs/Cfh6NtiaHC235 vmTdWMk5M7YV6WBlyTupdbbHDJJpqv8A6NCzL/C1w3/sq1oaPr2tx3CWEF/ItvI/lyxxxKq7W+Vv /Ha7qLS9BsYVmFhaw7f4mRV/9Cq3PJZtpc8NtNCzNZyMqxsvzLtauWSsz06edQqJQjBvzZhyeCfB 9jc+fa+MGsmV9u77VGzVp2OoeCNL/wCP7xzeX7L/AAyXDMv/AHyq151Z2M1zbvNDbbUjT5m2fLVm COa6mW2hjZ3Z9qKv8VYzbS3Pcp5Sq8P3tRv5L87Hpy/FLwNp8ZgsPtDK3/LO3s9q1e8NeA9b+LV9 P4w8NzQpGyLEsN1LskZo22t/6FXmtv4dmuSyRX9rvXa0kfm/dX+9935q+gf2SLVm8MzKi79s8y+Y v8XzLXBipJUZHoYHC0skxEcThXeV0tdVZ+WhA/8AwuPw3pn9j+KfBn9s2H928g+0qv8AuyR/Mtcj qF9o0k4WHwjDZNv+eEXM23/vlvu19M6Hqmm65cSQ6V5jiH/l4VP3cm1treW38W1vl3Vd1DQNB1GH b4g02xnRvl/0yKNv+A7mr5ucrH6Jl/Ff1Oparh7N6uzavfrbY+evB91pOqTR6VoHhKe215nVtIvr HUZP+PhfmVWWT5dtey/Dr4vaVrLDwz4wh/snW432S214nlLI395d33f93/vndUXi34a+CvAukXfx E8M+HI7bUtIi+02rRyt5TN/tR/xL81chJ+0B4d8QxpZ/ET4WWN+kf3ZIW3Mv+75nzf8AAd1c8pX0 PdrUqXFFF1KFFyUdG72aej0Tdmj1r4k+Jk8A/D/WPGzpv/s2wkuIl/vSKvy/+Pba/Oa70GHUpJdY 1vUmkubyVp7qZU3fvJG3N/481fYfxD1P4M/E74VX/gHwjqX/AAjF5dJG1vJfW8ix7lZW2sysy7Wr E/Yt/Y78PeJtZ8Xz/F7T/wC0v7EuP7OsI9zNFu8vc1wq/wAXytHt3f3q9zLM0wuUYCrXqP3rrRbt aJW+bPx/ibhXNK+aU6EqcowafvNWV93te+iPCfhF+zP4t+K3/E2tnmttNVW/0j7PuVlX+Km+OP2X 9b0GZYbO7kmVfmfcv3a9++KC+Kfhh4htvDfgPWta0S2+ys729wkc8SqsnlruVv4m2/dWpvjh4h1X 4U+H9PtvFum299q+saWs9vHDEyfe/wCei/w/7tV/rBmFavTlTatP4Y63+fQ8p8N5dRwk41INuDs5 X3fkj4s8QeFb/QdQe2m3MV+9X0N/wTd1jX9D8b+IpNE0f7ZKulwyurQMyx7ZN25mX5l/u/7VeW+L l8UeMFfUprOxjZUZ9tu27ctfR/8AwSB0e/l8XeMtX+zL9k/si1ieZv4ZPO3Kq/8AAVavfzWr7XJ5 qduayTt3ujy+GqX9ncR061ODcNWr3V1a3Q7r4ifBrxb498Maf458E6FDO1nFMt/Z2rt9pm/eM32h Y2/vfN8q/d2/KtcHc/Fz4x2li/h65+IOuRRw/JJbG+lVl9m/i/4C1fe0tnG0jO6Lnyl+auR+IXwV +HXxMB/4S3wxDPOy4TUIf3Vyv/bRfmb/AIFur899nywR/QGT+IGFpVvZY3Dpwi3yvRuN/wA9T4Pk lubq4M91M7ySffaRss3+9SxqN3H5rX0V4t/YNkWTzfAPjaPH8FprEG1v+/sf/sy1wGsfsp/Hrw/K ZZPh/NeQj/ltpUi3Ct/3w26sZNo/Zcm4r4ex8F7KrFPs9H9x56g2/dVf9pqnhXA3H8q1r34eeN9J dodV8H6raMv3vtOnSr/7LVaLTL0Ns+xS5/u7a5ZyZ9zhK+DavGaa8iNVAjyV4z61zXjP4t+E/Bav b3FxJcXK/wDLvCv/ALNXZ6ho+r6PoN54kvtDvBaWVu0s0xs5Nir7tt2/3V/4FXiPhf4d6n8VvFl1 ZpDI6K6ttVPm3SN93/0KvYynB4aup1sS7QitfP5n5t4oceYzhvD0cNlLjKvVbS68qS3ttv3Gy/tC eI9bumj023htlzhF8rf/AOPNWFB8XPHGmaw+pRatI6fxwz/Mkn/Aa+svBv7CfhXRdFS88Q6JNLJI m7yfu1ynxP8A2Qvh9pdq95Y2V9bNIrMu243Kv/Aa7sNxFwzGs6Mabs9L2T/PU/nnH1vEbEyjip46 TknzJJtJPySsvkSfs+eE/HH7TWlPcfC/wnPeT2cyxakkZUJaM33d8jFVVW2sy/7rV9IfD7/gmV4m 1HZc/Er4hWlin3ntNGt2uJV/4G21f/Qq+Jf2d/iz8V/2YPilfeGPBnje+0qDxAI7e9e1Zf8ASFVm aJm3K21lb+Jf71e43n7Sfx9u3LXfxm8Rk+q6vIv/AKDXnZthaeFxP7p3hJXj6Pp8j9k4TzvjbjTJ XGlWhSqU3yzbTcm0lr5X3Ps3wr+wP+zT4djj/tDwleavMv8Ay21jVJPm/wCAx+Wv/jtcZ+17+zH8 F/h38I7v4j+APAEOm6xYX9msDWt1MyN5k21laNpGVq+edB/a7/aT8PSLNp/xk1t9v/LO8uFnVv8A gMqtXW+I/wBtz4i/FvwI/wALPiDoml3DX19ZvFrFrE1tKvk3CyfNGu6Nt23bu+WvKTuzKrwh4gYL MaeKq4t1KcWnJKTV1100Vmuhcu/FXxo+Jiifx/8AsTWWu3f/AD/S6bcWsjf8Cb5v/Hq5rVP2c/jv 4ll/4pj9m3SfDsRb5cXSyyL/AMCubiRv++VWvq/X/iN4b0nxZLoN4+1YbqSK6umbdtm2+Z5Ma/M0 knzR7lX7rSRr97cqxzfFLQbyMWng+2a/u7h5PsvnRNFBtjVfMk8xvvL8yr8v3m/3WZduey0PmafF ucYOs3hsLZPZNyaS72vZHzHpP7IX7W9y0ccOvQ2L7sxbvErL5bfw7Vj+7W54n+Ov7HFzMYdb+BMu o30SeVdXEenQweZIvys2fMXd8ytX0P4R8aazrXj6PwkbnQZFhl3S3FrdSbpPlVmjjjbdu8vd8zbt v/oNfHem/BFNcsrzW764iF1qs9w9j5krJFawtNcLFNJt+80jQXG1fu7bdvvMyrTjJtM97JsdV4jr VP7W9zkSa5G4t3fXXXY8k/bp+Mfwq8dR+GfB/wAKPhbD4YgsXuLq92pG0lw0m1Y9zL/dVW+9/er5 3km3M0z3LDb/AK3dXq/7UHgO88FfEhNIvCxhk0u3uLW72qvmRyLuVtu5vmXdt2/3q80t9M+2agv2 n5fnVdzf71fpWRulSy2LXa/+Z/NXH9FPiqtCjdwUkot3ba0tq9x/h3wb4n8ZalF/wivhiadvN2q0 NuzLI22u/wDEn7J/xd8J+GI9Tv8AwZfW7TTqkX+ittmb+Jd33d1fo9+yL4Js/hT+xXpWg+M7Cx0q aSWbUWWbbuWGTbtaRvvbm2/d/wB2sPxz+0V8LJdNs/CD+MJ5Xa4Zkt5NLuI1bd/FuZdtfGY7jTGS xEvq0E4wbXV3t1uj18r4Qy90F9Zk+eVvK1+yPzk8SfAvx54Qhs7nxD4YuIvORdrRndtXd91tv+1X 6CfELwt8Yv2Pv2bfhD4E0nxPJ4e8Sajod83i2bwrfsn9pTLcbrZpZI/9ZJHDMsf/AH1Xn3xB1bQd W8ZaJ4c0Hw3Jr1xfavbpFpccvlLMvnL+7aT+FW3bfl+avsf9tebw74X8QfD3V9UtrPR7/S/CmvJo UNxF9ltodVWS3WNo927y9u6aSFm/5aLCzNW1LNcXnGWOpXioSTVmuzaXyP1PgLJ8FkvE9OFBOpGS d4PVSajdJrZ62d7aHxf4u8VfHXTdSOm/EDxt4qiuTEsr299rdwzbd235l8z/AGW+X73y0/Rvh344 8Y6T/wAJHqWpxWmnNceUt/ruqeVHIyttbbu3M23cu5tu1a9j0/4+/DHSNB1TUtC03T7PUrWORdDs sSM7yeY32aZpltWjkkhj+X5pF3N5jbt0jNTdS+Kv7PV54miuNR06fUbDTWtLHTVNtcPtsYrdpFkk jkZVaRbjarL91vMmZWbzN1ea6GGlq668k2z+osNiswjTUKeWcjW7UL3tbZJW6rr37Mz/ANlT4WeJ vhp+118OH8VwWNvLceIU8uGK+hlkC4Zd22JvlDfwt/tLX6K3Hxg8E2viOXQJr1RDatNFe6lNLH5S 3Ee3zIY1/wBZOysyxttXasjeX8zblX4M+FvjbwH40/bP+Hur+ALCWJI9dgWa6urCOCW8mkaRpLh9 sjbm3Mu3d/4792vtPw1+yVPp3giz0u81az/t3TrSGC31hGuHjaSH7Uq3Hk7o2jaT7XM0m2Rvmbcr fKtfS5LGCpSVKSkk9++iPyTxPpKrmlCpmCcJSpr3UnG13LVryVvM6Cf4z+B4ri3j8Hztr2oSXrQW Vjp8UirNJCqyTN5rLt8uNWVmZd33lVdzMq1/Pb+0x4e1Lw/+0f408LazbSQ3Fv4w1JZ1dmdlb7VI 235vm/i/ir99I/2O9Ps9NgsrDxgbBbXwxJptvNbWcj/Zrhpmma+i82ZmVm+Vdrbv9TCysvl1+UX/ AAUW+G3w/wDBP7e3jEeCdHvpLWzeFL+3voI41XUFjjWXytrNuh2+W25trbmb/Zr16mJeGg5yV7L8 eh+F8R5Tl+MwkaeHm3Lm1bTvbv2tY+P20uadneaFg6v8q7qo6lY3LWZS201nRvldlX/0KvqPwt4g /Z98SQ2+neIJbaHUh8qwz2Hys3+y38VN+JV7+zf4bifSLy6hW8ZNqWtrYNu/2flWvJhxHVVVU/Yy 5vJfj6HxM+FKDoyn7ZWXX9HqfJi6Zqv2eUOjCNX/AIq+rP8Agi/p72X7cnhjW7qaRLazstSluvLX czRrZzNt2/7qtXkmv6TZ65pNxb6JbSWsa7pUkXb8zL91W/u19Gf8Ee/D9z4M/as8F6l4kVrSTWLq SW1a4fy1aFrWaOP5vu/Mzf8AoNerLNVWw7v7sm0rfd+iNsk4VjPMo8zvBQnK+12ldL5tbH6F23xA +Jn9mWvxW1K2W2h1LS4bx76a4j8ixtbyza6jjtlkkWNlhVYrdmkX5riaSRvl2qsFx8QvH/iC1sIf Hj+dZXml3niDUdP0+eHy5rGFvLjt4mhVvP8AmWSZlVmZt0KttXdXv2neH9H0W2NtpmiWtkv8UNvZ xxfe+8u1Vqx5bxjgMP4vlrVUedX5mKvxDg6cuX6rHTRPZpW0W29z5yn1DVvEHjTR9Aj+DdvGlqkM EUMmjTSwKsnl3E1xNLHGqybY5FVV3bVaOZtvzLXAftga34L8N/H6+8Xarcx2eozfDfS4tHj1CdbO VrWS+ZdQWKRl2wXX2PzI1+6y+dJt+bbX2WyTLC8zu2xfmdm+VF/2m/u18Uf8FHvgP8Rfi14u074s /CXRI/EmkafoK6dqTaHex3U9vNHNJJ80cbMzLtZfu7q5cfh5U8NLl956O2h9dwBmeFzLiWlGulRp 2acr6Nu2jem+x5/o/wC038OdK8Mal4h0w6RY61a20kek6VAkyJJcedN5EyvDa+Xuhh8iH5tqqsbK vyzM1fJP/BRP4o+HvGfxC8OaD4J8UXF9oWm+ErO2sLW6SRWhkX5pGkWT/ls0jSMzfNuZt26um1HS rnR5mstZtmtJo/leG8iaB1/3lba1ePeN/CMvi39ofRNAuJDIuotbxQ7W3bvm+Za8fLq84VueqrKK b27K5+p+J+RYDA8MOrgajk5yUfiukm7fcM+DP7IPx4/aDiW/8H+GGSzV/nvppfLj+9/481en6p/w TE/ac0Gyb7HZw3z79u21VmZf96vuL9nn4sfBPwj4ft/Dc3xC0HTpIXW38mSVvlb7vzMq7V+b+83z V7JrnjDwT4d8NxeM9c8aaXb6VJFvW8WXzVb5dzMu2vksXxjxBOtzU6fLFv3U03dX7tfkfjGG4YyG lBwqvmktG7/p0Px4139jn9oDR9Tk0/U/hrfecn38pRX6Man+0z+y94vvpNZtvHDXCM7KJf7GuOcE /wCzRU/65cSf8+PwZr/qpw13f3n45w6ZMX2O6pufbuZv4qvWNpDI5T7FIUVG/eM7bqg/tZ1lTEEm 1d25fN/ib+Jflqzb628KqiWcL/Kv3mb7396v2KTsj89pqv1RreEZprBr97a2xMzxpFH975mbatat rqmpWqNFYJv8x1ZP3TSM27d83/jv/j1UPANn/ak95HMjD/VyK0b7WVlb7y12Mei2FwyXLozSxtuS TzW3Vm9Ynn4yvRpYlqpG+xlQ6pG1x9vv0knMLssXyKq7V+9/49/F/wABq54dms5rK/321ukrWsnz K3zM21mZdta9voOlx/8AMMjbdu+8m7733v8Avqqfi7xV4S8C6PLDeJHFLNFIsVvCq7mbbt3VgoTl KyVznjmGFT1i1t6K3kc9aLptrb2lhPbZX7LGyMyfK26Pczbv97av+6taMs9lZ/aEBYPbwKr/AL2N dzSNtkZdrfw/+zV5W3j7b8iab8i/wtL92r2neONKmdUuUaE/3tvy0VcFiFG/KfZYLOMqrT5fa29b pfe9D0qzPhSzhmje7tXw3zxyys32jb93b/stuZv++a9j/Zhs7+f4a6rHo77rmRbhbJlT/loy/L/u 186Ws0NxCJoZ1ZP7y19Nfsf3Ftb+C2e5vI0ia8kT5n+XczKqr/wJmrwsan7GSeh9DiaUYUYTpvnv JNef3bnQ3+i3mi2MWpWFy0MflRwQRzedbLb7VjWNWbbt3Ltm/wBnc26tCzks7O+YeM4bi8h091gR ZLjz41ZY907fN/vfe/uqqr96vS7ODc28fw/w7qJ/DHh283Pf6JbuW+/+6VWb5dv3v91ttfNVIu90 e/h86pOKjWh800meeX+zUPhN4qvBdXw8vTti6fMjeVb/ADfLGrfebb93/Z2/xV5tq/wtvbaFLbTo WuLuNtt1J5qqvmfxKq/7LfLu/iZZP7te2+OvCOieEvhfr83h61kh/wBAkfbJK0is25W3fN/d214/ pfxO8nW5r+7tLho5HZ4oVaORY5GZm+VZI/u7pJPl3bvm+9WMpNRP0rhCpVq0alTCK8U9na70WnmY yeAtYhhL6rNb2Q81ok+1XG3zGVtrfd3fKu7733a+hv2RtcufDeoarD4q0fyXuJbfzVZ927bbrH5n /AvL/wDHa8k0zxJ4G1iSwGvPGGt4oV3XEDKqtukkkZmXduXzNv8AwGRv4q6fwb4ih8J+KtU17Tpv tOjrFH9qvFlaVWkX/WMu7/e+7XnY1VK+HlBLXT8Gn+h38TudbLXOtDlcdU2rLs0n3ad7HtPijwj8 LvEXxDjGs+HlvzHE0tqqwbvLb+Gvm39vKx+y/HizsHhZEtdOhWBZN3yrXc3fxa8YeLtU1jxJ4M8T 6PaaDaqsEC6gqrJMyruZtrfw/wDj1fLvxk+JvxF8W+PJvFPibVbe/doo03Rv+7VV/u/7VdmSZdiq mMVVyS5Y2td6N/LTzPxbM8yw1LD2cW4t67O67l7V/B+j6Zaq8N55sskDRW8a/Msat/Cv/Amr68/Z b8OfAL4QeDYfBnw8+MMT+d5c1750sNtLcXW35m/ex7v93+7Xy98I/Bl345sb/wASfaWmax/dWtrD F5jzTMu7/gMar8u7+9Iu1a6JPAnieTzP7R077NFGqu89+3lRfN935m/vbW/753V6OPxNeL9hKV+r 9en3H6Fwdwblec5Y8VKfJJ6Rsk9Fa+j7n0/49+PuifAnxZHpGtPrmvW2rWS3UVxJqUMrW+2Ro2WN dq7l+Xd96rugftc/AnXsJP4on052/wCWep6fIm3/AIEu5f8Ax6vj3WNL1jSrsWWsWksLrFuSOX+7 u/h/+xqlvWvN9pKx9v8A8QuyTEUVzyfP1kmlftdWsffujfFP4Xa427TviRoc+7+FdUjX/wAdZq6S 18SeFdvnJ4q0tl/vLqUP/wAVX5vqUZvnA/4FViMDj7v/AHzUym0zOj4SYZT/AHeIkl5pP9T9Gbv4 v/Cvw8uNb+KGhwf7MmrRs3/fKs1ct4i/bb/Z/wDDwI03WNQ1uZfuLpmnMqt/20l2/wDs1fDMK7Ov rVy3jZjt6muaddo+zyrwtwFKS9rWnLy2PYP2uf2wtZ+OPwW8QfDbSPA8OnaXdQJK7y3jS3EnkyLI v3dqr8y/3Wqh/wAE1vh9ZaX4Dl+IviO2hR9//HxJtbdt/h/75+9XCaL4aXxPexeHJSwW+f7Puj2s 3zfL8u75f4q+gf2Q/h1q2l+ELz4QNeWeoXekapeWb3Fu26C427dsi/7LK1YY/MJLJJ0U9XJO3l1/ E+E8S+FsvyjPMNVw0bL2bT3d2mtW31abOn8d/G/4Z3fiCK0urnVrGKZmS3mXQ7j7Mzf7Mm3btrkP jtY+D9P8BvqWq+Lo40aLzbfyYmZpF/2V21B8YvgV4/8AFnirTtEufFusW89rP/pF9NqP7pl3fLtj Xaq7f4f/AB6qX7Ymi3lv4j8GTTXf2y2W1jguoZEZIpmX/aX+9/eryaFHAurRtJ3e/lb5dT81/wBu dOdktPh21/E+PvibY2Wr3MOtaVDN9o028jmWS4tmidoWb5m2t/DXeyRtvIfbWl4r+Ffiy3gv7q5m muoLpZDELqfe0LM3yqv+yq/L/wABqmU+co5/4FX12MxdGvRpwpSuo39dbaH614O4erTli6lRWcuW /a6T/HYrr5itV7w3vTxRpr/3byFv/HlqFoePl5qbQ4pm120jg+V/PXymb+9/D/49XlJ6n7VjIN4a d+x+gU3wP02d9RW81JWmm1C6nt777KzTw+ZdSXCq25vLZlaaT5v4l2q1Fr+zv4Sjt4bb7TMsUdhD Z+Xb28cSssdx5zMv3trSfMsi/dZa5zwp8bfj3oMaaV8Zf2ZdemuV+SXUvCqxzpM395o9zbf+AtXp Xh3xnrfiSNJrb4Xa9YBvm3a8kNr/AOOrI0n/AI7XRzPqfxhmseIMFXl+8Tje6aaaf3XM/wAC/A7w l4N8SJrejXmqedJOuzzr/cka+Zu2qqqvys33q/P3xf428QS62dMllhA0m9mgsZltl3wxrcSSLHu/ iVWZtu77u5q/RXxB4V+MfiNPs3hLx/o+gyM6rEy+HGvv++mkkX/x2Ovk/wAe/Ef9i74majcD4g/D bxF4e16CVor7VPDHk+XcTK22SRot235mVm+7u+aknZH3Ph1jatHEVauKg6t0k9NYpbOztda9Dw/T 5bb4jfGvw14h+Kc8V2n9prFK1zbxxpIzLti3Kq7fv7f4f4qm8W/Bizm/aQ07xDP4Js9L0mHxHD58 MflqjQszeXJJGvyruaNl/wCA1e+K/hH4F6t4a1DR/hNL431O+mi/0CfVLG3gSORW3K37pmkb7v8A DtrsPhL8aPG/xk8A21p8SfB1imt6BdLb3GuQ2/lz30Kx7v3y7du5W+8y/eb+FWroqYnEYbBuvCWi Ti1e1k9ml11evyM+PsDgMZnVP2dK0ZJSTt1W6a6aWPrPxD4Fh+IHhy2/s3XLi0jhi8qWSxlVWXav 8Pyt/D92vFbj9nLw3J8cYLXXtavL67a1VILO6upLlf3fzNMy7vvbf+ArXSeE/HGsWehKLbVdgki2 y/NXDaDo/ifxFq2r+JPEniO1uoo7plit/wB4jxr/AMB+8u2vjsLKtG6U+VdfO/RHzc406c0uXm7e Rr+Ovhnp/gv4pK8D2Mv2PW7fxHpEflLJ9omh+aP5tv8ADt27f9r7tfRX7efw41L9sHw/4f8AE37O es6H4qn8ILcHxBpWkazDLc2/2ry2jVV3bdy+XIu3crfL8qtXx54O0Xw5a/F3R/EnjzxNqEGgw3kc V1cSJNI0cKybpFWP7zfLuVf96vs/xnruq/tf+JbTVv2APGA8MzeHkYeKr37M2k/almb/AEVdqxt9 o2+XN95fl3f7VfbZFRU8NOjUm5KVrK9n52u+m59jwxQx2DzGjm1KmoKm3+8km6abSVpNLrey82j4 W1z4feM/B98+neKPCWqadcRviSC80+SJl/4Cy1Np3gTxdqjf8S/w9ebWH+sli8uPb/vNtWvv1/2a /wDgpPrunnSPEP7T2jRQMuOIg7r/AMCFvu/8erkr/wD4JM/F/wAY3Q1H4gftF2tzcM2S0mn3E+P9 3c612z4VqTd6cZP1aX43b/A/onLfF3Ko0+XHV6UGusOeV/lyK33s+f8A4IfC7xj4M8W6f8VPDni3 wbqOs+Hrn7fa+Fl8QLNfXskPzeQkcG7fI391W3V9vfD7/gpJ8GNWt1074p6FrvgvUV4ls9T0qaRF b/ZeNd23/eVa8sl/4JvQ/sv6XN+0TP8AFca5P4IibXItJTR/IW7ktx5ixNLuZo1bb95VZq5bV/8A grt8Q74j+z/gt4dTZ8qNdXc07f8AoK17mGp0ckoKFZ8jettZXtZXutu1j4LPsPLxKx7rZdB4uMFy uafsnG93y2kmmut7X1tc+0vCnx/+E/xDj2eBNfudY+Xj+zdFuZFH+83lqq/8CavzG/4KU/D3TI/+ CgGsrqcP2Oy8TaNY311a3CxyPC0kPkyMyqzKu7yd23dXpt9/wVu/aRnjKab4f8KWsfYfYJn2/gZ9 teLftL/tT/E/9pKGwn+Ilh4eFxptz58N5pmjxw3LfLtWNpfmZo13fKu771ceaZvgcRhnClJ8z20e 58Xj/CHinA0KmKq0oxhGLbTmnKyV9LJJsxfEXw1Tw/4edJtYW5tpr+1awt/scP8Aro1WFZNyru+W P5a5G78Ayaz8SvEekPJJaXf3P9It13Mvy+ZH8y/7K/dqDxV4m8f+ILm10rQLxoYrd45UvI/LWRZN vy/6xl+7XKXt58SPC+uTTP4h+3vebXv5priF227vvfKzfMtfLYejjW+f2iUrP16f5H5DUrYNQlSd PS+6StdEvx58O6boOtXT2usNf6hqT/aNSumgjVmmb/ZX5f8AvmvT/wBinwZ4K+J/xTtfhP4l8OqU 8X2kOkaXqL3TSz6FIqrN9qgVvl3N5LLtb5VWRtteWWOi3PxI+IWleHn1mG2Oqapb2f2y6dVit1kk VfMZv4VXdu/4DX61fG/wN8N/Dv7OOsfDT4XQ6LYrDFp+lzt4fsLdZ47eSaNWZWVflaT727+Hc3+1 X0GWYaVSnerK7jq/PYSznDZTiYzlBtWdmtLN2Sfnbe3XZnMeFv2fP2pPhPbppvhb9t62uNMhRVis /GHh9bny1/uqzTbl/wC+q7fR/EupaDGv/C0f2q/CMzr/AK2PSbCxsVb/AIFJcTN/47XhNr+wv8H7 y3E2q6b4gvJP4lutUZq2NH/YR+Akcif8WxWT7zf6Ret91f8AgVe7Tq4iHwQdvmeRmOZ8OZiubE12 293GlBN+d0738z03xZ8VP2NdRjW18efFfwXqyK/+r1jXI7xf+/fzR/8AjteQeNZvixqviiHUv+CY 7aSfDCRf8VVH4dis4rFdWZvl3R3O3941v5fzR/w10lv+yv8AAexw9h8JdLPy7v3js3/s1dBo/wAM fhv4J024TR/A1nY2y/NcLZq0aySfd3fK3zf71ayeMrwXPBpb6J3+84cJmeSZK3UwSnVlslUs4O/V pdV01PPtU8L/APBUTxVp/wBj8R/8K7tmZdv2jUotNeX/AMeWRf8Ax2vn74zfsyfE6D4n6P49+M3x I0+68SaHeQ2FmtndQyxSR3lvJIqwLHHGqrHt+bavys1fcA+H/hi3m/c6Jp7vv2/8eu7c3/Aq83/a Q+Cn/CUNpfirw7pv+l6Wm+3h02y2qrK25tyqvzKy7v8Ad215Gc4XMPqEp0YSuvO909GrHbgePJZh WWDrwpwpvXSNndNNatvqeKeFv2e/iXD8DfFnw01PSrdE8QXtrdLeR2CqsMNqzNBHGqtth2szSSN8 25flXburvdY0mWb4KN4VsdC0+4t9X02HRI77UIFnnsbOOZZI7e2mZdsCtIvzMq7m3Mv3a6XWPjBp WmfCcf2lNJF5nyyzQ/wqv97/AGW/irz688beJ4/CFtZ6l4u8WXOkW8sbqvlMqbfMZl3Kqr8vzfdr 8znneazhGPO48l7WVrdz6DD5TgZ1ZT9mpOTTfW+is3f5HN61+yV4y8RXa31s19o6pEsX2PRNYWK3 yoxvC+U+C3U/MeTRXrPhL4uzX+iR3MVsYUYnbHPA6sB7huaK4/7Zx/8AO/wOl4XD3/hr8T8OIMH9 y/3t33as29nNJIqOqqu770jeWtbH2fx5f7hNCqf7SpGrUJ4F16T55vJy3/PS43V/Rck29j8SpY2i o3nNJ+pPot4/g5hfrNZ3kN18twtvLuaPbXX6P428J3nz/wBrLCzffjuPl21zmmxv4DV31i2W4+2J tRYW+7t/vbqlXx1oMbedbeDId7fxNt/+JrG7SOevhaePnzwg5f3k0r+VvI7a317TZLd7y2kkuRGm 52t0+X/vr7teC6pdal458SXOqvGzG4lbYrfN5a/3a9H1r4qalNo89smlQorW7Ju81m2/L/DXN/Bn wtN4x1pPDemwM93eMqRLH83mf7tdGFrU6NKdWfQ8TF5ZWp4iFKUbOW2t2/U5W48NzSTPDbJvK/w/ 3qpzaXfxyH9z8v8AuV+nnh/9j/4Y+CfgzbpN4MtxrqxK15fbFbzG/wCBV87/ABG+Efg6xNxNB4ej WVnb5lirz6HE9CvNqMXa9r/qehW4ZrUqcbyV35M+ZfA/iy/8J6slzCkMqbtrQ3EXmL/vba+xfgXo eq/Gb4R3lu+qwwSySqqzQ2+1PlkVlVlWvkLxz4Z/sDWGS1RlTd8vyfMtfQHg/WvEnhddD/sPW7jT T/wi9m/k2s7RqzMzfNt/ib5fmZqjPVSlhFVj1PqOBKONx2ZRwXMlKLTi3dpNa7dmfQnhfxV8UvAO zRPiF4PvNXs4/ki1bSf37Kv+1/e/8dau60nxbpWsAzWdhqh/2W0iZW/8erwnQ/j98VdMVT/wkK3a /wAP2y1jbd/wL5W/8erqbH9qjxJaxNN4h8N6bPFGm5pI7hoNv/fW5a/P4zc5cqP2vNOEcdKLqypR utW07J+bTWn3nf8AirW9N8Q2j+ANe8N69YQ60jWUWoTWarEskn3fm3fL8396vB/Hnwr8V/De+Nt4 hsGFv/yw1CNP3Ei/3t38P+61ei6v4r/aq+OXhG60X4Pfsr30Wlalb+UmveIr9baKRW/5aRxt5fy/ 3Waufuv+CcP/AAUI+MGn2ulfEL4haXbabb/6rT7jxDJLFD/teXGu1v8AgTV9LheFcwxDTqNRi++/ 3HxeB8Vct4UjKFCPPK7Uo30bWl0/Ux/2bvhZrX7UHxisfgr8Lrm3udSuEae9u9+6DT7Vf9ZcSt/d Xd93+JmVa+q/2wf2evB/7OX7RnhL4LaPaRw6DqnwlWz8OXUku5bzUIbySS/83/ptN5kbf8BVf4Vr 1r/giz+xFdfsf3vj2b4oahouo6pq39ntYX1jE21bWNZt0f7z/pptb/vn+7XXf8FMfgjbfteappWg +D9Nm0fX9DgXUfDniK8gb7HfTbtslrIy/NBuX5vOb+792rxmR08Op4endya3637o8HOPFPMeJK9G VdKFJNvlV7a6at7tI/M/4seDde+HujX2g2fh5bq2jlZ4o5F+Zd3/AKFXgt18P9Y8XXTTWXhqTTbJ X3yrs2r/ALVfaWsW/wARbHxddfCv4qaO1v4h0lvKv7W42tu+XcsizL8skbL8yt/FWj4d/ZB8efEL S21XRNEt9H0a6uvsr+ItauI4La3kZWbcu5t0+1VZtsat93bXi4DE4zBTdCVO8r6vX72ZYynl2MhG vKpaG+rVmePfsQfDnVb6w17W7qBrfTGljsNNkaL71xGrNI391tvmKta/xA+IHwx0TxpN8NfiLqUd veQXCy+TJA0SzQtHDHEysvy/6vzP++f9qvsa3+GPgCZdE8E/B7TWs/DPhfQbWws1uIGSW6mjXdc3 Eisq7ZJpmkkbd/Cy18wftr/8E/8A45ftJfHK38W/DRND/d+H4bO6t9Sv/s0k00ckjfL8rL91lr3p ZLRx1T2lZuHNon5231OTI/EfHcNYhwoJTpvXlbatZ7p9HY8o+Kk+iXfjF7nw9rC3lq1vHtmjkZo2 b+Ly1b7q/wB1a5ryiR16f7Vbd5/wTx/4KGfCuFpofhV/a1sr/wCp0/Vre7+X/ZXcrVz2qP4w8Ear D4b+LXw81vwpqUz7Io9XsJIUmb/pnI33q8jH8P4vB3cGpRXVb280f0rwX4v8L59CGGqzdKq7Llk1 Ztu1k/XuSKjozfJVqJd7BQOlMMLq3z/8C3VNCoCjmvnJtn7lhIxlK5at4gWAzUPibxXo/g7Tv7R1 ebYG/wBUm3mQ1bsYmfCj+Jq8U+M/im61/wAWT2ss2bezZoIo0b/vqu3KMu/tLF8jdorV+h4PiJxn Lgnh54qkk6s3yxT2va7b8kd14c/aQhXxlo0A0+CG2OqwLeTTs21U8xVb/wAdav0C/Z//ALO0DXbu w8N69a6jHpv7iC8sbpZV2x/dXzF+VmVdvzV+Sm1Ebf8Aeavtv/gn6PiR4M+F1x4wudK8rw5fazJb 6XeNKq+dNGq/aVWP7zRruj3Sfd3Ntrp4s4dw9LLlVw7ty7rvquvddD+VaXiDnXFOOazGak7NRdkk u6SXQ+i/iV4kh8TfGGAeMNejtl8pZdI01beR/tl1u+X5Y1/h/wBr5f71ed/tYeJvidqVjDpviqzt 7bStLlX/AEhtO2uzMu5dzL93733Vrs9J8QeX4quNevNRjRmt/KRpvlXbXjHxg1SGTXri/ufFq38L S7rWzjWNY4/++Vr5HAUozaUo6pbvv220CrilGXxW8iC88TTa14NtoblN7x2uxppE2tItea7VTdsT /gNbDeIr+/tXs2fcrJ/7N92sz7P8rf7VdrorDycdru5/QnhLQrSyqpiJrSTSXnbdkHlP6Vb0cPDr Ns6PtdZVZGqPyxuCVd0O336tC8fzbdzfe/2aalqfrNdQlT1O/vP23f2qNSjlubfxz5MafNLJa6Nb qse77u5vL+Ws+H9qX9qfxLdpp1n8U9euLiV8Lb2JVWZv9lY466fTr34W6Lo2k+BJpLOW2vNLhlS8 uLqFbS4upIY5nmnbzF3MtxuhaORflW3X+Fm3acmr/A+G21Cx8OavYaOk15/Z3n2Mtus/2WG3aZv3 iq3mLczM0e7cy/u41bb91utx1PzF0snpTcYYBO+z5Vtfd6HA+IfHn7VsVlcX3iDxl43jhjtVnkuG 1G4jjWNtyq25W2/eVl/4C1foNoum/D3w9pehpdaBpNveahptq0Sw6RC0szNHHukbbHu27pF3M38T f3q+J/G+k/DjX/hda+B/hP4hvdY1KRlkTS9PN1Kys26SVpVWPbLIzbY1/urt/u19gaL8HdV+IUmo 3l5rF9bFrW1gsP7NiaRpIYbG3WCPd8vltHMt3uX7rNcM33ttdNDBYjEu0Iv7tD8v8QszyqlhqT51 Qs5XS0bSslotTu9Q1bw94d0ue8vtVtbeG3iV5VjlXc25tq7Vj+ZtzfKqqvzM1eI/tLfCux8D/HLU tIPg210vdpGnz3H2e3WP7ZJcW63HmSbf+Wm2ZV/vfLX2N+zh+wD4V1aGzfxt4ajuL6S8XVNZWZ9v 2dl8zyLeNV+6sfmNSf8ABUn9jrx9r2saR+0D8E9Ch1Oe00hrLxl4d+0LHPcWNqvmRX0C/wATQx7o 2VfmZfL+9trXM8kr/wBnTimnN62XZeZ+L4DifBRzeEVKThqnKWzbtayu2uu5+a/izwy+h2bzWbyL F/zzWuU8OfGbWPCtxLo+leD5plb5trWTO27/AL5r127m0rxZa+RpF+yiRP8AgS1vfDb9n7UPiP4m 0j4UeGbK8kv/ABFfx2azRrvaNWb99cN/0zhj3SM391f9qvjcFU/eKi4c0m7Jf12PucZTiqbqudor VvyOW0z9kDxX41+EHh/42eJ9S1QW/ipb688zS9JW5g0pYZFVftK7vM3TL5m3yd21lVWWvYP+Ca3i PQPg/N8WL+zt7/UILGfSbLT7W5s/s11eXMk00MMHlt/q2aRlX5vu/MzKtfoh4Z+D/g/4Zabpvw18 O6ZCmmeF7KHTtNhX5t0cK7dzf7TNuZv9pmrwbVPgj4T0PxPrOv8AhnwfYWzRanFrF/c2tssM1xPb 3DNDIzL97y2kk+9u3bm3V+l5ZgqWGrxq8ukW7u2+n+bM8s8XoU+GauQYuMnB2cWrW0mnrpe9la9z Ih/bJ0jQdMmbxJYLqV5NNGtimk+XBFcecrNBHC00m6fzGjm2yKv3VjZlXzFWrV7+0EviPVb+e98f w+FNE0y6mtJpLVFubm8khVvNkjZo2VY1ZWVVVd25dzfK0at23h74XaL4k1XTvEMnhG7sZNLs45rB rLU1gtpFX7sbQbVjZY93y7vlXdRo3wB+A+rWp0KPQfO+xQXVq1pNqMzNbw3FxHcSR/e+75kaMrfw /wALV+g4HEYGt7ql73YWGz7hvFNOmnd77N/c9NOmn5a+VeM/HXiTx/8AstfFHUfE3i1r06d4Lulu NO/sf7N9nb7NI37yRflkmZV/eLH8qtuX+7XyDF8A/h3o2m3Hw61a+tV1yC1/4mbxlXu5ryOCG7kt 4AzbokVZo4Iztbe3nO27y1Svv746fBH4d/Dr9mHx3a+BfCcFjnwfqe1bdpJGYyW2G+8zM27Yv/fN fmp8PPAP7Tvx+votQ8EDWL9bCKKI61JdfZ4bdY/lRWuW27tv+8zLXm8R18BgpQq14JpprWyVtL7v d9D9q8NKyr4TF16OKWGowab5mo62sttHbV/pfU7iH9nH4d+HdWujoN5Frl1pslvZWi3M/m291qsz TMkLIsf/ACzhjVsN8rSNHu+XcK0NU8A+MtM+GOqeIr/V9F1O8ks9Sl0YS6FHLGqx28itb2zeXG3n TNDIrN91dqttVpGrt/CH7AXiabULW38f/GfVNU1jU7iG61hdJ1KTyLS3hm+/NKzbp5lbcsf3drNu /hrvLr4YeAPhH8QtX+JesTw6R4X0WLZpazS+Zbafb+XuuZmZv4pJGk+X5mbc38TV+c4zibKlFww9 Kze1tt7fN2PH4z8SaVGFTD4XFOvNpLma0Wlmk3urt7JaH5baB4oSLQrbU102O+tLi1jli3ReYvzL WTeeOH1hmsdK8NtCf7sNns/8er6n+IX7N2iam2q/tG/s/aPHqXwz1uX7bdafHa+VfeH5mkZZN1s3 zRwsytJtXdt3N91fmrP/AGf/ANlvQvjj4xvPDngzxPY+VpqLPrd9/rV0+Nvu7lX70jfwx/8AoK15 08xw1KcnyvTX08n6XPxOnCGIp+2lNK2/qeN/sx/C3xD8QPjl4b8PPZsVW8W9uoY03eTawsrNu/3m 2r/wKv0suPGGlXHw38UfDyGzhS+0/XrN4o7PS1iXy4bq38zzJF+aST/WSfN92OvKPBEOo/8ABP8A 0PVZh8CNc8VyapcLcaz40sbiG0tvs6ttis4FbzJP3fzblk2+ZJ5nzfdr1rwDp9tqXi3xZreyRba+ 1LT3ihmi8tmWbT4ZNzL/AAttkWuZ8QYjCYmNWnG8GreT/VfM8TFTjiadSk3o7W+VtTtrTTdNvI3e 2eO4RvlWSNtysrVJNZ6VpqtPO8cTsuzd5tN+GPw1s30eXUnMyPcXUzWVw0XytCu1V/d/3WbdVXxN P8Q/DLSl9KsbizjbY95axN8q/wB5o/4a+7y7jHL8XFQqNwk9NdvvPg6mR4qNVKEuaPm7M4rUNJ8c 6ZO0dzbXX/XSFNytt+78y1W+ya7fhoZtR8sN/DeXXlrXo0Pg3wksW1Lm4eNl3bmv5NrUQ+C/Afni H+wVfc+3dvZlb+9/FX1FKlOrTUotteuh1/27Qpw9lKnquqQ7T/EGmyMsNzDcWkvTy7i1Zdzf7LL8 rVryTTeXvtrOSb/Z+6rf99V5zrmsfEKFbi9h1y4S2juJEiVXVW2q21f/AEGvJf2hv2pte+CvhK41 Wa/up9R+xNLZWck7bWbcqq0m35du5l+X+L7v96qqYlYenL2qfKjlp8NVMZVVSnUSv0u/U5343+Iv Cvwh+IF94b+35sbe6jaWNdrNp8ki7vss393au3/eVlqldeIvg/BB/wAJvc69D9oji3RWslx8n/Aa +fv2MNS8YePPib4w0H4narca3eeL/wDic3N9KjS/6Uv7uXzv+Asu3+H93/s19CeG/wBgn4aa/qD6 lqWlRna3zWv22RY93/XNW+avwvO6GGhmVTlUlBu65VdNPpvvfQ/YMveKw+DhGc/eSSd99OvzR51D 8dNKvZJrmwhnmRp2zIiMwJ780V9YeFP2QLGz0OG30X4dX/2dR+7+y6TJs/D5aK8B0qN/4Ujs+tR/ 5+x/r5n4mW93psaq73McRb+9LTodYdYzeJprPbq/ytv2s27+6tZFtoN/HHLss5t6xKiL5S/Mv8Tb t392r82k+IbhR+5aVVZvlaVVX/Zav6Ykz+eKeHw6abkiLxxHc6lb6an2NkmklbZD95vu1j/8I/cs ypYIz/7TfKrN/s10XiX/AIllnYJqSMPL86JJI28xl3R7d1ZFn4gSBnV0ZZdjeU0Nuqqvyqv3W/3V rkne59bk6qfU06aurv8AMveCfA+neJPFWk+G9ZmyurajDa7YX/haTazbv/Qa+of+CfPwN8PeDfEX j3xLaWbX19pN7JZ+HprqLY6rukVm2tu2t8u3/gNfJWoeIpVW3ewea3lhSNopFf5o2j/iX/gS7q/R b9n/AFjWdS1nwh8RtR021sbvxv8AD+HVJVtX2xXFxbyeXNJ/tbvMVm/us22vm+JK+Jw2BtF6T0t5 rX12TPcy76risw5asf3kdn5NfoeLfHbVv2k9P+IGiaJ4V+IuuXUuqeZ/amj29xM0FvM0n7uNWb/W Ky/MzbV2/MtZH7cXhvxP8OvGXh/4f3nimS2huLCGW9vIbX5rdZP9ZuVV3SbW3V9BftGeJL+3+Imm eJNEhsdKkhlV7rVriVYo49v8K7vvNXzj+3B8fNI+MvxE0q/02yVJ9NsPs91cNdbkmbczfLu/h+av NyrFVcTWockFyxT5rLftcWYYGnTw9Xnk1JyVrva/byPnV9L1XUNNvLbWPOmfymeKab7ysv3fvf7t emeCbu88ST+HtNjhV7v+wbWzRfu/vPMZf/ZlqDxVq0OsWsUFhZxiRrVd8cKfLu21lfBXXtT1C+t9 bd9k8Ls3yp/q2WTctfRZhUniMBOTilbp/XQ7OBMPDB8SUYQleTT19LHv138N7a7t4rPRBGkccu2K 4aJmluvmkXzGb+6zRyN/0zWP/artv2dfg74em+Klg/i1rfUraG6ZorVoG2SNGyr5kit/CsjLtX+J lb+7XnPhvx1eaPqT6qmnQuZGZmjjuJkVW+Zty7W3L8zbv+BVS1T9rTVvgj8TPB+oDTZLqwjsLi31 6xa63fao5Jl2zRtt+WZW+bc25WZW/vNXgcNUoYjO6UZbJ3+5X/M/WPEbFZvlfCGJlCejiknpfVpN dz9PrHRbPyU+09f738Vaei+E9RutWhtvD2vNG80qp5cybl+avF/it+33+yn8D7eGz8VfFSzv7+S3 83+zfD//ABMJ/wDdby/lj/4Ey15N/wAPzPh74Vd7/wCFv7Nl1qV8sv8Ao+peKNZ8iKNf+uFsrMzf 70lfs2KaUW4K7P4gwlPEVavv6I/T34U+Ebz4a3Mt/wCMNMV5WRdl5brvi2/w7l/h+9/FXd3ml+Ff G2jy2Gm/Zw/3rfy3X5ZP73+1/tLX4teLP+C/H7cmsSP/AMIwngvQIW+7HZ+HGnZf+BTyNXmHiL/g rd+394i1I6o/7RuqWL/e26TYWdpGv+6qw183LBYmpP2jav6n0seWNPkS0P2b/aY/Zp+Dn7RHw5a/ 8VWC6Dqmizw/2RrGj2a/2hD+8XzbNv8AnvHIqybd33flb+Fq4C+t9NutQj2WEMMNnFHa6Xpu/fHY 28a7VXc3+z97b95mZq/JD9qL/gop+0J+0T8I/AHgzxh8Y/EV9reg3WsXmt6wt19kluPtEkawRs0P l+YscMcn3v8Ans1ch4J/4KIftt+A7eFNE/aN8RNFbrtiW8aG7+X+7unjZmop5VFVXWfxMKuJxMqK oKXurVL5dD9q5rCw1aNUv7CSR4/mSSPcsi/7rLWHqmkWF3JDc29n51zby/8AH81wqyMy/wB7b96v yv0f/gs1+3bo8LJc/EXRdURkZf8AiYeF7fd/31Htrb+Df/BZb4jfDHwrpHgbxD8HNH1iw0m1W3W8 h1Sa2u5l/vSM25Wb5vvba2q0ZztFxTX6mEKMIUnPn966Vrbp7u/l2P05kt7y6XfqMyqn91a4v4+e DvB3jL4dX2l+L9Bt7/T5E8r7PeRb1Zm+7t3fdb/dr58+Ff8AwWG/Zj8eTR6b46TWvB9zI3zyapar Paq3/XWHdtX/AHlWu6/bR/a+8B/Br9lvRfi081v4hTXtemi8OR6TdRyRX0ywsy7pF+7Gu7czfe/h rycbQxFSEoqLvbTz6bo68DV+rYiNRPZo+G/iZ4Q/4Qr4g6t4XjDCOyvWS3Vv+ebfMv8A461Y8Sxl gAy4rN8K/EDxN8T7O4+IHiu9W51LUtSmnvZVXau5m+6q/wAKqvyr/s1keIviQdF1ebRtMso5JoVX dNJ91Wb+GvzuWW4mtjJUIK8k9eyP9FMs42yrJeDcJmmZVOWMoR6XbdlovPQ7iyjDJuT/AL6/hr55 8T6RqM/im/kMaorX0nzSN/tV0+teMPEOsW7pf6rJt/55x/Ku3/drnoWRpRInzbv4q+wyLJKuXuVS ck3JWsv8z+dfFzxYy7jalRwuCpOMKbb5m0m7pLYsaT4RsI1F7q1yrqrfLHH8u6v12/ZZ+E2jeOP+ CR/wo+I+laIsw0G/8RafrzWsW6SGNtUmkaTav3vL/dSMv935v4a/I2OSaS5V/OZgtfuL/wAECviE mn/8E55PhzeaPHeSSePtWuLJrhv3cNuyw7m2/eZvMWT5a7c3wUcXg3Ql9r+rn4vhczq4OrGtBaxa fquq+aPk/wCKPgnXvDukypEkd3YSRb7eaP5lkX+FlavApPB+t65dOdJ8MbArfeVG2rX7n+Lf+Cev wK1v4Y6/4n0Hw3cPrU2iXl5p1rpN00dj9q8lpI1WL5l3M38K7Vr83PCWmx69bww2fhtpr2T/AFtr Y2rPLI391Y1+b/gNfl+MwmMySSppKfNezV+nl3P0jKcywWdp1bOPLa6duv8Awx4N8L/gfrF54B+J mva9pkYs/Dvwy1DXvt00HzWd5byRtaKrfw+Y3mxsv8S7v7teR+EfFOj+MtKTVNKf5G+WWFvvW7f3 WWv0F/be0vwd+zP/AMEz/ij4MutbhPjPxRa28/iGxtYpNlnDJNDb21n5v3ZJI1kkkkVf4ppP7tfj rpOua34fvBeaPqs1tLt/1kMu3dX1WDyGWaZbGUvdqLW/T0+R7PCni3X4PzupSac8M7XinqmrK6v+ J9MeV8v3NrVp+F/Mh1ON0fYd2zcq/d3Ky/8As1eHeG/2hvFFg8cOt20N+n3Xb/VP/wB9LXrHwz+K XgnxrqVvbWepfYrn5v8ARbxNrM3+y33W/wDsq8XFZDmWClecbxXVar/gH9McPeLPB3EkPZ0a6hN7 KWl327M1PiJ8G/iX8IdabR/iD4OvdLKSfJNNHmCb/ajl/wBXIv8AwKvRv2EP2SNe/bJ+OFp8P7KS aHRbJftnijUbf5mt7NW/1a/w+ZI37uP/AIE38Ne8eE/h1/wUzsLE6PffEfw3cWzR8Q67dW92dv8A tfuW3f8AAq+5v+CaHwc8feBfhJfaj8Wb3RbvxLq2uTT3U2g2EMEC28aqsUa+XDHu2/vG+Zf4qMto RrYpKS0Wv9fM+G4z8TquVZDXjRnTlVfuxcJXtfRu1tLLXc9F8PfsvfB+x8B2HgbwZ4M03R5dJi8r SdStbWOKeFl/5ZyNt/ef7Syfe/hrEsPDWq6TayvrdnHDM1/sWSGL5pmX5dzf7W773+7Xu8dtbXDD 7RMqXSrsWaRflmX/AJ5yf+yt95aqeJvC1nNrmnQ+Syrdfc3f3m+Vv975lr7GMkmkup/G2NxmJxVX 2tablJ7t6t3er/E53wv42vPCvjS2tobZU/tK1hSVmb7rSLuX/wAe/wDQq37/AEK38RyWfxI0osuv aPcMl1JJK3+kW7bd0P8AsrXO694dZfiBbbB8trFCzbf9mt7wTqKab4tvLK5T/Rrx2idv97+KldK3 zOdKz9T8+/8AgoT+xX4p/Zf1ab42/CLwJqOt+Atd1SOL+z9Mg8280K8uG2x2ska/NJDJI22GZfl/ eKrbflr339lT4Bav+zZ4RN7qYjb4i6/AsXiHVoz5kGgwt839n2TN96Rfl86b7rSLtXdtVa+lZ/HW p3Gv6d8Mob/ZC1hcS6y2z7trHIsa/wC6zSbV/wC+v7tUPEnh9JZp9UtrNQnywaXbsm3+H5W/2Vry YZTgaeJdeEbN7/Pou1z6Gef5nUwMMLWldLbu1sm+6Ry+m2XiTy103QZmKR7le6uPm+ZvvfM3zMzV e8JfDE6lqWo+G96tcNof2N5mT5ZGk2tJJt/3v/QqhtbX4tSWccNs8cKKkf7uOw2tG275trM3zfxV 13wp0XWPDOvvY6381zcXsb7ml3Ntkj+ZfvNt27V/irvhJJKnFWRwVcNywc5TTl5Mg1rwrbW6SXiQ qLeGBbeBV/5aLGu2vHfE0OpaT4gbxDZ+Wlzbt/d+Vlb7y/7S19J+LreO7RYR0jiVfubVrxz4iaPY W7SfJvk3/d/hX/epOcqfvJ2a1XqTg61ShXjKD1R8tfG/4y+NZP2m7L4J6F8ddRurmHQ21fW9HsNN s7WCGFmjWJWwskjMyybm3N8qtHWZa6pceC2trOHybazur1UuLGO3VVjt1jmklZV/ibaq/N/eZa8R 07wrc+G/+CpmpT3N5cFvEWs60sUlw7Myxtp8O1V3fwq0a7f/ALGve9Vt01T4gaDpsyRyxWcV5eXk bfxeX5axr/38Zf8Avlq+K4izetnOO99+6louito9O+m5+kZlm1epSpwpu1PlWiSV31bSsnvo3rY9 P8L+D9Ss9LSbWLaO21XUoluNUWP/AJZ/Ltjt/wDa8tW2/wC9u/2amh+DPg/WryKbxPYNqdt9naB9 P1D5oNrMrN+6+6zfKvzN81afw/1iHxN4Xh1Nv3jrFsul/iVv8tW7NCLeSGNJG2btqsv8NfJqlrzN anjupLdMxb7wV4U+HCv4i0DwxY2dnNdK0sNnaqv76RVh+6q/MrfKrf7O6uS+BX7MHgP4HeFbrwH8 MvD39mWV9q91qk8cjbvLkuG3fK38Sxr+7hX+FVWvR9Rhm1SG0t3kx5d/vfa3+sXy2/8AZq0CyLAm n7PnVN0EzPu3L/7L/wDZVtK0otXdnZvztt9xMakuhyfjDwT4eutPh8MPpsc1tfN5EvnJu8yPb8yt /wABWqeh/Djw1bw6u9rYKz6lK0txJJ8zeZ5axq3/AAFY1X/drfuJIbzXI0dPkjgbcuz7rN/F/wCh U9ZHNuYUdd8qMyN/D97atc9oXHd2sZmhwI1vZ/abZUl8r7Pt2bdske1f+A/dpy6LYXGgzax9mX7P JdSNKrfxLu+b7tLr11/Z0FtcrDJDJ9sae4hb+Hy/mb/gNWoWmuPD6aVDuWKS3/1P8LNu/wD2qUVF qzJ3Vzgdf8DaLoN9C9nD5UN5Kyqv3V8xdrL/AOhf+O1UGk6PYKl1M/leXt/eSXG2uk+LXh19d8En RzeNAZlkiik+ZWhZo22yL/usqt/wGvnX4oftpaV8NfgVF8bX8Pafdx6hZRto0Kys0eoXTL8sa/xM u5WZm/urX6nwXnTWEqUK0n7lmt3ZP/hj5/NsmxWLrxqYbro9UtTB/ak+KEPwb099b8ba3/ZWlzNM 1rMy7vtS/NtWLb/rG2tX5l/tyfE+1+PvifR/iIj6grXifYILGSXb5aw/dkkkVtu1maRtqr95fvVu /taeOPFvxV+MWp+IfG/ie81X7RDHLZ+dL8trDMqzLDDGvyxqu7btVf8Ae3NXHeLPCV+IE8KmGZk0 +K3SXy0/1dx5bbl/4D5zf9813zzaM8SqkZPld9Htb0Pt6OWVJZdGlJJNJXaW7uup7t+wR+0mvww1 Lw/4/lt7rSyviNv7U1LRUVrm6tbez27Y422rt3SNI0f/AC0r96f2Z/Hnw3+NHwps/iX4ev8AQ9UV k2/2hp9vGqyNt3fMrLujb+8rfMtfzr+AofDeg/CCC51LTr53t/GyrBDZxbV2/YV8xVk/hZf3f/fV fQn7GP7WXxx+Gni+1tvgpqGtafLealDp2pWMiQyW2qRyTRxqrLJuX7R+82+Yq/L8rf3q8b6xRjKS 5dL32OLOMrxNZwnGeqST13sfph8Zv2lPhz4Q8ayaf8SPi+2m6jNCJ/sTau0XlRszbQF7Dg0V+T3i b4RfFv4seKNT8d/EuW+1DWb+/klu5rzTZbmRNx3LGZIZkVtqsB90dPTFFa/2hhf5V/XyPD/sOt/z 8Pju3X5Vj/8AQa0beN93CZrn9Lj8Z7hDf/YQP72xmZq2009JoSl/qcjj+OOOXyl/8dr9AlJJHwn1 dxnZtP0uzP8AHmi3+s2ML6bb+d9ndmljV/m+7XEsrwytD5eGX5drfK1dhrsP/CKyQ6h4LG2a4dlu Fj/eqy/e+7822oNT8Ua3cWrXOseD7Vtv/LaSwauWy5tep9jlWIq4TBtRs467tJr5PzPPr6+ma4cu cCNNq17p+y/8Z/iz4s+MPw78HXPjK6ey8O6fdaX4ftZH+S3tZGaaSP8A4E3/AKCv91a8Hvlkv9Rk eG1xufYkMafeb/dr6y/YE/Zt1Ww8UW3xT8aKttcRxNFpdj9113Ku6Rv+At8q/wC9UZ9WweHyubqJ N8rUVu7tW0+Tdzz8hjj8ZnUasW7XTb6WTvvsfQ/iPxVo19I3/CeJDa3FvEyxNdRLIn3fvV8efGpv Ct94mvNS/wCEhW9la6+9Jt2/8Br7k8aeHdD1bw5qNtrdrC6qrbfMX/0GvhjxR8P9Hs/El1NbWcey OVm3ba+E4Z5IOTbat0Pu8+k58sYJa7nlfi74h6xpd9BbaO/k+X8/mbPvL93bXRfsr3FnqnipdB1K RgkkTfN91vm/+yrjPidpM0evG9RMxttXdUnwrvptP8Y21zZj5WbY6/3l/wD2q/SMRhqVfLJqC1aP h8hzTE5fxRTqTm0lK3onpdeSPrrVPh34h8Mxpc3Ng01q3+qvIU3Iy/8AstfPn7Sl99q8fQ2iTbvs ulxo3+yzbmr6o+Gun/G+10y1m8Jak0ttdRK8UfnxyLt/3Wr0jxN+wf4S/ao+FthqvjS/k0fxrDYT La65p9uu35ZmbyZoI9qzLt3bdu1l2/er5bgzAutm85r7Cf4tI/X/ABd4kjDhKnQnOMueSV09WrXu 0fmcszswhRNnmP8ANt+Wuy0XR2tdPQl/N8z5v92vTP2kP+Cbf7Q/7Ofh288ea5Z6frHhy1uFRdc0 O68zcrfdkaLb5kat93/eavu3/gnx/wAER/gZ+0R8AfC3xs+Ivxy8VeTrWnLc/wBk6bokNj5f95fM m8xv9ndtWv0jEVY4VOVTRbH83YOUK/wan5myWc6t8iZX+OoLhZLceZLwP9qv3k0f/gjF/wAE6/BW yH/hTN5r00f35PEHiG6n3f8AbNWVf/Ha1P8AhgP9jDwvdQ22ifsseCYd0u2LztDWVvl/2pGauGOP oT0jf7rG1STgrn4A3VxNMsUL3kZEabYo2dfl+bd/7NUUVmkcawJNG38W1ZVr+izx9+yf+zf4X8Ev cw/s8eB0fylTavhW1/vf7tY4/Zf/AGQ9c02z0fWP2bPAMzTWvmNu8K26tt2/7K/7NVHHQkrqLMm3 ezP53ryzmDNhG+b/AGKzrjevXdX7tfFv/gl3+wH4itpJpv2ddL00yf8ALxot5cWjL/3zJt/8dr5T +NH/AAR5/Zpt99z4G+I/irQ/lZvLuJYb6Jf++lVv/Hqp4qjGnzS0RKq+9ax+Zkk3kq2x23L83ytU dxqly2nxaaZZGt1dn+z+a3l7m+8yr91W/wBpa9u/aO/Yp1v4J6Ld+INN8ew69Bbuv7mHS5op9rN9 7b8y/L/F81P+Bv8AwTn/AGkPjLZjXo/Ddr4e0eOya4fUvEU/lfuV/iWFd0jfeXb8vzbqyWNw06fO pK39dNzZKadmih8DtVhg+G01xcvtWxnmeVm/u7d1cl9oe81SW8mdt81qs8u7+Ft3/wBlXpv7Xemf D74Haq37Pvwo05hFY2sP9s6pNLvlvrhlVpWZv++VVV2qqq1eZN8utCPYu2Sy/wDZlrxMBgVDE1cR aym7q+9l/mz9S4l4zjm/DeX5ZSd1Ri+btduyXnZIbqDPHb/JJt3fNVaKN1XgL/urVjUotzfOf4t2 2oV42xp/DXrwVon55OTlU1LlvG8b/wCsX/Zr9aP+CGfiW/0n9no3NtKyy2fii6Zdv8O2RW/9m/8A Hq/Je3+Zt3mf7lfp7/wQ11bzvhD4l0Y9LfxNNs/4Fb27f+y1yYjl5o+qX3qxpU/hSs+l/wAUfrd/ wtKz+EFhD4p0/a1lfXEKWeltLtVppNzMu7+FV2s27+Fa8I8UfAv4eaH4u1TXvDO3w7/b2qXGqavZ +HbhoI7iaZtzK03+s8v5m/dqyx/7Nb1j4qTxR8RPh74JufnRbDWJbrd/dVrOHd/3zO1dj8RfDKeE NQi02/eNEklk/s7WJk3Kv/TGf+9G397+GvIqYalOtarrbZGqrV8JRjKnLl51e/le1vvPyy/4OCvG eieCfgn4A+DOgw+XLrWvXGqXC7v+XW1j8tf+A+dL/wCO1+UEXnNLyPvfdXfX2L/wXN+Ll54+/bs1 rwAjXlvYeA7CHRLfTbq4WWO1uNvnXKwsv/LNpG+Xd83y18e2IRJTO/SNd25q97D0YUaKUI2POpzq VG5Sd7sfao8kjJNHtf8AutWjBI8O3E33f4vvNWbazPcTfaXf52/h/u1Zt22tvd8mtZRUtzoo1p05 fu911Pq79kH/AIKUfHj4D32neDPFWt/8JR4S8+NH0/WJWaexh3fM1tP95dq/wybl/wB2v3v/AGN/ E2ieL/gfovinTvOSz1CKa4tZGVVkjj86RVbb937qr/31X8t9xqh07StQu1f/AFNhIq/721q/oh+H /wC3F+z9+yz8BvAvw51zWr/XvE2m+CNHW40fw75bz2cjWMLN9plZlhhb+9Gzbv7y18pm1DBZfL6x K0b3T6Loz6XAvGZrh3hqcHOpdNW1stmn0+bPrTxVdQxxobx47fzvlt75f+Pa4/uqzf8ALNqfZ681 /oNo9+7LeaTer5qt95Y9ysv+9/F81fDmof8ABZbwZb6hJbXPwB1JNNuPluoV163laRf+uTKq/wDf LfLXuP7Mf7VHwe/aB0vUH+Hut3CzWtnuvNH1KLyryzj/AIdy/wAS/eVZFZlrzcJmeCxM1GlNMWY8 PZvl9J1K1O0UtWmnb1tsfQesaSk3jvUXRd3/ABK/Ni/76rGXTftEyXlm+7zF3Ky1t/D++m1zQ9A8 VXkqzy3mlrFdSL/E3zVn+G4X0/xFc+GL3pDdN5X+yrfw13OLjKz6Hic3NFNEPw/8Gv8A8La1zxnq TrcJeWVjb2ULS/6tYfMaTcv+1JN/47Xf+MtNtrrU7aZLZUTZv2r/AA7Vrz1pnh8fSwwuwDSsvy16 FcMGhhd5Gbbb/MzVk1rpsbOcqsk5dEl8kv6uc9qVulrD5yfwp95as6ldW1j410q9upY4kuIoXaSZ tqqqxs0jbv4dqq1U9bvvK8G/bN/zyfKm6vjv/gpv8fPEmmzeF/hL4JvFYzaHM+uf6RtVdysqrI39 1Y/MZl/i3Vy4vEwwmHlVntH/AIY78uwVXMsZDD03Zy69ktWz6e8TftT/AAH/ALFh8Qw/ESzNjdTz RabMrbvtzR/6ySFf4o1/56fd3V4P8VP2yv2T727htk/aK0FGm+aLc83l/N/00aPy93+81fEdrrV5 4kbTdSTxEqJpdhI1vHqV60azLbq0i+c21lWNm3bY/wCJm+avEPih4vTxE09wlzHm8umumjh+WOGS RtzLGv8ACq7tu2vj5cT1pW5Iqz73+Z+k4bgPAvSpN38ml+Z9b/tJaTbW/wC1N8OvivoN5HNb3mpR xWd9byxyLNHNazRyNuX5W/eRrt210njfxMNO+Mmj203lo2qeHtQ/eK/zblaGRV/7683/AMdr5F/Z R8UT/wDCx4fh86b9NjuLXV7eHf8ALb3kcyxs0a/wrIv3lWvav2ytWm8E/Fj4V+MLaby0k8TXVr5m z5Zo5IV/0dm/h3N83+8tfOqtKtnEY9JJ/irnLmmW/UIKkpc3KtG+3+Z9Q/A3xJDDDc6G8ipLNteJ Wb/WbflZf++a9XhWG4t0d02/Ivmx18mfDnx/bX3iRUgmwsbboG3fNH8tfT3g3Xode0sI837xU27m +8zVVWnOhXcJdTxYNTjdF9dNvf7Ss2s5lEG+Rp1b+7t/+y/75rR1DS/M+RJvkaX91N/daqi3sMd5 DbTJsmVJG/2V+6taV1ffadNlfZ++hTdt/wCelOKp2aa1Ld73POr6z+Kmm/FCF4NNt38PyadI97eQ srS/aFmXy4/L+8qtC33l/iWta4vDb6W6zIwZYv3TSf8AXSuya6RraKZIflaJVXb/AOOrWB4kjtr6 A70bYz7ZVb+Gs60I25o9v6YRTSszn/i5LEvg837uvnLZ3D/M+1W/d/Lu/wC+v/Hq1PCoe+8N6Z5Z V3a1jWVv7rKvzN/u/LXmX7R15Donwp1vVYUY/Y0huNsLbd0a3EbfM3935fm/2a9P+DWlXtn8P/D9 tqV/JNeXFr9qvbhm+VmbdI3+7t3bV/2VrnpJSk2vT8DVq0Uc7+1BqzeFfgr418Tw7nXQ/D11cI0f 3t0dnJ/7NX5F+DvilN8RP+CfXh/wNDpqzapout3Vg140XmNa2cMa3yyRt/DuaZY/l2/LG26v2d1j QdL8beFdZ0PxLCr2etRXFvdLu+WaGRWVv/Ha/GD4P/B/Vfhr4o8Sfs2eIdTWKfw38X/7I1SGT5Xm s5oZI1kX+8rRxxt/tMy/w19bw/Plw9dJ2bUb+aTf62KhUinBNbO5RuNN8Fy68lz4h8GSan4j03S9 Hka1muNkEzfZ1k8ydl+6scfks38Lf3vmr6H+Kfw68EeG/iZr76f4YsbNZtc+0OsMG1Y47qOS4WPa 3+9Gv/Aa+cvCfxS0XxX+0BrGh6c11q1zpKR6Xpsjf6yOzt1aNfMb5dscbKqsrbvvMq/Kq19AfHjR 9V8UeMjr02sLPDqml6He2v2dGX939hj+bav8Tf8AxVd9alUowXMt0n99jrWJlUrKF7Wuv69B7+Df ADfCDQ0vLaOGC3+Jd4902xf3y/Z7FWb/AL53NXH/AAlvv7Y+NmiWHg+zXy7HxRpK3tvJtVY41azh a4Vf9plX/vqu6svB76V8BFeaZi+n/E2Z9skS7vms4/8Ax7dbf+PVyPh/WLD4W/FSLUftkdzIt/bz rD5Sr500d422Hcq7vMk+zKq/71c6fMktrpfma83utpt2bM/x/rnjvwJ8QPEPhj7TFdw2niLUIbQS wRsYIY7qWKOLP+yqCij9ozW7vVfivq942lW1pM+q6i1zZyu2+3kbULpmjb3Xdj8KKydOnfcXtJ/y /gfmJDdTbmSaeRv+Bt81WobW8mha5+zSPF97zliZl/76q/b2OmSSiOaJW8yX52+ZmZV+Zmrr/gv8 I/Gfxs+JWlfD3wBZyXmq6tcLBYQwxN5cat/y0k/6ZxqrM3+ytfqtacYxbk7I+Zw7hpaH4Gx+zH8H fid8S9du7PwF4G1DUXk2weZb27eWrfe2s33V+X5vm/hr6nvv+CcY03wpqFx8S/GEl1qtrpclxFoO ko0cTLGy7t0/8S7d3yrt+7X2P8Mf2d/hv+yT8F7PwN4bs49Rhtd0/iG+1K6XzNSuG2xzTSt91Vj+ Vlj/ALqr/tVi/CttY1f9o54Zlm1LR7WW68qxmRnkXzF3SL/tKvzbV/2a+Pq53XxEpxpPljFOz6u3 XyODF0qMsSp2u3ZeWnlsfC03wg0TwBKb/RPhdp9taaPbxvFcQ2TOy7mVdzSbWb5lbd97+7Xb+GZv G2izP/Zvh63cTfP9na6VY5lZd3mRSfd3f9M2+9/DXqXxM8F6UvxM13RNNvNQGkq/keF5ri/XyIVa ZfPWdtu1vlaTb/s/L/DXI6x8GPE/h3T5rr4dXklz4bjeb7PJqFwsSxtHI3mLDI3yyf8AAf738NeJ iXVqwU5y1fe7/N+p9HluPpU6Xs7JLpolb1scX40+OWq6bGlnrnh66S1uotq3Fq6y/wAPy7t1eSeK l0SS2Gq2z3Fz5zM0tuyeUy/7Lbv/AImvR9Y1Twrbx/bNVv4Xjmib/R7e42s0jL8vy/3tzferyrT/ AA74q8RbX0pJLl4YmRo7e1Z2jZm3fvG+6rf7LV6GXTpOK5Vbu+4Y2SXvN/jt9559420P+3o3s4NE ZIt+7yf97+81WdH/AGXfF+hz2mt6bfwtJHLHutZpVbzP91lr0W+8C3Oj6TLq3ip1ht4ZVXybVlll aTy/MVZtu5Y1bb935t22uh0HxH/anh2G8gsGhaNmSJWbaytu+6v91W/hr18Zm2Mw1GMaNrN27/I+ fhg8PWxCqdVrf8Udb8DfjRonhbTf7K8bFrD+z1kWBrpflkZdzeWrL8tfV37LfxH+H/jr4b6P/wAI x4zsbm9WLc1vHdKs8MjN5m1o2+bcrNXwbovj3xJZ6hD4d1O8jv0vkkgW3hi/ex/N/d/u7Vau28B7 LjxN89hY2Ftb/K1nHb+Q0P8AFu/ut/e/4FW+XZ9HIZTnKnfms3Z7rrZb6sw4jwGI4lpwhKXLybdr 92fpfaR2dxpJtryFdrfN/qtrR/Nu/wDQvmr3P9mfxBoOo/APR9eudUZLW3+0Q+XGu1ZJFuJFZf8A vqvxi+Hf/BUC78M3N3a3+jaxc6bHcNtt11b5ZI1b5WVmX93uXb8v+1XvH7Ov/Be/Svhf8E9B8E6V +zGuq6ppP2hJdQ1LxXtSRpLiSbd5awttbbIv/fNfW4mrPM8NHli07ptPpofGYTBzwFZqTTTVk111 7H6uaPZ6rqVquq6hZyQvcS7reFv+Wa/w1Q8TaSj/ABUsLOD5kt7fc393d/FX5oa5/wAHGXx1aylu vD37Ovgmzm+7FJeapeXO3/gPy15pqX/Ber9tjUNS+2aVpPgHTpJImTzofDMksnzN83+smasKOCxU XdpLRrc2qpNJLufrX+0p5WnfD+Oz+UPeaoqL/u14zJrV5HrHnQTNmNFi/wDHfu1+U/xo/wCCyP7f /jTxLa3t/wDG+3iS1+a3sbPwzYxwRt/e8vy2b/vpqwNJ/wCCw/7bGjOwufFXh2+3ffa68Kw7m/75 27a7sPhKlOnZ7nJWjOdRtaI/Y7WNYtfFnhG/0r7Sq3kMHm2rf3pFX7tfOHjTX7nxBpSfZod0Ulv/ AKRG3y7ZK+KPBv8AwW8/aE8NSb/EPw08H6wP49q3Vo3/AI6zVFpP/BV74i+PNYtvB/g34A6b/bGs XXkWSrr0jJ5kjf7Uf3f4t3+y1efmFDERhzQtbXmu1ZLe5eFoSqVOW122rebfQ91u/DdnrXidIdVk jsooZd0V1IkkkTSfw+YqruVf9qvT/BevQzQ31zC9u2iaXZ/atUuJLpV+1eSu7av+zu/76+Wvjn9p iH9p/wD4RyDxgniSEafHcfaJdLtf3cTMq/xSf6yRfvf3f92vKNe/bS+K/hHwT/YPhXW9PaPULCRJ ZtW077TeWq7l3QyMzeW3zLuVtu7b975q+eyyjRxtaM4TUoqVmk/vPezHLMfgabjVhytrTqvwPPvj 54yk+JX7RPiTxLM/mpNq8n7xfu7V/u/7NUY1VtQDunzQxNs/4FXIab4qmOsXGt6qjTXFxLJKzbNq +Yzbmb/x6tPR/FCLqzTXP70SRbfl/h+avtaqX2FoePhGqUUpHQavG64+fHy7aoxq6sSDu/2q37yx hvLHfDOp3LuXbVKPQZpYd5dVbZWEZdGeg4Sk9ClZ3HlzCFwp3fLX6Kf8EN/ECWq+MdKd2UR65p7+ X/dWa3mj/wDQo1r87Lyx+z3S/vlCt/eb7tfa3/BHfxEmi+IvH/8AaurWtoklro7QTXV0qK03nTKq qzfxNXnZlNQw/OvstP7mioUalS8LXumj9afA9qmn/E/TfiBeahD9n0/Q76w+xsnzSSXE1rJu/wBn att/48tewfFX4heCV+Feo+PteuY5dN0PRrq/v/O+75MMbSN/6DXiWnyDULGG82Y86JZdrf3W/wAt Xzf/AMFgP2kr34I/sO+IPh/pV0yX/j510a3aNtrRwsytc/8AkNWX/gVaSw8cRy1IPfX5HkyxNa6p VPsqy++5+KvxQ8bar8TPiDrHxC1WaR7nXNUuL+4aZ9zK00jSbWZv7u5VrCklj2+Sn3V+9t/iovJc yHZ8rN/d/hqGNJmbMb16LtbQ2vZWLFlJs+fq1Wo5EVlfj/bqpGrxtso+07Y/k/v7d1D3Li7D9Uun XS5X4+Z1bbX3L+yz4q/4TL4d6drG9ttxEzys33mbc25v97dXwh4guHXTwmPl82vsP/gnrqX9tfDG xsIU3va3U0TKq/7W7/2avhPEChz5NGolrGS/FH6Z4aYqUc1qUW9JRv8ANP8AyPVPG01tanh8D725 q9I/Yz/aC+HXwT+J1/4n8Z+PLPRzD4N1BLD7RPt+1TSeXGsKqv3vvbtv/TOs34gfDuzkuJIJ4VZ9 q71/u14v4q+D7218NVs7xopoU2wbvmXbu3V+ZZViadCpGU9Lap/kfpOd4GePws6cXpJWe17H67/B v/gpJ8BPA+kLbTeLrzXdNaJXVdL0uZ5VmVfmaNWVV2t/tMtZ3i//AILBfBhfGT6zpXwc8ZIGiXZJ M1rH5jL/ABbfM+Wvzv8AD/7Z2j+FfDLaP4s+G80N5tVJbrT2Vkm2/wCy3zL/ALtV/DH7ZPgDx3fT WU9hcWjw7VePUrdYt33v9Xu+Vq+hr57nWIqOdOmreSv8z4/D8H5Nh4qFWUvm7fLY++2/4LDeBR4w k15PgD4ke3aWRk3avb7vm+7/AA11V3/wXA+EP9lbP+FD+NBL5W3/AI+7Nl/9Cr4G0v4u+ANS+fTd S02dv7qstbQ8Q6bdQjy9Ht32/wAMbfNXlPiTNE7Npeqser/qZkcoq0X959QeOP8Ags/qGseG4/D3 w8/ZvmV43X99rWs7v/IcEf8A7NXyb8VPir8afi/401Txt4kSG0l1hmaeOzVtqx7v9Wu7d8vyrWmu tJDJ+58MfJ/eXbVfUPETxW7Pcp5O37ny1w4vM8djqfJUmrPol22PVy7JMsyur7SlT961rttu35HK R+GbbVoyniTWNQV5n3SrJK2yRq5X4ieE9K8OyRfYH81WXdurub7xV4eunMN5frjf96uD+ITaVcaY NT0+ZvLhdm3SbvmavNp0a/Mr3se2sTh1LezPRv2R/DOlajpeo+JFtpl1P+1I4nm/vQr91V/4Fu/4 FXqH/BRWwsb/APZRv/HtyJHk8Iatp+uW5jf7vl3Uccv/AAFo2b/x2sH9mzwm/h/wrpGP3U01rHLc bn/ib5mX/wAe/wC+ttelftYaVaeIf2T/AIh6RqWlQzpJ4J1I/Z532p5kdu0kbbv9lo1b/gK1y4Ov bO6cr3SkvzSsfDZxUdaUpPbU8j0zxtPpepQeJPD15m3maO6t2b7skcn7xf8AgO1q+uv2e/idpviL S4NVsN3k3HyXEP8AFGy/K1fCn7PL23xK+DXhO68OayHhfw5a+VJfW7LLujj2srf3trbl/u/dr3/9 j+bxDonxctvCt/tk0/UkkiuJo5fktZlXdHJ83+18u3/ar7rOMNSq0n0nHv18j4ujKdOt3iz7Ru/J j1COa8m/dyWq/Kq7m27vmb/0GpNH1JIdQSymuY9l1E32eQtu+Zfm2t/wGsvT7Wa4vpnubaS3uI7e OJ2/hkb5vmWnatolzcQRXOnwKtzb3Hm/Z2f5Zl/4DXyMptpOx6K3ua1nqP2C+Oiak/7qT57Vl/8A Qao6sHjvprZ32y7d8TM/3vlrAvPE2m6lZp9meS1uI33pG3zKrL/DuX/vmp9U1z+0Ftrx3WLdE37z f91l+VlrF1U00Xy6XOK+M2jWfib4J+LPD083lJdeHLrzZPKVtsaxtI3/AI7G1ehfBvWHuP2ftA8R W063E2raNDLEy/8ATxuZdv8Asqrf98rXAfFLVdHs/hV4tv8AU4Wura38OXzXVrar5kky/ZZPlj2/ xNu21p/si6w+t/sv/D2a6+dNP8KWabv4lmWPy2Vtv93ay1eEuqT9fzQVIvQ9T8uG108WyjcixKvl tX5bf8FOfg7efDv9sg/FrRB9m0/4jeF7OzluFfYsOsQ3lvbx7m/vMrQt/u7q/QT4xftd/s0/s+sl n8afjZ4f0K6ki3JptxO0t1t/vNDCski/8CWvj3/god8avgv+1r+xjqnjP4L/ABAkvk0XXrXV9Bvj o11AmpSWs22W1jaSNd0m1m+Vf4o1r3smlVo4uL5XyS91uztZ+dujVzOpB2ts918tT8wPil8RtY8N /HDUtb8N2cOlR32rxwav5O7dcRrIvnRtt/hZo2b+9u3f3q/QXxN4iSTS9Hkzas9n4cjtZVt5d0cK 28jR+X/vKu2vzR/aD0m+8O+IpvErTfPqG698u4+/HJ50nmLt/wBmRdzf71foJ8M9Otb74P6Jc6PP ayQwxSf2lcWsu5bq4uIbe8+Vm/hZopV//Zr77NqcPqFOUVsrX9DiwcpLMJqT+Xq/1PV7q8s7r4F3 M00a/wDEv+I3m3S/71rMy/8AjsEn/j1eF+IvE9n4l+Jd1pugzNMvh3WYftskcXy7re6ZZPLb7rN+ 8X/vqup1C48Wa18K/Ffh7Rn+0QW+r6Le6ppdjceU0lq0M0fnS3bfdVpJ/LZY/m23H3q8z8FeMrXw tcXuuQw2sug2t1DFFcaTZMtssMclu0ky7l8yb93GrNJ/F83+1XzSSqWST6L8UfQU4eypyne+4/8A ad+NFkvx58WwahLNiLxTqyQfa4o/M2DUbn73zdd26ivP/wBpzWtP8YfF7VvGfhTbLputalqGoWFz GvyzwzahdSJIPYqwor1/qFD+Zmf1mofHNq0xYOLmT5fufM3y1+rf/BHH9jd/hF8O5/2n/iFp7LrP iiw26Ja3C/NZ6bu3bv8AemZd23/nmq/3q/NP9la5+D7ftA+FY/2gdSaHwYdVjOtyQ/Ntj/6afxeT u2+Zt+bbur91/H3jzQbT4U3N54J16xuxJbwtozafKrwSRsq7ZImX5du3+Ffl+7XtcR1a1OMaEU/e 3fS19rnzX9oUp4Ruk9Xden/DnLeC9Zh8feH9cTxDc/JH9ua9Zf8Alms0f+1/d21F4P8Ahzf2t9L8 V/DFzvnuNJWCy+zyqzSNJCqzs3zfd3bv9r7v3a5L4I64ILjxZbTXkaRyeHJnfd91m3L8y/8AfVfR PwXt/DF14N0+Hwft1LSrGyjiW62bUm/dqzSfL97c27dt+7XwVaXs8T7r0stL/mJRaoXf5eR43p/w v8LaH4R8Sa3rUNrqFtHpskEtrHbqy2e1laX5dv7xl/2a88/aA8B6P4Ln0SHRvErWCtpG61vtUv5J UaRVj/eMrK22Rl2xrt+X7u5a+oPiFpUdnpk0MM0Nld+RItrNNuaBvMZdu5dy7m/2a+ffjBrU2oXS axDqU2lXemy3DS3C6ct1J5bR+XLIsUjbZF8vdtVtq16VOlKtG8umnpf9NThhiFSrb2v8+mh8k6lp Ot+KPiNrfhLX9bW8+w2tvP5i6WvlzKy7trLtZlZVbavy/ebc33at+F7NI7bW9StjpsOlXHiWa3Vr q6ZWb/RYf3bMrKzf7LbVVm/iX7rP+M3ibStPkXWLy3urT7Ulv5F9pP727tY4bdv3kkLbflbdH8rb fu/7VVPg/wCHH8OaDeR69frpc+sXV1ewW9xa+ZPcL5ce1fl+60jLu+8u1trL/DXbgab9o2tEnba9 /wBDtx1RfVYqWj+X5b7HE/GKGz0nw7o6fbJHudel89LOGL91Hawsyx/7TbWbb95vu1iaf4g02SaP R5ryFFmf70ibd21v4qf8do7/AFD4jfadH1vfb6HpcNrFbx7Vkt9rM0i+WzbfmZm3V51q1xbeItYl ezMkat8ywqjbVX+983zL81ej9WjiGnCWi38mZ0JVYUlzK99V6fI3PFWkpo+vQ6xolzHDdyI0sUlr u3LMrfL/APE12N74sv8Awj8Fdf8AFsN4wljsGiaO8g+ZrqRVVt3+1ubd/wB81yegtdXNpY2GpTW6 3ELt9l3bdzbf/Zl21e1nwXo/jfR38EPr0kbapKt5fzQ7p2t7eHc0ki7v+Ar838TVxV6VOtUp06r+ Fq73uk7/AHaHr0o1vZSVKKbkrJeb0/U8++HfwF8SXmg2t/qdhNDDfQebatIm3zI923d/u7ty1U+L HwX8W/B3/TJrNoftSrL5My7WZf8AnotfY/gGT4Yw+H9M+Ets94I/EXhm3bRL6+dWlaaPdJ5bf3W+ VvlX5f4f4q8s+P3in/hbHwnC+JJIV8QeEb+TTtUaP/ltCy7optv91l+X/eWvSwXEONlj7ONoX7dL 2TNcfwxgaeXaP94ldO/VLVM+XI/iDeYX7TbKy/3o61tJ8WaPdfvkn2uq/wAVfS0f/BMvw3f+D7Dx T5PjbSDcWcMsv2rTd6LujVt3zRrtqn4V/wCCeHw0XxBCmt+J9evLZXV5Vt3hgaSPd8yq21vmr7an nOCk7c34H5hUhXpzd1sfM2vXSSXktz5yncnybXrnpXmkY7xtr9XtO/4I2/sYeJNHt9e8Pa940e2u ot8Df29G3yt/C37v+H+7XG+PP+CUP7Fvw50mbxT48+JfijRLKHd819r1vErf3lVmj+b/AIDXrTqU 4wvfQ89YhVJWsz8zWjcf7v8ADXX/ALLnxC8I/Df9ofQPG3j9Jv7GsZ5kvJrddzRrJG0azbf7qs25 v9ndX0B4o8D/APBKHwb515rHxE8carul2waT4VvFuZ41X+KSWSNYfm/2W+WvD/Hc37OXi6OHw98B /g/4otdQvJfkm8ReI1u2jVf7vlqq/MvzMzKu3/arz8Q6GMw06dS8YNNN7aNW0PUy14iOPpOjHmnz JxVm7tPTRH174g8TeMLfw1rngbxXZ2+oeDLrRLjUdD1iZG8xm3R+XHHJ91o23f8Aj1fJfiL4Y6r4 ss5I7FLeJoUVreS6uli+X/gXzNXr/hrx94q0X4Ft8E9Z1b+2/JsIbPS9QuGbbpdusjSNDCv3pF3S N8zf8BXbXSfsx/sPftFftM3Etv8ABL4X3mtxRy+XdarNttrG3b+608m1d3+yu5q/OMvUsBVmsPq7 6WvZ20u/U/pyfBbx+GhUzl+xp8qbbaT11tvumfLLfAPxVFcrBLrWk+Vt3NNb3jSqrN/Dt27mrWsf gPolq3n3njC8dmi2/wCj6Wuzd/wKRWr7zi/4I1/teTalAJr34fpo7tIt/wCKo/HNvJp+mtH96OeT 73mf7Kq1e2+D/wDggBYeKNAa/s/2y9Lv7nZ+8bw/4cW7tV/3m+0btv8A3zXvxxudVZaJR+S/U8Wr wr4W5bSUp1XUv11dvWysvmflFa/DnxhpsrJoPiKxuYv+eN1ceQzbf4V8z5f/AB6tLS9J1WPeniXR JrWeN9vkzbdzf7Ssrbdv+1/FX3l8dv8AgiL+2T8L4Z9S8AaVo/xC06NGk8zw3P5V5t/69JtrN/2z aSvCf2eP2I/jp+0X8f4/2dfCXgy+0zW4Zf8AioG1qwkiXQ7dWVZJrmNl3Lt3fKv3pGZVX71Krjsz bVGcPeezQYDg3gapUljsNiOanBOTg3ott+vyPGF1C809kSC5htC33VjijXd/30u5qpedc+XLHMyi GSVZZ2+6kjL91mX7vy1+qXg/Wv2JP2fvjRf/ALDvwG+FXhfxhpukeDdcn+Lnj3xFYQ6hquv3cdjI qabpyru2yfangXbCv3vlXdtZq8L8B/sLaF+wl8GLf9sP/goDoVq+sLEv/CtPgrdS7p9c1RV3Ryak q/dt4W2ySQ/7O2TbuWNolRrW96V118rGlPF5JKq+XD2ejgrK8r6bJabX16bnk3wF/wCCif7W/wCy zIvg9vEE2saLaqqv4b8XRSS/ZVkXcvkyN++tm2srLtbb8y/LXnH/AAUe/a8179o7xtodzPHdadpt v4ct54tBmv8Az1tbiRpGkmZlVV3SfLt+78u2qvhPw78SP2o/jxDo15qs2oa94y15rjV9QZFX5pJP MnuG/hVVVmZV+6vyqteUftT6LN4V/aI8a+D5nZxpPiO6sIGZNv7mGTy4vl/65qtdWVTdXFJc3wp2 XlofB8fYPLcHCDVOMasnd27W1vbTdnD2s32iRi+7fVmP92q7Eb5qr2KpHxs5qxNNuX5H/wCA7K+l 3R+X7sBIY5N56tVe8uNkaom3LNUhG1VfZWbqFwIZET+LdUpPmL50oNEuvMn2eNN/8fz19Vf8EsfE r22taloG/PkX8M+1fveWy7W2/wDfNfJ+rh5o4xljt3V6D+yh8XNU+DvxcstVsEWWHUttleQszLuV m+Vl/wBpW2143EmXyzDJalKPxWuvVNP8VofQcH5h/Z/EFOT2lo/mrL8T9Kda1SaTULn7fdRkrLu8 5f4q5fxA2kzHfczMu6uQXw98cfiLdXM9nYaXpy/eWHUdehinb/diXdI3/fNT2/wF/aQVk8/wkt38 m5JrXVI5V/8AQvl/4FX5VhOE8yxWF9tSg3FO11rr2P2zNM/weQ41YXHtU5tKSTe6fXQs3Vn4M1Da l/c7v+BVHH4F+Glw2/7fM3+7Furs/Dv7KP7Usk8Nt/wonVJZZtuySHTmljk3fd/eL8vzV6v8Nf8A gnf+2l44tRdab8JWsImZl3ag8dt935fm3fMvzVzzyTNacuXlkvwM5cSZLJc6qx+TR4jpfwp8Daoq J/Y8kiL/ABNEq1t2/wAIbCzUN4ZudS09vl2f8THzI93+1HJu/wDHa+ufA/8AwR9+P2oRpcfEL4qa Ho6L9+309WvJV/4F8q/+hV6j4B/4Jb/BzwjqH2zxtr2qeKXVf+Pe+n8iD/gUce1m/wC+qdPhrMaj 96Siuzd/wPNxPGmU072bk/Jfqfnjql94q8L28z6lrdncwqm5ZLWXbI3+9G33f++qyoJvHnjiT7L4 V8NatfSNE0rfZdOklVVX+95e5a/XrQ/hT8MfBUzv4b8E6LZsyrFus9Ljj/dr8yr935lrqtPjhs1M 6Qxwps3OsKbf/Qa9bD8N4eCvVfM/LRHzWK43xk2/YRSXm7n5L/AX9gP9o79o29s7zW9BvvDGgzXG 1tY1TTdkjLu+by4mZWb/AMdWu0/bX/4Jv6P8C/2XfE/xY8C/HjX01fwbpUmqRNeaTbslwsbLtj2r /q23f8tPm/3a/ULSbK68SX0P2C2Z3VWZ/wDZVa+Vv+Cr2oQWH7IXxG0CfTr1hffDq8f7VHAvkQ7W X/WSM33v9n71fRYbLcBhq8Y8ialF6PXVJam3DWcY7NsfOFazvF7K22unbQ/Kv4Rft0ftPabpK3Ot a1pOsK21t2raHHu3f9dIGjau+8ff8FBvip8WPhvrXwQvfhloMN14s0K80tNWs9Xmi+yrJHtaRo2V t3y/L97+KvmHwjrjx6H9m2f8sv8Ax6u1+Aug6V48+KF7a6j4ysNIbQvBl5qlumobv+JhN50arax/ 9NG+bbXzlbKsIsXKpGlFOOqtorrVaK3Wx9ZleHy7EYinDFX5G9bXbfXz7H0d8EvC/ifSfh3ouiaP cwvcaLpNvBdQ2a+W+5Y9rTRr/Eu77y/+O19V/si2Ot69rERv9KZINPlW6lvo4vkm2t/6M3Uv7Pv7 E+iaLYaJ4817xJeXMslvHeS6b5CpHtkjVljZvvfLu+b7u6vqDwv4bttJsYrPSbOOCGH5vs8MW1Nt eJmmYRr3hBX132s76+up8H7HlrS7X8tS++rXsNw8kPKQov75W3fKy/w/8Bqnb3iW7hBNtVvuNs/8 d/z/AHamh09IJbgWEO3bL8y/8BWql5poWHfA+5G+/D/FXz8nUtqdOnQyvFei2msM1ykKrcbvmb+K Rf8AgP8An5q5O6s4dLZ3m1tTtfcizbWVf++t3+1XT31rvlED7pFX5kbftX/d21n6k2lwTyP9m824 +7Kv3VX/AHm/+Jrhqxu79TSE3HQzm1q21iSDSbaKMW0cq/bbr7PtVl/ur/e/ir4a1T9uf4p/D/Qv Fv7K/g3S5PBsvh7xVrCXF9b3G+8WxmvpJIYYZPuwbY5F/eL821l27a+6vLfa29m3M/3o/u/8Br8q f2rtSsta/bA+KnifRtQWW1uNfjsopo/lWRobWGOX/wAiRstenk9D2sasZ9k7+aaXz3Z6GAjCeLgp K610+X6HF+O9V00Q3NzDcs09xueeZrhpHkb+9JIzbpG/2mrrv2Y5YbX9mPUbnxN4ia0tdN+LEk+i Sf61bXbbwtIzRr83zNJIv+1XkXijUIWt3Tzst83zVY+CHxa8L+BbHU9G1HxS8cV1PfT6pYxt+8Xb azeRIvy/3m+b/eavu8Bhpzwc4K97X+5o6s59lCdGbVrP80cH+2I2g65qlm+g63b6jfRpeXF+1u7S RKu1ZGZZG+80n71tv8LLX0d+z38YrC38E6D8OtV1W4jn0Xw5HFe2sekzNHN5a7opFkVWVv3MjRq3 97d/DXyH8VPiV4T8ZQajrcL2Nrdt5m+z02Bkibd5i/u1b/Vqq7V219xfBHx5f23gWH4UX/he3i1/ w7odjvuGtVVbiOSGNfJb/tm0P/fNe9mPPhsppxlHVX3+Wv4nyeHlQxOazqU3zLT5dDotNutQ1jwK tzqviHT7PTbjVo9D1fw/NbyNJrHlyQ3y/a/IVmjhk8vb5a/M32eq3wq+Guq/G749eFvCXjS8s2sb XXtDgt9N0e3kto4Y/tVrCqssi7mVo5/93crV0h8RalH8IdbsE1W10hJPFuhpK1nb/vFZbG8Zm/8A Hq5P4QfFTR/gj8evBOq3mpSW9jJ4gs7rVNUjikurm426lbyL5m1Wb+792vl6cZ1Z2gul/wANT6O8 qcGlvrYg8Q/sv6d4m8R6lqdrZXF1C+oztBiNMQxvI0qxj5eihxRXnEHxj17wrdXOm+I/HPiW+vTJ G1w2k66YIIW8mNfKUR/K23bjcPp2ors9jD/n4vxPqKPCHEValGaw8tUn0/zPhmx0dZLhIbYM0jMq xKr/AHmr9Wvg/a23wb+BPhvwnu81NF0mNFjkfbtZl3Sbf7u5mavzZ/Zv8Nv42+MmgaC9tvhW9W4u mb/nnH8zf+g195/GD4kW2l+GfsCTKr7Pn217vF1erPFUsPTfdv52SPzLhTBU3ltWtVjdSaSv5K+n zPXfDvxU8E6x4bfWNB1uxjltbORdSWH900cbfe8yNvm/2t33flr6r/Yl0P8A4Rb9n/wxDcwxw+dY SXvl2qMsU32hmkVm3fMzbdrfL/er8QPjB4o/4SfVLPQYX+W4vVSdt/8ACzfMtfvx4Zt/J0uzs7e2 ZIVghRv+We3bH5e5d3zfLt+6v8LV85isqnhKcJt6yb+SX5jxdSjHmhHy+9I4z4vNpV1oqQvZ/a7S OVZbX7REzNG3zMrfN81fOfibw3DrGsPeXPLtb7HvliX/AFbN80dfXfijQprixuL+5kX/AI95vNjh /wCWjMvy/wC7/wCzfdr5/wDEOjzSa9dXDyKUj8lYrWOJV8v+8zf3t25a6sDUjG8f66HyuKoty5l6 /ieI+NvgHDqUWoOYVa8urWFZYb6/2ssNuzNthmVW2tIrRruZflWFV3fM1Z+hfDXUlkL+IbBodK3+ ba6Xb3/mwW9wsarukZvvNt3Lt2/71e2fEqzs9Hu7q2m1ubZDayRXWoK6+bHIvy7dqr97d/s1xPxI s/Elv4cmHhjWI7S8j0u4eJZtrL8q7fMb/d/h/wBqumpKlh6E6spWVr6vRW/I6ITxGOqxpPW1krLW yt9+h8VfE7w54e+JXxO8Q+JNB0rFtcX8iLbySxwOu1W/dqzN80nyt/31XKx+EdOWF5rCGaD7RtZl kf8Aeqqt91WrqPhjqmvWf9tpbTW+pXH2pfluH+WSRVb955n8P3v/AEKmzeBPE/i7ULjw9YblvPK8 26aGJtkce75mb/Z/u16WGwlevGFKk97dX2R6VKtFV3Fq/RL5mLa6Ho9nqSfYD5Js5VaWTzfu7l+b /e+b+Gtjwfef8ID44fXrbR7OdPK8q8a4dW+0Wv3WhXb8q/3vl/uruauh0H4V+J9L8Rafo3hLSptR v7i4jgs7WGLzZLqRvuqy/wAW7/P96vuf4b/sH/AD9lD4a/8ADSH7c81nf3WlxK9v4ZX97Z2czf6u 1WNf+P24ZvlVf9Wv+0qs1ezSyCFOjJ1Xd7Nvsfb4etluVU6cq0eec/hjHVtvSyS/M+KvG/hGbxR8 JLL4l+C9GmjuvDupLLol55UjR/u5laKORlXarN93b/Fu+WuG+Imn6J4g8ZaR4k8F6NMbfxhZSRXF jJ/rIbhvuxt/tRybo6/Qj4K/Gj9or/gpd8QtU8AeD9V034b/AAj8Pratqmh2ekwzy3kbSfubdmZV VZG8tm3R+WsKruXc22viT9oHxR4WsviJ458JfCJdvh5vH91e+GtUd/Nube3jk2r5cn91tu7/AMer y6uBpYFxnFtxbf3P9L7HpYfI8yznFTw8IKM0lJq7bim1ZN2tdp7H6zfALx9qXxF/Z18B+ObyzZJt S8JWKalZ/wDPOaGP7PJ8rbv4om+X/ari/H37Jvwi8Q6k+q6PZXGiXdxuaX7Cu2L/AHvKb/2Wvzxu /wDgoJ+1Z/wgej/DTw78S5vD2iaLpcdnbw6HAsEsyr/FJNtaRmZm/vLXM6L+11+07pbSNZ/HHxFe QycXFvfai1zFIv8AErK27/x35q+cnTr05ynTlbU7IeDubY5N1KkYtt2i9evkfdvibxton7O/hG58 MaD420vW5re4mle6Z2SCz3bdsLf89JG2t8qt/vV8RftR/EOw8XeObp/HkNvc6hNKsf26+ZZVX/rl /DGv+yv3a4/SLL4wfHj4k20Gm6Xq/izxFPcLLBYxW7XLssbbtqxr8qxr/wABX+9Xsnx5/ZA/bJ/a h+Ml5qXhf9kDWPDf2Hy0l0mRI4khkkjVtzTyMqyL/u/d/ir0o4nNMW4Ko5OMVpa6V16b/M7H4Y5P w44Up1Yc8tZNtJx22u776bHxb47+DFn4i8fXZ8H+JNLh09oo3Wa4eRlaT/loqqqt/d/8erc8E/D/ AE7wLZG2geO6u5T+/v1Tb5i/3V3fMsf/AKF/FX0L+yZ/wT1+On7UX9uat4FXQLHT9BvVs7/Vta1L ybdZvmZljZVbzNqrubb/AA7f71eqf8E2P2CrP9o/4t3vjbx8Yr34feENS8q4nt9ywa9dKzeXbxfL uaHb+8k/6Zsq/ekrulWzPMFCgtIPbzt1b3t6n1OU8O8AcFqvmlSfPVoq9m07N7JK1rvodJ/wTq/4 Je2Xxe0e3+P37TNtJpvgZYmvNL0e4uPsz6xCvzNcTSf8sbNVVvm+VpNv8K/NXpXxD/bB0T9oWTX/ AAR8LdauPAH7N3wtsVbxhrXhuD7JdeI1ZvLg0yw27fJW5kXy41X5mXdJJ8vy1T/4LEftotaRN+xv 8K9RjgSOKNvHM1ntVdu1Wh0tdv3VVVjaRf8ArnH/AAtXiXij4RfFXxP+zb8EP2X/AIKeE77U5vHd veeNNdks4WEF5fTXEltB58v3VjtreNtzM22PzC1aqdPDOVLDq/ItX3bdkvS+5xQwmY8SU6ec5xLk hWly0ot6Qgk25tbczSdr9Wa/iL9pPxH8Y/2KvjXr2teHrHw94MF34a8MfDfwVpcXl2Gkt9skvGWN f+Wkywxbppm+aRm/u18meB/iJ42+GfiCLxP8N/GGqeHtRhbzIrzRb+S2kVv96Nlr2L9rzxl4I8Je HvDf7IXwe8S2+r+HPA0s134h8QWb5i1/xFcKq3N0jfxQQqq28Lf3VZv4q8I8ksPnT/gVeJj8bVeI ilK7SSbXfr9x+ncK8NYFZdUqOilCpJuMWvs2STaet2lfXufdn7OP/Bar9rq1sY/hj4n+H+m/EjXt UT7B4X1Bovst82oSfLB5qxr5dyvmMv8ACrN/e+9Xt3x98Uaf/wAE1f2ZLb4d618VCPjP8bdWaTx1 8R5t1zc2SyNtv9SXb8zR20cjQ26r/wAtNzL935fO/wDgh5+ylp0l9rH7aXxJto7fT9A+0WXhW4vE +SOZY917ff8AbGP92rf3mk/u15T448X6F+3X+1F42/bC+OJubb4P+B/JWS33Mr3lnHuXT9Htv+nq 9k+Ztv3Vkkkr38PXxEcLBzd5Pa/RaNt/I/H85ynIq/E1bC4GChRpK9Rx+1K/uwS23tp1Z9J/Ez/g o5+x3+wH8NvDnhL9lX9mC6vNV1DwrDeeGNY1rRY9MW8sfmjj1CeVt15P5jK0nzKrSfe3bWr8yf2j P2ifjV+1r8VZfiV8YPFsmsa3fMtvZxr+6trOFm+W3to2+WGFd3/szN/FV345fFPxj+0Z8V9X+Lfi 6NUvtbvFWKzsYma2sYY1WOCxgVfuxwwqkaxr/Cv+1XGeK/AninwtFaXPibwnq2mxagjPZyalps1s t0q/KzR+Yq+YvzLu27vvVwYrGVqs27NQ6abn0mRcJ5XlcFUm74iae8uZpvWy229EfWf7IF7+yX+y lo733iv4v6PrHjzXBHbXEehrJfNZqzKq2cHlqyt823c275m/2a+Rv+CoXgG88E/tmeM9VubZY7fX tRW/sv8ASFaRlkt4WkZo1bcq+Zu27vvfNWl8EfiBoPwl+KelfEXWfB7a1Fo8rXFrpq3XlLJcKv7u Rm2t8qt833f4apftWfETSv2nvi9c/F/WfAy6ReXFhb2rQ2+os6MsKsqs25V+b5v/AB2ryfEwwuMl Vndpxa/FaH5hxtwHmuOx8alC827uTbsl2SW58+whPuZZvl/ipZG2t1/3K9Bh8M6PZIlsmg2K7vlS SRNzN/wJmp134f03T9zvZ243f9Mq+mecUV8MWfKUfDfMpL97UUfvf+R535czLsRGb/gFUdU028t7 oXs1nIqb1VdyfKrMtektfJb/ACWyY2/LuVVWu6+Hf7MWufGXwlN468QTzWXhWy1JbVr5PmlvLhVV mt4V/vbWX5v4dy1zVM/pYde0qrlgt9df+Dc6KnhzNU5KnV5ppaK1le3Vt/keL+E/B/iHxpcvZ+G9 ButR8tPm8mL5V/3m+7TtY8L3nhvVH0rXtHksbqParRsm1l/iVt1fWUfhWw8Cagng/RdD/sLTdm6y srhdzf8AXST5v9Y3+1uauD/ag8L2H/CJWvi37KxvobqOD7R/F5O1m2t/3z8v92vIw3FyxuYKlyWp y0Tvd+TfQ58VwR/ZuXfWIzvVhq+i+X6H0x+wh8NfBNp8KvDn7QnjnxxYzajr3h/UItL0KaPym+1Q 3H2d5mkZv3m1VaTb/tf7LV+nv7AejWGtfBV9cP2W5TVNZuJVm+V1ZV2xr83/AAFq/C748aVr2m/s 9/CKbwxrF5daLb+F9s+5dkdnqEkk00kce1V/d7pZF3NuZpI5l+6tfsf/AME7/EOmfs+/sd+BvCuo WclzHZ6DbytDbyqrNNIvmSf+PSV3vPKGWZO8PSS96be+1mePxVhs4zfOaWMzKbco04xjdW0tdPz8 z9APDdnYaHo+meHrb5Vht/8AVx/Kq/ep1/pr6DcS39nCxgm+e6hX+Fv+ei/+zV85TftzaDp+u6VY XPgPUopby48h7j7VH5ULfeVm/ib7u2uz/wCGwobuZ4E8Pf6uXZ5c118zf3v4a8PC4tYybva++9rn nVaKoxTT0PWre8+0Qh4ZldP+WU0b7ty1zvjCLzI3dEUH/ZTbTND1aDXrNfFXw6vI385N11pcn3Wb +Lb/AHWqK98XaPq1u9nqaNaXOza9rcJt/wC+WrvUUnqc0pXWhyUNtD529pGP92rW2bVryHSrBPnk ZV/4DTJ9JnimaOzv45Imf5N33lrr9B0XTfC+jtrd5dQw+XEzXt1cPtWNV+b/AL5qbxi+Z9BxvIpe A9SsPDPie+02YfIsU0Cyf3dy/K1fmz/wcH/Ezxr4U+AGg+GtFvY00nxPZX1jqv7jczNHJayKu7+H 5ZGr7H+Gv7Snwu+N0N942+GPiBtStZriSLy2tZIpVbdtXdG3zLXwn/wXk/aK+Fev/A+4/Z20qxbV fENj4gs9Wu9QhfbBo8cbeWys235pJFk27V+7t+b5tq15dXEKriacYys79O1/1PvOCsNmFHMZ1qdB zShPm02Ti1d9FY/NXwnMkmn+Ts5r179iv4faD4u+Pl6mu2Ekzw6dpaWW2Vl2yTatDCzNt+9+7aRd v/xNeMeDbjdCm92z/svXvv8AwTq1FYf25vCWlXNnHKl9cRrK0iszRrHI0isv/bTy6yxspU/aNLo3 92v6H0OEr8lHncuVpOz+Wn37H7P6fapb/IEXy2/1Sqn8P92t23ZI402P/wBcm/u1l6ZHNtRAiiT7 u7+61aKW/wAw/fbk3/8Aftq/OU5y2PnG1cqJq1zc319C8LRKt1Im7b97a23/ANlqC61CPd511+7l 2fw/dasvT57nRfDZvXuftkzXU37zd96RpGbdu/z92sm4t5pl33l55m1Pkb722vPxeK9j7r3NqNLn 9CXX9WtrX99cXWyGRv4f4WrDm1zTZFAQsnlv97b/AKxamu7U3pe1+U7X+7s3blrl/EVjbaOyQ214 zxNK2yNvm8tv7v8A6FXlyxspHTDDRbtcf8XPiZYfC34W698SJJl2aLpc1xAsn/LSbbthj/4FIy1+ Qk15fL4bfUdSfzbq+1K4uLqZvvbmb5q+mP8AgsB+05F4P+F2mfAvw/q2zUdev49R1NreX/V2sLN5 f/fyTa3/AGzavkz4J+C/jL+0HoOn+B/hP4T1DxL4iayvLz7DZ+Xva3hb55PmZfu7lr7/ACLAVJZS q8lbnktX2XX0vc6MIoYfG+89k399jB8Q3W3cI/v/AN2uk/Z++GPjL4ufD3xv4S8PeF4NRfUH024t 2urho441WaRfMj2/K0m1pPvLuVd21fmqaT9h39sn4a+ILKX49fAbxLpnhue/jTVL5Xt2lt4dy+ZI q+Z95Vavqn4f/D34K/s4Wv8AaHhC8m13wBfWrLdavDqMj32iyM3ytcqu39z823zl2tD/ABL/ABV7 OOxyy+j7PDyU6krWs01prrZ6PsuvQ9bDYV5q+erBqCvo01r08mj5N/aO/wCCWHi74Z2txY+CvF7e IfEOkwxt4l8OzWX2a5tfMj3L5a7tzfK33W+b5a9w8C32oXGiX15qviRbm4t7e30h7yOLy2ka1tV/ 4Fu+Vf8AvmvaprFtTurPwFfSSQeILV2vPBfiyT5/7YVV3bZWb70235Zl+7NH+8X/AGfKf2xZ1+Bu iaRq2l6XY3134onurvU/C+nX6rfaRdLD5e6WNv8Alm2373ys25W/iriw+dZnmXJhcTq9WpaLs/JW /HoyK/C+Hw8vb4WDUtLxim726pau5F8Rtc0j4e+ANHh8Q+JbO2j17x1qUqfarra832O1jhjX/d3S NXk3inWrPTby3tdBub59XhikguNSkuGVrX943ywMrfeaParM27/Z2/NXmUMnxB+LF4niT4n2f2aX S7+4nit7u6V1uI7hl8uGFV/hj2tu/wCA19R/8E5f2Ktb/bb/AGh7H4Y+bNb6HZldQ8ZatD963sFb 7qt/z2kb92v+8zfw16uLoQwkoU6U+aclrbVK/RM+34IymlhMLWzrOabhSotuKkmnK1nqmr76JdTE +CP/AAT6/aw/aL8ED4ifCD4C6nrmii7ktE1FLoW8byR43qgfG8KW2ll+XcrKPu0V/RR4C8B+CfhZ 4M034deAfDNppei6PZpbabp8D+VHBEo+VVG7n1Ld2LGis1gqfZ/f/wAA8uv47Z/7eXsMJFQu+W61 t0vqfyYfsw6HqWmXF94t0natyyeRbzSfdX+Jv/Za9J8Uab8QPFULzza3JLcL/C0HytXA/A/4meGP D/hWLTbl1SaGVt+7+Ld/FXufw5+OmgWpaJrO1LttZZmr283eOhmcqsaV1svQ+EyOGW1Mmp0faLa7 s9U3q/8AI8c0v9nb47a54q0eNPBM12smrwsi27+ZLcfMu5Y4/vN8u6v2Pm/bz+Amg6vZ6Pqusaxp TXDr+71TS1ia3jX5V8xdzN83yqzf7Py18o/sq/GDwx4p+I97baVc2dx4mh0ORfDVvJK37uaSRY5Z lVfveTHuk2/3Vrz748aA+ra7e2fgnRLPS4l/dXGrSfvdQ1ZtzbbiRm+WPd97au5tu3cy/drkq4mv mdSNLEpQcU7W87d9zxcbl9OFZxw15pu7bd16XP0m8O/tH/BP4p2MsPhHx7Y37tOsHl79jbv7u1lX /vqvNWa2l1QP5K/vrpkluo1XcyrNtVf+A/dr81PAnxM8ZfCPxrbwa3qUj3FrOr27XiM8ax/xfL/d Zf8Avlq+rfh38crbxBNbfZtSmsLhnWRYZJdyf3ty/wC1XXSySVNRtK7eztoz5fHVVRqP3Wkj3b4x fbLjxE72enqt0qyOlrNOqqy7vvMy7v8Aeryz9pRtS034O6tqtneLbQyaMyNMz7d25v8AVq38Ndbd ePn1K587VdburtpLKaK6uLza0n3fm+aNV/8Asa8m+O3i6DXNK0fQf7V+0WUenMn2NvmiuGaTduk/ 4Dt/4Durzc4y7Gexp0UtZSSfond+Wtju4eq4epjHUT0SfTurLc+T/Buk/bNS03wx4Ys7iXVdU1lY PssK/NdM21VjZfvNuZq+5NF/ZPv/AIF6eln4wha61W6i3as1m+3yZtu3y4/9mP7q7vvbWavWP+CH fwM+Hn7RX7VWu+NvGemWNzH8P9BhfS/LiXdeahdeZH9o+Zf+Wcccm3/eWvvb4lfsreGrj4lNqw0/ zbTSpfNbcv3pP+Wa/wC7/e/3Wr9ZyPARwOHh7RXm4372T2/Cx5OZZlRwmPnyu8UtXa33Hyh+yT+y X4e+DdpL8b/H9tCPEN5as9rJdRLGuj2O3du/urMy/NI38K/L/er4K/4KDftQa3+1J8UN9hNNB4Q0 FpIPDVjJ8qyfwyXki/8APST+H+7HtX+9X6G/8FKPiBf+G/hmfhdo0zJceIt39qMv8Nmv3l/7aN8v +6rV8ofsL/sd6b8Z/i5N488eaStx4Z8K3Cu9nMm5NQvvvQwsv8Ua/wCsZf4vlX+KssdCdefJsnuf ZcF4jC0Kc87xzvyq0F26aX6tnL/s/wD7LHif4V/AXVfjz+0d8d/EHwv8Ba9ZR20uh+GXaPU/EEMn +qjaP+FZPm2r95l3N8q/NXh/7YHwB+FnwjvvBvjD4G+KtU1jwZ488Nf2toP9sW+y8tfLm8mS3mVV /hbb/wCPLX1/+258ev2eP2nPHN/+yp468Ra54em8O+I4V8NeMNH0v+0ba61Jo/s89vPbR/vPL3Ms atHu+61emfAz9mT9nfVfiNpNhBf3nirUfgNodr4UgjurBU0y11bzJLqeZf8An5uN0it/zzj+X7zf d8mtgKeIXs9oq1n18z77A8XYzJf+FbGRlFzu3BJJOFvdd7b3t1Pn74Ifsh/Bb9iv4Cf8NZ/tqeFV 1vxBcJH/AMI54HniVljuJF/cW7RN8sl0y7Wbd+7hXduVm3VU/wCChPwe8W+M/h98LrDxD8I/Bui/ Fjxj4omt9J0HwHatHt0toY2W3uW+XzJI5mXdIq7V+b+7Xnn/AAVW/aG1L40/tM3PgXStUkbQfAbt ptgkb/LNffK13cf73mbY1b+7HX0l/wAEyPht8TvinqFz+25+0n4w1DW9Um01tI8F3muS7mtbGPct zdRr91V+Vo1Zfvfvm+81cMY4evUnhYx91W1+67v36HuYmrm2V5XR4ox1f35ttQu9Lq0IJXt1vLQz PH9t4R/4JRfsvWngL4ULb6l8XPHX+jLrH2dZJZJvlWS4jVv+XeFmWOGP7skjKzbvmrq/2rPiV4z/ AGNf+CeVl4S8W+ONQ1Xx74gsP7GbVNSvGnn+3XStJfzKzfwwxtJGv9393/ery79mK21T9vz/AIKI 6x+0tr1m1x4R8CSq3h63mXdEvls0enwr/tM3mXTVS/a68R+G/wBpj9qPxF4y+JFzI3wh+BVn9l1W RZmj/tjVGb5rGBv+e1zcKkPy/MscLN/doqTlTw03Tsr6Lskt2ebRwEcZn2GoY989RWr13u25W5Ka +9Kx84fAD49ftY33hnTf2P8A4F+NJdO03xPqMlkum6fZwo9xJefu5Gmn8vzNvl/ebcu2NWr9MvHu v+BP+CbX7E7ReD4beVvDmlrZaEsnytqmsXH3ZG/vbpN0zf8ATOPbXyp/wRk+Dll4x+L3ir9o/UdB t7O20OJrTRLaLc0VreXm4sqbtzbYrfdGu7/npXSf8FOLnxP+09+118Of2JPA1/5aQ+XdapJ95Ybi 6VmaaRf4vJs13f8AbRq48GquGy32l7zlovK7srfI9fjNZfn3HdLJqUFChRXtazSSvyq+tt7ba9Wf Fnw/+C/7QH7UnjHUbj4feBta8YazdTtdateW9v5n76ZtzSSyttWNmZmb5mrT8W/FT9rz4EeGdT/Z M8SeOfFnhfTLWRo9S8ITXDQLG0nzMvy/N5cm5W2q3ltu/ir7V/4KLfF3T/2F/gH4S/ZN/ZduJvDZ 1qCS61TUrF/LvPsMbeW0jTL832i4k3M0n3lWPau3d8vn2r/s0+Iv20P2oPg74P8AF15du1n8FdD1 H4l60zM1wkO6Zwrt/wA9pEkijVm/56bv4a8yrgXGThSm3O6Uui11tp2PvMFxjRxeCp43G4eCwK5v Z3V5JU1pKz0Sb0VurR4d+zD+wB46+P3g2/8AjV428YaZ4B+HOkrJ/aPjXxEjeSwX5WWCL5fO2t8u 7cq7vl+ZvlrO+On7G48B/E3wL4T+DHxHtPHuh/Eu2jm8Fa9aWbWzXTNdNayRyRN8ytHMvzf7NfdX /BQfxP8AAP4qeGLn/gn34J+JOkeCPEHhSTS9R0Sx1KdbTRrtljk26S0/3YJljkjkXzPl8xl/i3Vt /sr/ALHl/wCEvjb8MoPGXiDw/dR/BP4bSRy6Va6zHc3kfiDUJ5pZppIV+aOOHzWVWk+8yKyr/FXT TymhKSpxV7WvK+t76r7j5mt4j5nTw0syrSdOEublpONrw5Xyyu1u5WWmm+h1n7U3wy1L4R/sYaH+ xJ8CL230w6tpP9l654mvG8qz0XQ7dfO1bVrmT+FWZtv96RrhlXczV81/su/s1eFP28/FVh8NvBVn qGlfs3/Ci8ZQz/6NdeMtYkX9/dTt/DJMu1m/597fbGu1pGqD/gqZ+0Z8Zf2hv2lG/YT+EMrJotnr dnpdxY2fytrOrSKrbZ2/54ws3yx/d3RtI275dvsX7efinw//AME7P+CeOjfsv/CfURDrXiW3k0aL ULf5Z5I9vmapff3t0zMsat/02Vf4a9F1KcpSkl7sNPVrZLyT+8+GwWFzPAZbQ55r61jJOcVu4p7z l5pPTotT0H9kb48eH/2m/wBoDX/hv8Bfhr4Xsfgn8KYIbXS5odBj3aprnmfuJrRv+WEcflyMrLuk ZdrM3zLX5s/8FgP2l5v2lv20dfl0rVWudB8Fr/wjmgbZd0bLbs32mZf+ulw0n/AVj/u197+HrdP+ CWf/AASXutYvIksvG+tWDTeVs+f+3NSj2wQ7f4vs1v8A+iWr88Pi9+yDceH7jwT8D/BXh3VNW+Ks 3hpvEPxIjkvI1ttFhuNsltbzeZtjtpI7dlmuJpJNqtPGtc2PVWeHjBLXRv59PU9Lg6hgKPEdXFSk 3Ti3CDbvdpXnNtvZ7X80j5pum2t99vlrNvvm3I9eifGT4G/E74KalZ6b8RfDDWP9oW7T6dfW95Dd Wt5GrbWaGeGRo5NrfK21vl/iVa4G6RF3ZRa8eleHus/UMbKniqSqUpKUXs073+4zXuHibYCvy/3q r67dXNwoRxhV+5tq3Ir+b9xcfxrtrP1y4kkkRB8vy16Ebygj4fFQ5JSKXluGXe7V9M/su3GgWv7N muapZ639g1a08SLHPdajqLfZreFo18v7NbK3zTMytubb/CtfMqh2PT71avgnxhrvgfxLpvirwxqH 2e+sb2OW1l2qyqy/dZlb733m+9/ermzDCfXcM6XNbZ/d0fkzhjU9lLmR7V428UeGW1zTfEt34zum eRWafVNYZY4/l+8sca/Kvzf/ALVeUftL/GbT9bvtN8HaFq32m0il+030ijarLt2x/wDAfmZq89+I Xhv4ja14oudevLyTVfOnZ/O3btu5vu+W33fvfw11P7NvgrRPD3xCs/HHj/T4prexuFmg0/U4t6TS L91pF/iVW+bb/u11YLJ8DlsI4qdTmlFaRSW77eh+eY/F59nGMll9LDyhGTs5O9rJ6u66M/Sv9mT4 MeAZ/wBjDwLfeP8AwBYpf3nguH+3Fu4m8ySFZGmXzFZvl/dxxt/D92vNf2dP+CkXxf1a0bRPFNl4 XXRFuG/sbUJbO6Vmtd37rzFgZlVtu3dXNftEftKar4s/Z28Qvp/xOuleS1hins7VIYI5reSaNZVZ trSfd/ustfM8fiqztLhP7B1iSazh+WWSFFXbtX5V3L/F92uDAZd/aNOtOorOctP7vX9fwOLjOtVy ypQw9WTm4x6322STfofpF42/bi1vwH4X0rxVDpXhHxUmoa5DZW9jpN5cRSxyMrN5jM27bt+X7y/e avo//hPPijp+/Uk8NeGZlhTddR3GqXEW3b975vJb7q7v++a/FjTfE9zYQw3+pa35etr9zdLtkhVv mj27f4l+X73+1Xpfw3/bY/aT8D3QstO+M19c26/cjvNs/wB5fm+8tFXhrH04ReHmnJXu3pfax8ZD M8BJv2ycV062P1h+Bf8AwUg+Lvjq61qz+FH7Hlxq1z4f1abSb+S18c26RNNG23creT80bfKys33l auzuvid+2V44sbt/E9npPw71e6024n0lriddeaS6jZW8mRZNsfl+X/Esfy/LX5xfsk/8FBPiX8Mb XW/O+GNjreva9q91qOs6g22KC4aaRvLX5V3Ku3cv+9/s16u3/BUj4+eLNPsL22+EvhfQbS106RNO t49zSRtNC0asu37qqrK21fvMq7q9XE5bnMqcIwjrZaq3Zd3+hzUMZlkXK7VvO/5LqfePwJ+LnxX1 r4xeJ/gV8Rb/AMJ3N14f0uxvYtS0vRJomuo7j5vmj8zb+73R7tv96vQvHVr4ejZJvid8bPLto23L p7X8NjBu/wB1fmb7v8TV+V3hX49fGjxR4wuPiv8AFT4sahdX95FHBdfZYvsytCq7Y1aOP5WVfmbb XtV3r2ia5o76to7xib7P/wAfDWsbbt3/AE0b+KuLH5fmFFxhNqzS21167Bh8wwt2433fl6bnl3/B T74peApPjRPN8BbiO1a1SM6h4m0GeSCTUJpF+dmmiZfPjXaq/d+9826vhz4lz32ueHL2zubyaRmt 22+bKzFW3bv/AEL5q+oPihb+HLnWpjrNhqWrWscEn2+x0nakkkK/NtWba21tyr8zK1eHePfD9pfu 6+DvhT4isoP72p3ElzI3/fMMa183jKEsDjoNPSyf3PU/sjwUzjL8z4BxWBqQXOnKLlpqmtE29fuP BvBuoebaxhOfkX7v3q+mf+CXvhyLxV/wUO8GaRcvN5Uml3lyVVP4Ydsm5v8Ad2rXh/gbwX/wjVtf Wl9bSR3X22RGhmiZWjVW+Vfmr3H/AIJ0eL9Q8BftpeFbvw94XvNY13VIJtO06zs4t25ZGja53f3V 8lW+b+GvXxlenNVHBXvFr70z8CzPB1cLSnTm9Yyt32Z+2UP7n53+793bT777bdafNa6NtSRk2/aN n3mb+7/tVXa3kt5Fe/uVVY/+Waru+X+Hb/8AFUk2qG3O90aGKGJmg3fw/L/F/tV+aSqKMTzoI4Ox 1awmVn0t1RYZWiSFm3K3ltt+b/x6objWk0yYPLH5Vrdfe/6Yt/F/wH73+7VLw+LbT7FbC5tlT5mZ 2X+83zfe/wCBVPuh1JZ7a5T/AFbsqeZ91l/z/wChV8vWm51W2z04RUYJEWsSTW9wv8KN92Zf4a+T v2uf27dO8FWXiLwH8PdKefxXo8+1I76DzLWT5VZmZlk3K21vutX1P5k2m25tpka7st3zqr/vIf8A 4r+Kvze/bf8ABfgfx98ZvFevw6q1pexX/kPqFm7fu5FVdqyqvzL/AHfmrvyilhK2Niq6bj5eq38j sw8d2lqj4p+Pfj74hfEzx7feMvibrc19f3T8TSbtixr92OP+7Gv92vuH/giV4Pv/AAd+1NaW+t2E 0P2f4ZalLtki2t5k01r/AMCX733q+ZPAtt4r+HXxKsdd8T6DpOuafYzrdxSapBvtmmhZZItyr/rP m27lb73zV9of8Ew/HvxF+LH7W/i/4i+LdUt7mGPwRdM32e1jtooZJr63+WOKNV2r+7+7/s1+r5ji 4/2Y6VNJRUXa221kktLdTmwuHqvFSqNbu2u59Hf8FEvEdrZaTfvbRfKt191X/h2/dWvzS1jxLe6E dU0u2nmt4NTtZIL+G3laNJo2/wCWcn95a++f+Chmt21xod1awzL5yuyy7nb+6v8A9lX54+MLG8td We0uGVlVf+WbfLXyGWJOo3sft3CmHjLLuWaTv3Ogtv2ovizonwth+FejeII47C11i11GyvmtVkvL OS3ZWjWGVvux7l+Zf4l3L91q534pfFHxz8ZvHt78SviTrP8AaWsagsa3V01uqLtjXbGqxr8qqq1g XVi7TLJ/dqzHbo0ZfH+zXuc0IRtFb/rb/gH2+V5ZhYYn2iglLv1K1rMitvcfd/i2/dr9+f8Agip+ yrafs2/sY6V4v13S1j8S+PUj13V3dSHjhZcWkDf7McOG/wB5mr8JPhf4OHjn4m+HvBci5XWNes7B l/2ZriONv/HWr+jr9sv4iT/s5fsV+P8Axz4TT7PJ4a8EXKaQI/uxyLAIYNv+6zL/AN8114RLWb6H 5t4y47E1I4PJ6WntpXfS9mkl97v8j8fv+Cl3/BSD4wfFX9rzxLd/Bv41at4c8LaHKdG0aDSpdqXi W8kiyXTf3mkmMpz3ULRXyEv7oeXIZXI/iMnWiuOWNnzM/ZMs8K+H6GXUabw6bUYq73ei1Z8q2c2l KvyQyNWzY655K+WlzMiN/Cvy1iW1i/30TK1rWOniX5A65/u7a/d/Zxk9Uf5uU5ST0bR9Df8ABNP4 f2fxg/bW8C6Jf20k1pZ382o36+a0fmQ28MkjLuX5vmbatfUP7T2la34P+Lnir4aabd2f+g+GZtRS S62ozW+1WVV3fxfN8v8Au1xn/BC3wrDffH3xT4q/srzDpPg2SKK4ht9376aZV+Zvur+7Vl+avo// AIKF/s1eJPF3iLVvjf4ett9pp/hKSz1LT13LPIrL+78v5fm2tt3L/dWvjcww7xefKlBfCvLe9/no fVYDGSwWCS5rKV/x2PgTxBdar4is/DPiHxH4njvPtVlcJ5az7pYVh3Kvmf3d33l/2a+mv2I/hnqv jj4Y23xa1zRGklhv5rXTdsrLG1vHtVpG/vNu3f8AfNeVeFf2ZfHi+Hfh1a2fhKa41Xxha317pawq 0jTRtJMsEe3+83kyN8v8LLX6Nfst/s13Pww/Z38JeA/EOlyQ38OiK2pQyJtaO6kZpJFb/daTbX2+ CwVJUnzx+F2Wlv6sfNY6vOpJtve3W/Q4LT9Bv7W4juYdN0uNof8An4tfN/2vus1eZ/HrTfEPhtZv EjeHrO80230ubzVs7NYlhkZlWP7qqrfe+X+KvsGP4HGMi53svlv93Z8tFz+z+PEULQ6ja/aLdp1l SFoty7l+7tWtcRluFxMFFrZpiwOMWDbcd2rfeR/8EQ/AV58Frq1u7w7LrVrxbjVG+Zd0jL/q2/2V Xaq/7tfq/wCLtLg1XRJEe3Z9yfKv8VfKH7FPwAXQNQt57iFf3MqvuX7yt/er7HdF28fdC104uUYT p2WqX4dDysc44ltJ76H5Y/t7+ETq/i7VdSm2uscrQJ5f/LNY93/jvyt/31Wv8G/DN38If2TY7zw3 pvnaq3h+81lI4YtzzXkkckke1f7y7Y/++a9e/bo+F1tb63f6lYpG6+UzSwq/977v+61eAW/7Zngn 4U/DW20DxR4V1i71fR4PssUdisfl3W3/AFbeYzfu/l+98rfd/irkxKg4c59Pl6x2KyynhsNFy5ZR vFdUu/lc+Ifgn4Iuv2f/AA3d/tufGPSZorjTZZIvh1pOpxNHLrXiCRW23Xlt832e33NMzN/Eq/3a +vf+CWkFsv7H+keJI9Q8/Uda8Qatf6zeTfM0l410yszf8BWOvh79rr44ePv2jPiBJ4z8eXqrHb27 QaRpNvKzQafb7v8AVx/3mb7zSN97/d21m/s9/tkftCfsx2934O+EupWN5Zatdef/AGHqmlteL9o2 7fMhVWVlZl27lX721a+beKjSqWafLa2mp/QuZcJZrxDwupc0YVm4uzfuqMdo39dWamn/ALCPxA8J eItb+Lv7atvN4S8D6Pqk0+tXklzG154imaZmWz05VZmkknb5Vk/hVmb+Gv0d+HN/oHxc/ZL0nVbO G38LaL4i8B7VXTZVWLRbWa3aPbHI3yr5Ktt3N/FG26vgjxJ+zd/wUj/bk1y18afFHQbq3tY0b+y2 8SSx6VZ2qt97yLb73zf3vL3f7Vd1pP8AwSN/aWuvBP8Awget/tXabY6O0vmv4ftX1Cez3fxfu90c f/jtc9D2lJTVKk7Pq3q/+Ac3FFHKc1wOGpZtmtOnWpOL5YXcUkrWSW7v1Pev2MfHf7GPwg/Z+1Gz +DnxL0uz8N+GtZuINX1zXtUhin1C4jVV+3SLuVmjkXb5O1fur8q1+fP7Yf7THg74n3Np8H/gD4f/ ALB+Gnh68muNLsXVvN1a+kb99qVzu3M0jbmVVk3Mq/7TV6f8Sf8Agjj+0t4a099R8D694X8YPCm7 7LZzyWt23+6s67W/3fMr5U8aeBfGHw68S3Phbxz4U1DRtTtX/wBI0/UrVop4/wDgLfw/7VeDm2Kx sqMac4cq/B/M/SPDbhfg2pnVTM8NjvrNSVvdk9U+9urXQ/Ur/gkH4VstB/YpsNVtdvna54j1K8uG X/ZZbdF/75jb/vqvnS9/aQ8DfAr/AIKcfGT4+fEiKe9bRI9Ss/D2lxffvLr/AEe1hhVv+WSrHuZm /hVWr0X/AII5ftJeFD8O7v8AZk8T61BZazZ6vNe+HIbmVY1voZtvmwxM33pI5I923+JZG2/drqP2 zP8Agl98Ovi38TNS/aDvPjGvgG2vttz4tbVrBWtWZV2tcRyNJH5bMqruVty7vmX71dtVzq5dSnh7 Nxtu1ppb8GfBqOFyPxPzOjnsJqniFyxkottptNJWT0a00PkPRde+IP8AwUR/acb4hfHrWI7Twv4f sGv/ABTeQR+XZ6HoNuzSSQxf7UjM0a7vmkd/++fv/wD4J66naeL/AIa+NP2vtR0ER3XxB8R3l7Z2 SRf8e+i6bH9nsrFf9lVhZdtfn1+0p8e/hF4f8DH9lP8AZEtp4fBMd2t14p8UXw23ni68j/1ckn92 1j/5Zx7fmb5tv3a+lf2Bf+Cl/wCzb8Gv2V9L+Gvxg1rUtK1bwr9oit7e00aS4/tGGSaSZGiMfyq3 7xlZZGX7qtu+auDLcZhaeJlGrNN2bcuje2notj6jj7hzPMw4Yp1stwslS5owhSSd1TvdyaWzk0r9 kl1ufOH7PumXPj/xx4p/b+/aA0+Wfwv4Z1aTXLsXEu1dd1uSTzLTS4t33v33l+Z/djjG6vtH/gij dar438BfEn48+OLoXOteMPiIraxdMvzSbYfOk/4Dunbb/u18K/tw/tweI/2uPFFrZ6VoaeHvBWjS yHw74YhCDbI3+sup/LVVe4kz/D8qr8q/xM1j9i//AIKKfFn9i7TNb8PeEvDmk67pOtXC3D6bq7yI tvdKu3zo5I23fMu1WX7rbVrmwuZYXDYu17wV9erb6+lj2uIuBeIeIODZNU4wryjCMKd1aEItO1+7 er+S6H2p+xB+yF4l8F/tteL/AI//ALSYgsPE+q6zr154B0G4nWWe6h+0f6Tq21d22NY5o442/wCm jV6l+1F+zB8Nvij+2R8JfjB8cPiXYxaJp/l6V4V8EzI3m61rXnSXS/7PkrtjaT+L9yqt96vyy8S/ t1ftN69+0Ov7T/8Awsya08WwI0NhcWEKrBZ2vzL9ljhbcv2fazfu23bvvN83zVy/xk/ab+N3x68f wfEv4tfEnUtV1uz2/YLzzfI+wqrblWBY9qwru+b93t+b+9W6znCU6ThGDfvX9db3Z87U8KuMMXmd HGV8VGDVLkdk3y6Wslttu77n6yf8FT/iL8A/hH4f8I/F743ah/but+Frq61DwF8NJpF8jWtYkVVi vruP732e227v7rbtvzN8tfnV+xx+0posfxk8Q+Kfjt8QI7bWfE/inT9fvdc1VmFtqjwyXDT2NxJ/ ywWbz1kjkb92slvGrMvysvz9408beLPHmsTeJ/GvibUta1K4XbPqGqX8lzPIq/d3SSMzVz8jO3Pm f981yV84nWrqUVZLp+rPoMj8M8PkeSzwleq51Jqzklayvey3sr79z6S/4KA/HbwR478H6H4G0vXt J1PWPtlnqOsQ6Dqjahp+htb6Wti1vFft813JcMv2iRmZmXy4Y2kkZfl+T7peudtaN55ki7H+7/Dt rOuo/l+/UOtLEVueR00cnpZNgfq9NtpNu77v9DKuC6qZB0rL1PbMy7H5X7/+zWvdKh3Zeuem+WRp s4+bdXowSsfEZrLkk0luNQmNdmKdGqKv+6+5GpI/m3P/ALFKuxlPyMKu2p46k2WL+Odb+4cSMR5r Nu3f8CqOFpZHH7xqlvLhI5otka4aCNv/AB2mtdwnd87f3f8AgNZNaHuYecHFMr+JZrn+zEhjmZfO uo03K/8AtV7F4J+H+lSeG0ubndKzLuWOzSOLa3+18v3q8S8R3FtG2mPHcMAt+u5dm7dX1H8P9LWb w3D5EMZTyvkb7u6uv2rwuDg092z8T8Q6ksVnji9oxSXz1PPZPhSltP50KXUsczt+7uPLZl/3W/2q rR+E7mPUFjdJI0jVd7SSr8teryaTqK3CW39m70+b5l+auU8SWdmk01m+62lZdq/aovvf8CrvwuYK c0pM/M6+H5Yaas7z4B+MtBXUjbIkclrJaxpu2fwrI33q9V0/w3ol5Z3M1+iusPlpFJGv/LNY1218 j+FdbtvDeoQ6tc39xao26KVlf7u1v7v/AAJq9n+EXx1/4SLSNStryZZUWdYopNm1l2qqt/6DXuzx 0JzUbNbLyPOWFkouTZ9a/Dv4V6brGgsqIzNs+dvKXdWT49+GvjHQfD7aFo+vXCWcaf6LN9ljeWFW /ebVb723dXR/szeKrDUFfS5nj+ZFkRml/wBZ8v3a7b4iaZcwae81xbZjbbsZvl2/7NeDisVUpYvk lqvM66VKLpcx8D+JtZ+JfgrxUvie28YaolzDqkO2PzdsczRzecu5V+9/q6+g/j1+3VpnhLynttRm lmvollW1tbjey7l3fNtauK+P2g2zpDf21qoW1uJJUVU/2fmr5Q+I19qVz4qm+0TbBHFHFEq/LtjV fl/8eryM9w9LFyhNK29/wP2/wYUK+LxFCtL3Uk0u/RnXeNvGkPxA8dax4tS2+ztqV150sLfe8zy1 3f8AoO6vSP2DfFmufCb9pfRPjT/ZtxFoOjpdLreofZW8tbeSFl2rJ/eZtv3a4X4Lw/Dfwjbf8Jb8 TrD/AISC+mg36J4Xtbry4pG/huL2VfmWNW+7br80n+ytZvxM+IHifxJdLeeIdVzDGira2NunkWtu v8Kxwr8qr/49/tV8zVjL3qS6q336Hu53QhVx1anT+FN69Pkfu7pOpWGs2MOpWdzHcRNErwSRvuWS Nv4lqS6KTabNFcRr5M0TL/tLX5r/ALDP/BXzw18OfhrZfAr4weFri7udBib+y9ebWY4muLXzG2ws skfzSR/d3bvmWvdLr/gsr+zHY20t1qfhvXo02bf3N/Yy/wDfP7xWr5PFZTjqU3T5G+z7nyUcPJS0 1sz1Pw/q00ml/PbMZluJEeNk+b5WrSF1+/YIm3y/ll2t80bfe/z/ALteAfBb9v8A/Za1zwjNr3iH 4iW/hueTVLhbfT9YlV7lo1Zds37nzF2srfe3f3qsWH/BRb9ie81K/wDJ/aG0lHhdW2/YLzbIrfK2 79zXy08pzKM5R9lJtb2TdvmlY9SUNfI6z9qH4z3Pwa8AjxHYIwvbi8jtYrqFP9WrfekZf4tq18Sf Ez4I2/iqfUvEuj+JJtL11t0txqEcrbpG+9ukX/lorf7X96vWf2rv24/2PfGvgiyttN+PunzNa6z5 8tvDYXXmfd27o/3P97+H/Zr5o8WftofA6TQb20074jfbrzUN0U7LZ3Sqq7l8tv8AV/8ATNflr1Ms yjO6c4zo0Zp31fK7Nab3VrHVTr4OnTcZzS8m0meT+OPFHi7wnr6R+JPDscCTKplktG/0a6X7rSR/ /E/eWvqH/gml8ZfCfwb+M9/feLb+SPRfGmjR6Rb3zf6i3vPO8y2kkb7u2Rm8nd/CzL/Dur5u1z4l /Cn4ymPwpbeIZDqd5f7YPtltJBbtJIvzSLIy7Y/mVvvf3q9i+BHwru/G/wABb/8AZ18bfEaOLTbG 5h1vQrjQLCN7pYZLjb5cksnzNCzLujX5fmr73FQUcFavF05OykrPVX1a0extlaeJxThFqUe6tdPs fTP/AAUN8VrqHg+0eG28szXV4zxzff8AlmWP5v8AvlVr4YvLt1v5Xd96yJtfzK+iP2tPGh1Lw1o9 gk0kzx6dIs81x96T983zbv4m2qu6vmK8vZo28qMKf4nVq8HL6fuux+35Hh1hsAoXJbji6+4v9779 Nt5vMkCbPlaqf9oOzj5MMtPsXPmZ/wBqvRlFpWPtMqglLU6TwXrk3gfxhpnjPTYfNudH1S31GCPf 96SGZZFX/wAdr+ib4s6P4Z/b8/YZ1nSvh34ht2s/iN4Jc6Nfh9yRzTRb493+7KFDf3drV/OLb3H7 1uV/2a+i/wBjD/gpj+0x+xC76H8M9etNT8NzyNNdeFNcjaWz8z+KSJlbzLeRv4mjba38S1tg8SqK cJ7M+W8SOBsy4nWHxuWte3otuKeiauna+100mr6dzyL4m/Bv4o/B7xrffDz4oeC7rQta0+TZeWGr WcgcH++jKu2SM9VdeD2or9E1/wCDjnVZYo31v9kHTZrkxjzHj8WDbn2D2+5R7HpRS9lgW/j/AAO6 hxD4r06MYyymLaSu+eOv4n4W2LI2woFUVsaTb2zZ3j5mrPsbU7t+xcV0Oh6akzLvT/7Gv39RZ/n3 yo/Tr/ghP8P00f4O+NfiQ6L5WqeI7eyeNk/5Y28PmfL/ANtJV/75r9FPh34JtvFl9qrJZxzxfbFg +y3S+ayxsvyq38LL8tfIn/BLPwRbeBf2LPDs11CzXOtXF5qiSMjKsayTKq/+OxrX6Kf8E/8AwvZ+ LNU8VSXiNst7y3dmmRtzN+8X+Kvk8uUanEVSrLZXX3WX6HpY9qng1FbqxjQfsy6Ctxpt/c/DrT0f TUb+ybiSwXda/wDXL/nn95l+Wta+/Z18S6gsr6fZNMkar91drMv+796vrdfDOjIyOsHyxrtVf/Hq uW2l2lvzFFtr7N4yklpG7PmHKq5anxbD+z74htbwWFzbSbpnXYu3durp9F+Aeq2qhLWw83zG2pt+ 81fU13oOlXrF7mwjLN95ttTWem2dnCsNtEqhf7tH1+KStHUac+5ynwl8B/8ACH6CiTJtmZPnVl+Z WrsHTbHTvL96Vh8v0rhqVJVZuUhnz1+2t4Q1LX9MtrnR7CS6ZomWWOF/mXb91ttfnZ8Wv2Zfi74y vrlNB8BzpC337i+dbaKP/aaST7tfpn+1ZrGpaFoUU+lT+S7RM3mKqt91v9r/AHq/M79qTxJ4q8UT XL+MPHNw1svyrp9xK3lzN/sqvy/99VrJxdBXXQ+w4Pljo4y1OSSvo3d/gfPHjX4P/s1fDOaSb40/ GOTxPqMYbf4V+GsSy7m/uy6jJ+7j/wC2atXJR/ty3/wi32/7L3wF8GeAQx2f2pcWTaxq8n+01zc/ Lu/3VrB+JUKC4bCLtV/lVf4a8l8RMkbPsk+61fMYus4L3dPQ/rPhnIqOYUI/XZyqJ9G2o/crJ/M9 ck/4KaftvWuoLqX/AAvKSQs254bjRLGSJv8AgPk17FpP/BZzxfH8FdStte+HNi/xAjaOLSdQtYmX TJlbd5lxNFu3K0e3/VqzLIzL91Vavh28bDEVWnleSNt3yt96vAnmmLo3Slufb4jw04OzWMPbYSK5 Wmmkk9Oj7p9bnrvir9vT9sbxbfPqOpftH+KYWZty2+mX/wBlgj/2VjhVVWsXx1+1h8cPih4WPg/4 v+KYvF9kke2xk8S2cc93ZN/eguVVZo/93dt/vK1eb29wN2z+98tMuG2N03V4lfF4irpKTa66/ofc 5dwvw9gZQdDDQjytNNRSafk1qAuJLUo8Um0r8ysrbWVv/iqv6/468Z+LYVtfFPjDVtRjh/1Md/qU 0yx/7qyM1Z02THj0quHy3ls23t96vNk6uyeh9W8Nl1WSnWjFyWza1XzGzM27NMeZwuxB/vVqaL4a 8ReJboQeHPD99fy7lXybGzknb/xxWroNL+A3xm13wddfEnTPhdrT+HrOGSW41trRo7NFjba371tq /Ky7dv3t3y/erBU6jlon9xOKzDAUPcqVIx1S1aWr2Xq+iOFkZ8YpAd64zT5EIk+5/D0rtrr9n74g 237PVv8AtKR2sL+HrjxRJoblHZpY51h8xZGX+GNv3kat/ejainSqVL2W2r9DkzDH4PBKDrTUeeSj G/VvZLzZwKlvmzTJY3ZgdvzV6Z4C8P8A7NUHw1Pif4s+KvFb62+vTW9vofheG0/48o4Vbz5ZLn/V 7pGZV2q27a3y/LXrHxZ8B/sY/sx/FXw14X8SfBvxj400XWvC2k6++pah40W2ka3vIfM8uOC3t13N G25fmk+ba33a7IYScqXPzJLTr32PkMw4mw9DG/VI0pym78qSsnZJuzdk7XVtT5XuLZ3j3/8Aj1U4 7Wa7kS2tbZpJJH/dRxqzMzf7KrX1Dquj/CbUf+Ca9x8WNC+CXh2z8W2XxHtfDOs+IQJ555LGSxe6 SaNZJGjhmZo9rMq/d+6q1V/aD/4S39i7wP8ADbwB8I9UuNC1nxV4As/FnivxRpjeVfXlxeSSeTZp cf6yG3gjjX93Gy7pJGZt3y7euGBcY+0k/dsnou58zV4qhiarw1Ok1V5nFKTS1STbbV7KzXnqj5kf SdQub7+zYbKb7X5qxJarE3m+YzbVXb97czNt/wB6tL4r/A34v/Bi5s9N+Lvwy17wzPqcLXGnx69p klt9qhVtrSR7vvbf9mvrX4W+MX/b8/ZY+KHgj46tFq3xB+F3g5vFvgjx3cQxrqE9jbuEudOu5lVW uY9rLtaTcy7/AL3y1P4W/aU+GM/7LXwi/Z9/bL0S4174XeJfDGofYtbsV3a14N1S11a4hW+tJPvS L5bxLJbt8rRr8v3dtepQwdLlUlLSSuvy1+Z8HnHEmYQqSp+xvKnLlnFO7aaunFtK+nSx8o3X7MPi i1/Zpn/akv8A4geDofD41RdLi09de83VZL5lZltfskcbNHJ5aySfvGVdq/erY8Vfsc/Cj4U38Pw9 +Pf7Q0vhrxxfeDrfXbfSYvCzT6Zp8l1Z/bLKxvb3zlaOaaNo9zRxssbSKrN97b6/+0h+xx42/Zh/ Za8fabe67ZeKvAmseJvC/iPwJ4/0JvM07WbVvt1mzbl/1EyrOu6Nv+A/LWt8OfjR8EP28rvwb+xl +3J8GLzSviM1vY+GvBHxj8Po0Gpwq0arp8OqWjfLcw7WjVZP+ee1vl3bq7fZ06cG5aNK5+eY/Mq+ LftacuaCk72SUkrJrR9tbrc+A42+VJtjfMu7a38NPhV93+0y1e8X+HLvwZ4t1bwhe3lvcXGj6pcW E81u+6OSSGZo2ZW/usy7qzo5QsuMf7Py1i79DthP2lOMk9GTXtlcz2NpeImV8pkXb/ss1VNjIV3x Mv8AwGtNbZ7rQoZkm8t4bqRX2/7Sq3/srVVk0+dv9ZeMaXKd9Gs4RVjD8UO6T6W7dPt6rtr7N+D9 rbXvhu3TZHhlX/e+7/er4p+IynTf7OG9W3XTN/3zX1x+zb4gE3ha3S8LIrIv/fVPMaVT+zqcl3Z+ M8XVY1OIai62X5I9Mk8Ho0n2n95D8/3lf5a5Dx5p9msckE2tw7ZItqxzLur0bw/rFtfXCaalyqeZ /wA9vl21xHx20mG1s/Oj8Qr5sfzxSLEq/wAP3awynC4vFVbRV0j4vGVKVGOrPnXxvorx6DfXN/f2 +2z3S/LP8u1vl3Vr/sq6u+ueHrqH7LxNe/O0n3dv8P8A6D96sT40WtzffCnV7m8vFkZbLek0btu+ WRflpn7Lut22h+Hd9zt3wztuWT/x6vra1CpDDyTXvKx5tKoqk7LY/Q39jeZIZIy81v8Ae+XcrM27 +781fVXjyO2vtDQz7dkiL8396vi79mX4gTW+nWd5pr28jLdb/wDVbdy//s19nXl1H4o8Dq9sY1aP a67f++q8bM6dS1OpLdrX1Lw7S5oR7ny38aPCts2l6jsmVQqSLt+7XwT8T7iGHxxqSJuC+auz/aXa tfdnxujv7dtRhuXZI28zYzPXwR8Zrj+zPH8/nQbmkgjdZNy7vu7f/Za5asXOkm3t/kfqnhZinQzq cP5ov8GjQ8N6xDb6ogd1wyqu7+98tUPiZ4hmk8M32qeRIywRSNj7vzLWZa+OYbRkd4W2R7fvP827 5fu/+PUus+NrO+k1Lw8kCyJfJ58Sr93ay7ZP/Hl3f8Cryo4aU8QqjjdL/NX/AAPsM9qfV8VVhKVn J3Wnfb8R/g688NajrOharrkEb2+rQKzNI3+rbcv8X92uu1/wL4S15ph4bvPKSOVo1uNNla8tW+b7 zf8ALSP/AMerxPTPE8en/CnU/h74r8PtLf6fdK+galDLt+z/ALz94si/xKyr8v8AvVs6XZ3PijSY /GnhLXrPR7mOJfNjh1Fon3L/ABL/ABfNXo4rAS5nJScUnZPdW0af3afI+UwOPT0a5pNJtbNNaPex r+LdMv8AwXqdxoPiSz2XMaq3yv8Awt8yt/3zWBZw6lqU7Pa3n+js3yRxy7d3+9Wd4l+IvinWN769 N9sv4/kluJn+dv8Aa3fxVS8KeIJPLmhTdvjuPn+b5q2p4OrToOTtf8PUdXMcPVxMaavbX19D1TT/ AIM+INU8OzeIdcgkhtViZ7eSSLcsjL/7LXkmpanbWMq6bbWcLLG7b5NnzNXXT+NteXQ5La51a68m OJlSFpW2qv8AdrzWW8muLhpppP8Avr+KtMroVm5uo7rokcGd4ijTjD2a16v/AIcu+Idav74g3UmB s+VY027a+iv2AvE15Z6d4wuV1GaXamm28W6Vm2/NI23/AMdr5n1Letv852n+8te+fsCWnh+58K+K bvVPG1vp1x9vs/Jtbq1kZZlWORmbzFVtu1v4f4t1VxBShLI6mnb80bcD1KlXi2hFttO/5Poe5fGr xReXFnpUD37SrNoysyq33d00ny/5/vV5bNeNbl94XYzb2Zot21V+983+7XX/ABLuNKjvLCGzvFkV dJt1n8t/+Wm1mb/0KuSs7e21LULewm3bLi9hil/hVY5JFX/2Zq/OsBSUbR7n9WNqhh7pbH1N4F/Y L/Ze0fwppMH7WH7eOlfDPxz4l02C/wBH8HDwpLf/ANmwXKrJatqdwny2jSI0cnlttaNWVmr5/wDj L8J/FnwB+LPiD4PfED7LDqnhrVJrC+a3f9zIy/MskbH70cissit/davpT9o39gT9pj9o7x98ff2l PAyaNNpnhzxLrd0NCutaVdXvtMsZmtZbq2ttvzQx+T5a7mXd5bKu7bXtfjb9mz49+NPiZ4q+Jn7K nw28L+IPGWqa5LE2reLVs7l7ex0zS9Pt/sun217ujmuZpPOkkk2syxxwruXzPm+hxOEUqVuTls9H 3VvzPiMo4veWYp1amJVXmTvCTjGMJaNK6V0km73u3b1Pzet7pJGDJMuz+9vrW8NaRL4k8QWWh215 awSaheQ2sV1dTrHBG0kixq0kn3VjXd8zV+h938DPhX+0X8CP2Yv2wNb+FGg6H4q8R/F+x8K/EHTt I0iOzs9cj+2TRmWW1RVjEn+jfNtVf9ZJ/dr0jxD+zz+zZpf/AAU01H4eaf8As++DLrR9Y+IOl+G5 tGu/D6ta2tm3he41K5aCJSqxzSTLCzSL8235a8l5e73vofVU/FrDKnOCoy9pGE3KzTScWlZPS61u npdb2Z8EftYfsY+L/wBlL4m2/wAM/EvxM8I6xPPotvqCXOl635aKkpcBWV+d2ULZ/iVlb+Kivtu1 +Cf7N+lfFX4lfDnwx+yd8KrjSfB/j+50fS5td0We6u2jW2tp2Ekpk+fbJPIq/wB1VVf4aKp4TD3/ AOCYYLjviurhKc1KUrpO/JBXuv8AEfiNYi2b50tNp/3q6rw7Dt+dEVV/2U+7WNpMkasr791en/AP R9N8YfEjSPDGrP8Aubi6/wBIVfvNGqtIy/8AjtfvMqkaNJzlstX8kfwrRbqVIwS1bsfsb+zXpL+D P2YfCmlas6wra+ErNbhWX/pmsn/s1faH/BN7xLo13rviLToNcSaS4tY5YbfCqzKrfM23/gS18F3f igaf8MbGzub+ZUjtVdIdzMq/u1Vf9plWtm38ZeIfBHwtl8Z+FdYuLHVNLvLW6ivLW4ZJI5Fmj+b/ AMe+7X5/kuY06uYuT0UpNX9Xvb1Po8wwV6DTey/I/ZVSm1cutSV5F+yD8e/+GjfgfpnxCvI4ItQY Nb6lHBMrKJo/lZtv8Ib722vXE+6K+2nCVObjLdHx8ouLsxaKKKRIU2X7lOqG4uIYInlmbaFTc1AH jP7YOqaTpvguBbpt0zPJ5S+Xu/h3ba/Lr9pfUpriWbeI0Rdqpu+Xd/vV+iH7WmuW3ji0NhoOpKNR VJv7Nt2bas21VVlVv73zV8EfEbxVqtj4d8baPeaVY215a6XHPBNcabG1zat9ojjmVWZdy7o2b733 f4a6JxcaVup9jwjVjSxPMldprTbdrU+LPHtrqWu6oum6Jp9xe3Uz7YLO1gaWWRl/uxr8zV5/8Rvh T8U/BtimveMPhpr2lWE0qxRX2paXJFE0jfdjWRl27v8AZr6V/aAW5+C/7Ovg6z8GXMljf/EK3vNS 8R61ayslzNaxzeXBYrKvzRwr/rGVWXc33t22vC9O8KftIX/wy17/AIRjwb4mu/B2pwR3Os3UlrJJ py/ZZPMW4WSRvLjkjZWXzFbcysy/Nur5nG0Yaxe/kf1Xwrm9aeFVSDjGKfLq7N2dnZ9HfZdTOuP2 Ofjyr6Kde0fQdD/4SVP+Kd/t/wAYafZ/2p91f3G6b5vmZV/3mVa878eeBvF3w08V6p4A8f6Dc6Vr WlXTW+p6dcp+8hk+9t/4Eu1lZf4Wr6X0bwT8Jvi9+yf8EbP4ufFj/hENJ03x34g8PzamujNcrHHN Jb3SxsysqwL975m3Ku7d/DXmn7e+q/ES+/au8XX/AMU/Bi6JfRywxWmnx3LTxtp8MKx2kiXG3/SF khjVvOX7zSN/u14WYYGEKfNDe/ruvwPs+HOKcZic1eGxEo2SnfRp3jJJWbeum9v1Odg/Zv8AE037 ML/tLWmoJNaW3icadfaZGn721tWXbDfN/wBM2uFkt/7u6NqqfD/XfgJoXgWebx58P9W8SeJJNaIt be215rK3gslhXLSbY5GkZpm+VV2su1v9mvoL4b/Er9nL4L/Eyz+AfxJ0jxJcW2oeBrPwT46lN5ar ptubj/SJrhYtrTNJDdT+Zu3LtZWr5s+O3wa8Z/s8fFfW/hR43spI7zRr2SFbkoyx3kP/ACzuI2/i jkj2tXlYnDxoJVKaTWz62f8AwT3Mnzmtm2Kq4LGSlFN89Np8rcU9k1q7PfXVWPavjTf/AAN/Z+m+ G/ibwT+zH4Y1TTvFPgbTPEV3H4l1O+vn3ySSLPbrmaNVVWj2q21vvfNTfDHi7SvEv7CPxQ8ReHPA Ph2w1PRvGunxx6lb6Da/a4dH1KSfda+f5fmbVYKu75W2/Lu21J+1h8MPH95+xv8AAz4i6l4entho nhO+03XEnKpLax/by9ozozeYqyRn5W21wH7K/wAWPhz4f0Txx8D/AIz6zd6Z4V+Iehw2dxrlpZ/a W0m+tZvOtLtoV+aSNW3Kyr821vl+7UVZqOLlTdlGUdNLatLy7/cefQoSxfDv1qDnOpSq+97zbcYV Oib193stfuD9jzx1418NfETU/CfhPxRfafH4g8H65aXUNndSRLNJ/Ztw0TMq/wASsu5W/hrovgjc y+Kv+Cf3xv8ADL3byjR9S8L65awszMAv2qSCRtv/AG2WsCysPg/+z2mpeONB+PGneNPEI0y6tPDt l4Z028hghkuIWha6uZbuOPascbuywxqzM23cyrup/wCzf8e/g98Ivhf498JfEDwh4i11/HeirpU9 rpl/b2sVrbRzLLHMssiyM0yyRr8vl7VX+9u+XChKNNqnVlb3Wt7rVabeZ6OcQnmlGpjMJRlJuVGS 93lbcJ3e9notNdLni0g8liH2/L81fbXwi1P9nnwtqNp+x38V/iPrMUHjT4f6b4a1zR18PKtjo+tX Df2hb6g92027zIbi5jX5Yfl+ZWavnr/henwY8PeHR4a8Gfs7RyQ3GtW97q9z4n8SyXk2oQ26ybLX 9xDD5ELSOsknl/NJ5aqzba5v4mfH7xB8TvjRL8c7zwt4e0vWJ76O7ntdNsGNnNcK27zpIJ5JFbd8 u5fu/L92lh6tDCN2ak3ZPR7dTXPsJmXE8VRqUpUoxTaldX5klyuyu1Z3MT4l/D7xX8K/iFrXwu8c 2Yt9Y0LUJtP1KEnbsmjZlY/7rfeX/Zavff28PBni3Vfg5+z98aH8J6kmnXnwes9LvtRkspFiiuLW 6mjjWSTbtVmjkjZd33l+7Xjvxv8A2iPjD+0V4jtvFPxn8cDWtSt4miivZLC3t5Nvy/eaCNdyrtXb u3bV+7trH8UfFD4peN4nj8YfEvXtWhkaNnj1TWZpYv3f3P3bNt+X+H5fl+XbRH2ajUpwTala3lYw xGX5rXlgq9eUY1KLbnZtqV42aTdt73+R9Afs4+BNU8e/8E7vjB4Lm1TRLGe/8S6HqXhWHW/EVnY/ 2jcWbMt3HD50i7mWF/vfdb7u7dWTrXxd+Bf7V37P/hL4W/Hrx7/wgvj/AOG+ltpPhrxjfaZcXmma 5pO7dFa3f2ZWmtpoW+7MqsrL9779fNl1DbIwEyQmTfyGVWbb/wChVcs9H1bxFqVpo/hvTZtQvr6V YLK10+3aWW4kb7qxqvzM1ddOvV5FDk0slbvZ3XpqfO47IsM8XVxE61m588XGycWoqL1baaaWqaPT 9P8AiT4E/Zx+EnjbwJ8M/HkHizxX8QtIj0PWNf0mzuINO0nR/OWeeGBrmOOa5uJ2iiVm8tY441b7 zN8uJ8TPjH8FvFP7M/gf4NaF4D8UReJPB9xfzjxDeazb/Y5vt00c1zD9mWPzPLVol8tvM3fM26uR +IHwv+IXwsFlZfEbwdf6O+pRNcWDXsW1biFZGjaSNlZlZVkVlb5vlZfmrlL66tbdd7uq/wAO6umn OolyyVla1vxPAx2CwVR/WFNzk5KXNdatKy2srJaWsdfpn7WXxZ8Efsz+Lv2Un1GHUPBHi64tbxtH 1JGddNvoZlmW6tPm/dyNt2yL91lbdt3Vn3n7e37QtxoejWNtfaBbar4f0FdG0PxhD4Us11+1sVja OOFdQ2+duWNvLWT/AFir8qsteW+LNWhvLhIbZ8otYrzNzXRzNq268z4THUcL7aTUVdu7st3ZK/3b kj/vArp/301IvzTcDimws23y8fLSzMI/bdRd82pCmlHbsaEck0elXfkdI7qF2X/vpf8A2ZarNqUz fJs2bv4ttT6eyyLeW2FfzLPdt/3WVv8A2Wq6xw/cRF2/N96nG9riVVRbRyXxWuPMjsPnb5ZW37v9 2vor9n3Urm48Mw2xuPnWJX27fvfL/DXz98VLVH0WG5RPu3S7/wDgW6vd/wBmyRF8K2OoJ99ovvN/ u/drvxHK8thfo2fjfFKl/rBN9JJP8Ev0O4uPGuseHtZtndI5o/NVdv3WWrXxC1rUtasZoYplXam5 /wCKrOsLZF01KCwhuHV1Z1/utXDat40efULiGewZJbf+Hd8rK1ehkdXDU4c60l2Pg8xjVnO1jC+M Gh/avh29hcu3+lSw7pF/55xsrSf+y1w/w6vpdNXVdNuZl837VuTzE3K275q7X4teKU1DR9P0pLPy Rs3Mu7/P+zXn9jcOdcmhSNldrDzd277yq3/oVbzxX1nGTpp6W/FH00MmVHhWGLcff5t/Jq35n0D+ yf8AHiz0vXl8H65uSGa6V7WSP+H5fmX5q/Sz4P8Ai7+2vhy0H2ln8n5VZl2sy/w1+KXhO7mj8QW0 8MrbvtSsnzV+lH7I/wAWpG8I2mk6xqTRyrFs/efdk/u1zZk6ToKnN2fQ+bpUqkajnDbqS/tR6ilu tzC/mbpHk2r/AMBr4V/aFtFHibS7h0YLNoUTbf8AtpJ81fV/7W2vXkn2mRJuI/MZPn2r/DXyv8f4 Jm8U2cE/Lw6Nbo/97d833q8aUFTwkm+6P0jwzU6vE8YR6xf5Jnlnjy2ki8ITzQpIkqBXG1vlX5qb P4f1SPSrO8tbzFyzLLBJ/DGu35t38XzVc8W+dPotxbShcC2fbhfamWOoJdeH9NRmYYsI/wD0Gs6N RrDJx/mf5f8AAP0Di7DRjnSVS+sbfc/+GIfFGm2ep6jf3OiQzQwSeWsS30sfmtt27mbb8v3qxrFr nQY/3xj2M7fKvzba07ie2uJGSaFg6t8jLVef7NLCyI/yr9/dXRTqylHkex8bWo01UdSOktfxdznt ehnhZdYhLSxt8sv92ovCd1DDr93bW3yRyRK67q0ldLWZ7OaHzbaZPut/DXPaWr6X40EKIzrsb5f9 n71erBKdGUPI+erSdHGQqLZtX62b0fyZ1HiTUt1uumW7/wCseuZvo47cPI/3V+Va13k+2am83935 UrJ1mQSagln5n8XzUsJD2fur1KzKTrXlJ9bIfrUaf2fv6/L92vVv2RZ7my8I6nqFsM/8TBf4PlX9 196vM9St92kv5ZXO2vRv2a724074c3qwXDKt1fyK6q33lWNa4c5k5ZROK7r8z6ngCjP/AFwotdE3 +Fv1PW/F+oWdxcwrvZZI7W3Vo5P+ua/drn2864Uwwvw391v/AB6rfii4+y63cu23LJGn7z7y/u1+ asq5m8xmfK7f9ldtfn9KDjZo/qa8Z3iz7p8Hf8FjdH8L/CnxReXHwCZ/ip4m+HMngy/8T2+txppU 1vJcT3EmoNaeX5i3Ukk8jMqyeWzfN8v3a0f2b/8Agrf8Kfhb8X9Q+NXjL4R+JLy90PVfEF/8OtLs 9QtxBH/a8FjDNb3rP822NrCNlkj3fLJIrL92vgG2+ymX/SHVUVP79LDNGVzGMLu/v16NXG4mUVGT ulsfLYbgThvEVqkXBrnvzavqraau2l1p3P0X8H/8FKv2XYvhV8Ffhld6f49sYfhn43PjHxGq+H7O f+3NWaSaZ44m+1L5MKyTzbdyt8vl7vu16Z8NP2xPh98Xv2xU/bRs/CWraX4GtfitLfz6t4hv9PsA 7f8ACKx6bHap590qy3CybpGjVvljZW3fw1+VdjO8Y/dV6X4V/aW+MPhb4C67+zHpPiaNPBniXU4d Q1fSpbGGVmnj8vbIkjL5ke7y4921l3bVrhWInf3tj1q3hnl/sn9QvzTvGTlJ2UZO8mtLuXVdNLaI /Uz4P/Ez9l7TvFXxK8b/ABS/ag8CaHc+NPiZqGu6Xpdx4zs5J4bGSK3hhMvlSuiu3kM20McKy0V+ Pn2g/wB1h9WorL61H+VfiexS8MK9KnGFPGzUUrLSOyPDtJvpsf65m2/3nr3P9iVn1X9oXw3pSOu6 4uJk3M/yt+5avCNOb5hv3Ma+i/8AgnTate/tUeHtiKzW8V1c/wAPy7bdm3V+2ZpVVPLas30i/wAj +AMuXPjoJL7S/NH6b+PribQVs7KZNs0c8ayxs/8ADuX7rVoaqtzffBHxhCkO0tptwy7m/uqrfL/3 zXJePtQk1DUIX1LWPNuWtWdN23dJt/i/4D8tdZ4V09L7wbqWjzTSLc6pazJAskrbVkmhVV3f7PzL X5LlVZKvT5Hq5Lf1XTyPtMZScqMufs9j1H/gjl8QfHeo/G7T9M8M219Lp11BINeaOJvJWHy2ZWkb 7q/Nt2/xV+sahsEs2a8u/ZN+Bnhf9nL9nzwt8K/DVhbwf2Zo8K6jNCm1rm625mmZv4maTcfmr0ey 1G2vnkW2kLeS+x22svzf+zV+0YqvGtNcq0Wl+/n5H5vUk5S16F6k3r61DcXkdtHvuHVB/vVmap4y 0PRk3391sX+Jj/D/AL1YRhObtFGZqSXCRqZJGVVX77M33a87+IfxR0+xivIdPug0FrZSNPcQMrfM y7Y1X/a+b7tc58Uvj5ctC+neFw0KbWWWZkVt3+fmrwT4q/FD7Rbv9s1hpl83/R4flVI/4fuqqrXV SoNLmktV0CNN1ZcpyP7Q+ua3N4BXW4bO6f7PeSO9191l+WNlk/3dy/e/vV80/Eb42eBviN4G8R2X xFeGy8Ww+GbiLS9a37E1aP5WW3nX+Kb5dyt/FW98cviVZ3TTJ9pz5fy/M/8As18hfFLxhDdXEkNs 6/8AAfm8ta5sXX5YM/SuF8ohiGnLR3TTWjX9dS1qnxy+GPj74Q23wK+Op1ixTQ72a68IeLNHs1up dN87/XWs8DMrT27N825W3K1cTonxZ+EXwl+FXxG+Hdt4r1rxg/j3RIdMgjtdLk0yz09obhbiO6ka 5ZmZlZVXy44/us3zVz3/AAgPxO8eWs1z4J+G+uayisyvJp+nSSq23+Fdv3m/3a8r1Y3P2/8As2e2 kjmWfymhki2yRybtu1lb5lbd/DXzWLxVSGy1el/U/o7h/J8vq0/ZSm1G6k4pq11Z376tXdj0u+/a G8E/8Mvp+za/wourl116TXP+EiuPEbI0OoSQ+S3lwRw7fJ8v/lnIzMzfNuqtB+2B8RbjwFoXgPxn 4O8IeKofCsaL4Y1XxToX2q+0yHduW3WbzF8yHd92Obcq0H9k/Wlg8VXmr/GvwDDB4JVT4oaw1W41 CSzVrhbXd5dtbt5n75lX5W+X+LbTvh5+zx8KPHniTWNCsvj5JfRaT4BvPFHnaN4XbdN9lWRp7Hbc SK0MyrGrKzLtbzK8OtPGyfZteXT/ACsfZUJcLUoSlNOVpOTdm0m0r2fS69NDkPH/AMdfiH8S/if/ AMLe8S6pZr4ie4WdtQ03Sbe13TK25ZmjjXa0n+0y/NtX+7Wf8QPi78Ufixcw3fxK+I+t6/LZ7vs7 axqUl15O772zd93d8v3a6v8AY/8Ah38MfjJ8UrvwP49sNWuvM8Oalf6TDpGqRwNJc2tpNdCGVvLk +WTy/L+Xay11PwM8C+FvHn7K3inx54O+AVt4i8Z+GfFmmQsbh7y687Tbxbjd/o0Uka7o5Io13f3f vV5LoYicbuXxJv1tvoe9UzzJcuklClrT5Umkkkpuys76K61PB726kubhr68kaSb/AJ7TPub/AL6b 5qdY2N5qUpNjZyXG1WZvJDPtVfvbttdT8UpvE/w/+N+pySeC9P8AB2s6TqUfm6FYR+bbafcxpHuW NZPMVl3Zba25fm2/NX1P4e+K8XxAufD3x1SSZ/AvxUsE8A/GjwxpDLBFomoLb7UvoI1CrDG0KrdR /wAO6O4jb5W21y0MGsVNx5tU/wCn9525xxRPJsLTrUqCcJq97q197aJp3V7Nuzel9T5Y034EfGrx Bdy2tn8MNc82HTG1OVbrT2g2Wa/eum8zb+5+X/WfdrWm/Zl+J+jWPhPVfF66FoVh40Zj4ev9W8QW scM0a/enZlZmjjVv3bMy/e+X71dx+0xpnjb4O63460/xbqMs11ql3Z+GfDd2t40sVz4ft4YbiOaF vuyQy266f935f30tZvxL1I6p+w98F/EtrCrzaD4t8R6PMwX737611CNf/IjfL/8AFVSwdJSkne8V fp3S6LzOH/WfMa1CjWg4qFV2Vk39lve9t0uhxXxO+BfjT4G/Fo/CX452snhqeGeP7Xei1a5i+yt/ y9ReX/x8Q/3Wj/8AQq9D8K/sk/CfxR8V/HPwLn/aBbT9a8Mwt/Y+tavoq2mkahOs0EPlzSPM0lus k08arIy7fmVm212XxN+MHg7T/ij4q/ZO/a98OanL4KGu3F14U8RJat/a3g2S6Xzlmtt3+vs28zdJ at8u35o9rVleLPBaR/tK/FbwvP8AEnwtPY6h8NGS18SXeuW9nYahNNptnJbSRPPIv+umT5V+8u75 tu1q2jhsPB8yXMr2s3ZrTb7+p4dbiDPMVRVOpJ058jalFJwlqrNXTaetmm+ul9zifCXwi0j4e+Iv iF8Nvj98JtVTxX4b8I319p+nXOpyWv2W5t9rN5kca/6RG0bNIrK21vLX5mVq9W+HHwpm8V/s9fCr 4hfAb9lnwfr+u6l4o1XRvF82uWrXUVzLayWzWzSfabhVtvOjeTzPL/i+7t+Va4n4Xftl+EPGfw3v /hF+1TDJf3mkeFNW034d+PIg0t7pjTWU0Kaddsu5ruykZlVd25oW2svy/d5zSvi58A7z9jvRvgj4 18X+J4PEVn8QZvE0Uui+HY5YLOOazjt2t/MkuI90m6JZvMVdq/dr0sLLCU43TWz7Jp30TvfU8bMa ufYiSVWMlNSjdptxlFpq6Sastm1pZ/e/SP2Xte8Y69+zN8XPDfw88RaF4W1/w/rnh/VdB1vUJLWz bTYbjUJLW5ha/kj8xYdzQ/Kzfwr/ALtQftJfGnwh+zH/AMFFLnxP47+F0lwNL8ORaL46ttKt10xt aurrSWs7/VtO2/LB53nNNDIu1W27vl8z5fNvDP7TnwK+Guj/ABD8IeGfhH4h1fRfG3hOz0ItqviO O2uF8mSO4lvpPLjkX7Q11GrKq/u1jXa25mauCuf25vifdeG/Dfh/xZ4U8MeJLvwbC1l4b13X9Ja4 vLfS2VlfTJfmVbuz2ySKscys0e792y101cTTjRjGnrJW9NLnz+MwmMWPq1nH93JNNPRtSSTe/Rr5 dy5+0l8JvDvgf4b+HPit8BPjNc+Lfhtq+q3lhpKalYfZdQ0HUI445prO5g3eWsjRtHJ5kfyyferw C81C5upRJNMzfN/E9dT8QfjT4m+IGjWHhSew0vS9B0m4mn0zQNDsvItYbibb5s21mZpJGWONd0jM 22NVXatcNcTbuqVxxjJv3tTjlia1DDKEpX39bdL9LhdyfvPv1EzbV2B6ZJNuzTGcxtXTFaWPnqtb mm33JoWjjb56LiYyL89QxybW3/8As1PaRZI/kk+ZqJJXuKEm4tMtaPNOt4iQople1kSLzPu7mjbb upfhbo/jP4p6nc6ToOj+dPY2Ul1cW9rBJLL5a/e2xr8zN/srVTT5kt762eRM/wCkKrr/AMCqDwl4 h8Y+DvHEdz4D8Talol/ubzb/AEq6aCWNVb/novzL93+GuujBThKKtfo307nh5nKpRqwqwm1G9nFd e2/Z/gfSHjr/AIJR/td6n+x/D+134W8Kw694IvdGk1WO+08sskdvCu6SRo2Xcu1Vb/vlq5z9lrTW vPh3aXKIpdk2ruel+Af/AAU2/ai/Y98J3nww+A/x/N94S17TrgeJvB2uaSt1pvnXaNDcx7J/m3Mr fNNC0e6of2OdRmufAi2kI3GCVl2tXJjYYnDZdL2krrmTTtZ2fR2R8NmNaOYY9SdrpNaX6P8AT1Oy 8RG50OOaHe2fvMv+zurz3XpEvdWd4JNjb9rK38W6vS/G0MVxC/mIqur/AHf7v96vNJ7dJvFUds7b fnVX2/3d1Xktfmg2+34HzWZYblkuVHMfExbnUPF6WekTZ8mBURW/iaq2ofD3xhoekp4p17R2gsZm +ypeK25fMZdyq3/fNZHjnVpl8UPeWkzIv3vlb/aqfWPiZrt74Y/sW9128e3WeOU273LMu5W+X5a6 OatDFRlBaN697H6dhcHhsRwjOlOSi1BtJrdpX0+ZmeC7i5k8QQsj7fLn+dV/3q+2fgbdTQ6Whg/h r4j8B3EP/CTMj87rhtv/AH1X2x8KNStl0FJ/Mw6pu27afEM3CnCx+SZfG7khPjxrE19oskNzcq0u 5V+58rbmr59+MWufbvE/751Lx2qqV/u/M1e3fHxUulsb+GZgkkqtu/3fm218xePNYF94qvJsriOX yv8AZ+Vf/iq4KSqV8Ck3u/yP0Hw9rRwPELrtaRT/ABsiC8msblTHcpIysu35XxWFoFwi6FaQgfMk DI//AAFq9T/Zj0nwV4u+M2ieH/E+i29/ZTed59vcbtrbYWb+Fv7yrXE/E/TrDw58TPEWiaVbLb2d n4mvIreGP5Vjh8z5VWuqhhpxwzfS/wCX/Dn1/FmaUcfj4uKfNFavS1m15+Rh6k+2TzTH8v8AvU1x DH++8pW3f3qW6k+WIv8AxJtqstw677aY7l3/ACU4QbifK1JRb1/rQo6gJJlf+Ft9dP8As0/D9/i7 8VrzwjF4g0TTLiTwrqc0M+vXot4Ha3t3m8tZG/5aSeWyxr/E3y/xVzF8PKYD/gW2vZP+CUnwp8Ff HT/goR4W+G3xCsJbrRL631P7ZDb3bQM3l2crL86/d+ba1ehJuODnO+0W/uPIpYijhc0ozqO0eZXs r6X3s9zxTQ4mJklkC/KrM6t2rGhYXmqS3LJnd9yuw+ImgXnw+8a+LfCN3C0c2l61eWUscn3laO4k j/8AZa5exs0itxOH/wBqtaTSTn3t+Rz45RqTUY7Jt/joaUkfm6RK+Pl2fdr0j4IaZDZfB6x1FX+e 41e8D/8AARGFrzy1+bR5ECN8y12PwdvpD4EsbB2+SO8maLd/DuZa8rNXKWXyj/eX5M+98PIRXFVK T2UH+aO+8WN/xUl6kZV4vN+Rl+b+FaoW9x5kbRP/AA/7NR61eb9cu1d1/wBe27a+5WqKGaHzBJ8w Rq+S5Hyo/ornp8za7hqSjaqZxRZ+X5Y2VWvrrzLlvRaltZtq7Hf+L5GqpRfKXhKkFXbR6F8FfhX4 t+OHxI0j4XeCo4G1DVp2jjmvJfKgtY1VpJriWT+CGONZJJG/hVWr6a+Bv7J3/BPn42fEGz+Amh/t leLYvFuqXP2PSfEF14Cji0LUbtv9XHEGm+0KjN8qtIY93y/d3ba43/glrpHhPxR8X/HOk+MJZ005 Pg14jlujZNsuZIUhiaeGJv4ZJLdZo938PmM1fWHx4/ZE/Zx0X4Z/su/tr/s3fDF/Al5438beGYNT 8MW2pXF7CWupI5o2VpmZvMjaNl3fLuVvu1l7P3L2ufOcRcVVsNm31GnXnS91criotczTa5rptrTR Jd79D4d/ak/Zx+JP7IXxq1b4H/FW3tV1HT2WWC6gEphvbaQbop4j1KMvZvmVgynlaK/Qn/gttf8A w0tv2sNDh8YQWz3o8AWmWfbnb9tvtv8AD6UVk8NTvueJhfGDiH6tDnoqTsruz1ff5n4Zabfb2WQQ yA/7tfTH/BNGN779qCwMlssscejXzyq393y9v/s1fK1rrF6jL91v+A19c/8ABJiH+0PjNr2pXO0f Z/D/AJUUm37rSTLu/wDHVr9S4irKlklaT7NfefynkVGU8zh5O/3K598a1LeTa3YGHR4UTymR9z/M v8K7f9muu8L+JZvD/g+31J7T5YfLZ90u5mkVl2sv+y1cPrUyXGtWsN/qTRN56r8v/wAT/d/2a1vG WtWem+C5ba1mj81YtkTK7L8q/e+X/dVfvV+N4LE8k6bWjTT+7Y/QMVh06cl3Pu39h3/grX4e/amu NV8Mp4D1rSJvD7SRX/8AaSLJaXEnzLtWSP733fu17+37TzzWj3DTQ25VWCRoP++dq/8As1fkZ/wT 1+POleHYfE3gabUlWax8aXTxW+z/AJZyNu/4F97+KvqXTPi4m5/OufKMbt/F975vu/7v+zX9EYad Oth41LbpP8D8pxlBwrtJWPr2z+Pk17qCXT3KhIV3OtwzeW23/wAe3ba4Hxh8frLUryW3s0VNv3mh 3fN83zM2771fOXiL41K42JeMo+7/AK3/AL5rzrVvj5DZzPp800jXHlM0S7m+XbXUpXtYxhQu7nvv iv47Wsd/NZwTM3zt9nkkf5l/3l/3a8U+I3xigZj515j90zLG33m3V5Vq37QX9p3Us03yzMn3W/hr znxR8QLvULjzrydin+y21fu1lKWlz08Hhnzq6Or8S/HiXSbBbC10fSWkXVPtFxfahYR3MjR7VXyV 8xflX5Wb+981cT+2D8UvFGg/Gzxj8Gf+EhjsfCd1rlvbPp9vBDHFb2MklvNG0e1V27d33v8Aerhv F3jDQWuGhvNTukikdftDQxLI+3+Lb/D93/x6uQ/a6+PHgn4zeOpPG3hLwxfabJNYWtvfx6hfxzrc NDbx28cm1Y18tmWPc3zNXlYmdo3bP0vIMKpYiDjG6s032ejT3Lv7d95r3g/9qzxP4Ps7m6sLHw7f 29r4St7Odols9PWGNrZoNu3buVvM8xfmZmZqr/toeJrb4heDfg/8ZdcC/wDCW+LvAMkvi+6VNsmo SWt5Ja219Jt/5aTRxtub+Ly93zVw/iT9qXxh4q8N6Z4Y+JHg/wAM+L/7Bs1tdE1TxFpskl9a2q/d t2njkjaeFf4Vk3bf4Wrg/GfxE8SePNafX/GF/wDaLtbWO3iVYliS3t412w28Ma/LHDGvyrGv3a+X xlVeznFO92mvI/aOHqNWMqDqJRdO6bT1aatbvbZ6ns37Feg6z4+0b4y/DzRtMvL241b4N6k9tbWs TSyNNa3VrcxrtX+L9223+9S/8E77+TTP2q7eTUryysLP/hH9ctdZu9ZkhgtrOObT5oV8/wC0sq7f OaFdrf3vu14VofjbxX4ct5rTw54q1HTobxo2uobDUZoI5tv3fM8tl3bfm+992su6uZJ5DJcHzHZt ztJ8zM3975q8apiXCUHa7jf8f+HPto5dLFfWIppQqpLa9tLN9ndWPqb9lP8Aaw+JHhT9pDQtP+OP xgs9H8K6bcTReJraJLdLFrf7PJDNGq2UbLct83yqu7dXM/CrxZ8FfAnwT+LPwb8afFmR38US6Xb6 DdaFolxcxStY3TTLdPu8vbHIrNHt+9975flrwBZv9imSS/xOVrg+uVNFva+/nuepHhzB1G3zcqah dJJK8XdPZ63ep3HxH1D4Y/Z9Ng8AapruqXS28ja3rOuQrB9ok3KsUcMXmSMscca/eZtzbvuqqrVv 4V/tCeO/g/4a8YeE/DU6SWHjTw+2l6pDOm5Y/mVo7iP+7NH+8VW/uzSf3q86FxndimNc7RyWGa4H OpCrzx0e2h9H9VwtXBrDVvfgt763s7ry0djt/H3xj+IHxL0Dwx4b8Za215a+DdIbS9ESRfmgtfOk m2s38W1pGVf9lVX+Gp7f9oT4ywfD+2+FFn8RtQtvDdnOs9to1uypBHMreYs21V/1m5V/efe+Va4E zNnDHj2pBdOGCZ2ik5VnJy5nd7j+qZfGnGkqceVNtKysm3dtLo9Wbvijxx4r8bas2t+MPFOpavfF Nn2zVL+S5l2/3d0jM235m+X/AGqxmuGU/u6gnlmjduG+Wmx3kMb+dMiun8a7qSi27vqE61ClDlSS S6JWRM91tV95X5aga/Rs/eqncXCKzfvOP71V5Lrcxx5h/wB2uynRk9T5/G5nQgneRYvtSKwPsbbu +X5q5a4uOGj6tWh4g1Kzt7FfPmWJ9/8Ay0lX/wBBrlb/AMYaJBI2/Urf/dVt1erQwlWWii2fm+fc R5bSladWK9Wv8y+8395KrzM8nKI27/ZWsS68faJCG2Xk0n8X7uKqcvxEsGXdBYXEnyfxMq16lPLs VL7J+cY3i7J1p7ZfLX8rnSLCwjZ3dR/F96k2p/G61yD/ABIvyn+jaPCP+ukrNVOfx54hLeWk1vH/ ALUcFdEMrxL3sjwK3G2Swl7t5fL/ADsds/k7wgmZv91dtTeYjf6yFm/3q8+XxJr162Ztbm+b+622 txbqcaTF5tzI7eVuZt1TWy2dO3NLc1wHF9DG1J+zg0oq93b9DoppyhUh402/NuaWk8TXFno8OqSh oZbnV52Zdv3Y4d25azvBmmQ647398/l2duu7czfNI3+7/vVmeMNcm1jVnmm3fL8iMy/dVaKGHkq/ J23/AEX+ZlnGbx+oKrazldLr0s3bp5MpaP4dvPEGtQ6VoJ/0m6baqs3y/wC0zN/DX0h+xvZedo8i abMrz2d4ySqr/LIu771ePfDPSZNN8PXvil48vN/ocUm3c0MLf66Rv7vy7V3f7Veu/sbzINU1G/gT Y66kyuy/xLXLxBWc8DOMdo2+/qfP5dgVQpwrT0lO+nlY9X+IEcTWEl5CmJY9yurfKq/N81eNahev /wAJFKXXbt3M7K/3flr2j4hXxkt3d02ozMr7fvV4ysQvL+6TZu/cSb1X+Jq8vh3mdBuR5ucyUZq3 9aHmPip0j1UTJJuLWu5P++qyriaCa3k+T73+d1XPF0lzca1LsH+p2xbf7u1VrHkkddx+7X0VrVLo +swk/wDhLjCX8qT+6xq+ERGviKG5z/q5Vbar/db+9X2J8K9RN1arbO7ENF8rV8h6LazRyabqO3/W RL8zf+gtX1V8H7yHUrWDyXb5Yvnhb7y1x5/rSgz88wkOSpU6Gh8cNWh0Xwa2q3r71sUaVP73yq3y /wDfVfH8+oS3Vw01y7O8nzO3+01fY/7T3hX7V8DdVubZNxt7Df8AKnzbVZWb/wBmrwr9mH9nCw+P 0Gt3+peJLiwh0uW1gijs1VpbiSbc3y7l2/Kq/wDj1RlEHiKChDe7PpcpxtHLaE603ZXSf6E37F9n DffGSHxDqWn77XS7VmaSSJmWOaRlhi+7/FuZq5f42CGf4ueNLb/lpHqlw/8Aut5jU8/G68+E8+t+ BfgJ4wvEs7rUVni1y4jjW7uFhjaGRVXbtWNpG3K33vl3VxOg6hPceKJHv7ppZbqJllkkT5mb+9/t fer2q9JU8KqfVO7/AANv7WWNqzmvhkklv0d9u49rxrjT47lf4W+bbQzJJHv3r/wGqmm3CW8dzprv /qZWqE3H2V2h8tmbf8n+7XCqS6dH+BSrtKLfVWfqtyHVL51b7m1F/wDHq9t/4JK+LtS8F/tpWXjn RpY/tth4e1RrWKZ4VWaSSEx+WzTSRr83mN91t3935q8A1m6dY3mkj5/u19pf8G9/hvTtX/a28V63 qVrZzLY/Du48qG6RX+aa+tY9yq391d3zfw1rjoxpZTVk1vF/joePSxEP7YoupHmipXa7pa217nm/ /BSz4e674E/az8VSeKhBHfeKGtdfvbeGBY/ss15Gs0kLKu5VZWb5trbfmrwO4VI4j5G75fuV+lf/ AAcC/C2yj0b4a/GPTdNjiMc994ev5IrdV3LtW4gVtv8A22Va/MyaTaywwybv9llrkymq8Rl9OXZW +7T8kelmdWjUxUp04cqetuivrZfM29Bj3aHcO7fdXdXYfCWMx+F9OR1wrSFl3J/02auW0uEW/gua 9f5PMfZ9+us8ETpF4N0yFHjLrbbtqy/N80jNXPmTlPDSS/mX5H6D4e+xw+cU51Ha0H+LRu6k27Ur n5F+aeT/ANCqFjt61PbsGXfNaN83zI1MZEZn8mFitfMH73JSdPmtuysVHndetP38fxetMDwPIxRq kdoRH87/AHv4qpptmVFwi73R23wO+L3jD4F/EPTvib4IuIBf2CzRvDew+bb3NvNC0M9tPH/y0hlh keNl/utX1Vf/APBYv4xeIvGXw21jVfgr4HHhv4URK/g7wRaRXcVjb3i26wRXTN5zSNJDHlY1Ztq7 mb5m+aviJJEVtkM9aNrPtX5HzWdSVSC0Nv7CyPN66q4umpTS5b3ezVujWtm0nurux9YfH/8Abp+E H7VXxNvPjJ8dv2PbbWvEN7HHFNcQ/FDUbWCOONdqRwxY/dxgcgerGivlyOT5BxRXH7SqenT4M4ap wUYUdFtrL/M8At43X94X+9/s19vf8EkdFS3Xxf4reHAaezsopNjN83zSf/E18MWt4+R8n/fNfo1/ wTR8P3Oi/s2w6lD5cdxrGrXF15kiMy+WrLDH/F/0zavveNsT7HJJRW8pJfjd/kfwxwtRc8ycmtIp v8kfS8dx5d41zBbNt37dyvtXb/8AZf8AfVU/jV4inX4dzJpWlRxFXWR/3vzLGy/Mu6rF7cX/AJcg tZ41T5WeFm27m3f/AGVcz8dLz7B4J1FJp4TaLFulh3svnfN93ctfjdCpKNaN+jR+hVYp03f9f6se S/s/fFJPB/xc8YeG/NVWvPsN/E33W2tCu5t38X3a+g734xzTX15ZpeMNs8m3au35q/P3x/8AECXw N+0BpPi2FPIt9S0aOBo2/wCeaySLt/8AQa95k+JVtcao94l4redFG21f722v6FyXFSq5bTb35V+G h+e47AWrSb7tfce+XPxO1K6j8l79iy/Oi7/l3Vi3fjKZG+03k2C3+qk3/M3+9XlH/CzZmJSGbCr8 u5qyNU8eTSR/PcqrfwNu+7833q9VSm9UcP1blVrHpeseLLBW87eoVfl3f71cR4m8d+a7JDef8tWb atchqHi5yv765/j27fvVz2teIoIVPyMX+b7tZtye7PQoUacbaamn4k8STSRytNOqr/C33t1ef6zq 0MzP+/8AmqlrniC5vGd/OZU3bdtc9qWsQo3+kzRj+6skteZjPeWh+g5Ji6GHiuZpIsX2p7nIO7/g VV/txZvn27dm6sttWs/LbZcw5/u7v4aw9S+Jnh7StrzX80ifdT7PFu3V4FTC1Ju0U3c+9wfE2W4e LnOpFRjvqtPU6r7cqxtsPzb/AL1MkvPmVv8A0Jq8+uPjJpX37bR7qVvvfvJVWqWofHLUpFVLDwxZ xbfvyTStIzf+g1n/AGHjJvSNvVm8/FbhrCU+VVuZ/wB1N/jseotdJsTYv/fT0rXSOrbHzt/hWvFt S+MHjZl3w3lrCP7sNqv/ALNurIvPid42vIylz4nvFH3dscu3/wBBpf6tYiUvekkcdTx2yShFqlSn J+aS/W570tx8zPJuC/7T7aqXfibQ7Ti+1uzh2/8APS6Wvn1tUv7yRXudRuJv4tskrNTmUDbMifNX VT4Wg9Zz+5Hz+K8f8WlbD4VLzcm/wsj26++KXgmyBc+I4XH/AExiZ/8A2WsuL41+GL29FpYQX8zM /wDzwVV/9Cryqa4drNXZ6b4T1K2svEFvNePsi37Xb+7u/ireXDeCpwb1bt3/AMjwl42cVY/FwguW EXJJ2Tdk3rq20euH4m211cLbWukNu3/eknrN8bfEzVNDhZNJgtxMqruZ1Z9tcxq9zo/h/Uze2GtQ 3crlvlhfc26meJbLzNBha5kV5ru4/fSK/wB1a46WWYeFaD5fd7Pq/wDI+ix/HOb4nLq9NVrVEm20 1otlZrqy43j7x39hR7jWcPdWTXCJb26qyru+Vq5+XxF4k1SP/T9evJv96dqm1P4gvqHjC/1G2ijt 4biwayijhT5Y4dqr8v8A3zWVHJ5MDbPnfdX0WGwtKCfuJN+SPxTMuIM1xajfETerTu277a79RJt7 Fncbv4vm+ao92375wKjkkfd8/wA3+zTWZJJMPXW4R0PBnWqzleUrjrxt0bbOF2VHY/vfkd+fu1Zv NIul8Pprn/LGS4aLb/7NWdbrMtwoST71OEoST5XezsOtRqUHH2kWuZJrzT2ZNNE8Mmx3qJmZf491 TM29vId+aj8p9xVz8q0PcxTuibTWMl0lsP4nrsvstu5it7y5W3iZ1RppPuxr/E1cnpcbw3MNzMcB n3L/ALtb2oXzzW7PCjBP9r+KvMxilOrFLY+z4dqQoYarNq8tLLvp+R6Lp/g3wf4pj8N+BvCvjqxt r3VtSjs57zUryGKztVZm/wBIkk2/uFX5mZW3fL92vP18Ka/df2jqWi2FxqWmaXdRw3WrWtqzW0bS SMsTSSN/q/M2sy7vvVNceIIIfBtv4Mn8L2lnJDeSXjXv2PbdyLIqr5bM33o127lX+8zNWv4Q+Muv eGfh/qXwog1y6/4R3WtRhv8AUNLU7Y5bqFWjjuGX/loyxySKqt8q+YzL81c0IVKEG4vm16276u68 tjtxFejmeKg6qVNJJaNu1lpo+73LFtqVjo2thW1WS206aBrC4jhj+ZY9vzf7qs33q9Q/Y2hisfiL r/g5LlZvLSO4tZNy/MrL/wDs14/40XRdY8SXGreFdG+waPcM0thp/wBoadraH7qxtI3zM3y7vm/v V9M/8E6/hzosdzd+NtVgkubuZPKiVf8AlnDu+7XjZzKlTy2o5vdJW876f8E9Cq6nNCMY2V3Z36W1 t5M6n4kaXtsZS+5tq7tq/wB5mrx6xb7HqF6958/7qRf+A/NX1p8fvD9hpvhltY0SwWIxyrvjZa+U dYvt3iifKbFuEZXjX/arx+Ga6nCUUeHndF8ylc8I8WalPaeJ7u2eRvNW4bzWVapPr3mAo+5/+2Va fiLSXbWr57n/AFn22Te27/aqquk/e2NX17qUOqPdoYXMHh48r0sunkj1P9nfwvq3xK1CDRIbCS5S H5X8tfurt+WvuH9n/wDYh8VW0drquvPJb2UMTMkn8W3+6396vK/+Cefh7wzoNrplhK/lPq2l/bbi 4/i3bm+7/wB819qeH/izf2Onumj+G7q8hhT55o5V/efL/d3V8jxBisZPSjH3T5vDYSEMRNVpe8m9 NkeAftSeB9N8K+C9X8OWFtJLFcaXJEu7721lZf8A2avgf4KftSeKv2d7K/h8J21re/bLqGe4hvJ2 jZZI1Zdysv8Avf8Ajtfd/wC0d8SvEPirXZtSXwqtnY28TI0LNuaRf4mavzt+KPw9tNK8earYaYzJ B9taW3+T7scnzKv/AI9trt4XxCpUpe0dpaM7ZYGpjOejRjdNbFDxj4zh8ceONU+INt4Z07SP7Uu2 ePTdPaTyLf5fmWPd823dub/gVQ+EbxG8XK7oqtGu/crVRk8H3lxbJZvqUzQxuzpDu+VWb73/AKDT tH8OyeG9dtJ0lZ0k8zezV9RWrUK8JRUtWiKGU5pgnCVSlaEWru/nY6LxXZ/2X40leD5Yb6Leu3+L 5d1ZF/J8wk6N/G1bPixpZtA03Vdnz2s7QM3/AI8v/jtZFwsfnN8nytXFR1hFvpp9x2YlKM5Rjs3d fP8A4NzH1KGS6jMML/M1fWv/AAS41v4vfBm51H4t/CzQtEvZrb7Rp+pHXl8iCOOSFZvL+1syx7mW Fdse7duZVVWZq+b/AAj4Yh164mmuX2Wdnb+bdSL95Vq54OTxro2tp4u8GeIVsGhdWg3fNt2srLuX 7rfMq/8AfNRjpU8Vhp0HJLbV7d7HRkuCxccfCvRp+0lZ+7ZNNbN2emh+mf8AwUZ8feIPjv8A8E8t R1vxreeGbLV9J1jQ9Zfw/YWtwt5ZyNM1u37ySTayr5+1mj3LuXb8rV+X0enCSYedZ/NvrorbR/EV tpd4usasl0bqeS4lYs27zZG3Oy/NtXd/F/erHtdTFuTDcPudf4a4MFShhKLpUpcyTdvnY9rH4KtT qRniqfs5SV3GysiXxFs/se20q0hZTt3S/wC1XC3Vjf2GqEGGRBtyp3bVrs5Lz7RcM8aVBq2y6kEM wyrRfxV34arKirNb3ueRisK8RVhKnK1rJH1B4Kl+F+n+HNClvNN13Vdml27XVu08NqrN5Y3KrKsj bd38Ven+GfF37M3j2Z/hB4e/ZGvJvGGvwtZeGLzTPF1xdXA1CRcRM8Mnlx7d33t22vlO10LU0tYr ePXpDGIlC5j+YfL/AAtVnStHutIu0v8ATdXntrmMqyXNvNIkisv+0rbhXw9XCUfbylKe7eiT79T+ tp5lmGKyilRpYdqcYxSk52V0lbRb/M+8L39nH9rv4W+E7Sw+Jf7MHwy8S6SstvCl5aeG7G+1ZfM/ drCsrLD50m5tvzLJ91vmZVrzHU/2S/iz49t9dh1v4KzaOmntJBFcaL4S0+CSO8Vvmjljhm8ySGNW j3NCrN975W21873Hiz4lXDRPJ8YPFe6GXzIGPiO6/dttZdy/vPlbazLu/wBpqpN4q+LFk0s2m/G3 xbDEztLcKPEN18zN95m2yfeauihSgpe7UWvk9PxPz3Mst4llB1KlON9W5KTV+rdk0vU878T+MfFG iyTG1+yo1vI0bboNy7lba1YsHx78TWW6OXSLGQd2ZGXd/wCPVYjt4dRvLm2e6YwyS/v93mbm/wBr d/eas/U/BelTas9ho6XjjYzNJNb/ACxqv3mavucPgcHOnapBPbofz9jOMOJsFi37HFSsm0tW1o+l 7mhH+0nrqoFbQ7TPu0n+NFcLN4X115C0NtEy9jvorX+ycr/kX4h/xErjj/oMl+H+RegZ1Yb0kXb/ ALNfqt+yH4bg0H9mrwZ4d1JVW4Xw9DeOrK2394zSKu5f4v3n3a/LTw7pd7rWs2ukRzZW6uo4nbd/ CzKrV+rOheJJm8GaJf6Dtt7COJntYd3yrGqqsf8A46tfHeIVZuhRop2vJv7lp+ZPCKS9pVfkv1Z3 9zdWdvH5fktujt9ibbfd8qt91v8Ax7/arkvjdZvqvhC7+xpMi/Z1aXzH3fKq/dVau2vxG15Zgl5p Vu779qMzfLub+9/tferC/aG+KHh+/v8AUtK+HtheXGkLFtsv7a8tLll8tfM8xY/l/wBZu2/7O2vy +hCqqy9U9z7CdSLjZ9fL8z5A/aO+HnxD8Yf8Ilf+EvA+pXs3lXEDrYwNK3+sVo/u/wDjv+7XqGhf CP40xeAbLxpqvgCTQbP7HsuGvrr5maNfmbb8zbm/u13nw38Wa3Z6pbq9zp9tDHZL+7aJpG8xfm+8 v977tYviz4zarqHguXw9rGsSNbQ3TS+Tt+f5W3bdy/e/3a/R8p4kxdGEcMorlj11u+tvI8LG4GKi 6sG3KT2etujE0f4a6zDb6dPr+vW8L6hYR3VlZtbyN50cy/u2b5l2t833Wqvqml+A9DkvLO51LVLx 7X909x+7gijutqsy7tsjSKvzbtu3+H7tdL4R8J+NPiBqOit4Bh33F5ZWaWsKxeWrSMsaqq7vlbd9 7c3y15fqypa6rd6R4w16axm0+WS8iaSXdPHdeZ5c27b/ALS/d+bb/tLXLDi/NK1aaU0ox6JXd7/5 HQsnwrpqLXvvXV208jL+MniDR/Cen2Ot+BLnT7+K6uvIl+1ap58qrtVmk8tdu1fm27mX7ytWTqFn eXUIebUvluH2rbx/u1X+6v8AtVyXxuubS4vHsNAu1vIv9aki2Gza275mVvl/+J+9US+NtWjs0hsr mM+S+5GVPvf7tfT4TG43E4OEudtu7d9HY+cxlD6tXlFt2vp+Ghu3nhuzhV3uXZwrq0qtcSSeWzbd q7V/h+asyO38L29xFv0q3b5Pu7F+9/d2/wC196qLa5qWoO32y8kcsn8Uv+s/3qhs2muLwPZws7L/ AArtXd/Cqt/tVq51nF88/u0MIQ9pJLppuO+PWpzL44tLmw0aR0bRrffDCm5Y/vLXkPjiHTbVoU02 83JI3zRt/D8tewfEz45aD8N/ESaJbeFf7WuV05V+1TXHyK23btb5d25a8E8R61PrUiSOkcar/CqV 7WU+3dOKcfdtu3/TJzGeEjhJqM2p6KyWjXW7IVt5NpLtzSCF1ZkSamx3W3aH605pt0g2NxXvt3Pi tUrIi1BX8hVL7masySN42bzH+Wrd1dCa6X72F/u1ox/2DHCX/fKn/TSKuerU9m9j0cFgli01zqNu 7MaG5jjXydmd38VXxdJCo3o3/fNR31jpPl+dYakyN/zzkX5WpqzP5Szp93+7TpVIziZYrDVMNU5Z NPzTTX4DbiZZ1Kf8Cqt5br02rVzzIZMnvt+7UN15NvGx/wC+N1W3c5ot8xLaj7deRPc/O0kq/ebb 8q1r+J4bvQdVksbzSri2+7KtvcsyssbL5kf3vm27WXa391qsWel2NqINatLW6tEjtY932633LcTf xeX8u3b/AOPVPNp13rCjUToMbLIm/wA2Sf8Au/7VeTWxEfaq609ep9zluU15YWTUk5PVWTelvTvv c5429hdKHSFo33fdX5lohhR9P+0u/wA29lrZjk022tZJ4oPLdfl8qP5mb/vmsvaIY/sz/Lu+aurD 1XNNW7HkZvgVhXB3Tbve2nkZjNhsr8tKp3S9P96iYbZCM0i7ET5H+aunmPCNnTLu2udE/se/vGWP zd23a21ar6hocVrZ/wBpWaSGP/nps+WtzwZoD3eipeBZgJGbdtl2q1a+oafCnhy7sEh2r9nbYq/3 q8GeNhSxLjD+bX9T9PwvDGKzDJo1q1rKF4vd7XSu+ljzn7z7Af46v2+kwtcK8z/L/EtR6StvJefv n/3d1W7r/RpH8r+Ffk3PXtym1oj82hG0tSrdXT3WqLbJ8qr8i7a2NI8OXl1dIl1qvkqz/ekRmrnd I3vrFt8+S1wv/oVelNa7AFEbBq8jMcQ6Fox63Pv+Csop5qp1Z3tBrS7V/usfXegftq+C/GX7OEH7 P/7Yvwr8HfFGwsLZYPD3iyS2l0/xToUartVYL2NP3yr/AAxzbl/havhW88NzxeIZo7OOR7Vbhvs/ mD5pI93y7tv8W3bXbxebs2TOxH+zSm13L/C//oS14WCrvBSnZ3UunRei2R+j5twrlmZunKlT5JR1 dm3d6b3b7dDAsY3jj8mGFkT+7X2r+wN8QNKsfh/aaO9pHHNZyyQSybP9Z83ys1fJP2HavyHctd1+ zz49Phnxbf6Ik2397C6Lv/vL/wDY1jjYPMcNOC6a/ceFxBlscqwMKknrdJaW3R9q/tTeOIU+HNzB Gkahtu/b826viHxJqz3Hi1ESbym+6itXuf7S3xMsJvDel2H2n/WNvdfN+ZlVa+YL7XEuteW8R/na X5N1Y8NYCVKEpW7n57m2KjNRjfch1a1hm1GZ/J2iR99QrYPt+RNu2r+nwy6hA1yUy6uyuv8A6DTp bW42uGi429q6cRJwrOF9j9q4ewkMVkVKvy7xS+7R/kfUHwd1CPwTp/w91JNsQ+xLbzsz/N+83fLX 0J4k8eQ+G7NksJmiebbGu3/Zr5a1mS/0/wCFujfJte3itZ4tv3l2x11fij4opq1npV2UbE0UiP8A 7LLtpVKbq4CTW/8AVz8Wx84rOJtbcz/M6z4leMklsftT3EZl2M3zfNXyF8WLd7zx9f3rIqtcLG/y /wC0tepeOPiFNHN9jSb5pn2/7y/7NeafEYg+JTKn8UEY+b/ZXbXFhcPLDYe76n2HBfsa2eSpvW6f 4WOZjtayfE0qRyxonDba3FjfnL4rD8VQul5E/wD0y/8AZq7cG711c+/4poKjk03BdV+aNGyhfWPC mpaah3MsS3UX97cv3q5XznljTJ+6m2uk8B63HpmsWb3PzRrL5U/zfK0bfK1UvEfhPUvD/iSbR0tG eKSVmtZFX7y16VKXs6koS9V+TPyfFRlUpwnD0f5okstavNN8Mz6bDKoivJV+0Ls+9t+6tbHhloW0 lJIU27tzbaytN8K6jqF2mmujKjN+9kb/AJZr/FXSSWNtY6nc2lhbskMMqqq/8BWuLHSpuLjHdu/6 H23A6qxzJcy05Wl67v8AAls47a6vLezuwwimnVJWX+6zVzPjDRf7J1y4h/55uyf/ABNbepxyLb5j LF9+5fm/u/NWt8TvD/2yxt/E9hbfubqBd38Xzba48PV9jON3o7r5nscZUvb4nl6ximedRzGM4V13 N/FTr5naNJkf5vu0jQ+XId6MP4qJJfOjWH+Lf8m2vaa2Z+cxk4vz6Hqui3y3Wl2zl1YmBf8A0Gra yJ/GcVxui3l1b6dDC6t8qbdrVpW+tvGcSJJj/ar5Kvhn7Rtdz+pMlz2lPLaPtd3GP5I3mkRvuPWb 4smeDw7fSwbVdbVmpYdat5I8MmGp98sOp6dPaK+4zRMvzf7tZUIOnXi2uqOrNKtPF5bVhTd24yS9 WjzrRbbVdSha5ur2SaBWVmtbefZ5n+8392uksbN5rFj5Nrbwt/y62+7a3+8zfNJWRotlCipqdhct G/zL5bfd/wCBVtNqVnpOlreCNRLcRMyxtX3kaspTsj+IcVQ5Jyvun6nO+IdOa31aWLcvB6onB96K iM+q6qft32pU3/w+lFdmpw6mP8PvESaB4usNYNh9qa3nVlt9+3zJPur/AOPNX6eab4f8SaLo+maP ZaDcXCabpsMCtDb7lZlj/eMy/wC996vylSOZfuO27+Bq6rQvjt8afB8ax+H/AIteIrFPupHDrM23 b/us1eLxJw7UzpwlCSi4X3Td77bPoetk2cU8uhKnNO0rPS2h+lE9xrENujrp8kLx/f8AMt927+98 v96qfjLw3YSeFr6z/fNI0Sovk27LuZm+Zdzfd2rur5y+Hn7VHx0Hw40TVbb4jXUslzA0V1PdxRzt IyyN97cv3vu16Fa/tKeP9S0nztV8c2qXMm0qzWcaqrf981+U4vK8ZhK3K7e7JrS/R27H6Tg6DxVF Ti/iSav2audTpb2a29tNpkbOYXVHaOL/AJbL8q7W/wB2vG/F3iqa41681V38i3tYvIikk+Vfl/vV i/FD9oP42WiXtlpvxTuhE0v3bKKOL+H73yrurwvV9U8XarZXJ1fXL6dG3N5bXG5WZvvbv4a+oybI qlVOrOas/VvXfscGYYz6lPk5HJ2vo1Y+4fBnja9tW8MW3iG9updMm0azSK3ZV8hv3O5VX5v935W3 Vd+I2qeDrrxNd3Ot20cS3VusUs0aq0kLfxfLu/dr/wDFbtq1zHwf8JaPfeCPBviDW/EdxcG10DT5 4rKG3Z47fczK0kny/LH91Wbd/drR/ak8UfFO38aXFhr1napdKypf3lwkfmLHHGscUO5fl8tYVXbt +ZdvzfNXyfsKcc4lThvqnulo+nmeri4VZ4aE12767dX2PKPi9ps7Wt3eafeXAgkXdEsbqyNHG23y 2b727+KvPbXxT8PLGxjN7qt89xsXdHb2vyxtt+6zVr61rGlav59hqV+0Mc25/wB3KyrN/s15rH4b mvr957KzuHVp/l2/d/4FX6XlVKnGg4zk0l+p8RmDqSqKKtJ9/wAzsNQ+InhuOIJpWg3Em6D5prqX an+98tc/408ea9feGd8N59mFxKv7uzXYq7f9r71Svof9m2Z/tJIwqvtVlbd83+1WL4haGbSlsEh8 pt6/L/wGuuj7N1Y8quk99zqjhXGi07XktPU5mbUrm82fbGabbuZGb5m+b71VtQ8nbE/b5q0JdLj2 shqnr1j5NmkyPzvr6SjVp88Yo8LH5fWhhZya2W5RYJHnY9JcXHlr5yH5v4aRZknA4X+9VW8unkk2 dVr0W7Hx8dxFZ/vB/vffqzHNcx7fvMtVo128/errNH0uGTTreZ03M0S1xYqrGlFOR72R5fUzKtKn TlZpX/Gxz8jXMg3/ADVXhm2ybHk+Vl+SuyuNKRrd8L82yuKk52OHqcHXVe9lsbZ/lNTLJU+eV+a/ 4WHPLCs5CPk1FKzyDzH/ALm3bSTfLIHTlWWhm8z5c8LXa1Zanz8fiR3mhwzX2jQR3F5M8flLsjZ2 ZVrbjit5IFsnh3Iv3Y9/yrWZ4X2SeH7Nxt/1VakCdfkr4nF1Je2kuzf5n9K8N4OhHLaU1Fe9FX9G lp6DF0PSgzPBbRq7HLMv8VcFqBe3vm3nd822vRo4nVgyvxXAa5D/AKdN3ZZW/wDQq9LJKspTmpO+ i/M+P8S8FRoYajOlBR1a0SS6PoZF95a3TI7/AO1VXdt5z/FVvVlwyTRp95apSNtZf9mvoVrufj0v iPVfha4vPCCQZ2m3mkjz/erQ1ezZdPuC44WJvm/4DXNfCS5YabeWyvyk6tj/AHlrptcvGj0O85wf s8n/AKDXxWLhKGZNLrJfjY/p3h7E0cRwTTnNfDBr7ro8osVRpwjn/cqxfMVjYu/KptbbVCK4eF1P 92rEzBbV8Pur7Fx7n8zSk1UmM8NjGv2bhfu3Uf8A6FXs0+lQzkuo/irxjw40a69ap91muU/9Cr2G G7kjk3M/FfNZ8pKcOXs/0P3LwidFYXERqK6bXy0IJdPeJj5acVEsfGz5q147yG5XnmiWxilBePmv nlVa0kfsE8vpz96k9DPjix23U34ew7vjLKqytsNirPt/3hVmS2eJSpjqHwKI7b4j6pq7SbFh0uJW Zv7zMP8A4mvUy2TlVlbrF/ofm/iVT9jksLq3vL8mbPxx8aSa14hjsLab93b2uxF+7XDaHY3mpa3b W0L/ADNcbd1Q+I9S/tfXLu9SThpa6j4T6Sl1rE2pOcJbpGv/AAJm+WvoKdOOFw3u9vzP5/nUdevq WoIpNF1i705uRGFb7m3d95avR+Tebt/ytV34nQxL44muIEkQT2qja3y/MrN81YCvMz4D7Szba+Ux 0FUrKa0bSP6R8PcwceGXSkrqHMv1/U9n8eXS/wBpWXh3zsRW8Eauq/8AXNawrjUrlfDf2BH2zafc K/8AtMu35qo+NNWmbxtJNv8Ak3r+8/4Cq7atSObq4SV5lCTW/lP8v/oVetRp2oRTXQ/n7H1XPH1J dW2c5HNNrni61hd22b1VNqf7VZvi2UXmpJc/KpaL7v8AwJquWdvNp/jKNBO0e2df3y/3d3/s1Ra1 Yi9uRcxx7Vxt2/3fmb5azx6jHDX6Kx9p4aU51uJFFK7cX+CRhCNgu3GfasbxKkTajbxScf6PJ8v/ AHzXQSWcsb45/wB6uW8YzPb+IbNHP3rWT5q4cBaeISXZ/kfrXG0Xh8jm5Lql+KM6xZ47qWzd8fxJ XqWlx2fjfwz+/fMyovzL96GZfl/8e+WvL7zZHcRXJ+7s2vXXfDjXILPUv7Ku5pEiunUpJG+3bIv9 6uzHU5SpKcfiR+P4GpTjN05ap/0jqPC/hlF0m4s7nUpLb/SF82SZ/lk/3axNXjmtfEV/vljfc6yb o/8AaWuqm0n+3F/s1p/vT7nX+Jlrg9P1eTW9cvmAVPm+Rf8AZX5VryafPV5pN7JX+9H3OQVKNDMa Udm7pepauhdSRG4hHy2/ztu/u/d/9mr0j4T32m+JPCM2g38azvGnlKuz+993/vmvKfFX2lbHNvNs +bc6/wB5aPhn8UJ/CerfbIdpbZslhk+6y1dXB1MRgn7PdPQviHMKdHPHTqPolr6HU33wd1WTWH0d 7aPzN7Ltb/0LdWP4q8F6d4LuLHSJrlZb+4uF81V+7Cv+1Xaa58Z/DGq2cUkOm3D3Gzam6XbtX/er zK/1S91fxVDevJ5shlZ/3nzUYJY2cv3uiXTu0jwcasHCDcLNu2pvagkMWpXUMMbIFnb92z7vm20x mQMQXqro3iBNQmvJrmFcyXDNVmVopCRBJ1/vVFWEoztI/V8iq0q+U05wlfTb00BH8tT867hUkeoT Quro6/LVGbzIm2Ojbf71QXF1DbQSXLvtWP5qdOkpyS7m+Lxv1ehOb0UVftsjn/DOquvjCXTXTfA1 7IyKv8P8VauvLNrmuNCieVGqbUX+HbU3hrw/Do9v/aV/Dvv7z5lj2/6tW+arGqWbw2cVzMixlX27 ll/hr6xKMJc/ZW/4J/KGKrSrV532lJv8bkH7qxVbYbflWikgjFzH50F3lSeDRXPep3M+RnmEdvNN 881zn/ZWpI7OFd2/mnRx725RRUyxvH/H81e1zvuXSwkE9Eeu/Bd/7Q+HslvNPJssr+T/AFaf6vcu 7/0KtubWfD1l4diCaBNNdwyt9vkupdvmK33ViX/x7dXEfAfUPK1K+0R7lkW4gWVVX5tzL/8AtV6P e2ujzomrPab3mgX995vmMu3/AGf4d392vgszUKGYTUk3dp6ef9M/TcodSWXwceis767HHeMNQueI L+5j3Km51X/x2uS1LVElsZrOz3F5l2/u0/vV0vjaSwWYTTOsfmLu+Z6521sbJbV57bzJGmRtiqv8 NepgFCNFSS/q54mZOtOu4qSWmp3/AIN+M/xL0vwFNoul+LZNOtl0qHTJV0m4aJ7i3Vt3ly/N8ysy qzf7SrXMeN/ib4z8SXV3N4k8W6leXK+WkUl1cbtsaxqu1v8AgKrVXS7lLPQJpt+WZ9rr/wCg1zMl 9c/vNl5ubdu+V/8Ax2tMJg6EsTOfJHfst9OtjizDGYhYSnHnd7d+myO9+FPjySK7l0fVdrzTXG+K +uH3bfl27W+X7tN8beITFeXaWFzDE0d/5SLb3Dbdy/xK392uO0w3Md0gH93Z9/8AipLzTxqVw5T5 GV90rfe21s8HRji5T2Wnpc5IVqs8JFRXvbef3mrb+IrzWNTRHRUHkMu6H5fm/vNT7y1e2ji37dzb meRfm3N/tVnWlnClqltHu3faF/j+8v8AFVnVriZpgU/hX7qv8tOajGdobHsZRFznerq1qiOaxdzl E+VqyvElv/xLHw33WWtm3ZGXej/d/hqtrln9q0e5RPvbNyrV0KzjWjfuj3MzwMcRl9Rw3cX+COLi P7xoX43L8lQMzxyNHj/vqp5U3bZiPuv/AA/3aLxUnXzo+K+nlsfiWidiJG2/P/t13nhRfO8N2zxp u2qy7f8AgVee+ZtXZXf+A/n8OxecdvzSbf8AvqvIzfTDJ+Z934fWlnEoPrF/mjQaP92yf+O157NC WjeDPzK7ba9OaOFvkSvN7pDHqkyeZ8qysvy/71cuTVOack/I9zxGwzp0qEvNr8mUYWLf6K/Bb7lQ 4KN8/wD49V64s9v8H3WqvdW/ksib/mavfPypbnoXgbM3ha0Dt91G/wDQq1+EH8VY3geQx+GbX723 Yzf+PVtD5l+9gdq+Gxl/rE/V/mf1Hw3Z5Lh0nqor8kTxShF3clfSuI8Tfu9euIem6Vu1dirnjHeu N8b289trb3OOJtrGuzJmo4lruv1R8z4l051cmhJLSMlf56f5GJq0ISxSZ/mXdWO0mVUfw1o6lefa NPjhz83mtv21mK235H4r6xbH4JN66HefB9kea/ij6bY2rqPEqkeH73HP+jNXIfByYNrl3B/D9i/9 mWuu8cXC6f4Vu5v4jFsUf73y18lj4uOapLq1+h/QHCdaMuAZzk7KMZL7rv8AU8nkZ45N/wAtSNce ZYu7/wAPy1UYHdju1DM627wjld+5ttfW2vE/n+pL947Gh4VRr3xLZRxjhrqP/wBCr1t1xkd1ryn4 dZXxdZCIfN5rbF/4DXrKmK4H79Nh/wBmvls+lavFeR+7+E9FPLa01u2l9yT3+ZH5jq3zPiprXUJI z90kU1tPP8HNIsfln/gNfPvkkj9bi8RSfY0oL63mjCEZP8VUfE81toGkX2qwuoa+2r/tbVX5f/Qq YrGJQY+tYHxZ1UnyNHiOBb7Q67/vV6eUUP8AaeZbWPzzxTzS+Rww8kuaTTv2SRy+n3jyXHl7slv7 v8VexeB400PwjsnX97JdRyvtTc3+yteYfDrwzdalqT6q0H7mHcysyfKzV6Zpn+jxpC90yusqsy/3 q+ixbUlyo/n/AAkZX5mbfxQjS+uodWjtVj/0OP5vu7v9quZ0+23ajAm/rOo+X/erqfG14l5Y2yfM WWzZtzP975q5vw4Hl8S2MThhm8jOdv8AtV8rXV3H5/mfuXAlf2eTYq/2dfvRt+LvLOqffYu08zt/ 31VnS9YF9/xJ5vkZXZov71UNZdI9USaF2fzJZG+V/wCHdUcNui6k1z9p2vHKzpl9te/TivYxufiW IcniZu5b8QQu0dtqc0S71dVZW/i21Q1i7lsrzyxwN7f+hVq6jdWF/os32y5jR/K+T5vvN96uT1jU RcJBI77mVGVm/vfNXDj48+Gaa6o+58O8TLDcTQmn0f5Gh/ato6fv0X5q4P4mTwjxjZeWcj7KR8v+ 0zVtmQN94NXF/EfzW1qK6AziJV3f3WrkyijGOK+TP1PxJzWriOHnFpfEnf0dxbjUU2bN6tt/vVa0 fUnjuI5kf54331zW55x+5fa/91qfb3V5YyYKNtavoZ4eLjyn4VRx0pT5mtD6AsfENgtvD4umvFRf Kb92v97b91q8r0PUdviBZ5J/9YzLt/3qqafr09xYvbJN8jfeVqitVMV5HPt+ZWVv/Hq8elg40FNS e59Th80lLE0akPsyT/FHU63NGjxecjMmGrmtc0+axmN1DBIh/ut/drpZb82V4l1sVtqfxJurL1bW X1Bi9/M0h2Ku6Z93+7SwbnC1loetxVOniMdOU3Z6W+5GTa+IHWNe+3/arofD09pdNc6tNNsFvZbk 3f3mrE03w6moBrl5ljhX7jf3qg8Sz/2Wz22iQ3Rs/wDllNNFt8z/AHf+Bbq7ZQp1ZcsNH1PlYVK+ Ho89TWPRdWXvD+pImteU0n+uTai10qyuCNnH/j1ef+HJLx9Ytrm5Zvml213Duu47ju9fmrgzCio1 V6H6LwJjqlXAzi9oy06b2La3cqtsx96qmu+Vdaa8ZdUPXdQZXI/2ararYz6vYm2g+VV2s1cuGpr2 8fVHvcSY5wyau9/ddvmrFmz8Sahr3lHTb+OO4+61rcW/zK3+y1UfEGpTRyf8TjUpL+5X7ljGvyL/ ALTLVK3t38M3Sf6TvvW+4zfNHaq33ZP96ojZzx293qEU2+PdsRmf5pP7zM1fUShFeh/N6qSbtbUz b/UdXurpprm9Ebt1ROgopUt3uC0vqxop+72I533MyPYv+zTlb5WNONvht6Pwvy0uPm+58tXzXZ70 ackrM1fBeqf2L4ltbzO1N+2X5/vK3ytXvcWp21ppjfZtOjmt5Pl/eIrbv+BV84R/N8wr2TwT4ih1 n4e2kUO1prF2ivLf7y7v4ZP+BL/6DXzOf4X2ijVXTR/ofW5BinTi6XzX6oy/HEdssZZLVT5e5YvM b5Vrj2mQzB5kkRo4tsTK/wAq1veJdYR7WU7Gdtm2Jd/3Wrlr3euzfu/1XyKq/wAVbZbSnGjZnBnF WlKvzRNKS8SPSfId12r9/wD2t1Z9raSSad9sTblmZtvlfw/71GrR/wDEthSG5yrf3fu7qg0e6v4b RoUuWgZlZfvfLXo0YOMG4vVvU8TE1faVYwktEtBbyeYwsltJj/a/u1Jo949zI4f7i/8AfTU64hSG H7MkzKrJt2t/6FRp9h9jh3v5jNub71aTcPZtPcyoRq+3TXTc19HtSdQ+2XM33kbyo/8A0Kqcn72R 9g3fN8lT2zPb25uZt25n2/7q1VkXy13p8v8AwOuFXc2/kfXZbSUKftGh6t5e5xU8U8MilJtu1vvV Qa4Tdk/9809rqFfn2f8AAacoNvVHrQxMeXlvoctJavbXUtsy4VZdvzVHs8vfD/AyfJWr4hjja6Ey IwWRNz/71ZrLnk/w19JQnzwi/I/HMzorD46pBbJu3o9UZP8Ay0rvfAszr4dh37tu9tn/AH1XB+Ye a6/wbr1teW6aP/qpI1+Vf4WrjzOnKphrJbO573BWJpYbNlKcrNppebujrrWRGX/WV554ii+x+JLl CNu26Zv+AtXZtL/Z8bXTuypH99t9cn4pvrPVNQbULO2ZD5Sr838X+1Xn5TTqQrNpe61ufYcfYrC4 jLoUpySnF3S6tNalK61CGNmdxl2/haqm57ifzp/l/urS7Oszvub+JmpILmKSRIZn2Rs672X722vo G7I/JKUearGJ6D4XXboFqkL7h5XyVorJMrFKZa2trb20UNt8sSouz/dqVBscMjt/wIV8PXkp1ZS7 tn9P5VSnQwNGnJ7RS020SH7pHwu7/vmsHx3blLeCZ+fvI3+1W9t3NuT/AL6rI8fhF8PvN/FHKuWr XASccVC3c4+LaCr5BXTWqV18tThWjtra43vNwrf3fmqtfKjlZtnytT1WO4H2maTK/wB1affsDs37 VRU2otfZapn81y2Nr4S3cFl4mK3UxXzrdkXd/e+Vttbnxm1qOLS7TTEJDzO0ku3+6v3f6159FNJa z/abZ2DRvuDf3WroviBfrrC6dqBLbJLXp/tbvmWvMr4VSzCFV/1bY+8yviCdPg7E5fFWd07902k/ y/E55Tg1a0+eKOJ/tKMqNxu2VWt459zBE4b7y1NNH+7X5m+/XpuSTPg4pPU1vhdbeb4uRg/ywpI4 r0r7RbR4fflv9mvOvhldQW3iQwyx83ELJE393+Ku4aHa3D18tnK5sUr9kfvnhtUVHIpezSbcnfy0 VvwLR1PychBSpqsUoXcn/Aqz5G2/wUism3JFeSqUGfd/2jXTtfRdDShuJxOkkIyPNWudsfD/APwl HiqT7YjPD5/zs392tGGeSIh0fbWl4VGq3uti1s9Ojt7KFd1xcfeZv9lf9qvVy6UaakurPyzxCjXx UqVWzcFdPybt+ZZWG30+4SGz3RQw/Km1PlqG8XUtPmS/R9yq+9/73/fNYHiqHWIdQlSz1vzod7N5 Nwv3f+BVZ0fxk6+Smq2zTJD96RW3ba9bkbgnuflydpNWsddq3jazvLGzSOPa62ux/m+8zNUmg3Aj 1i1nWbc6vuVl6rXAp5F54ikmtpme3j/1TN8tbdrq11ZzJNCzHbJld3+zXg46jGFWKj01+/U/ZOBa jjkmI51pPRfJWvb1NR9YSS3htLm5UPGvzf3m+aqcJs5JppptQZ9vzfxf+PV0WsaNp+v3yTTQ+XKy bkZfut/FXK3lnJZNNZ/Z5Hj3MrNt+Zq9qg4Tp6Ox+OYqnUp4iUZrY1Ffw8oivJ4/OCt83nXDL/3y tLr11Yalb79K01oY7dF3t/C3zVzpt7OGNnf+H/VQ7vl/3qshLm3sctdSOsjq3+z92pxkYQw7cn5I 9rhOGKq53S9j9l3b7Lq38hA4B4NNntNA1qN9C16ZbZrhN1rdN/yzkX+9/s1H5vuKyfFN1DZiG9vD kLu2x/3v9mvGwcG8RG2jP2PiiqpZJNyV7Wf5GTH4Xm03WlttYvIbdVlZWkZ/vL/eWulUaWdL+zWe mqlvJ8v2y4+V5P8Ad/urXDNqF5q2rNqd+G3SN/3ytWZLqchvtMzHb8qq1e3WoVKjV5an4zgsXSox laGj7/1ojT17w9J4ekiv9LuftFrMn+uj+7/tK1O01kkuEKH70q1B4e8TJZ7tK1JfNtJPllj/APZl /wBqrcek/wBm6lE1s/nWsjbreZf/AEFqxmpQi4T36PuergPZ1sXCdLZtXXb/AIFzS8a3P9k2q3O9 XDfKu2sGSKaAxXOsDDtErqrK21d33flrY1q0fVLqxspHyrT7pdv91amvYtSWSTULzUls45P+Wci7 m/75rDDSjTpRi93c9viKnLEZpOUNIq2nnZXZDaW82uW4m03W43Fuu77K3ys3+yq1euvF1sbCz8ya O7kjlZZ7eaL/AL5/4FWVfzeFtStniS6ZL2P/AI97iGDYzN/tbaxJrqaeZ7m5dvO/5a7v4q1jSjUe qtbpb+rnhV8TPDq2jv1Tuvu6M6G8uLG81BLixlihia63xR7f3m5v4W/2a03O5jj5q5LQ1d9Qh/i+ bd/u11EMyNxLux/eWuLGxUZRS6I+34Nr+0w83a138tiRZV3f3dtV9XuryG1D2Sbl+9Iv3Vq9FY20 8Ze2vVz/AHWSq1xGY1KTR4Xb8zVz4ecIVlK17dD388wdfFZbUpJpXVr7ro+noZdnrV3cXDJdabGz suzzFdvm/wDZaG0u/wBPWaSFdlpcLulhkbdt/u7a1PBmueB/Deivc+KrPUrqW4n3RW9ncRx7V/vM 0le0eHvAHw0+IXgf/hKvB+j280i2u+WzvL1pXh/2W/u16WLx/wBWXM4Plva/T/gep+G0cC5ScVNO R80G11BJZFib5fMOKK9c1HwLpE9zvNuYvlA2JargUVP9sUuw/wCyqnc8gCIO+2nAJJ9zdt/2aiXe 6qTCqtUscLg8vtr0bW1PbilJbaiLGir8i/7VdZ8M/Ec2i3d7p8Ft5kV5a7XjVdzfL83y1yc0LrH9 7/vmtrwHp8N9rbwiaRP9FkZJl+Xa22ufFRhUoS5trHThJVKeJXJo/wCu+hq+JNSe6hFtNCsbM29f 92sXULqGVRaSTYVU2sy1NdWWo6rcmGyRpf4Yo490jbf/AGWqWo+FtVsZN+tTRwvv3NHv+ZVrnwsK UElzWZzZhUr1by5G136W/IWHUNNktTDbQf7CVKsMkmmxiG23BvmaT5ay1tbYbrezfzd3/LT+7W/Z +Ln0zSVsIdKVm2bXZZf9ZW9VOFvZq7v1MMJF14ynVfLFLdamSdQtvO2QvJv/AN3+KtJbqa1tWuJk ZvM+5t+7urNmOg2LLc6hcs0rbv3MK7mVt33Wp1t4ks5LV0t9wfymX5l2q1aVKTmlaLscOHxUaVSX vq/Q0Ptn26DZ5/O/56dGpb5N/wAtZukxlbXzi7b5G3fMlXNz7d77mrkqwUZNI+zyuc3h4ua1evyH NYwrLwKd5cMfzx/99URnzVb+9TGV1++9KLl3PQnGCg5KO5xc11ei6ld0aV97LvokmvG2rI+Fq5cQ pDqEyFNzNK21W+6tF5vaEfvl/wB1UVVr6SnJOmvkfjWMUniJ36Nr7jIBCtsR91afhK1ubnVofs6M fLfezL/CtZjM8p2Iv/Al/irr/CdvHpel8ovmyfM7VhjKvJQdt2enw/gli8ygm7KOr+WtvmP8bxzN YxsgYKsvzVzph8qQIXkct9zbXValI91atDNt2N8rfLWJNG2m27O+3cvyxSfd21zZfVjGlyPe57PF uDqVcZ9ZhdxaV/K2n3FK+sXVSly7I3/PP71VGVI1zltrfL9ytazmK2rvMn3n/iqnNH5i+WnzP/s1 6CmnJHx0Irc7fw5qKxaDapM+8+V/DV3+2EVtiQqvtWJo99bXFqkNtcszRou5WTay1aj3tjen8dfK 18PBVZcy6n7zlOa1HgaShK6UUr77JLcutrgZym9lNVNdki1bSJLN5P8AWJn/AIF/DSSj92H+Ufw7 qQxeZH8/3VopU4QmpR3Rti8XiMRh505u8ZJr5NHI3EEEKhCV+Wql0vmKuH/gq5qjfM2x1Cb/AO5W TJ5LR/JuDfdr6ek3ON2fgmIh7Kq4dhywte3MdtEPmZtqba9AvtDsZ/DyaKoUGKLMUn+1XKeCILNr 17iVdzxr8ma6me7jjTedo/i215uOqzlXiov4dT77hXBYaGW1atVKSmra9v8Ah9TjLZkjjlSZ/m+9 8tQ3ElzGv3ML/tU+FkXVpkeH+NtlTx6Vf6ra3epW4UpZwrJPufb8rMsa7d33vmZfu16kZLlTZ8FU hGFRxXn+B03gTwXf5t/FGzdbxhtysPmXd/F/tLXT+aqjDtXE+D/iLeeFLWTSZoBcW8ysoEVwyPH/ AJ/utXS6XqkN7ZpOm7a396vnMzo4iVV1J7bK3Y/Z+Cszyungo0KDaqO7kn0ei06NF+VYZV2f8C3V VZ9rZT7tTsyTL/dNV2xCfnDFf71eXBdD7TESu0/xNrwX4R8R+PfEtn4S8J6VJeX99L5VtDGOWb+8 391V/iavs7Qv+CfPwd0v4ZpP4o+I+rQ67a2DS39vosUN2txcbfmWONtrM38K7f71Yf8AwTR8YfsY +GvhX4q1T45eMdP0XxKuoqkTahP5TTWLRrtVG/66LJuVf7y1t/Er4m/su3vix0+GPxmsJbdlZdtp rDKv3vl+81fPZpjsxjieWhCSjF6tJu/z7HzOZyoY6n9XqPTfe363Pir4w+HpvBmpX1heaTrOmSLL sgj1/TlieSP/AHoWaPd/s7q4OFpo1b7TuQSfe219EftOfEfwneeHbmxuNWt9RluFZUCyrK0jfw18 xWMuqq37l2X5/nbdur7vJ8XPF4NVKkeV+d9fv1Py7N8t+qYpU6T5m1fzXqdr4aIaxlKRctOrN/3z 92rzcM0YO41leF/t8Fvl3Z3Zt33K2B50q/8AHs2W9a8/FyUsRJ9D9W4Zw8qGTQg782renfU9R0fT bzXdGsE0TTZJZWtVaDavzN8vzf8AoNdhY/s+6Tc+Crfx/wCO/i14Z8OabfSzWumrcedeahqE0bbZ FtrS2WSSba21Wb7qtuXdu+WvmrXJviNqtv8A2XZa/dw2Krt+zrMy/L/d2r96v08/4Iq6R4GT9nXX 9RsbCzj8Wrr0ljqepRr/AKTb2O2OSCGNm+aGHc0rbV2qzbm+9XJmWKeXZd7ZSvZrSO+vd62+4+Ex OS1q+Oq3py5btqTWmr6Jas+dtP8A2B/hl4t0WLxPpnxl1aazvIt8TNoH2NlZflkVopm8yNlZfust eU/Ff4RXXwn1KDQ5bxr6xljzaagyKvnbfvL/ALLLX6ifHzwH+x/o7PF8SPjvoem6vcIzJb3HimGO X/gSs27/AL6r4K/bO1P4XeFPDWl+EPh74307Xvt2qSSo1texztawxr/rNy/dVt23/arxMFmmYZjN QnGXLe6uv1stke3w1So5Nm0ZpaSXK9O9u7b3Pmq/EMMzJEfl/wDQaztcsk1bTpbGfcx27lZf4WrU vLSG53NDw+3dWeqC18Q6W3iOzgmsVu45bmG6aQRXCqdzQyNH8yq3zK235vmr6TCpOSd7NfofYcQy nSwc/c5otNWW2umvYwrjQNbs2/c6VJMkf8SutZN3eTozPLpsibf4t1ev+KPC3ws8ZeMbz4hadd6B Y2M15JND4T0Q3FpBDE27bDFIzNIqx/L8zbmbb/tV49eeGb86gySpMy79qLGrNu/4FXt4XE0azd3Z 9bq35n4pisBmFFq0HZ7W1/JFu0t9KurdLma/X95/Cqfd/wB6tnw63kCS38+Ro/lO5vutVbQPCcyL vm01lb+Bf/iq6SHwlc3OH/1e1f71cWLxVFNx5vyPteG+HcxnKFfk1XSz19bkMTO9yssNxDDMqN5U k3zKrVzuvx3lvfP/AGo8ksv8W5d3/fNdVL4Vnhj/AH1w2z/YTdV3wF4X0XxJ4tmh8Q3t+lha6VMB 9jvI4J/O2t5DbpFZWjWTazL97bu21hhsRRhdt6JHo8VZPjlSVXl5ZNpWvv8AL0OCsdbgs2321tdD d/EsC7v/AEKpdya44nhs2Y/3mi213tz8Frzw7b3n/CTeL4dS/wCJXM1nHouqRq0d1/yyaTcvzR/3 lX5q4e1OtrCuialcrFGz7tyxfO1ehTrYatFzpu9vP/M/P1h8wp1FTqxdm+xtWmhW2lRwzWs2+W4g Vnb+Fd38P+9To1cbgHwtUo/t9ozpbJI1qrful/2av2EdzeDZBZyGvJrtuXM3c/VMjoRo4eNOEHF7 tW6vew5AxOaebuaO1fEPm/I3y1dtfDmoznfMqp/vNXtXg39irxX428E2XiPxD480fwtZ3y+aiXcE kl3JH/DJtX5VX/Z3V5uJzDBYKKnXmoq9tf8AJXbPcxdLGUsM7QlzNPlSW+nW+iR8za9bwm52fYGk mhbbEyvtjX/gNS6X408SeDLhNS0HVLizaPa0rWsuxrj+9u2/w19BfHT9hz4geFvD9rrHgDxDpfiR G+W6t7Nlgnb5vlkWNm+Zf+BV5R4X/Zw+L+syzRaj4Lks/JVmSTUv3Ufy/wAK/wB2vVwedZVjMJ7R VIuK0s3Z/NOz/A/HMXkmbU8by+ylzPqlp960Kj/tA+P5W3W1nHsHA+Xd+tFd74c8LfADwto8OmeL i2s6iV8y5urVW8tGb/lmvy9ForN4vLL/AMN/czuXDmfNX1+9Hgi3Vzsx5LGpo5vMVUfcu6olUp+8 xu/2qerJtCV78rI8ynz21ZOrI0fz/dqS0kImaNHwki7d3+zUKybMK7qaVrhFyHRf92stZaHZGpBK 7Z6BqnxC0HwhocVh4Ws4ZLma1VLppE3LH/F5m7+Jm/u155rS6l4luX1SaZokk++0ny1WaF9RSUIv 3fl2/wD2NMHhnWI7U3NzbMIli37mq8NhKOGXMvifV7ni5nmeKxtT2dm4RtZLRLzYmhuljqRthNvS T5d396tTU7dJLOVEdc7W2tWdp+m6fdabc3n2mNJrfay7n27v92s66vrmfKedW86TnV5ovUjDY9Yb COlNXUrtWffobDXWgwaQiTWkkt43zO33VX+6tZ7TJ5izojff/irXfT9NPhu11aG8j85vvwr97/gV Zd5eWcjeZLtR9m1o423bqunKKTtd6s8yspxtey0TVv18zYs9YSa3GyHaalbVH+by4OVrF0242xY2 Mo31chfzG5Rj/wABrlnThGbdj6vB4/EToQ5pWdv66FtdSnk+fZtqKa+upR8j7nb5UVmoFndt9/ai r/eqG6X7O3nQyMW/vUoRpuS2NcVicWqEmm9uv9ajbiz1aZkeaFl8tPl8uL71ZV5fTrJ5P3dv95K6 Sz8SWt5PFZ6480UKptaSH5mX5f7tcteQ3M1wwSCRvm+X5K9ClOC93Y+JrUa8v3j1u/n9242wt7mV h9nRRteuq0+VLW1SF5tzL/FWJpVhqsIH+jSfNWvb2GpSKvmJs+f+Jq5MXNSVm1Y+nyKhUwy9pyNy fkTTXm5eXVlrH1a6eaRLNEX/AFq1rNpLqod7lf8AgNQx6DbNNveeRnV/krnozo0pXuejmOGzDFU+ VK1/PoO+xW9va77x9u3+H+Jqzr64j8xkhtvu/N/FXSWC3lvdx37vG7QyrKu5PvMrblpmtadqnijV pdY1TUN0tw+5vJXatbvG0oy127+fax40eGcwqQvFe9dJLytq737+RieGJUOpf6ltzL83zV0ypJlX eRQKXS/Cthp0e9PM3/xNWgtjbE8Qs3+9XkYvFUqtS8T9H4fyHG4HBqnWaTbv6XM9lTaPSq2oTTRw OURtu3+5W+tvDHjYnFQXyusfCbd1ctPERU1oe1i8sm6ElzW03S8jjtI8H6rr1jqF2LmOKOz8vzGa KRo2aRtq/Mqtt+633v7tYE2niOFrnfuVW2/Kvy16NpMWp6NI82g6tdWUsn3ms5WjZvvf3f8Aeas6 bwrYfMly8zJv+7v+Wvfp5lS13+4/J6/CGZSqXVrebOP0G9azumCIzbvlrejW5uId6W8h3f3VrXtN I0WzwbbTlX/aatFI/Mh9f92uLEY6EpXUT6HKOHMVTo+znU07JXOFvNF1KabfDZ7P95q0dJj8R6Xp OpaPaar5MGsW8cF/HGu5Zo45FmVW/wB2SNW/4DXQzWPmOw2c/wAVLDpqfLvPyrQ8ylypAuDqcsQ3 K789vwOVh8F3lzKpS8/8crqdD8MvY2S2yXnMf+xV6GBFG9E+u2po5NrfJt21wYjH1qy5b6H1eScM YDLqzqcvvNW3YkemSLiN7n5qsLYWy8F2ahmLL9/7tRtJh/8AWfNXn805dT7WNPDUY/Df1uVr7QbG 5nWQQbWX+Jv4apv4X0+RvMmjST6rWubh/wDfprRzfxnFdEK9WMbJs8mvlOXYibqOCbfkZTeG9LgU SR6dHuPTI6VJa2NlA/yWEatt/u1e2pI2W+7SeVtk5+61N15yWrf3nJTynC0580aaXokW7VESNUSB V2/3adKyKv7x9tQRyJHGyJ81RyyGRuR/Ht2tXLyuUrs+hdeFDDWitdhzXSfwbTV611W5jhaG0vri 28z77W11JFu/3trfNWZ5e3bs25/2qak3lt8g3f7VaOLtdHnqopLlqpOL3Ql94U0i63PNCru/3mJ3 M3/Aqk0PwhotpdfaYYdjf72Kmt7lPMV3T/gNXopUZtyR/wCz8tKdeuocnM7eptgcmyqVeNb2aunf ZX9e5MtvpsX/AC69vvU24sbCVRm2jZf9pacsLFQw25/urUbRbVzmuNSle9z6mpCi6fK4R+5DDa2e 35IYwf8AZp0ds+0L5K7qTzBDwnWnrcbZF+f/AIDVOc7HBTo4Xms429CRY9vOz5v9mpkiQrjZzUKn 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 vQYAALMsBQAAAA== ------=_Part_2088330_1630004527.1399607980397-- From sandeen@sandeen.net Thu May 8 23:18:49 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3BB5E7F51 for <xfs@oss.sgi.com>; Thu, 8 May 2014 23:18:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC2D9AC013 for <xfs@oss.sgi.com>; Thu, 8 May 2014 21:18:45 -0700 (PDT) X-ASG-Debug-ID: 1399609123-04cbb03cc43f3d50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 1iFFsAFTmY6peipC for <xfs@oss.sgi.com>; Thu, 08 May 2014 21:18:43 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4E08B63C6059; Thu, 8 May 2014 23:18:43 -0500 (CDT) Message-ID: <536C5728.6040805@sandeen.net> Date: Thu, 08 May 2014 23:18:48 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists References: <1399598222-4349-1-git-send-email-david@fromorbit.com> <1399598222-4349-3-git-send-email-david@fromorbit.com> <536C4511.3050201@sandeen.net> <20140509035653.GJ26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] repair: don't grind CPUs with large extent lists In-Reply-To: <20140509035653.GJ26353@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399609123 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.5660 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/8/14, 10:56 PM, Dave Chinner wrote: > On Thu, May 08, 2014 at 10:01:37PM -0500, Eric Sandeen wrote: >> On 5/8/14, 8:17 PM, Dave Chinner wrote: >>> From: Dave Chinner <dchinner@redhat.com> >>> >>> When repairing a large filesystem with fragemented files, xfs_repair >>> can grind to a halt burning multiple CPUs in blkmap_set_ext(). >>> blkmap_set_ext() inserts extents into the blockmap for the inode >>> fork and it keeps them in order, even if the inserts are not done in >>> order. >>> >>> The ordered insert is highly inefficient - it starts at the first >>> extent, and simple walks the array to find the insertion point. i.e. >>> it is an O(n) operation. When we have a fragemented file with a >>> large number of extents, the cost of the entire mapping operation >>> is rather costly. >>> >>> The thing is, we are doing the insertion from an *ordered btree >>> scan* which is inserting the extents in ascending offset order. >>> IOWs, we are always inserting the extent at the end of the array >>> after searching the entire array. i.e. the mapping operation cost is >>> O(N^2). >>> >>> Fix this simply by reversing the order of the insert slot search. >>> Start at the end of the blockmap array when we do almost all >>> insertions, which brings the overhead of each insertion down to O(1) >>> complexity. This, in turn, results in the overall map building >>> operation being reduced to an O(N) operation, and so performance >>> degrades linearly with increasing extent counts rather than >>> exponentially. >>> >>> The result is that the test filesystem (27TB, 30M inodes, at ENOSPC) >>> takes 5m10s to *fully repair* on my test system, rather that getting >>> 15 (of 60) AGs into phase three and sitting there burning 3-4 CPUs >>> making no progress for over half an hour. >> >> Did the blkmap_grow() changes sneak in here accidentally? > > Ah, forgot to mention them. Do a realloc every 4 entries when we > have hundreds of thousands of extents is just silly ;) <snip> > OK, I'll add "because we are doing an ascending offset order scan of > the bmapbt" or words to that effect. Ok, with those agreed-upon changes feel free to add a Reviewed-by: Eric Sandeen <sandeen@redhat.com> - thanks for getting these done. -Eric > Thanks! > > Cheers, > > Dave. > From sandeen@redhat.com Thu May 8 23:59:23 2014 Return-Path: <sandeen@redhat.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 B1D207F51 for <xfs@oss.sgi.com>; Thu, 8 May 2014 23:59:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9527A8F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 21:59:23 -0700 (PDT) X-ASG-Debug-ID: 1399611561-04cbb03cc63f5190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9lLblj5e4PQYwjc5 for <xfs@oss.sgi.com>; Thu, 08 May 2014 21:59:22 -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 (8.14.4/8.14.4) with ESMTP id s494xKNk030822 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:59:21 -0400 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 s494xJB4027217 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:59:20 -0400 Message-ID: <536C60AC.9080306@redhat.com> Date: Thu, 08 May 2014 23:59:24 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH] xfsprogs: remove xfs_check X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfsprogs: remove xfs_check Content-Type: text/plain; charset=ISO-8859-1 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: 1399611562 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 removes xfs_check and all references to it in manpages. The DIAGNOSTICS section from xfs_check(8) has been moved to xfs_db(8). Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- If you realllly don't want this in 3.2.0, so be it, but here's the patch for whenever. ;) diff --git a/db/Makefile b/db/Makefile index 9485b82..bae6154 100644 --- a/db/Makefile +++ b/db/Makefile @@ -14,7 +14,7 @@ HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \ io.h malloc.h metadump.h output.h print.h quit.h sb.h sig.h strvec.h \ text.h type.h write.h attrset.h symlink.h CFILES = $(HFILES:.h=.c) -LSRCFILES = xfs_admin.sh xfs_check.sh xfs_ncheck.sh xfs_metadump.sh +LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh LLDLIBS = $(LIBXFS) $(LIBXLOG) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) LTDEPENDENCIES = $(LIBXFS) $(LIBXLOG) @@ -38,7 +38,6 @@ install: default $(INSTALL) -m 755 -d $(PKG_SBIN_DIR) $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_SBIN_DIR) $(INSTALL) -m 755 xfs_admin.sh $(PKG_SBIN_DIR)/xfs_admin - $(INSTALL) -m 755 xfs_check.sh $(PKG_SBIN_DIR)/xfs_check $(INSTALL) -m 755 xfs_ncheck.sh $(PKG_SBIN_DIR)/xfs_ncheck $(INSTALL) -m 755 xfs_metadump.sh $(PKG_SBIN_DIR)/xfs_metadump install-dev: diff --git a/db/xfs_check.sh b/db/xfs_check.sh deleted file mode 100755 index 553da63..0000000 --- a/db/xfs_check.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -f -# -# Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. -# - -OPTS=" " -DBOPTS=" " -USAGE="Usage: xfs_check [-fsvV] [-l logdev] [-i ino]... [-b bno]... special" - -echo "xfs_check is deprecated and scheduled for removal in June 2014." -echo "Please use xfs_repair -n <dev> instead." - -while getopts "b:fi:l:stvV" c -do - case $c in - s) OPTS=$OPTS"-s ";; - t) OPTS=$OPTS"-t ";; - v) OPTS=$OPTS"-v ";; - i) OPTS=$OPTS"-i "$OPTARG" ";; - b) OPTS=$OPTS"-b "$OPTARG" ";; - f) DBOPTS=$DBOPTS" -f";; - l) DBOPTS=$DBOPTS" -l "$OPTARG" ";; - V) xfs_db -p xfs_check -V - status=$? - exit $status - ;; - \?) echo $USAGE 1>&2 - exit 2 - ;; - esac -done -set -- extra $@ -shift $OPTIND -case $# in - 1) xfs_db$DBOPTS -F -i -p xfs_check -c "check$OPTS" $1 - status=$? - ;; - *) echo $USAGE 1>&2 - exit 2 - ;; -esac -exit $status diff --git a/man/man8/xfs_check.8 b/man/man8/xfs_check.8 deleted file mode 100644 index 23027ca..0000000 --- a/man/man8/xfs_check.8 +++ /dev/null @@ -1,203 +0,0 @@ -.TH xfs_check 8 -.SH NAME -xfs_check \- check XFS filesystem consistency -.SH SYNOPSIS -.B xfs_check -[ -.B \-i -.I ino -] ... [ -.B \-b -.I bno -] ... [ -.B \-f -] [ -.B \-s -] [ -.B \-v -] [ -.B \-l -.I logdev -] -.I device -.br -.B xfs_check \-V -.SH DESCRIPTION -.B xfs_check -checks whether an XFS filesystem is consistent. -It is normally run only when there is reason to believe that the -filesystem has a consistency problem. -The filesystem to be checked is specified by the -.I device -argument, which should be the disk or volume device for the filesystem. -Filesystems stored in files can also be checked, using the -.B \-f -flag. The filesystem should normally be unmounted or read-only -during the execution of -.BR xfs_check . -Otherwise, spurious problems are reported. -.PP -Note that -.B xfs_check -is deprecated and scheduled for removal in June 2014. Please use -.BR xfs_repair " " \-n -instead. -.SH -OPTIONS -.TP -.B \-f -Specifies that the filesystem image to be processed is stored in a -regular file at -.I device -(see the -.BR mkfs.xfs "(8) " \-d -.I file -option). This might happen if an image copy -of a filesystem has been made into an ordinary file. -.TP -.BI \-l " logdev" -Specifies the device where the filesystem's external log resides. -Only for those filesystems which use an external log. See the -.BR mkfs.xfs "(8) " \-l -option, and refer to -.BR xfs (5) -for a detailed description of the XFS log. -.TP -.B \-s -Specifies that only serious errors should be reported. -Serious errors are those that make it impossible to find major data -structures in the filesystem. This option can be used to cut down the -amount of output when there is a serious problem, when the output -might make it difficult to see what the real problem is. -.TP -.B \-v -Specifies verbose output; it is impossibly long for a -reasonably-sized filesystem. -This option is intended for internal use only. -.TP -.BI \-i " ino" -Specifies verbose behavior for the specified inode -.IR ino . -For instance, it can be used to locate all the blocks -associated with a given inode. -.TP -.BI \-b " bno" -Specifies verbose behavior for the specific filesystem block at -.IR bno . -For instance, it can be used to determine what a specific block -is used for. The block number is a "file system block number". -Conversion between disk addresses (i.e. addresses reported by -.BR xfs_bmap (8)) -and file system blocks may be accomplished using -.BR xfs_db "(8)'s " convert -command. -.TP -.B \-V -Prints the version number and exits. -.PP -Any output that is produced when -.B xfs_check -is not run in verbose mode indicates that the filesystem has an -inconsistency. The filesystem can be repaired using either -.BR xfs_repair (8) -to fix the filesystem in place, or by using -.BR xfsdump (8) -and -.BR mkfs.xfs (8) -to dump the filesystem, make a new filesystem, then use -.BR xfsrestore (8) -to restore the data onto the new filesystem. -Note that xfsdump may fail on a corrupt filesystem. -However, if the filesystem is mountable, xfsdump can -be used to try and save important data before -repairing the filesystem with xfs_repair. -If the filesystem is not mountable though, xfs_repair is -the only viable option. -.SH DIAGNOSTICS -If the filesystem is completely corrupt, a core dump might -be produced instead of the message -.RS -.I device -.B is not a valid filesystem -.RE -.PP -If the filesystem is very large (has many files) then -.B xfs_check -might run out of memory. In this case the message -.RS -.B out of memory -.RE -is printed. -.PP -The following is a description of the most likely problems and the associated -messages. -Most of the diagnostics produced are only meaningful with an understanding -of the structure of the filesystem. -.TP -.BI "agf_freeblks " n ", counted " m " in ag " a -The freeblocks count in the allocation group header for allocation group -.I a -doesn't match the number of blocks counted free. -.TP -.BI "agf_longest " n ", counted " m " in ag " a -The longest free extent in the allocation group header for allocation group -.I a -doesn't match the longest free extent found in the allocation group. -.TP -.BI "agi_count " n ", counted " m " in ag " a -The allocated inode count in the allocation group header for allocation group -.I a -doesn't match the number of inodes counted in the allocation group. -.TP -.BI "agi_freecount " n ", counted " m " in ag " a -The free inode count in the allocation group header for allocation group -.I a -doesn't match the number of inodes counted free in the allocation group. -.TP -.BI "block " a/b " expected inum 0 got " i -The block number is specified as a pair -(allocation group number, block in the allocation group). -The block is used multiple times (shared), between multiple inodes. -This message usually follows a message of the next type. -.TP -.BI "block " a/b " expected type unknown got " y -The block is used multiple times (shared). -.TP -.BI "block " a/b " type unknown not expected -The block is unaccounted for (not in the freelist and not in use). -.TP -.BI "link count mismatch for inode " nnn " (name " xxx "), nlink " m ", counted " n -The inode has a bad link count (number of references in directories). -.TP -.BI "rtblock " b " expected inum 0 got " i -The block is used multiple times (shared), between multiple inodes. -This message usually follows a message of the next type. -.TP -.BI "rtblock " b " expected type unknown got " y -The real-time block is used multiple times (shared). -.TP -.BI "rtblock " b " type unknown not expected -The real-time block is unaccounted for (not in the freelist and not in use). -.TP -.BI "sb_fdblocks " n ", counted " m -The number of free data blocks recorded -in the superblock doesn't match the number counted free in the filesystem. -.TP -.BI "sb_frextents " n ", counted " m -The number of free real-time extents recorded -in the superblock doesn't match the number counted free in the filesystem. -.TP -.BI "sb_icount " n ", counted " m -The number of allocated inodes recorded -in the superblock doesn't match the number allocated in the filesystem. -.TP -.BI "sb_ifree " n ", counted " m -The number of free inodes recorded -in the superblock doesn't match the number free in the filesystem. -.SH SEE ALSO -.BR mkfs.xfs (8), -.BR xfsdump (8), -.BR xfsrestore (8), -.BR xfs_ncheck (8), -.BR xfs_repair (8), -.BR xfs (5). diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index 7a43a2c..4d8d4ff 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -38,8 +38,7 @@ commands may be run interactively (the default) or as arguments on the command line. Multiple .B \-c arguments may be given. The commands are run in the sequence given, -then the program exits. This is the mechanism used to implement -.BR xfs_check (8). +then the program exits. .TP .B \-f Specifies that the filesystem image to be processed is stored in a @@ -56,14 +55,11 @@ an ordinary file with .B \-F Specifies that we want to continue even if the superblock magic is not correct. For use in -.BR xfs_check -and .BR xfs_metadump . .TP .B \-i Allows execution on a mounted filesystem, provided it is mounted read-only. -Useful for shell scripts such as -.BR xfs_check (8), +Useful for shell scripts which must only operate on filesystems in a guaranteed consistent state (either unmounted or mounted read-only). These semantics are slightly different to that of the @@ -204,9 +200,7 @@ command can be given, presumably with different arguments than the previous one. Get block usage and check filesystem consistency. The information is saved for use by a subsequent .BR blockuse ", " ncheck ", or " blocktrash -command. See -.BR xfs_check (8) -for more information. +command. .RS 1.0i .TP 0.4i .B \-b @@ -244,7 +238,7 @@ Trashing occurs to randomly selected bits in the chosen blocks. This command is available only in debugging versions of .BR xfs_db . It is useful for testing -.BR xfs_repair "(8) and " xfs_check (8). +.BR xfs_repair "(8). .RS 1.0i .TP 0.4i .BR \-0 " | " -1 " | " -2 " | " -3 @@ -1856,12 +1850,60 @@ and printable ASCII chars. Many messages can come from the .B check .RB ( blockget ) -command; these are documented in -.BR xfs_check (8). +command. +If the filesystem is completely corrupt, a core dump might +be produced instead of the message +.RS +.I device +.B is not a valid filesystem +.RE +.PP +If the filesystem is very large (has many files) then +.B check +might run out of memory. In this case the message +.RS +.B out of memory +.RE +is printed. +.PP +The following is a description of the most likely problems and the associated +messages. +Most of the diagnostics produced are only meaningful with an understanding +of the structure of the filesystem. +.TP +.BI "agf_freeblks " n ", counted " m " in ag " a +The freeblocks count in the allocation group header for allocation group +.I a +doesn't match the number of blocks counted free. +.TP +.BI "agf_longest " n ", counted " m " in ag " a +The longest free extent in the allocation group header for allocation group +.I a +doesn't match the longest free extent found in the allocation group. +.TP +.BI "agi_count " n ", counted " m " in ag " a +The allocated inode count in the allocation group header for allocation group +.I a +doesn't match the number of inodes counted in the allocation group. +.TP +.BI "agi_freecount " n ", counted " m " in ag " a +The free inode count in the allocation group header for allocation group +.I a +doesn't match the number of inodes counted free in the allocation group. +.TP +.BI "block " a/b " expected inum 0 got " i +The block number is specified as a pair +(allocation group number, block in the allocation group). +The block is used multiple times (shared), between multiple inodes. +This message usually follows a message of the next type. +.TP +.BI "block " a/b " expected type unknown got " y +The block is used multiple times (shared). +.TP +.BI "block " a/b " type unknown not expected .SH SEE ALSO .BR mkfs.xfs (8), .BR xfs_admin (8), -.BR xfs_check (8), .BR xfs_copy (8), .BR xfs_logprint (8), .BR xfs_metadump (8), diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 index 51297c4..0957d81 100644 --- a/man/man8/xfs_mdrestore.8 +++ b/man/man8/xfs_mdrestore.8 @@ -48,7 +48,6 @@ returns an exit code of 0 if all the metadata is successfully restored or .SH SEE ALSO .BR xfs_metadump (8), .BR xfs_repair (8), -.BR xfs_check (8), .BR xfs (5) .SH BUGS Email bug reports to diff --git a/man/man8/xfs_ncheck.8 b/man/man8/xfs_ncheck.8 index 4099772..5ae72b2 100644 --- a/man/man8/xfs_ncheck.8 +++ b/man/man8/xfs_ncheck.8 @@ -63,13 +63,12 @@ May be given multiple times to select multiple inode numbers. Prints the version number and exits. .PP If the filesystem is seriously corrupted, or very busy and looks -like it is corrupt, a message of the form that would be generated by -.BR xfs_check (8) -may appear. +like it is corrupt, a message of the form that would be generated by the +.BR xfs_db (8) +"check" command may appear. .PP .B xfs_ncheck is only useful with XFS filesystems. .SH SEE ALSO .BR mkfs.xfs (8), -.BR xfs_check (8), .BR xfs (5). diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index b7c2d8c..0394c50 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -548,6 +548,5 @@ fixed and/or improved. .BR mkfs.xfs (8), .BR umount (8), .BR xfs_admin (8), -.BR xfs_check (8), .BR xfs_metadump (8), .BR xfs (5). From david@fromorbit.com Fri May 9 00:44:12 2014 Return-Path: <david@fromorbit.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 EA5D77F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:44:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F24EF8F804B for <xfs@oss.sgi.com>; Thu, 8 May 2014 22:44:11 -0700 (PDT) X-ASG-Debug-ID: 1399614246-04cb6c728f40c650001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 8oNkwuIhcBAiTgEF for <xfs@oss.sgi.com>; Thu, 08 May 2014 22:44:06 -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: AqJBADdqbFN5LL1sPGdsb2JhbABZgwYcM4JuhQqjfAaSWohRFwMBAQEBODWDAjskNAUlAwctiECcebQQFoVAhwGCGIIeD0SBOQSZQZQ+ggcr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 09 May 2014 15:14:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WidbF-0004ru-Id for xfs@oss.sgi.com; Fri, 09 May 2014 15:44:01 +1000 Date: Fri, 9 May 2014 15:44:01 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v3.2.0-rc3 released Message-ID: <20140509054401.GK26353@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v3.2.0-rc3 released MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="XvKFcGCOAo53UbWW" 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: 1399614246 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.5661 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --XvKFcGCOAo53UbWW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 593dbdd xfsprogs: v3.2.0-rc3 release This will hopefully be the last release candidate for 3.2.0. This update fixes a coupel of build warnings, updates the Debian package changelogs for the release, fixes an xfs_repair regression and a xfs_repair scalability issue exposed by files with hundreds of thousands of extents. The repository has been tagged (v3.2.0-rc3) and a tarball has been uploaded to ftp://oss.sgi.com/projects/xfs/cmd_tars/ so you can pull down the source whicever way you want. Please test! -Dave. Commits since v3.2.0-rc2: Dave Chinner (3): [bbd3275] repair: don't unlock prefetch tree to read discontig buffers [bb9ca6c] repair: don't grind CPUs with large extent lists [593dbdd] xfsprogs: v3.2.0-rc3 release Nathan Scott (3): [b47c8ca] Fix 32 bit build warning in libxfs, xfs_daddr_t printing [ce5da12] Fix msgfmt warning when building the German translation [75b480d] Update debian changelog in preparation for pending release Code Diffstat: VERSION | 2 +- debian/changelog | 7 +++++++ doc/CHANGES | 7 +++++++ libxfs/rdwr.c | 5 +++-- po/de.po | 1 + repair/bmap.c | 40 +++++++++++++++++++++++++++++++++------- repair/prefetch.c | 51 +++++++++++++++++++++++++-------------------------- 7 files changed, 77 insertions(+), 36 deletions(-) --=20 Dave Chinner david@fromorbit.com --XvKFcGCOAo53UbWW Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTbGsgAAoJEK3oKUf0dfodql0P/2XFmUtpOKDWAxmds3FR5Yva KT+oBRx4Ot4ZcvKA9bzdEjxCs2dgn/6tvwwUJ9u/DqELR6bX1/Mll5XYc10L97Mp ewGkleYfA5tzj5el7jnKTofXq5od00rXl9/gvXli/NeKKtjeRg49T6YGkg7lK9VH 6kaKByW5rwDoiHOxCeo9i/5+HgoNO3macS5zYym2keCVXXARX7ny/h8F4qg4hcQW H1hX+TKCo9G0oGtde9jGs4UURT3V51OJNBzonTpxo8qOjTIM7UNkcQUo0bZmz01a GFtmwX1ub8o5/uqwHoVIHNf6oyWVCSQaqdgtSh5WLeQphdLVO57mhT2LeYTHegSL reAudgFGU/eVyUHw1YmFwHHehcGP3UfqBzhMnSsZPrsJTgKavBWbxN4nCEzWOA4/ EruZPWnVoOgziaYXSKLElYaKMFwlygUWH7t5+j8JccEPHQEka/JZNniX3+kXL9gi HWj3CJxBxaIXdCZn42KTSR25MPEi7mRQ+RVbZ4uE1oHHt00NeKoL1zhRoj7TRZgE F+lA63m91x3d7sqreVvRrMPAmcyYtyvyNZMJFpvXMlg3i9w+JOJy/0XicuFDgfKf 3pW0hQK43L4rX0Et7BrHdrMXXtTYHw+wmGQWvpJxm2IDo97+7I62goCB4b4kD8zZ icw4aNxkBJij9C0UIwD1 =p6bi -----END PGP SIGNATURE----- --XvKFcGCOAo53UbWW-- From wangsl.fnst@cn.fujitsu.com Fri May 9 01:06:09 2014 Return-Path: <wangsl.fnst@cn.fujitsu.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 D73B57F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 01:06:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E7C2B8F8039 for <xfs@oss.sgi.com>; Thu, 8 May 2014 23:06:06 -0700 (PDT) X-ASG-Debug-ID: 1399615560-04cbb03cc53f7470001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id FwffbbB72kq2fiyJ for <xfs@oss.sgi.com>; Thu, 08 May 2014 23:06:01 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.97,1016,1389715200"; d="scan'208";a="30293143" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 09 May 2014 14:03:29 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s4965wcV004276; Fri, 9 May 2014 14:05:59 +0800 Received: from wangs.fnst.cn.fujitsu.com (10.167.226.104) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.146.2; Fri, 9 May 2014 14:05:59 +0800 From: Wang Shilong <wangsl.fnst@cn.fujitsu.com> To: <xfs@oss.sgi.com> CC: <linux-btrfs@vger.kernel.org>, <jbacik@fb.com> Subject: [PATCH v3] xfstests/btrfs: add qgroup rescan stress test Date: Fri, 9 May 2014 14:02:23 +0800 X-ASG-Orig-Subj: [PATCH v3] xfstests/btrfs: add qgroup rescan stress test Message-ID: <1399615343-28544-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.167.226.104] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1399615561 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.5662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Test flow is to run fsstress after triggering quota rescan. the ruler is simple, we just remove all files and directories, sync filesystem and see if qgroup's ref and excl are nodesize. Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> --- v2->v3: addressed comments from josef: - remove unnecessary redirections - don't use _run_btrfs_util_prog() when capturing qgroup show output. - turn off inode_cache mount option explicitly. v1->v2: switch to _run_btrfs_util_prog() --- tests/btrfs/050 | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/050.out | 3 ++ tests/btrfs/group | 1 + 3 files changed, 85 insertions(+) create mode 100644 tests/btrfs/050 create mode 100644 tests/btrfs/050.out diff --git a/tests/btrfs/050 b/tests/btrfs/050 new file mode 100644 index 0000000..81d953a --- /dev/null +++ b/tests/btrfs/050 @@ -0,0 +1,81 @@ +#! /bin/bash +# FSQA Test No. btrfs/050 +# +# Quota rescan stress test, we run fsstress and quota rescan concurrently +# +#----------------------------------------------------------------------- +# Copyright (C) 2014 Fujitsu. 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 + +_cleanup() +{ + cd / + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_need_to_be_root +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +# use small leaf size to get higher btree height. +run_check _scratch_mkfs "-b 1g --nodesize 4096" + +# inode cache is saved in the FS tree itself for every +# individual FS tree,that affects the sizes reported by qgroup show +# so we need to explicitly turn it off to get consistent values. +run_check _scratch_mount "-o noinode_cache" + +# -w ensures that the only ops are ones which cause write I/O +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID >&/dev/null + +_run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT \ + $SCRATCH_MNT/snap1 + +run_check $FSSTRESS_PROG -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000 \ + $FSSTRESS_AVOID >&/dev/null + +_run_btrfs_util_prog quota enable $SCRATCH_MNT +_run_btrfs_util_prog quota rescan -w $SCRATCH_MNT + +# ignore removing subvolume errors +rm -rf $SCRATCH_MNT/* >& /dev/null + +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT +$BTRFS_UTIL_PROG qgroup show $SCRATCH_MNT | $SED_PROG -n '/[0-9]/p' \ + | $AWK_PROG '{print $2" "$3}' + +status=0 +exit diff --git a/tests/btrfs/050.out b/tests/btrfs/050.out new file mode 100644 index 0000000..a388160 --- /dev/null +++ b/tests/btrfs/050.out @@ -0,0 +1,3 @@ +QA output created by 050 +4096 4096 +4096 4096 diff --git a/tests/btrfs/group b/tests/btrfs/group index 59b0c98..ee3e8a5 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -52,3 +52,4 @@ 047 auto quick 048 auto quick 049 auto quick +050 auto quick -- 1.9.0 From BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org Fri May 9 02:21:58 2014 Return-Path: <BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 538517F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 02:21:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59E158F8039 for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:21:55 -0700 (PDT) X-ASG-Debug-ID: 1399620112-04cb6c1fcc2bd930001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id F7tarbTOoKd7MBZs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Fri, 09 May 2014 00:21:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+48db321c732efb342709+3911+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 1Wif7v-00022i-8d; Fri, 09 May 2014 07:21:51 +0000 Date: Fri, 9 May 2014 00:21:51 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: Brian Foster <bfoster@redhat.com>, Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140509072151.GA7635@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140507144822.GA4061@bfoster.bfoster> <20140507224755.GR5421@dastard> <20140508011256.GS5421@dastard> <20140508120228.GA47272@bfoster.bfoster> <20140508125405.GA8096@infradead.org> <20140508134520.GC47272@bfoster.bfoster> <20140508212120.GE26353@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140508212120.GE26353@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399620113 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.5663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 09, 2014 at 07:21:20AM +1000, Dave Chinner wrote: > I haven't looked at that, but I'm assuming that it is just a > > -include libxfs/Makefile > > directive rather than using: > > obj-y += libxfs/ > > If that's all it takes, then I'll rebase the patch on that.... The -include line could work, but I'd rather do it like we did in the old days and have a single makefile. From BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org Fri May 9 02:24:42 2014 Return-Path: <BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8C70E7F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 02:24:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CF52AC015 for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:24:42 -0700 (PDT) X-ASG-Debug-ID: 1399620280-04cb6c729040fa60001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id wReShUvVU285EDGC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Fri, 09 May 2014 00:24:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+48db321c732efb342709+3911+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 1WifAd-0002os-H3; Fri, 09 May 2014 07:24:39 +0000 Date: Fri, 9 May 2014 00:24:39 -0700 From: Christoph Hellwig <hch@infradead.org> To: Josef Bacik <jbacik@fb.com> Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfstests: fix flink test V2 Message-ID: <20140509072439.GA7882@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix flink test V2 References: <1399574310-13718-1-git-send-email-jbacik@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399574310-13718-1-git-send-email-jbacik@fb.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399620280 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-Spam-Score: 0.00 X-Barracuda-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.5663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org Fri May 9 02:29:45 2014 Return-Path: <BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 95E4F7F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 02:29:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 253BFAC013 for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:29:45 -0700 (PDT) X-ASG-Debug-ID: 1399620583-04cbb03cc43fa390001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DivxHEZHeKFIAmJW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Fri, 09 May 2014 00:29:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+48db321c732efb342709+3911+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 1WifFW-0006FT-Tt; Fri, 09 May 2014 07:29:42 +0000 Date: Fri, 9 May 2014 00:29:42 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140509072942.GB7882@infradead.org> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140506083744.GA9976@infradead.org> <20140506090056.GH5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140506090056.GH5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1399620583 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.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.5663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, May 06, 2014 at 07:00:56PM +1000, Dave Chinner wrote: > I did this because I'm sick of having to edit 50+ files whenever a > single header dependency changes. There are almost all cookie cutter > duplicates because of the dependencies - if it were code, we'd > factor it in an instant. I just don't see why we should treat 50 > copies of the same header includes any differently.... So let's factor it out by fixing our header mess like I started with the format headers. That's the real fix instead of encoding that mess by wrapping it. > > - do we really need the separate include/ dir? That always annoys > > me when editing code. It makes sense for something that is a real > > public interface, which this is not. > > It's for simplicity of updates with the userspace code. Both > userspace and kernel need the same code layout, and userspace > currently has a separate include directory for all the header files > (and they get installed that way, too). If we want to change the > userspace source layout and commingle all the headers with the C > code, then that's a lot more work on the userspace side (i.e. it's > more than just pointing the include/xfs symlink to libxfs/include). > > I don't mind which approach we take - it's trivial to rework the > patchset to place all the headers in the libxfs/ directory - I just > took the one that matched the current userspace infrastructure... The only ones installed are xfs_fs.h and xfs_types.h. The first one is special. I'd really prefer to to make a major mess of the layout for this. In fact I don't even really see the need for a subdirectory just to share the files. > > > Also is libxfs/ really the right name? libxfs in userspace has quite > > a bit more code than this, so maybe we should just called this "shared" > > for the shared user/kernel code? > > I'd like to have this kernel code define libxfs/, while in userspace > we separate out all the support code (i.e. libxfs/rdwr.c, etc) into > a different directory that builds the userspace libraries. i.e. > libxfs/ is a static object archive that is wrapped by the userspace > infrastructure, just like the kernel wraps it with infrastructure to > make it useful... Well, libxfs is the whole think in userspace. So even if you absolutely want to stick to a messy hiecharical layout we could at least condens it to: fs/xfs/shared fs/xfs/include in the kernel libxfs/shared libxfs/include in userspace From BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org Fri May 9 02:31:29 2014 Return-Path: <BATV+48db321c732efb342709+3911+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4EF4E7F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 02: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 4593A8F8037 for <xfs@oss.sgi.com>; Fri, 9 May 2014 00:31:29 -0700 (PDT) X-ASG-Debug-ID: 1399620687-04cb6c728f40fd80001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id wALjpiB1YADRM9V1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Fri, 09 May 2014 00:31:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+48db321c732efb342709+3911+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 1WifHD-0007n6-Ql; Fri, 09 May 2014 07:31:27 +0000 Date: Fri, 9 May 2014 00:31:27 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks Message-ID: <20140509073127.GC7882@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks References: <1399537188-26509-1-git-send-email-david@fromorbit.com> <1399537188-26509-19-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399537188-26509-19-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1399620688 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.5663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 08, 2014 at 06:19:48PM +1000, Dave Chinner wrote: > While this might seem wasteful to burn a pointer in the data fork > for all files, consider that the geometry information > for data allocation can be abstracted from the xfs_mount in exactly > the same way as has been done for the directory geometry. > Effectively it's a hook to carry allocation policy around in.... > > So, add the geometry pointer to the inode fork, and initialise is > appropriately and use it for all the directory and attribute > operation setup instead ofthe xfs_mount version. A definitively NAK to bloating the inode without actually making use of this. I can see where you might want to go with this, but until we actuall support different dir block sizes per inodes or similar, and it actually proves to be useful this is not something that should go in. The rest of the series looks okay as long as we don't touch the inode, but I'll have to do a slightly more detailed review. From karen.wrench@tiscali.co.uk Fri May 9 07:52:22 2014 Return-Path: <karen.wrench@tiscali.co.uk> 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_FROM,FREEMAIL_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE,T_FREEMAIL_DOC_PDF 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 686F47F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 07:52:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 615028F8037 for <xfs@oss.sgi.com>; Fri, 9 May 2014 05:52:19 -0700 (PDT) X-ASG-Debug-ID: 1399639935-04cb6c1fcc2c9b30001-NocioJ Received: from out.ipsmtp3nec.opaltelecom.net (out.ipsmtp3nec.opaltelecom.net [62.24.202.75]) by cuda.sgi.com with ESMTP id ofNrLuH5gOpUnPGj (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Fri, 09 May 2014 05:52:16 -0700 (PDT) X-Barracuda-Envelope-From: karen.wrench@tiscali.co.uk X-Barracuda-Apparent-Source-IP: 62.24.202.75 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At0HABLObFM+GIt+/2dsb2JhbADKcYEJ X-IPAS-Result: At0HABLObFM+GIt+/2dsb2JhbADKcYEJ X-IronPort-AV: E=Sophos;i="4.97,1018,1389744000"; d="pdf'?scan'208";a="140398428" Received: from lb-mask.bir.opaltelecom.net (HELO ms6gb1.int.opaltelecom.net) ([62.24.139.126]) by out.ipsmtp3nec.opaltelecom.net with ESMTP; 09 May 2014 13:52:14 +0100 Received: from (41.189.42.227) by webmail.tiscali.co.uk; Fri, 9 May 2014 13:52:14 +0100 Message-ID: <14628979.865611399639934880.JavaMail.defaultUser@defaultHost> Date: Fri, 9 May 2014 13:52:14 +0100 (BST) From: "karen.wrench@tiscali.co.uk" <karen.wrench@tiscali.co.uk> Reply-To: carol_s1975@live.com Subject: =?UTF-8?B?dHI6IFJlIOKAj+KAj+KAjw==?= =?UTF-8?B?4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP?= =?UTF-8?B?4oCP4oCP4oCP4oCPQ09ORklSTUFUSU9O4oCP4oCP4oCP4oCP?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?UTF-8?B?dHI6IFJlIOKAj+KAj+KAjw==?= =?UTF-8?B?4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP?= =?UTF-8?B?4oCP4oCP4oCP4oCPQ09ORklSTUFUSU9O4oCP4oCP4oCP4oCP?= Content-Type: multipart/mixed; boundary="----=_Part_25638_16815269.1399639934625" X-Barracuda-Connect: out.ipsmtp3nec.opaltelecom.net[62.24.202.75] X-Barracuda-Start-Time: 1399639936 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: 2.51 X-Barracuda-Spam-Status: No, SCORE=2.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC0_TG783c, BSF_SC0_TG783d, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.00 TO_CC_NONE No To: or Cc: header 0.30 BSF_SC0_TG783c Custom Rule TG783c 0.50 BSF_SC0_TG783d Custom Rule TG783d To: undisclosed-recipients:; ------=_Part_25638_16815269.1399639934625 Content-Type: multipart/alternative; boundary="----=_Part_25639_18807001.1399639934625" ------=_Part_25639_18807001.1399639934625 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Madame /Monsieur, Nous sommes heureux de vous informer du r=C3=A9sultat des programmes internationaux de gagnants de loterie tenus il y a deux jours de cela =C3=A0 notre si=C3=A8ge sis =C3=A0 New York. Votre adres= se E-mail =C3=A9t=C3=A9 d=C3=A9sign=C3=A9 comme gagnants de cette ann=C3=A9e v= ous faites donc partie des heureux (es) gagnants de la LOTERIE MICROSOFT BILL GATES=20 FONDATION. Veuillez trouvez en fichier joint votre NOTIFICATION DE VOTRE GAIN DE 250.000=E2=82=AC. Pour toute information veuillez adresser par E-mail le formulaire suivant c= i dessous que vous devez remplir =C3=A0 l=E2=80=99adresse E-mail de Ma=C3=AEtre JACQUES CAPLAIN charg=C3=A9 de vou= s indiquer les conditions g=C3=A9n=C3=A9rales de remise de votre gain. FORMULAIRE DE V=C3=89RIFICATION VOTRE NOM ET PR=C3=89NOMS : AGE : SEXE : ADRESSE PERMANENTE : PAYS : VILLE : CODE POSTAL : FONCTION: MOBILE : SITUATION MATRIMONIALE: Contacter Me JACQUES CAPLAIN =C3=89mail: maitre.jacques_caplain@hotmail.fr T=C3=A9l=C3=A9phone : ( 00225 ) 41 50 68 85 Madame Solange Fournier =20 coordinatrice et directrice des op=C3=A9rations Recevez les f=C3=A9licitations une fois de plus de nos membres du Programme= =09=09 =09 =09=09 =09=09 =09 =09=09 =20 ------=_Part_25639_18807001.1399639934625 Content-Type: text/html;charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class=3D"msgBodyTxt"> <= span style=3D"LINE-HEIGHT:15px;FONT-SIZE:8pt;FONT-WEIGHT:bold;">Madame /Mon= sieur,</span><br><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div style=3D"padding-left: 0px;" id=3D"msgBodyDiv" class= =3D"msgBodyTxt"><div class=3D"readMsgBody"><div id=3D"bodyreadMessagePartBo= dyControl366f" class=3D"ExternalClass MsgBodyContainer" data-link=3D"class{= :~tag.cssClasses(PlainText, IsContentFiltered)}"><div class=3D"ecxreadMsgBo= dy"><div id=3D"ecxbodyreadMessagePartBodyControl1355f" class=3D"ecxExternal= Class ecxMsgBodyContainer"><div><div><div dir=3D"ltr"><div><div dir=3D"ltr"= ><div style=3D"padding-left:0px;" id=3D"ecxmsgBodyDiv" class=3D"ecxmsgBodyT= xt"><div style=3D"TEXT-TRANSFORM:none;TEXT-INDENT:0px;FONT:small/18px Arial= , Helvetica, sans-serif;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(= 0,0,0);WORD-SPACING:0px;"><span style=3D"LINE-HEIGHT:15px;FONT-SIZE:8pt;FON= T-WEIGHT:bold;"><br>Nous sommes heureux de vous informer du r=C3=A9sultat d= es<br>programmes internationaux de gagnants de loterie tenus il y a<br>deux= jours de cela =C3=A0 notre si=C3=A8ge sis =C3=A0 New York. Votre adresse<b= r>E-mail =C3=A9t=C3=A9 d=C3=A9sign=C3=A9 comme gagnants de cette ann=C3=A9e= vous faites donc<br>partie des heureux (es) gagnants de la LOTERIE MICROSOFT  BILL GATES=20 FONDATION. Veuillez trouvez en fichier joint votre NOTIFICATION DE VOTRE GAIN DE<span class=3D"ecxApple-converted-space"> </span><span style= =3D"COLOR:red;">250.000=E2=82=AC</span>.<br>Pour toute information veuillez= adresser par E-mail le formulaire suivant ci dessous que vous devez rempli= r =C3=A0<br>l=E2=80=99adresse E-mail de Ma=C3=AEtre <span class=3D"ecx= Apple-converted-space"> </span><span style=3D"COLOR:red;">JACQUES CAPLAIN <= /span>charg=C3=A9 de vous indiquer les conditions g=C3=A9n=C3=A9rales de re= mise de votre<br>gain.<br><br>FORMULAIRE DE V=C3=89RIFICATION<br>VOTRE NOM = ET PR=C3=89NOMS :<br>AGE :<br>SEXE :<br>ADRESSE PERMANENTE :<br>PAYS :<br>V= ILLE :<br>CODE POSTAL :<br>FONCTION:<br>MOBILE :<br>SITUATION MATRIMONIALE:= <br><br></span></div> <div style=3D"TEXT-TRANSFORM:none;TEXT-INDENT:0px;FONT:small/18px Arial, He= lvetica, sans-serif;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,= 0);WORD-SPACING:0px;"><span style=3D"LINE-HEIGHT:15px;FONT-SIZE:8pt;FONT-WE= IGHT:bold;">Contacter Me<span class=3D"ecxApple-converted-space"> </span><s= pan style=3D"COLOR:red;">JACQUES CAPLAIN</span></span><span style=3D"LINE-H= EIGHT:15px;FONT-SIZE:8pt;FONT-WEIGHT:bold;"><br>=C3=89mail:<span class=3D"e= cxApple-converted-space"> </span><span style=3D"COLOR:red;"><a style=3D"COL= OR:rgb(0,104,207);CURSOR:pointer;" target=3D"_blank">maitre.jacques_caplain= @hotmail.fr</a></span><br>T=C3=A9l=C3=A9phone :<span class=3D"ecxApple= -converted-space"> </span><span style=3D"COLOR:red;">( 00225 ) 41 50 6= 8 85<br></span></span></div> <div style=3D"TEXT-TRANSFORM:none;TEXT-INDENT:0px;FONT:small/18px Arial, He= lvetica, sans-serif;WHITE-SPACE:normal;LETTER-SPACING:normal;COLOR:rgb(0,0,= 0);WORD-SPACING:0px;"><span style=3D"LINE-HEIGHT:15px;FONT-SIZE:8pt;FONT-WE= IGHT:bold;">Madame Solange Fournier <span class=3D"ecxApple-converted-= space"> </span></span><span style=3D"LINE-HEIGHT:15px;FONT-SIZE:8pt;FO= NT-WEIGHT:bold;"><br>coordinatrice et directrice des op=C3=A9rations<br><br= >Recevez les f=C3=A9licitations une fois de plus de nos membres du Programm= e</span></div> </div> =09=09 =09 =09=09 </div></div> =09=09 =09 =09=09= </div></div></div></div> </div></div> </div> </div> </div> = </div> </div> </div> </div> </div> </div> ------=_Part_25639_18807001.1399639934625-- ------=_Part_25638_16815269.1399639934625 Content-Type: APPLICATION/PDF; name=2012_melanchon.pps-.pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=2012_melanchon.pps-.pdf; size=306840 JVBERi0xLjUKJeLjz9MKMSAwIG9iaiAKPDwKL01hcmtJbmZvIAo8PAovTWFya2VkIHRydWUKPj4K L0xhbmcgKGZyLUZSKQovUGFnZXMgMiAwIFIKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9UeXBlIC9D YXRhbG9nCj4+CmVuZG9iaiAKMiAwIG9iaiAKPDwKL0tpZHMgWzQgMCBSIDUgMCBSXQovQ291bnQg MgovVHlwZSAvUGFnZXMKPj4KZW5kb2JqIAo0IDAgb2JqIAo8PAovR3JvdXAgCjw8Ci9DUyAvRGV2 aWNlUkdCCi9UeXBlIC9Hcm91cAovUyAvVHJhbnNwYXJlbmN5Cj4+Ci9TdHJ1Y3RQYXJlbnRzIDAK L1BhcmVudCAyIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMiA4NDEuNDRdCi9SZXNvdXJjZXMgCjw8 Ci9Gb250IAo8PAovRjIgNiAwIFIKL0YxIDcgMCBSCi9GNCA4IDAgUgovRjMgOSAwIFIKPj4KL1hP YmplY3QgCjw8Ci9JbWFnZTUgMTAgMCBSCj4+Ci9Qcm9jU2V0IFsvUERGIC9UZXh0IC9JbWFnZUIg L0ltYWdlQyAvSW1hZ2VJXQo+PgovVGFicyAvUwovQ29udGVudHMgMTEgMCBSCi9UeXBlIC9QYWdl Cj4+CmVuZG9iaiAKMTEgMCBvYmogCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggMzM1 Mwo+PgpzdHJlYW0KeJzNW1lv40YSfjfg/9B5IxcRh83u5rEIBNiynSgZOxPHSRBs9oFj014vZNmj YzDYX5tX/4utqj4pSpZsMUASWEORxe46vrq6W+zdB/bNN+/OR+MTlg6H7PhkxD4dHqhKJZliKfxf Sp5IvBykSZpWRSpzdv1wePBu/FDfNYqdPLKfDg/Y6Tm9WKRJmUmWFzIRJZOySkrBMpGkks2aw4Pf /sGmQBxMyt+9r6d3LGqmg2+PY8/BTgMdXwEfZ5xVSZWzq9vDA04sc2bfLsuEl+zqwT6Z3dmry28P D/4VnR/FefR9PFDRj/FARpfsfBwPyuj9+1hGY7gloot4wLPoZ/jOTuCSR0dw+Ws8KCJgHm6k0THc uByPiO4HuD6PBxVRXbD43+zq+8ODU2ATdLS3VJkskpSvSJUUZeklM9+0dKfAxC+XIEYefUCO8bvm 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 t7v5VhFoyslw1CLYwBgN28WfdAsUuOVe2VdNVUqMjFrnElyhatb9XalrimW+0lt1+WytRxwF/XFr zWTglKMbM91ReukCtrgK+EqPbe0a1N6mWc5IZOVEDmSRK+soL+jZNqvpyLcN0G73XEzJpOJtOL3C sbr7DPs6FrZluzjWlT+SW9OC/2yOEZHRAquuaR5nNxitpjp3NnRuwVBRZUPptJldU4GDuXOK71IQ XDxTvu47gekfELVkfMUyKwAt4bv8qCsTL/+q68WBtlmIc5FUf7/fdL1NJmORlkx/6S+6euVe5FlS 7M59z7oTucJuetfZf4953sfP2HZgdtOv2Dyrrwpy3S2L/RwozRL1d/gN21s0aX7C5mXYIYL9H5Rl 2B0KZW5kc3RyZWFtIAplbmRvYmogCjEwIDAgb2JqIAo8PAovV2lkdGggODI3Ci9CaXRzUGVyQ29t cG9uZW50IDgKL0ludGVycG9sYXRlIHRydWUKL0hlaWdodCAxMTY5Ci9TdWJ0eXBlIC9JbWFnZQov RmlsdGVyIC9EQ1REZWNvZGUKL0xlbmd0aCA5MDU5NwovVHlwZSAvWE9iamVjdAovQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCj4+CnN0cmVhbQr/2P/gABBKRklGAAEBAQBgAGAAAP/bAEMACAYGBwYFCAcH BwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/b AEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMv/AABEIBJEDOwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUG BwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR 8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5 eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj 5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQAC 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 U3VidHlwZSAvVHJ1ZVR5cGUKL0xhc3RDaGFyIDIzOAovV2lkdGhzIDEzIDAgUgovVHlwZSAvRm9u dAo+PgplbmRvYmogCjEyIDAgb2JqIAo8PAovRm9udE5hbWUgL0FyaWFsCi9TdGVtViA0NAovTGVh ZGluZyAzMwovQXNjZW50IDkwNQovRmxhZ3MgMzIKL0ZvbnRXZWlnaHQgNDAwCi9YSGVpZ2h0IDI1 MAovRGVzY2VudCAtMjEwCi9BdmdXaWR0aCA0NDEKL0l0YWxpY0FuZ2xlIDAKL01heFdpZHRoIDI2 NjUKL0ZvbnRCQm94IFstNjY1IC0yMTAgMjAwMCA3MjhdCi9UeXBlIC9Gb250RGVzY3JpcHRvcgov Q2FwSGVpZ2h0IDcyOAo+PgplbmRvYmogCjYgMCBvYmogCjw8Ci9GaXJzdENoYXIgMzIKL0ZvbnRE ZXNjcmlwdG9yIDE0IDAgUgovTmFtZSAvRjIKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0Jh c2VGb250IC9UaW1lcyMyME5ldyMyMFJvbWFuCi9TdWJ0eXBlIC9UcnVlVHlwZQovTGFzdENoYXIg MjMzCi9XaWR0aHMgMTUgMCBSCi9UeXBlIC9Gb250Cj4+CmVuZG9iaiAKMTQgMCBvYmogCjw8Ci9G b250TmFtZSAvVGltZXMjMjBOZXcjMjBSb21hbgovU3RlbVYgNDAKL0xlYWRpbmcgNDIKL0FzY2Vu dCA4OTEKL0ZsYWdzIDMyCi9Gb250V2VpZ2h0IDQwMAovWEhlaWdodCAyNTAKL0Rlc2NlbnQgLTIx NgovQXZnV2lkdGggNDAxCi9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAyNTY4Ci9Gb250QkJveCBb LTU2OCAtMjE2IDIwMDAgNjkzXQovVHlwZSAvRm9udERlc2NyaXB0b3IKL0NhcEhlaWdodCA2OTMK Pj4KZW5kb2JqIAo5IDAgb2JqIAo8PAovRGVzY2VuZGFudEZvbnRzIDE2IDAgUgovQmFzZUZvbnQg L1RpbWVzIzIwTmV3IzIwUm9tYW4KL1N1YnR5cGUgL1R5cGUwCi9Ub1VuaWNvZGUgMTcgMCBSCi9F bmNvZGluZyAvSWRlbnRpdHktSAovVHlwZSAvRm9udAo+PgplbmRvYmogCjE2IDAgb2JqIFsxOCAw IFJdCmVuZG9iaiAKMTggMCBvYmogCjw8Ci9CYXNlRm9udCAvVGltZXMjMjBOZXcjMjBSb21hbgov Q0lEU3lzdGVtSW5mbyAxOSAwIFIKL0RXIDEwMDAKL1N1YnR5cGUgL0NJREZvbnRUeXBlMgovRm9u dERlc2NyaXB0b3IgMjAgMCBSCi9XIDIxIDAgUgovQ0lEVG9HSURNYXAgL0lkZW50aXR5Ci9UeXBl IC9Gb250Cj4+CmVuZG9iaiAKMTkgMCBvYmogCjw8Ci9TdXBwbGVtZW50IDAKL1JlZ2lzdHJ5IChB ZG9iZSkKL09yZGVyaW5nIChJZGVudGl0eSkKPj4KZW5kb2JqIAoyMCAwIG9iaiAKPDwKL0ZvbnRO YW1lIC9UaW1lcyMyME5ldyMyMFJvbWFuCi9TdGVtViA0MAovRm9udEZpbGUyIDIyIDAgUgovTGVh ZGluZyA0MgovQXNjZW50IDg5MQovRmxhZ3MgMzIKL0ZvbnRXZWlnaHQgNDAwCi9YSGVpZ2h0IDI1 MAovRGVzY2VudCAtMjE2Ci9BdmdXaWR0aCA0MDEKL0l0YWxpY0FuZ2xlIDAKL01heFdpZHRoIDI1 NjgKL0ZvbnRCQm94IFstNTY4IC0yMTYgMjAwMCA2OTNdCi9UeXBlIC9Gb250RGVzY3JpcHRvcgov Q2FwSGVpZ2h0IDY5Mwo+PgplbmRvYmogCjggMCBvYmogCjw8Ci9EZXNjZW5kYW50Rm9udHMgMjMg MCBSCi9CYXNlRm9udCAvQXJpYWwKL1N1YnR5cGUgL1R5cGUwCi9Ub1VuaWNvZGUgMjQgMCBSCi9F bmNvZGluZyAvSWRlbnRpdHktSAovVHlwZSAvRm9udAo+PgplbmRvYmogCjIzIDAgb2JqIFsyNSAw IFJdCmVuZG9iaiAKMjUgMCBvYmogCjw8Ci9CYXNlRm9udCAvQXJpYWwKL0NJRFN5c3RlbUluZm8g MjYgMCBSCi9EVyAxMDAwCi9TdWJ0eXBlIC9DSURGb250VHlwZTIKL0ZvbnREZXNjcmlwdG9yIDI3 IDAgUgovVyAyOCAwIFIKL0NJRFRvR0lETWFwIC9JZGVudGl0eQovVHlwZSAvRm9udAo+PgplbmRv YmogCjI2IDAgb2JqIAo8PAovU3VwcGxlbWVudCAwCi9SZWdpc3RyeSAoQWRvYmUpCi9PcmRlcmlu ZyAoSWRlbnRpdHkpCj4+CmVuZG9iaiAKMjcgMCBvYmogCjw8Ci9Gb250TmFtZSAvQXJpYWwKL1N0 ZW1WIDQ0Ci9Gb250RmlsZTIgMjkgMCBSCi9MZWFkaW5nIDMzCi9Bc2NlbnQgOTA1Ci9GbGFncyAz MgovRm9udFdlaWdodCA0MDAKL1hIZWlnaHQgMjUwCi9EZXNjZW50IC0yMTAKL0F2Z1dpZHRoIDQ0 MQovSXRhbGljQW5nbGUgMAovTWF4V2lkdGggMjY2NQovRm9udEJCb3ggWy02NjUgLTIxMCAyMDAw IDcyOF0KL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9DYXBIZWlnaHQgNzI4Cj4+CmVuZG9iaiAKNSAw IG9iaiAKPDwKL01lZGlhQm94IFswIDAgNTk1LjIgODQxLjQ0XQovUmVzb3VyY2VzIAo8PAovRm9u dCAKPDwKL0YyIDYgMCBSCi9GMSA3IDAgUgovRjUgMzAgMCBSCi9GNCA4IDAgUgo+PgovWE9iamVj dCAKPDwKL0ltYWdlMjIgMzEgMCBSCj4+Ci9Qcm9jU2V0IFsvUERGIC9UZXh0IC9JbWFnZUIgL0lt YWdlQyAvSW1hZ2VJXQo+PgovUGFyZW50IDIgMCBSCi9Db250ZW50cyAzMiAwIFIKL1N0cnVjdFBh cmVudHMgMQovR3JvdXAgCjw8Ci9DUyAvRGV2aWNlUkdCCi9UeXBlIC9Hcm91cAovUyAvVHJhbnNw YXJlbmN5Cj4+Ci9Bbm5vdHMgWzMzIDAgUl0KL1R5cGUgL1BhZ2UKL1RhYnMgL1MKPj4KZW5kb2Jq IAozMiAwIG9iaiAKPDwKL0ZpbHRlciAvRmxhdGVEZWNvZGUKL0xlbmd0aCAzODY4Cj4+CnN0cmVh bQp4nMVcW28bxxV+N+D/MHkqNwjXO7e9BAJRirIcOZIlS5TTNigKQqJkBhJl62K0+bVBn+KX/oae c2Zmd5Z7Fck2sEnOzvXMd24zZ2fEXp2wnZ1XR5ODPRaNRmx3b8I+v3yhMx0KzSL4lyoeKkwOozCK siRSMbu4ffni1cHt7HouBNu7Y+9fvmCvjyaMeb3xV4ez5TUbzJfDN7uB7Xp3Cg33BeOCTa9evuA0 An6nMgoVm0K/EbvGrzcvX/w8YMHf2fTtyxevpzUDiKYBvF55HMbUa01fMM0kClOhWKKiMFGMJzzM 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 cmVhbSAKZW5kb2JqIAozMSAwIG9iaiAKPDwKL1dpZHRoIDgyNwovQml0c1BlckNvbXBvbmVudCA4 Ci9JbnRlcnBvbGF0ZSB0cnVlCi9IZWlnaHQgMTE2OQovU3VidHlwZSAvSW1hZ2UKL0ZpbHRlciAv RENURGVjb2RlCi9MZW5ndGggNzgxODkKL1R5cGUgL1hPYmplY3QKL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgo+PgpzdHJlYW0K/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQN DAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwL DBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjL/wAARCASRAzsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QA tRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJ ipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx 8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcF BAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oA DAMBAAIRAxEAPwDsFTnnrUyp3NOVMe5qZI+metfG0qNj62UyNI88npVlI8j0FOSPufyqwkecE8Cu 6nSOedQYkfYdPWrCR9h19aekecYGBU6R9h09a64UzlnUGpHgjuasJHjBPWnImOB19amRPxNdUKZy zmNVO5/KplTPXpTlTHJ61KF9a3jEwlMaq/lUgWlC08D0rVIycgAxSgUoFL0qjO4AUE0E0lABSE4p C3pTCaVxpCk0xmx1prPj61EzdzUORoojmb8BUTP+VNd+56VA8nXPArGUzaMBzydh+dQPJjIHJpjy E5A4FV3k7D86551DphTHvJjPc1XeTuevpTHkxkDk1A8nPqa5alQ6oUxzyZ5J49Kru+fYUjvjryag d88muKpVOqEBzPnp0qJn9KazZ9hUZbPSuCpWN4xFLY6U3qaAKcBXPrLc02EApwXPSnKufpUqoD06 VtClchyGqmPc1KqfiaeidhU6R49zXdTpGMpjEj7n8qsJHnk05I8e5qwkXdvyrtp0zlnUGJHn2FWE j7AcU9I88nj2qwqZ9hXXCmc06gxExwKmVMe5p6pnpwKmVMcCumMDmlMaqY68mpgvrSquPc1IFx9a 2UTCUhAuetPApQKcBVpGTYgFO6ClpKqxIUUU0mi4Ck00mkJqMt6VLZaQ5mx9aiZvWkLelQs+Pc1m 5GkYjmfHWoWfPXgU13x161A8mOSaxlM6IwHs+fYVXeTPA/OmPJkc8CqzyZ9hXNOodMKZI0nYVXeT Huaa0meBVdpOwrjqVDqhTHPIB15NQM/djTWfHuaiZsdeTXFUqnRGA5nz14FQs2fYUhOetJXFOpc3 UbBSYop4X1rNJsq9hoXNSquenSnKnrUypn2FdNOiZymMRM8AVOiY6cmnomenAqZEzwBXdTpHPKY1 Ux9anSLu35U9I8Hjk1YSPHua7YUzlnUGrHnk1OkefYU9Y8ctU6x5+9XVCmc06g1E9OBU6p2FKqZ9 qmVfTgV0Ric0pjVXHTrUirjnqacqgdKeBWqRi5ABTgKUClq7GbYUUtITTELTSaQmmk4obHYcTTC3 pTS3rUbNn2FQ2WoilvSomfHTk0jPnpULP6VlKRtGArvj3NQO4HJpHkx05NV3kx15NYTmdEID3fPJ OBVd5M+wpjydyarvJnknArlnUOmFMe8meBx71XeTsPzpryZ9hUDP6VyVKp1QpjmfHTk1Ezge5prP 6VCzY+tcFSsdEYDmbuaiZs9aQt+dN5Y1wzq30RsogTTguOtOVfTrUipj3NKnScndg5CKnrUqpn2F OVMdanVO5/KvQpUTCUxiJn2FWPNl/wCer/8AfZ/xpyR569Kl8pfQV304NLQ5ZuMnqVUTsOvrVhI8 Y7mnJH2HT1qwkfYdfWtKdIU6gxI8EE8mrCR9z+VPSPBHc1YSMDBPWuuFM5Z1BiR5wTwKnROPQU5U 7n8qmVM9eldMYHNKY1E7DpUyrjpSqv5VIq1somEpCBfzp4XvTguKUCtEjJsAKcBQBQTTJDOKSikJ xQAE4ppbP0pCeaYzetS2UkKTxUbP2FNZ8+wqJn/Ks3I1jEcz4+tQvJj3NMeTsPzqu8mMgcmsZTN4 wHvJ3PX0qB5O56elMeTGecmqzydz19K5p1DphTJHkznPAqu8mcgdKY8meSePSoHfPsK5KlU6oUxW k7D86hZ+wprSZ6cCoWf0rhqVTqjAcz49zUTN69aQtjpTetcNSq3ojZRAktQBSgU4LnpURjcdxAKk VPWlVMe5qdUx7mumnSIlIYqZ61OkZPsKckfc/lVhI88mu6nSOedQakfYDAqdI+wFOSPd7CrKR9lG BXbCmcs6gxI8dOTVhI8cnk0qJjhasKgHua6oUzlnMYqetTrHnk05Y8deTUwX1rojA55TGqufYVIq +lOC+tPArVRMXIQDFPAoAp3QVZDYAYpaSimSFITSE0hNA0gJppb1prNj61Gzc81DZaiOZs+wqJmz 7Cmu+OtQs+evArKUjWMBzSZ+7ULPjpTWfPsKrvITwv51hOodEID3kwPU1WeTHXk01pMcCq7yY9zX LOodUKY95O7Gq7yZ68CmPJjryaru/cmuOpVOqFMkZ93sKhZ/Sms2RzwKhZs/SuGpWOiMBzP6UzNJ SVySlc1SsLmjaTShc1Iq56DiiMHIG7DVX0qVUx7mnImeAKnRMdOTXbTpGMpjVjxyanVPWnKmPc1O kXdvyrtp0jnnUGpHu9hVhI89OBT0jzyanSPPsK7IUzlnUGpH2AqdI8dOTTkTPTgVYVOMCuqMDlnM YqYPqamVPWnKuOnJqVUx7mt1E55TGqnrUoFKBTgK0SMmxAPSnAUAUtWS2FLR0ppNAhSaaTQTTC3p SbKSFLYqNmx9aaW9KiZ8dOTWbkaRiOZu5qJn9elMZ8e5qF3xyaylI2jAez5HtUDyZ4HHvTHk4yTg VWeTPsK551DphTJHk7L+dV3kweOTTHkzwOPeoHk7L+dcs6h0wpjnkx1OTUDv3NMZ8e5qFnx9a4ql U6oQHM/r0qJnz7Cms3c1GzZ61w1KxvGIpbPSoy3YUhOacF9a4nOU3oa2sIFz1qRVz7CnKnrUqpn2 Fb0qBEpDVTsKmRPTk05Ez04FTomeFr0KdEwlMaiEe5qdIyOTz7U9I8cAZNTpHj3Nd1Omc06g1Iz1 P5VLtqVI8deT6VN5Z9K6409DmlUKqR5x2FTpGeg6etPSPOCeBU6J7YFXCmZTqDUTHA6+tTImPc05 U7DpUyqB0rojE55TGqmOT1qUL60oX86eF9a1UTFyEAp4FKBTgKuxm2IBS9KM4pKYhSaSkJxTS2fp SHYUt6Uwmmk8Uxm7CpbLURzNj61CzdzSM/51C8mPc1lKRrGA537npUDyZzzgUx5O56+lV3k7np6V hOodEKY95CcgcCq7ydh+dNeTIOeBVd5M5A6VyzqHVCmOeTGQOTUDyc+ppjSdh+dQNJ2FcdSqdMKY 93x15NQM+eSaaz49zUTN69a4alU6YwHM+fYVGTnpSElqAK45TcjVKwAU4CgCnqvrVQpg2Crn6VKq ZHHSlVM9anRMj0FdlOkYymMROwqwkePc09I+wGBU6R9lFd1Okc86gxI8c9TVhIu7flT0jx05NWEj wOeTXZCmcs6gxYyeTx7VYVM/SnKnrUyx55NdMYHNOY1Uz04FTKmOBTlXPsKkVfSt4xOeUxFXHuak C4+tKBjpTwK0SMXIQCnAUAU6rJbEoopCaBC00mkJphPrSuUkOLVGW9KazflUbNn2FQ2aKI4t6VC0 mPc0xpM/dqJn9KxlM2jAc7469ageTHJNNeTHuarPJjrya551DohAe8mevAqu8mfYU15O5NV3kz16 VyzqHVCmOaTPAqBpOwpjPn2FRM/pXFUqnVGArPj3NRM2OvJprP6UzNcNSrc3jECc9aTNBpACa527 mgU8L60qr6VKqY9zWkKTe5LkIqetSomfYU9I8cmp1T1rup0jCUxiJ6cCp0jJ4Ap6R7vYVYSPPTgV 3U6RzTqDEjx0GTVhI8e5p6R9lFTpHjpya64UzlnUGrHjlqmWPP3qeqY9zUyp610xgc0piKmfYVKq +nApVT1qQCtlE53IRVx0p4FKFpwGKtIzbAClopaokKQnFBNNJouApNMJxQWqNmx9alstIVm9ajZs 9eBTWbHJqJn9elZuRpGA5nz0qFn9Kaz5HtVdpCeBx71jKZ0RgPeTHTk1XeTHXk0x5Ow/Oq7yEdOT XNOodMKY95O5NQPJnknApjyY68mq7v3NclSodMKY93/AVCz56Uxnz16VCz/gK4alU6owHs/pULNj 60hbPSoy3YVwVKxtGIrN+dM5Y0oXPWpVTPsKwUZTZV7DVX061KqY9zTlTsKmVPTk120qNjOUxqpj rU6x9z+VORMe5qdI8cnn2rvp0jnlMYkeevSrKR5HHApyR92/KrCR568Cu2FI5Z1BiR9lqxHHzgdf WnpHnHZasInGB0rqhTOWdQYkePc1JsqRU7DrUnl+9bqJg5ldU7n8qmVM9elOVMcnrUoX1q4xIlMa q/lUgWlC08D0rVIycgC4pQKUCl6VRncAKCaCaSgApCcUhb0phNK40hSaYzY601nx9aiZu5qHI0UR zP8AgKiZ/wAqa79z0qB5M5zwKxlM2jAc8nYfnUDyYyByaY8hOQOBVd5Ow/OuedQ6YUx7yYzzk1Xe TuevpTHkxkDk1A8nPqa5alQ6oUxzyZ5J49Kru+fYUjvjryagd88muKpWOqEBzPnp0qJn9KazZ9hU ZbPSuCpWN4xFLY6U3qaAKcBXPrLc02EApwXPSnKufpUqoD06VtClchyGqmPc1KqfiaeidhU6R49z XdTpGMpjEj7n8qsJHnk05I8e5qwkXdvyrtp0zlnUGJHn2FWEj7AcU9I88nj2qwqZ9hXXCmc06gxE xwKmVMfWnqmenAqZUxwK6YwOaUxqpjryamC+tKq49zUgXH1rZRMJSEC5608ClApwFWkZNiAU7oKW kqrEhRRTSaLgKTTSaQmoy3pUtlpDmbH1qJm9aQt6VCz49zWbkaRiOZ8dahZ89eBTXfHXrUDyY5Jr GUzojAez59hVd5M8L+dMeTI54FVnkz7CuadQ6IUyRpOwqu8mPc01pM8Cq7SdhXHUqHVCmOeQDrya gd+Msaaz49zUTNjrya4qlU6YwHM+evAqJmz7Cmk560lcU6lzdRsFJiinhfWs0myr2Ghc1Kq56dKc qetTKmfYV006JnKYxEzwBU6JjpyaeiZ6cCpkTPAFd1Okc8pjVTHuanSLu35U9I8Hjk1YSPHua7YU zlnUGrHnk1OkefYU9Y8ctU6x5+9XVCmc06g1E9OBU6p2FKqZ9qmVfTgV0Ric0pjVXHTk1KqY56ml VQOlPArVIxcgApwFKBS1djNsKKWkJpiFppNITTScUNjsOJphb0ppb1qNmz7CobLURS3pUTPjpyaR nz0qFn9KylI2jAV3x7moHcDk0jyY6cmq7yY68msJzOiEB7yZ5JwKrvJn2FMeTuTVd5M8k4Fcs6h0 wpkjyZ4HHvVZ5Ow/OmvJn2FQNJ6VyVKp1QpjmfHTk1Ez49zTWf0qFmx9a4KlY6IwHM3c1EzZ60hb 86ZyxrhqVb6I2URSacFx1pyr6dakVMe5op0nJ3YOQip61KqZ9hTlTHWp1TufyrvpUTCUxiJnp0qd EzwKekeevSrCR5HHArup0jnnUI0jwcAZNWEjx7mnpH2FWI4+cDr612wpnLOoMSPB55PpVlI+5/Kn JHj3NTqmPrXTGByzqDVT8qlVMj0FOVO5/KpQK3UTCUxFXHAp22lC5+lP2itEjJsjC/nTwvenBQKU CqSJbACnAUAUE0yQzikopCcUABOKaWz9KQnmmM3rUtlJCk8VGz9hTWfPsKiZ/wAqzcjWMRzPj61C 8mPc0x5Ow/Oq7yYyByaxlM3jAe8nc9fSoHk7np6Ux5MZ5yarPJ3PX0rmnUOmFMkeTOc8Cq7yZyB0 pjyZ5J49Kgd8+wrkqVTqhTFaTsPzqFn7CmtJnpwKhZ/SuGpVOqMBzPj3NRM3r1pC2OlN61w1Krei NlECS1AFKBTguelRGNx3EAqRU9aVUx7mp1THua6adIiUhipnrU6Rk+wpyR9z+VWEjzya7qdI551B qR9gMCp0j7AU5I93sKspH2UYFdsKZyzqDEjx05NWEjxyeTSomOFqwqAe5rqhTOWcxip61OseeTTl jx15NTBfWuiMDnlMaq59hUir6U4L608CtVExchAMU8CgCndBVkNgBilpKKZIUhNITSE0DSAmmlvW ms2PrUbNzzUNlqI5mz7CombPsKa7461Cz568CspSNYwHNJn7tQs+OlNZ8+wqu8hPC/nWE6h0QgPe TA9TVZ5MdeTTWkxwKrvJj3Ncs6h1Qpj3k7sarvJnrwKY8mOvJqu79ya46lU6oUyRn3ewqFn9KazZ HPAqFmz9K4alY6IwHM/pTM0lJXJKVzVKwuaNpNKFzUirnoOKIwcgbsNVfSpVTHuaciZ4AqdEx05N dtOkYymNWPHJqdU9acqY9zU6Rd2/Ku2nSOedQake72FWEjz04FPSPPJqdI8+wrshTOWdQakfYCp0 jx05NORM9OBVhU4wK6owOWcxipg+pqZU9acq46cmpVTHua3UTnlMaqetSgUoFOArRIybEA9KcBQB S1ZLYUtHSmk0CFJppNBNMLelJspIUtio2bH1ppb0qJnx05NZuRpGI5m7momf16Uxnx7moXfHJrKU jaMB7Pke1QPJngce9MeTjJOBVZ5M+wrnnUOmFMkeTsv51XeTB45NMeTPA496geTsv51yzqHTCmOe THU5NQO/c0xnx7moWfH1riqVTqhAcz+vSomfPsKazdzUbNnrXDUrG8Yils9KjLdhSE5pwX1ric5T ehrawgXPWpFXPsKcqetSqmfYVvSoESkNVOwqZE9OTTkTPTgVOiZ4WvQp0TCUxqIR7mp0jI5PPtT0 jxwBk1OkePc13U6ZzTqDUj7n8qsJHnrwKckeOvJ9KspF3b8q64UzlnUGJHnHZasInGB0pyp37VKq Z9hXTGBzSmNVOw61MqY+tKq44FSAVqomEpCAU8L60BcfWngVokZthilxS4oqiLiAUvSjOKSgBSaS kJxTS2fpSHYUt6Uwmmk8Uxm7CpbLURzNj61CzdzSM/51C8mPc1lKRrGA537npUDyZzzgUx5O56+l V3k7np6VhOodEKY95CcgcCq7ydh+dNeTIOeBVd5M5A6VyzqHVCmOeTGQOTUDyc+ppjSdh+dQNJ2F cdSqdMKY93x15NQM+eSaaz49zUTN69a4alU6YwHM+fYVGTnpSElqAK45TcjVKwAU4CgCnqvrVQpg 2Crn6VKqZHHSlVM9anRMj0FdlOkYymMROwqwkePc09I+wGBU6R9lFd1Okc86gxI8c9TVhIu7flT0 jx05NWEjwOeTXZCmcs6gxYyeTx7VYVM/SnKnrUyx55NdMYHNOY1Uz04FTKmOBTlXPsKkVfSt4xOe UxFXHuakC4+tKBjpTwK0SMXIQCnAUAU6rJbEoopCaBC00mkJphPrSuUkOLVGW9KazflUbNn2FQ2a KI4t6VC0mPc0xpM/dqJn9KxlM2jAc7469ageTHJNNeTHuarPJjrya551DohAe8mevAqu8mfYU15O 5NV3kz16VyzqHVCmOaTPAqBpOwpjPn2FRM/pXFUqnVGArPj3NRM2OvJprP6UzNcNSrc3jECc9aTN BpACa527mgU8L60qr6VKqY9zWkKTe5LkIqetSomfYU9I8cmp1T1rup0jCUxiJ6cCp0jJ4Ap6R7vY VYSPPTgV3U6RzTqDEjx0GTVhI8e5p6R9lFTpHjpya64UzlnUGrHjlqmWPP3qeqY9zUyp610xgc0p iKmfYVKq+nApVT1qQCtlE53IRVx0p4FKFpwGKtIzbAClopaokKQnFBNNJouApNMJxQWqNmx9alst IVm9ajZs9eBTWbHJqJn9elZuRpGA5nz0qFn9Kaz5HtVdpCeBx71jKZ0RgPeTHTk1XeTHXk0x5Ow/ Oq7yEdOTXNOodMKY95O5NQPJnknApjyY68mq7v3NclSodMKY93/AVCz56Uxnz16VCz/gK4alU6ow Hs/pULNj60hbPSoy3YVwVKxtGIrN+dM5Y0oXPWpVTPsKwUZTZV7DVX061KqY9zTlTsKmVPTk120q NjOUxqpjrU6x9z+VORMe5qdI8cnn2rvp0jnlMYkeevSrKR5HHApyR92/KrCR568Cu2FI5Z1BiR9l qxHHzgdfWnpHnHZasInGB0rqhTOWdQYkePc1OqfnTlTsOtSqgH1rojE55TGqnc/lUoFKBTwvrWqi YuQgXP0p4HFAFOAq7GbYAUvSjpSE0xCk0lITxSbhRcLDqQnFIW9KYTSuNIUmmM2OtNZ8fWombuah yNFEcz/gKiZ/yprv3PSoHkznPArGUzaMBzydh+dQPJjIHJpjyE5A4FV3k7D86551DphTHvJjPOTV d5O56+lMeTGQOTUDyc+prlqVDqhTHPJnknj0qu759hSO+OvJqB3zya4qlY6oQHM+enSomf0prNn2 FRls9K4KlY3jEUtjpTepoApwFc+stzTYQCnBc9Kcq5+lSqgPTpW0KVyHIaqY9zUqp+Jp6J2FTpHj 3Nd1OkYymMSPufyqwkeeTTkjx7mrCRd2/Ku2nTOWdQYkefYVYSPsBxT0jzyeParCpn2FdcKZzTqD ETHAqZUx9aeqZ6cCplTHArpjA5pTGqmOvJqYL60qrj3NSBcfWtlEwlIQLnrTwKUCnAVaRk2IBTug paSqsSFFFNJouApNNJpCajLelS2WkOZsfWomb1pC3pULPj3NZuRpGI5nx1qFnz14FNd8detQPJjk msZTOiMB7Pn2FV3kzwv50x5MjngVWeTPsK5p1DohTJGk7Cq7yY9zTWkzwKrtJ2FcdSodUKY55AOv JqB34yxprPj3NRM2OvJriqVTpjAcz568CombPsKaTnrSVxTqXN1GwUmKKeF9azSbKvYaFzUqrnp0 pyp61MqZ9hXTTomcpjETPAFTomOnJp6JnpwKmRM8AV3U6RzymNVMe5qdIu7flT0jweOTVhI8e5rt hTOWdQaseeTU6R59hT1jxy1TrHn71dUKZzTqDUT04FTqnYUqpn2qZV9OBXRGJzSmNVcdOTUqpjnq aVVA6U8CtUjFyACnAUoFLV2M2wopaQmmIWmk0hNNJxQ2Ow4mmFvSmlvWo2bPsKhstRFLelRM+OnJ pGfPSoWf0rKUjaMBXfHuagdwOTSPJjpyarvJjryawnM6IQHvJnknAqu8mfYUx5O5NV3kzyTgVyzq HTCmSPJngce9Vnk7D86a8mfYVA0npXJUqnVCmOZ8dOTUTPj3NNZ/SoWbH1rgqVjojAczdzUTNnrS FvzpnLGuGpVvojZRFJpwXHWnKvp1qRUx7minScndg5CKnrUqpn2FOVMdanVO5/Ku+lRMJTGImenS p0TPAp6R569KsJHkccCu6nSOedQjSPBwBk1YSPHuaekfYVYjj5wOvrXbCmcs6gxI8Hnk+lWUj7n8 qckePc1OqY+tdMYHLOoNVPyqVUyPQU5U7n8qlArdRMJTEVccCngUoXP0p4FaJGTY0L+dPxQBTsYq yGwxRmgmkoEGaaTigtioyfzpXKSFJpu6ms2KZvNQ2WokxPFRs/YU1nz7Comf8qlyKjEcz4+tQvJj 3NMeTsPzqu8mMgcmsZTN4wHvJ3PX0qB5O56elMeTGecmqzydz19K5p1DphTJHkznPAqu8mcgdKY8 meSePSoHfPsK5KlU6oUxWk7D86hZ+wprSZ6cCoWf0rhqVTqjAcz49zUTN69aQtjpTetcNSq3ojZR AktQBSgU4LnpURjcdxAKkVPWlVMe5qdUx7mumnSIlIYqZ61OkZPsKckfc/lVhI88mu6nSOedQakf YDAqdI+wFOSPd7CrKR9lGBXbCmcs6gxI8dOTVhI8cnk0qJjhasKgHua6oUzlnMYqetTrHnk05Y8d eTUwX1rojA55TGqufYVIq+lOC+tPArVRMXIQDFPAoAp3QVZDYAYpaSimSFITSE0hNA0gJppb1prN j61Gzc81DZaiOZs+wqJmz7Cmu+OtQs+evArKUjWMBzSZ+7ULPjpTWfPsKrvITwv51hOodEID3kwP U1WeTHXk01pMcCq7yY9zXLOodUKY95O7Gq7yZ68CmPJjryaru/cmuOpVOqFMkZ93sKhZ/Sms2Rzw KhZs/SuGpWOiMBzP6UzNJSVySlc1SsLmjaTShc1Iq56DiiMHIG7DVX0qVUx7mnImeAKnRMdOTXbT pGMpjVjxyanVPWnKmPc1OkXdvyrtp0jnnUGpHu9hVhI89OBT0jzyanSPPsK7IUzlnUGpH2AqdI8d OTTkTPTgVYVOMCuqMDlnMYqYPqamVPWnKuOnJqVUx7mt1E55TGqnrUoFKBTgK0SMmxAPSnAUAUtW S2FLR0ppNAhSaaTQTTC3pSbKSFLYqNmx9aaW9KiZ8dOTWbkaRiOZu5qJn9elMZ8e5qF3xyaylI2j Aez5HtUDyZ4HHvTHk4yTgVWeTPsK551DphTJHk7L+dV3kweOTTHkzwOPeoHk7L+dcs6h0wpjnkx1 OTUDv3NMZ8e5qFnx9a4qlU6oQHM/r0qJnz7Cms3c1GzZ61w1KxvGIpbPSoy3YUhOacF9a4nOU3oa 2sIFz1qRVz7CnKnrUqpn2Fb0qBEpDVTsKmRPTk05Ez04FTomeFr0KdEwlMaiEe5qdIyOTz7U9I8c AZNTpHj3Nd1Omc06g1I+5/KrCR568CnJHjryfSrKRd2/KuuFM5Z1BiR5x2WrCJxgdKcqd+1SqmfY V0xgc0pjVTsOtTKmPrSquOBUgFaqJhKQgFPC+tAXH1p4FaJGbYAUoFKBQTVWIuHSkJozTScUAKTT C1IT60wt78VLZaQpPpTGf0601nz9KiZ+wrNyNIxHM+Pc0zfULyY4HWo9x9ayczVQLLv3PSoHkznn Apjydz19KrvJ3PT0rOdQ1hTHvITkDgVXeTsPzpryZBzwKrvJnIHSuWdQ6oUxzyYyByageTn1NMaT sPzqBpOwrjqVTphTHu+OvJqBnzyTTWfHuaiZvXrXDUqnTGA5nz7Coyc9KQktQBXHKbkapWACnAUA U9V9aqFMGwVc/SpVTI46UqpnrU6Jkegrsp0jGUxiJ2FWEjx7mnpH2AwKnSPsorup0jnnUGJHjnqa sJF3b8qekeOnJqwkeBzya7IUzlnUGLGTyeParCpn6U5U9amWPPJrpjA5pzGqmenAqZUxwKcq59hU ir6VvGJzymIq49zUgXH1pQMdKeBWiRi5CAU4CgCnVZLYlFFITQIWmk0hNMJ9aVykhxaoy3pTWb8q jZs+wqGzRRHFvSoWkx7mmNJn7tRM/pWMpm0YDnfHXrUDyY5JpryY9zVZ5MdeTXPOodEID3kz14FV 3kz7CmvJ3Jqu8mevSuWdQ6oUxzSZ4FQNJ2FMZ8+wqJn9K4qlU6owFZ8e5qJmx15NNZ/SmZrhqVbm 8YgTnrSZoNIATXO3c0CnhfWlVfSpVTHua0hSb3JchFT1qVEz7CnpHjk1Oqetd1OkYSmMRPTgVOkZ PAFPSPd7CrCR56cCu6nSOadQYkeOgyasJHj3NPSPsoqdI8dOTXXCmcs6g1Y8ctUyx5+9T1THuamV PWumMDmlMRUz7CpVX04FKqetSAVsonO5CKuOlPApQtOAxVpGbYAUtFLVEhSE4oJppNFwFJphOKC1 Rs2PrUtlpCs3rUbNnrwKazY5NRM/r0rNyNIwHM+elQs/pTWfI9qrtITwOPesZTOiMB7yY6cmq7yY 68mmPJ2H51XeQjpya5p1DphTHvJ3JqB5M8k4FMeTHXk1Xd+5rkqVDphTHu/4CoWfPSmM+evSoWf8 BXDUqnVGA9n9KhZsfWkLZ6VGW7CuCpWNoxFZvzpnLGlC561KqZ9hWCjKbKvYaq+nWpVTHuacqdhU yp6cmu2lRsZymNVMdanWPufypyJj3NTpHjk8+1d9Okc8pjEjz16VZSPI44FOSPu35VYSPPXgV2wp HLOoMSPstWI4+cDr609I847LVhE4wOldUKZyzqDEjx7mp1T86cqdh1qVUA+tdEYnPKY1U7n8qlAp QKeF9a1UTFyEC5+lPA4oApwFXYzbACl6UdKQmmIUmkpCeKYWpXGkOLYqMn86Qn0pjP6dalstIVmx UTN3NIz49zUDvjk9fSs5SNYwHs/4CoHkzkDgUx5O56elV3kznsKwlM6IUx7ydh+dR7x6/rULSZyB wKiMi571zSqam6plp5MZ5yarvJ3PX0pjyYyByageTn1NZVKhtCmOeTPJPHpVd3z7Ckd8deTUDvnk 1xVKx1QgOZ89OlRM/pTWbPsKjLZ6VwVKxvGIpbHSm9TQBTgK59ZbmmwgFOC56U5Vz9KlVAenStoU rkOQ1Ux7mpVT8TT0TsKnSPHua7qdIxlMYkfc/lVhI88mnJGB7mrCR92/Ku2nTOWdQYkefYVYSPsB xT0jzyeParCpn2FdcKZzTqDETHAqZUx9aeqZ6cCplTHArpjA5pTGqmOvJqYL60qrj3NSBcfWtlE5 5SEC5608ClApwFWkZtiAU7oKWkqrEhRRTSaLgKTTSaQmoy3pUtlpDmbH1qJm9aQt6VCz49zWbkaR iOZ8dahZ89eBTXfHXrUDyY5JrGUzeMB7Pn2FV3kzwv50x5MjngVWeTPsK5p1DphTJGk7Cq7yY9zT WkzwKrtJ2FcdSodUKY55AOvJqB34yxprPj3NRM2OvJriqVTpjAcz568CombPsKaTnrSVxTqXN1Gw U2l608L61mryHew0LmpVXPTpTlT1qVUz7CumnRIlMaiZ4AqdEx05NPRM9OBUyJngCu6nSOeUxqpj 3NTpF3b8qekeDxyasJHj3NdsKZyzqDVjzyanSPPsKeseOWqdY8/erqhTOWdQaienAqdU7ClVM+1T KvpwK6IxOeUxqrjpyalVMc9TSqvpTwK1SMXIAKcBSgUtXYzbCilpCaYhaaTSEimk4ouOw4mmFvSm s3rUbNn2FQ2WoilvSomfHTk0jOT0qFn9KylI2jAV3x7moHcDk0jyY6cmq7yY68msJzN4QHvJnknA qu8mfYUx5O5NQPJ3JwK5Z1DqhTHvJngce9Vnk7D86a8mfYVAzk9K5KlU6YUxzPjpyaiZ8e5prP6V CzY+tcFSsdMYDmbuaiZs9aQt+dM5Y1w1Kt9EbKIpNOC460qr6dalVMe5pU6Tk7sHIRU9alVM+wpy pjrU6p3P5V6FKiYSmMRM9OlTomeBT0jz16VYSPI44Fd1Okc86hGkeDgDJqwkePc09I+wqxHHzgdf Wu2FM5Z1BiR4PPJ9KspH3P5U5I8e5qdUx9a6YwOWdQaqflUqpkegpyp3P5VKBW6iYSmIq44FPApQ ufpTwK0SMmxoX86figCnYxVkNhijNBNJQIM00nFBbFRk/nSuUkKTTC3vxSM2KiZu5qGy1Ecz5+lR M/YU1n/AVA8mcgcCspTNowHPJjgdageTBPc0x5Ow/Oq7yYJA5Nc86h0wpj3k7nr6VXkk7np6Ux5M Z7tUDvzk9a5J1DqhTHPJn6VGZOaid+56VH5ntXHOrqdEYE7Sdh+dQs/YU1pM9OBULP6VjUqmsYDm fHuaiZvXrSFsdKb1rhqVW9EbKIElqAKUCnBc9KiMbjuIBUip60qpj3NTqmPc1006REpDFTPWp0jJ 9hTkj7n8qsJHnk13U6RzzqDUj7AYFTpH2ApyR7vYVYSPsBgV2wpnLOoRIm043fMasooB5cE1gX3h EX949wNY1S3D4/dwT7EXAxwMe1RDwHk/8jBref8Ar6/+tXVGFuhi3BrWX4HVqo7uKmUA8l65MeAT 38R67n2uv/saePh+e/iTXf8AwM/+xrdJ9jCXJ/N+B164/vACpVI7OK44fD9u/iXXv/Az/wCxpw+H x/6GXXv/AAM/+xrVJ9jFxh/N+B2QIHAcU8N/tiuMHw+J/wCZm8Qf+Bv/ANjS/wDCvSP+Zn8Qf+Bv /wBjVXfYzcIfzfgdmCB/EKXcP7wri/8AhXx/6GfxB/4G/wD2NH/Cvj/0M+v/APgZ/wDY07y7C5If zfgdpuH98Uhcf3xXFn4ft/0M3iD/AMDP/saafAB/6GbxB/4Gf/Y0cz7DVOH834Halx/fFRl17uK4 xvARH/My69n/AK/P/saY3gMj/mZde/8AAz/7Goc32LVKH834HZtID/GMVE0gP8YArjW8C46+JNd/ 8DP/AK1RnwPjr4i1zHvd/wD1qzc32NY0Yfzfgdg0o/heoWkHZxXIHwSf+hh1v8br/wCtUTeDTnjX 9Z/G6/8ArVjKozojRh/N+B1jygfxAmq7zAdXya5VvCPpr2sH/t6/+tULeFMf8xvVyf8Ar5/+tXNO odMKFPv+B1DyjqXqF5AergCuZPhbHXW9VJ/6+P8A61RHwzjrrOqf+BH/ANauWdRdzpjRh3/A6R5d 38eB9agaQdmrnj4aGOdX1P8A7/8A/wBamHw7/wBRXUP+/wD/APWrknOP8xvGjDv+BvtIvY0wuvrW H/wjzf8AQU1H/v8A/wD1qT/hH2/6CWo/9/v/AK1c8o039o2UI9zaz/tCl5P8VYo8NZ/5imof9/v/ AK1SL4Y3dNV1Ef8Abb/61SqUH9r8BNQXX8DZUY6PUqrg/fyaxF8K5PGral/3/wD/AK1Sjwl6axqm faf/AOtXTChHozKTh3/A3VTHJcVMq+risAeDz/0GtUz7XH/1qlXwYcc65qv4XH/1q7IUUc8nD+b8 Do0QH+PAqdEz0cAVzS+CCeuu6wP+3n/61TJ4FJ/5j+sgf9fX/wBauuFM5puH834HToo6Aip0UDo2 TXLL4Dz08Qa1j/r6/wDrVIvgI9vEWuf+BX/2NdMYvsc0uT+b8DrVUD+ME1KqjuwrkR4BPbxHrv8A 4Gf/AGNSD4fn/oZdez/1+f8A2NbJPsc8lD+b8DsFA7uKkBH98Vxo+Hzf9DNr/wD4Gf8A2NOHw9P/ AEM2v/8Agb/9jVpPsZOMP5vwOyBH98UobH8Yrjf+Fen/AKGbxB/4G/8A2NH/AAr4/wDQz+If/Az/ AOxq032J5Yfzfgdnkf3xS5H94Vxf/Cvv+pn8Q/8AgZ/9jR/wr8/9DP4g/wDAz/7GjmfYXJD+b8Ds yR/eFIXH98VxZ8AN/wBDP4g/8DP/ALGmn4ft/wBDNr//AIGf/Y0ud9hqnT/m/A7Quo/iFRtIo/jG a4w+A27eJde/8DP/ALGo28CsOniTXSf+vz/7Goc/I0jRh/N+B2bSDqXFQNID1cYrj28Dkf8AMx64 T/19/wD1qibwRgc+Idc/8Cv/AK1ZSm+xvGjD+b8DsGkBH3xioHlzwHx71yTeC8DnxBrOPe6/+tUL eD/+o9rGPe6/+tWEqjOiNGH834HVvMOiv+NVnmweHya5g+EueNc1j/wJ/wDrVC3hTB41vVT/ANvH /wBauadRHTCjDv8AgdO8uOS4JqB5O5euabwxj/mM6oT/ANfH/wBao28NY/5jGpk/9d//AK1ck6ke rOiNGHf8Domkz1fioWfP8eBWC3h3HXVtS/7/AP8A9amnw+O+q6h/3+/+tXJOcOsjeNKPf8DcaQdA ajLr2NYv/CPsf+YlqH/f7/61KPDrd9S1D/v9/wDWrlcYT2n+BqowXU11DHq9SKueN2BWQPDXc6pq H/f7/wCtT18L5/5i+pj/ALb/AP1q2hhqfciTj3/A2lXsGqZF9G5rDXwpu/5jGpgf9d//AK1SL4RB PGtaoP8At4/+tXXCgkYycO/4HQohHuanSMjk8+1PSPHAGTU6R49zXXTpnHOoNSPufyqwkeevApyR 468n0qykXdvyrrhTOWdQYkecdlqwicYHSnKnftUqpn2FdMYHNKY1U7DrUypj60qrjgVIBWqiYSkI BTwvrQFx9aeBWiRm2AFKBSgUE1ViLh0pCaM00nFACk0wtSE+tMLe/FS2WkKT6Uxn9OtNZ8/Somfs KzcjSMRzPj3NQu+OT19KY8mOB1qB5ME9zWMpm8ID3k7np6VWeTOewprydz19KrSSdz09K551DphT JHkzkDgVXeTsPzpjyZHoKrs+fpXHUqnXCmPZ/wA6hd8D1NNaTsPzqFm5964alU6IwHM/c1HuNMZ/ zpu81wzramyiSs2fYVGTnpSElqAKiU3IpKwAU4CgCnqvrVQpg2Crn6VKqZHHSlVM9anRMj0FdlOk YymMROwqwkePc09I+wGBU6R9lFd1Okc86gxI8c9TVhIu7flT0jx05NWEjwOeTXZCmcs6gxYyeTx7 VYVM/SnKnrUyx55NdMYHNOY1Uz04FTKmOBTlXPsKkVfSt4xOeUxFXHuakC45PWlAx0p4FaJGLkIB TgKAKdVktiUUUhNAhaaTSE0wn1pXKSHFqjLelNZvyqNmz7CobNFEcW9KhZ8e5pjSZ+7UTP6VjKZt GA53x161A8mOSaa8mPc1WeTHXk1zzqHRCA95M9eBVd5M+wprydyarvJnr0rlnUOqFMc0meBUDSdh TGfPsKiZ/SuKpVOqMBWfHuaiZsdeTTWf0pma4alW5vGIE560maDSAE1zt3NAp4U96VV9KlVMe5rS FJvclyEVPWpUTPsKekeOTU6p613U6RhKYxE9OBU6R54Ap6R7vYVYSPPTgV3U6RzTqDEjx0GTVhI8 e5p6R9lFTpHjpya64UzlnUGrHjlqnWPPWnKmPc1MqetdMYHNKYipn2FSqvpwKVU9akArZRMHIRVx 0p4FKFpwGKtIybAClopaokKQnFBNNJouApNMJxQWqNmx9alstIVm9ajZs9eBTWbHJqJn9elZuRpG A5nz0qFn9Kaz5HtVdpCeBx71jKZ0RgPeTHTk1XeTHXk0x5Ow/Oq7yEdOTXNOodMKY95O5NQPJnkn ApjyY68mq7v3NclSodMKY93/AAFQs+elMZ8jnpULP+ArhqVTqjAez+lQs2PrSFs9KjLdhXBUrG0Y ilvzpnLGlC561KqZ9hWCjKbLvYaq+nWpVTHuacqdhUyp6cmu2lRsZSmNVMdanWPufypyJj3NTpHj k8+1d9Okc8pjEjz16VZSPI44FOSPu35VYSPPXgV2wpHLOoMSPstWI4+cDr609I847LVhE4wOldUK ZyzqDEjx7mp1T86cqdh1qVUA+tdEYnPKY1U7n8qlApQKeF9a1UTFyEC5+lPA4oApwFXYzbACl6Ud KQmmIUmkpCeKYWpXGkOLYqMn86Qn0pjP6dalstIVmxUTN3NIz49zUDvjk9fSs5SNYwHs/wCAqB5M 5A4FMeTuenpVd5M57CsJTOiFMe8nYfnVd5MEgcmmvJnIHAqu8vYfnXLOodUKY55AM92qB37nrTGf H1qB3I9zXHUqnTCmPd+MnpUDvn2FIz9zUTN3JrhqVjpjAVm/KombsKCxb6UBa4ZVHLY1SsIBTsUo FO2mmqY2xgFOC56U5Vz9KlVAenStYUrkOQ1Ux7mpVT8TT0TsKnSPHua7qdIxlMYkfc/lVhI88mnJ Hj3NWEi7t+VdtOmcs6gxI8+wqwkfYDinpHnk8e1WFTPsK64UzmnUGImOBUypj609Uz04FTKmOBXT GBzSmNVMdeTUwX1pVXHuakC4+tbKJhKQgXPWngUoFOAq0jJsQCndBS0lVYkKKKaTRcBSaaTSE1GW 9KlstIczY+tRM3rSFvSoWfHuazcjSMRzPjrULPnrwKa7469ageTHJNYymdEYD2fPsKrvJnhfzpjy ZHPAqs8mfYVzTqHRCmSNJ2FV3kx7mmtJngVXaTsK46lQ6oUxzyAdeTUDvxljTWfHuaiZsdeTXFUq nTGA5nz14FRM2fYU0nPWkrinUubqNgpMUU8L61mk2Vew0LmpVXPTpTlT1qZUz7CumnRM5TGImeAK nRMdOTT0TPTgVMiZ4Arup0jnlMaqY9zU6Rd2/KnpHg8cmrCR49zXbCmcs6g1Y88mp0jz7CnrHjlq nWPP3q6oUzmnUGonpwKnVOwpVTPtUyr6cCuiMTmlMaq46cmpVTHPU0qqB0p4FapGLkAFOApQKWrs ZthRS0hNMQtNJpCaaTihsdhxNMLelNLetRs2fYVDZaiKW9KiZ8dOTSM+elQs/pWUpG0YCu+Pc1A7 gcmkeTHTk1XeTHXk1hOZ0QgPeTPJOBVd5M+wpjydyarvJnknArlnUOmFMkeTPA496rPJ2H5015M+ wqBnJ6VyVKp0wpjmfHTk1Ez49zTWf0qFmx9a4KlY6YwHM3c1EzZ60hb86byTXDOrfRGyiBNOC460 qr6dalVMe5op0nJ3YOQip61KqZ9hTlQd6mVO5/Ku+lRMZTGomenSp0TPAp6R569KsJHkccCu6nSO adQjSPBwBk1YSPHuaekfYVYjj5wOvrXbCmcs6gxI8Hnk+lWUj7n8qckePc1OqY+tdMYHLOoNVPyq VUyPQU5U7n8qlArdRMJTEVccCngUoXP0p4FaJGTY0L+dPxQBTsYqyGwxRmgmkoEGaaTigtioyfzp XKSFJphb34pGbFRM3c1DZaiOZ8/SomfsKaz/AICoHkzkDgVlKZtGA55McDrUDyYJ7mmPJ2H51XeT BIHJrnnUOmFMe8nc9fSq8knc9PSmPJjPdqgd+cnrXJOodUKY55M+wqBnz9Ka78ZPSoHfP0riqVTq hAe0nYfnULN+dIzflUTP2FcFSsbxgKz4HvTOSaAM04CuXWZpsIBTwPzpVXNTKvYV0U6RLkMVMe5q XYaeiY6cmpfLPqK7YUdDCUysqZ61OkZPsKckfc/lVhI88mtqdIidQakfYDAqdI+wFOSPd7CrKR9l GBXZCmcs6gxI8dOTVhI8cnk0qJjhasKgHua6oUzlnMYqetTrHnk05Y8deTUwX1rojA55TGqufYVI q+lOC+tPArVRMXIQDFPAoAp3QVZDYAYpaSimSFITSE0hNA0gJppb1prNj61Gzc81DZaiOZs+wqJm z7Cmu+OtQs+evArKUjWMBzSZ+7ULPjpTWfPsKrvITwv51hOodEID3kwPU1WeTHXk01pMcCq7yY9z XLOodUKY95O7Gq7yZ68CmPJjryaru/cmuOpVOqFMkZ93sKhZ/Sms2RzwKhZs/SuGpWOiMBzP6UzN JSVySlc1SsLmjaTShc1Iq56DiiMHIG7DVX0qVUx7mnImeAKnRMdOTXbTpGMpjVjxyanVPWnKmPc1 OkXdvyrtp0jnnUGpHu9hVhI89OBT0jzyanSPPsK7IUzlnUGpH2AqdI8dOTTkTPTgVYVOMCuqMDln MYqYPqamVPWnKuOnJqVUx7mt1E55TGqnrUoFKBTgK0SMmxAPSnAUAUtWS2FLR0ppNAhSaaTQTTC3 pSbKSFLYqNmx9aaW9KiZ8dOTWbkaRiOZu5qJn9elMZ8e5qF3xyaylI2jAez5HtUDyZ4HHvTHk4yT gVWeTPsK551DphTJHk7L+dV3kweOTTHkzwOPeoHk7L+dcs6h0wpjnkx1OTUDv3NMZ8e5qFnx9a4q lU6oQFZ89TxUTu56DivPviZqV9YjS/sl7c22/wA7d5MrJuxsxnB968//AOEi1v8A6DGo/wDgU/8A jX1WV8IVsyw0cRGokpX0aPOxGZwoVHBxvY99LZ6VGW7AV4P/AMJBrX/QY1D/AMCX/wAaQa/rP/QY 1D/wJf8AxrqqeHGJf/L2P3MlZ5SX2We8hc9RUiqSPQV4Taal4mv5PKs77V7iT+7DNI5/Q10Np4a+ JF2oMa6ug/6a3hj/AEZga4Z8E06Hx4iNyv7ZjLaDPWlj7AVMkfoMmvLh4K+Jm3P2u8Ht/aX/ANlV W48M/Ey1Us76qy/9Mr/fn8A9Onwxh72WIX3kyzVfys9iSPHbJqdIwOTz7V87Xmp+LtMlKXt/rdq/ pNPKh/U1V/4SbX/+g9qn/gZJ/jXr0ODHUXNTqxa8jnlmsf5WfTKRt1b8qtJHnrwK+XP+Eo8Q/wDQ e1T/AMDJP/iq+q0j+bJ/KuHM8inlvJzyUua+3kOljFWvZWsCR5x2WrCJxgdKcqd+1SqmfYV5sYBK Y1U7DrUypj60qrjgVIBWqiYSkIBTwvrQFx9aeBWiRm2AFKBSgUE1ViLh0pCaM00nFACk0wtSE+tM Le/FS2WkKT6Uxn9OtNZ8/SomfsKzcjSMRzPj3NQu+OT19KY8mOB1qB5ME9zWMpm8ID3k7np6VWeT Oewprydz19KrSSdz09K551DphTJHkzkDgVXeTsPzpjyZHoKrs+fpXHUqnXCmPZ/zqF3x7mmtJ2H5 1Czc+9cNSqdEYDmfuaiZ+5prNj60zkmuCpWvojdRFJJ+lAFAFPA9OtZxg5O7HcaBUqoT1pVTB55N TqnrXXTpESmMVM9uKnRM9BgU5I88nj2qwkefYV3U6RzTqDEj7AVN5XvUqR54AwKl8se9dapnNKpq VEjxz1NWEi7t+VPSPHTk1YSPA55NbQpkTqDFjJ5PHtVhUz9KcqetTLHnk10xgc05jVTPTgVMqY4F OVc+wqRV9K3jE55TEVce5qQLj60oGOlPArRIxchAKcBQBTqslsSiikJoELTSaQmmE+tK5SQ4tUZb 0prN+VRs2fYVDZooji3pULSY9zTGkz92omf0rGUzaMBzvjr1qB5Mck015Me5qs8mOvJrnnUOiEB7 yZ68Cq7yZ9hTXk7k1XeTPXpXLOodUKY5pM8CoGk7CmM+fYVEz+lcVSqdUYCs+Pc1EzY68mms/pTM 1w1KtzeMQJz1pM0GkAJrnbuaBTwvrSqvpUqpj3NaQpN7kuQip61KiZ9hT0jxyanVPWu6nSMJTGIn pwKnSMngCnpHu9hVhI89OBXdTpHNOoMSPHQZNWEjx7mnpH2UVOkeOnJrrhTOWdQaseOWqZY8/ep6 pj3NTKnrXTGBzSmIqZ9hUqr6cClVPWpAK2UTnchFXHSngUoWnAYq0jNsAKWilqiQpCcUE00mi4Ck 0wnFBao2bH1qWy0hWb1qNmz14FNZscmomf16Vm5GkYDmfPSoWf0prPke1V2kJ4HHvWMpnRGA95Md OTVd5MdeTTHk7D86rvIR05Nc06h0wpj3k7k1A8meScCmPJjryaru/c1yVKh0wpj3f8BULPnpTGfP XpULP+ArhqVTqjAez+lQs2PrSFs9KjLdhXBUrG0YnnfxU5bSf+23/slecmvRPilnOk/9tv8A2SsP wM2oHXTFpml2N/dSRn/j9Tcka926gDtz/jX7jwxiXQyGFVK9k3q7dT5DNI3xcl6HOW9vNeXEdvbx tLNKwREUZLE9BXqlt4G8P+DtLXVvGM32mc8JZx527uuB3Y/+O12nhiz11NUL6xoug2sKxN5cljHi Tfxx16Y3U3xJF4pn1QrYaToN3Yoo8p74FnBI+bv618rmvFWKxeLjhYtRha7s9X5JmdOhGMebdnmm pfFXUghtfD9la6RZL9wRRKXx/wCgj8B+NcneeJdc1BibrV76UHs07Y/LOK9g+weM/wDoW/CX/fv/ AOvR9g8Z/wDQteEv+/f/ANevTwmZYbDrSgr9202/vREoyl1Z4d9omLbvOkz67zV611/WbFw1rqt7 CR/cuGH9a9j+weM/+ha8Jf8Afv8A+vUN1D4tsrSa5ufD3hCOCFC7uY+FUde9dn9u06nuOgnfpp/k T7NrW7OL0z4ra3br9n1aO31azbh47iMBiPqP6g1y2tX9rqerT3VlYQ2Fu7fu7eLoo/x+lWtf8S3H iCaN5bWytY0Hyx2kIjUn1Pcn8aw/evp8ry6lD9+ockpLVJ6fcYTm3pe4lfZcacD1r40r7SiTCj1r wOMleVP5/odOEdlIFTufyqUClAp4X1r4pROpyEC5+lPA4oApwFXYzbACl6UdKQmmIUmkpCeKYWpX GkOLYqMn86Qn0pjP6dalstIVmxUTN3NIz49zUDvjk9fSs5SNYwHs/wCAqB5M5A4FMeTuenpVd5M5 7CsJTOiFMe8nYfnVd5MEgcmmvJnIHAqu8vYfnXLOodUKY55AM92qB37nrTGfH1qB3I9zXHUqnTCm Pd+MnpUDvn2FIz9zUTN3JrhqVjpjAVm/KombsKCxb6UBa4ZVHLY1SsIBmnAUoFPVM9aqFMGxFXNT InYU5Uz2wKmRM9OBXbTomMpkaJjpyaspHg88mnJH2AqwkeOBya7qdI551BiRnqfyqwkZPJ49qeke OvJqdI+5/KuuFM5Z1BqR59hUuxfQVKseeTUoXjpXTGBzSmVUTHC1MqY+tPVM9OBUypjgVpGBEpjV THXk1MF9aVVx7mpAuPrWyiYSkIFz1p4FKBTgKtIybEAp3QUtJVWJCiimk0XAUmmk0hNRlvSpbLSH M2PrUTN60hb0qFnx7ms3I0jEcz461Cz568Cmu+OvWoHkxyTWMpnRGA9nz7Cq7yZ4X86Y8mRzwKrP Jn2Fc06h0QpkjSdhVd5Me5prSZ4FV2k7CuOpUOqFMc8gHXk1A78ZY01nx7mombHXk1xVKp0xgOZ8 9eBUTNn2FNJz1pK4p1Lm6jYKTFFPC+tZpNlXsNC5qVVz06U5U9amVM+wrpp0TOUxiJngCp0THTk0 9Ez04FTImeAK7qdI55TGqmPc1OkXdvyp6R4PHJqwkePc12wpnLOoNWPPJqdI8+wp6x45ap1jz96u qFM5p1BqJ6cCp1TsKVUz7VMq+nArojE5pTGquOnJqVUxz1NKqgdKeBWqRi5ABTgKUClq7GbYUUtI TTELTSaQmmk4obHYcTTC3pTS3rUbNn2FQ2WoilvSomfHTk0jPnpULP6VlKRtGArvj3NQO4HJpHkx 05NV3kx15NYTmdEID3kzyTgVXeTPsKY8ncmq7yZ5JwK5Z1DphTJHkzwOPeqzydh+dNeTPsKgaT0r kqVTqhTHM+OnJqJnx7mms/pULNj61wVKx0RgOZu5qJmz1pC350zljXDUq30Rsoik0oXHWnqvp1qR Ux7mlTpOTuwcrHm3xVBH9j5/6bf+yV5ua9V+J2mXt/8A2V9is7m52edv8mJn252Yzj6GvPz4a13/ AKAmpY/685P8K/euEsRh6eUwp1JJPXRtHx2YwnLESkkUbC+udMvob2zmaG4hbcjr2r1keJ/DHxF0 qPT/ABCw0vUo+Y58gLu/2WPY/wB1vzrzT/hGdeHTRNT/APAST/Cg+GNfPP8AYeqf+Acn+Fa5plWV 41xqKajOOzTRyw9rDS2h0Gs/C3xDppMtnEup2nVJbXkkf7vX8s1yFzY3VlJsu7aaB/7sqFT+tdBp tt430g506y162XuscEoU/wDAcYrpbfxd8TI02S6VeXS+k2lMf/QVFcdOriML7rcJrvfUfJzdGjzL FTW9tNdSBLaCSVzwFjUsf0r03/hLPHR/5kmEn1/seamS+K/iayFLfRLq1B7QaS3H5qa2/tOs/hpw Xq0Hs/N/cYOkfDTxLquGksvsMB6yXfyYH+7979K5OeIQXMsQfd5bldw74PWuq1OLx/q4ZdQtPEE6 HrGbWUJ/3yFxWR/winiPt4e1b/wCl/wr0cvxs05SxdaLvsl0Mpw/lRjdq+14x8i18gf8In4k/wCh e1f/AMAZf/ia+wowQig9q8LinE0q86fs5J2vt8jbDpq9xQv50/FAFOxivlDdsMUZoJpKBBmmk4oL YqMn86VykhSaYW9+KRmxUTN3NQ2WojmfP0qJn7Cms/4CoHkzkDgVlKZtGA55McDrUDyYJ7mmPJ2H 51XeTBIHJrnnUOmFMe8nc9fSq8knc9PSmPJjPdqgd+cnrXJOodUKY55M+wqBnz9Ka78ZPSoHfP0r iqVTqhAe0nYfnULN+dIzflUTP2FcFSsbxgKz4HvTOSaAM04CuXWZpsIBTwPzpVXNTKvYV0U6RLkM VMH1NTqnrSomOnJqdI8deTXdTpGEpjUjJ5P5VYSPPsKckfdvyqwkeeTx7V206ZyzqDUj7AYFTpH2 Ap6R59hVhI+wGBXXCmc06gxI8e5qdY8deTTlTHAqZUx7muiMDmlMaqetS7T6U5Vx9adtPtW6iYOR Eq59hUir6U4L608CmokuQgGKeBQBTugqyGwAxS0lFMkKQmkJpCaBpATTS3rTWbH1qNm55qGy1Ecz Z9hUTNn2FNd8dahZ89eBWUpGsYDmkz92oWfHSms+fYVXeQnhfzrCdQ6IQHvJgepqs8mOvJprSY4F V3kx7muWdQ6oUx7yd2NV3kz14FMeTHXk1Xd+5NcdSqdUKZIz7vYVCz+lNZsjngVCzZ+lcNSsdEYD mf0pmaSkrklK5qlYXNG0mlC5qRVz0HFEYOQN2GqvpUqpj3NORM8AVOiY6cmu2nSMZTGrHjk1Oqet OVMe5qdIu7flXbTpHPOoNSPd7CrCR56cCnpHnk1OkefYV2QpnLOoNSPsBU6R46cmnImenAqwqcYF dUYHLOYxUwfU1MqetOVcdOTUqpj3NbqJzymNVPWpQKUCnAVokZNiAelOAoApaslsKWjpTSaBCk00 mgmmFvSk2UkKWxUbNj600t6VEz46cms3I0jEczdzUTP69KYz49zULvjk1lKRtGA9nyPaoHkzwOPe mPJxknAqs8mfYVzzqHTCmSPJ2X86rvJg8cmmPJngce9QPJ2X865Z1DphTHPJjqcmoHfuaYz49zUL Pj61xVKp1QgOZ/XpUTPn2FNZu5qNmz1rhqVjeMRS2elRluwpCc04L61xOcpvQ1tYQLnrUirn2FOV PWpVTPsK3pUCJSGqnYVMienJpyJnpwKnRM8LXoU6JhKY1EwfU1OkeOTz7U9I8cAZNTpHj3NejTU0 cs53GpH3b8qsJHnrwKckeOvJ9KspF3b8q64KZyzmMjjzjstWETAwOlOVO/apVTPsK6YtnNKY1U7D rUyrj605VA4FPAq02YSkIFp4X1pQuPrTgK0VzNsQCnAUoFBNUTcOlITRmmk4pAKTTC1IT60wt78V LZaQpPpTGf0601nz9KiZ+wrNyNIxHM+Pc1C745PX0pjyY4HWoHkwT3NYymbwgPeTuenpVZ5M57Cm vJ3PX0qtJJ3PT0rnnUOmFMkeTOQOBVd5Ow/OmPJkegquz5+lcdSqdcKY9n/OoXfHuaa0nYfnULNz 71w1Kp0RgOZ+5qJn7mms2PrTOSa4Kla+iN1EUkn6UAUAU8D061nGDk7sdxoFSqhPWlVMHnk1Oqet ddOkRKYxUz24qdEz0GBTkjzyeParCR59hXdTpHNOoMSPsBVhI8dOTT0jzwBgVOkfYCu2FM5p1CNI 8Hnk1ZSPufyp6R49zU6x468muqFM5p1Bqpnk1OqZHtSqnrUwX1rojA5pTGqvp0qVV7Uqrn6VIB2F apGLkIFAp2KUClxV2M7jAKcBQBTqYNiUUUhNAhaaTSE0wn1pXKSHFqjLelNZvyqNmz7CobNFEcW9 KhaTHuaY0mfu1Ez+lYymbRgOd8detQPJjkmmvJj3NVnkx15Nc86h0QgPeTPXgVXeTPsKa8ncmq7y Z69K5Z1DqhTHNJngVA0nYUxnz7Comf0riqVTqjAVnx7mombHXk01n9KZmuGpVubxiBOetJmg0gBN c7dzQKeF9aVV9KlVMe5rSFJvclyEVPWpUTPsKekeOTU6p613U6RhKYxE9OBU6Rk8AU9I93sKsJHn pwK7qdI5p1BiR46DJqwkePc09I+yip0jx05NdcKZyzqDVjxy1TLHn71PVMe5qZU9a6YwOaUxFTPs KlVfTgUqp61IBWyic7kIq46U8ClC04DFWkZtgBS0UtUSFITigmmk0XAUmmE4oLVGzY+tS2WkKzet Rs2evAprNjk1Ez+vSs3I0jAcz56VCz+lNZ8j2qu0hPA496xlM6IwHvJjpyarvJjryaY8nYfnVd5M dOTXNOodMKY95O5NQPJnknApjyY68mq7v3NclSodMKY93/AVCz56Uxnz16VCz/gK4alU6owHs/pU LNj60hbPSoy3YVwVKxtGIrN+dM5Y0oXPWpVTPsKwUZTZV7DVX061KqY9zTlTsKmVPTk120qNjOUx qpjrU6x9z+VORMe5qdI8cnn2rvp0jnlMYkeevSrKR5HHApyR92/KrCR568Cu2FI5Z1BiR9lqxHHz gdfWnpHnHZasInGB0rqhTOWdQYkePc1OqfnTlTsOtSqgH1rojE55TGqnc/lUoFKBTwvrWqiYuQgX P0p4HFAFOAq7GbYAUvSjpSE0xCk0lITxTC1K40hxbFRk/nSE+lMZ/TrUtlpCs2KiZu5pGfHuagd8 cnr6VnKRrGA9n/AVA8mcgcCmPJ3PT0qu8mc9hWEpnRCmPeTsPzqu8mCQOTTXkzkDgVXeXsPzrlnU OqFMc8gGe7VA79z1pjPj61A7ke5rjqVTphTHu/GT0qB3z7CkZ+5qJm7k1w1Kx0xgKzflUTN2FBYt 9KAtcMqjlsapWEAzTgKUCnqmetVCmDYirmpkTsKcqZ7YFTImenArtp0TGUyNEx05NWUjweeTTkj7 AVYSPHA5Nd1Okc86gxIz1P5VYSMnk8e1PSPHXk1Okfc/lXXCmcs6g1I8/SrCJ2AwKcsfc1OqZHtX VCBzTmMRMcCplTH1pyr6dKlVfSt4xOeUxqrj61KF9aULinAVokYuQAU4CgClqibh0pKKKYgooppN FwFJppNITUZb0qWy0hzNj61EzetIW9KhZ8e5rNyNIxHM+OtQs+evAprvjr1qB5Mck1jKZ0RgPZ8+ wqu8meF/OmPJkc8CqzyZ9hXNOodEKZI0nYVXeTHuaa0meBVdpOwrjqVDqhTFeQDryahd88saaz49 zUTNjrya5KlRnRGI5nz14FRM2fYU0nPWkrjm5s2VkFNzS08L61koTZfMkIFzUirnp0pyp61Mseee grop0GZSqDETPAFTomOnJp6JkccCpkjyMKK7qdIwlUGqmPc1OkXdvyp6R4PHJqwkePc12QpHNOoN WPPJqdI8+wp6x45ap1jz96uqFM5Z1BqJ6cCp1TsKcqZ9hUqrnpwK6IxOaUxqrjpyalVMc9TSqvpT wK1SMnIAKcBSgUtXYzbCilpCaYhaaTSEimk4ouOw4mmFvSms3rUbNn2FQ2WoilvSomfHTk0jOT0q Fn9KylI1jEV3x7moHfHJpHkxwOTVd5MdeTWE5nRCA95OMk4FV3fPsKY8nc1A8meScCuaczphAe8m eBx71WeTnA/Omu5PsKhZyelclSqdUICs+OnJqJnx7mms/pULNj6159SsdMYDmbuaiZs9aQt+dM5Y 1w1Kt9EbKIpNOC4605V9OtSKmPc0U6Tk7sHIRU9alVM+wpypjrU6p3P5V30qJhKYxEz06VOiZ4FP SPPXpVhI8jjgV3U6RzzqEaR4OAMmrCR49zT0j7CrEcfOB19a7YUzlnUGJHg88n0qykfc/lTkjx7m p1TH1rpjA5Z1Bqp+VSqmR6CnKnc/lUoFbqJhKYirjgU8ClC5+lPArRIybGhfzp+KAKdjFWQ2GKM0 E0lAgzTScUFsVGT+dK5SQpNMLe/FIzYqJm7mobLURzPn6VEz9hTWf8BUDyZyBwKylM2jAc8mOB1q B5ME9zTHk7D86rvJgkDk1zzqHTCmPeTuevpVeSTuenpTHkxnu1QO/OT1rknUOqFMc8mfYVAz5+lN d+MnpUDvn6VxVKp1QgPaTsPzqFm/OkZvyqJn7CuCpWN4wFZ8D3pnJNAGacBXLrM02EAp4H50qrmp lXsK6KdIlyGKmD6mp1T1pUTHTk1OkeOvJrup0jCUxqRk8n8qsJHn2FOSPu35VYSPPJ49q7adM5Z1 BqR9gMCp0j7AU9I8+wqwkfYDArrhTOadQYkePc1OseOvJpypjgVMqY9zXRGBzSmNVPWpgvrSquPr UoX1rdRMJSGhc/SpAKUCnAVaRk2IBS9KXpSVRIUUU0mgBSabmkJpu4etTcpIeTTS3rTWbH1qNm55 pNlKI5mz7CombPsKa7461Cz568CspSNYwHNJn7tQs+OlNZ8+wqu8hPC/nWE6h0QgPeTA9TVZ5Mde TTWkxwKrvJj3Ncs6h1Qpj3k7sarvJnrwKY8mOvJqu79ya46lU6oUyRn3ewqFn9KazZHPAqFmz7Cu GpWN4wOT1vwvq+qarPd2niq8sIZNu22iD7UwoBxhx1Iz071m/wDCC6+P+Z41L8n/APjld51NJn3r RZjXiuVNfcjN4Sm3dr8WcJ/wgmvf9DxqX5P/APHKQeBdfP8AzO+o/k//AMcrvArHvUyqx6dKqOPx Muq+5f5CeFprp+LOBHgHX+3jrU/++X/+O04fD/xB28dann/df/47XoCITwBU6IR05NdUMXXe7X3I ylQgun4s89Hw68RY58famP8AgL//AB2nj4c+Iz1+IGqD/gMn/wAdr0VI2HfJqwkRHLH8K6o16r/4 ZGEqUV/w7PNl+GniZh/yUPVQP92T/wCO1Knwy8Tnp8RtWA/3ZP8A49XpqRk8k1OkZPfArpjOo/8A hjnlCP8ATPMF+FviYn5fiTq//fMv/wAep4+FXinPHxM1n/vmX/49XqqJnoMCp1QdBW8ZyMJKJ5QP hR4q/wCin6zn/dl/+PVJ/wAKm8V/9FQ1r/vmX/4/XrCrjpyalVPxNapsxdjyMfCTxaf+ap60Pwl/ +P04fCLxd/0VbXP++Zf/AI/XrwWnBatGbseQj4Q+Lz/zVfXPyl/+P07/AIVF4v8A+isa5/3zN/8A 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 YnR5cGUgL0xpbmsKL0EgCjw8Ci9VUkkgKG1haWx0bzptYWl0cmUuamFjcXVlc19jYXBsYWluQGhv dG1haWwuZnIpCi9UeXBlIC9BY3Rpb24KL1MgL1VSSQo+PgovU3RydWN0UGFyZW50IDIKL1JlY3Qg WzExMC4yMiA1NDEuMjkgMjgwLjA5IDU1Mi43OV0KPj4KZW5kb2JqIAozMCAwIG9iaiAKPDwKL0Zp cnN0Q2hhciAzMgovRm9udERlc2NyaXB0b3IgMzQgMCBSCi9OYW1lIC9GNQovRW5jb2RpbmcgL1dp bkFuc2lFbmNvZGluZwovQmFzZUZvbnQgL0FyaWFsLEJvbGQKL1N1YnR5cGUgL1RydWVUeXBlCi9M YXN0Q2hhciAxMTcKL1dpZHRocyAzNSAwIFIKL1R5cGUgL0ZvbnQKPj4KZW5kb2JqIAozNCAwIG9i aiAKPDwKL0ZvbnROYW1lIC9BcmlhbCxCb2xkCi9TdGVtViA0NwovTGVhZGluZyAzMwovQXNjZW50 IDkwNQovRmxhZ3MgMzIKL0ZvbnRXZWlnaHQgNzAwCi9YSGVpZ2h0IDI1MAovRGVzY2VudCAtMjEw Ci9BdmdXaWR0aCA0NzkKL0l0YWxpY0FuZ2xlIDAKL01heFdpZHRoIDI2MjgKL0ZvbnRCQm94IFst NjI4IC0yMTAgMjAwMCA3MjhdCi9UeXBlIC9Gb250RGVzY3JpcHRvcgovQ2FwSGVpZ2h0IDcyOAo+ PgplbmRvYmogCjMgMCBvYmogCjw8Ci9QYXJlbnRUcmVlIDM2IDAgUgovUm9sZU1hcCAzNyAwIFIK L1BhcmVudFRyZWVOZXh0S2V5IDMKL0sgWzM4IDAgUl0KL1R5cGUgL1N0cnVjdFRyZWVSb290Cj4+ CmVuZG9iaiAKMzcgMCBvYmogCjw8Ci9EaWFncmFtIC9GaWd1cmUKL0hlYWRlciAvU2VjdAovV29y a3NoZWV0IC9QYXJ0Ci9Gb290ZXIgL1NlY3QKL0lubGluZVNoYXBlIC9TZWN0Ci9TbGlkZSAvUGFy dAovRm9vdG5vdGUgL05vdGUKL0Fubm90YXRpb24gL1NlY3QKL0NoYXJ0IC9TZWN0Ci9EaWFsb2dz aGVldCAvUGFydAovRW5kbm90ZSAvTm90ZQovQXJ0aWZhY3QgL1NlY3QKL0NoYXJ0c2hlZXQgL1Bh cnQKL1dvcmtib29rIC9Eb2N1bWVudAovTWFjcm9zaGVldCAvUGFydAovVGV4dGJveCAvU2VjdAo+ PgplbmRvYmogCjM2IDAgb2JqIAo8PAovTnVtcyBbMCAzOSAwIFIgMSA0MCAwIFIgMiA0MSAwIFJd Cj4+CmVuZG9iaiAKMzggMCBvYmogCjw8Ci9QIDMgMCBSCi9LIFs0MiAwIFIgNDMgMCBSIDQ0IDAg UiA0NSAwIFIgNDYgMCBSXQovVHlwZSAvU3RydWN0RWxlbQovUyAvU2VjdAo+PgplbmRvYmogCjQy IDAgb2JqIAo8PAovUGcgNCAwIFIKL1AgMzggMCBSCi9BbHQgKCkKL0sgWzBdCi9UeXBlIC9TdHJ1 Y3RFbGVtCi9TIC9GaWd1cmUKPj4KZW5kb2JqIAozOSAwIG9iaiBbNDIgMCBSIDQ3IDAgUiA0OCAw IFIgNDkgMCBSIDUwIDAgUiA1MSAwIFIgNTIgMCBSIDUzIDAgUiA1NCAwIFIgNTUgMCBSIDU2IDAg UiA1NyAwIFIgNTggMCBSIDU5IDAgUiA2MCAwIFIgNjEgMCBSIDYyIDAgUiA2MyAwIFIgNjQgMCBS IDY1IDAgUiA2NiAwIFIgNjcgMCBSIDY4IDAgUiA2OSAwIFIgNzAgMCBSXQplbmRvYmogCjQzIDAg b2JqIAo8PAovUGcgNCAwIFIKL1AgMzggMCBSCi9LIFs0NyAwIFIgNDggMCBSIDQ5IDAgUiA1MCAw IFIgNTEgMCBSIDUyIDAgUiA1MyAwIFIgNTQgMCBSIDU1IDAgUiA1NiAwIFIgNTcgMCBSIDU4IDAg UiA1OSAwIFIgNjAgMCBSIDYxIDAgUiA2MiAwIFIgNjMgMCBSIDY0IDAgUiA2NSAwIFIgNjYgMCBS IDY3IDAgUiA2OCAwIFIgNjkgMCBSIDcwIDAgUl0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4K ZW5kb2JqIAo0NyAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMV0KL1R5cGUgL1N0 cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo0OCAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAg UgovSyBbMl0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo0OSAwIG9iaiAKPDwK L1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbM10KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5k b2JqIAo1MCAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbNF0KL1R5cGUgL1N0cnVj dEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo1MSAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgov SyBbNV0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo1MiAwIG9iaiAKPDwKL1Bn IDQgMCBSCi9QIDQzIDAgUgovSyBbNl0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2Jq IAo1MyAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbN10KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo1NCAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBb OF0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo1NSAwIG9iaiAKPDwKL1BnIDQg MCBSCi9QIDQzIDAgUgovSyBbOV0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo1 NiAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMTBdCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNTcgMCBvYmogCjw8Ci9QZyA0IDAgUgovUCA0MyAwIFIKL0sgWzEx XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjU4IDAgb2JqIAo8PAovUGcgNCAw IFIKL1AgNDMgMCBSCi9LIFsxMl0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo1 OSAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMTNdCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNjAgMCBvYmogCjw8Ci9QZyA0IDAgUgovUCA0MyAwIFIKL0sgWzE0 XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjYxIDAgb2JqIAo8PAovUGcgNCAw IFIKL1AgNDMgMCBSCi9LIFsxNV0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo2 MiAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMTZdCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNjMgMCBvYmogCjw8Ci9QZyA0IDAgUgovUCA0MyAwIFIKL0sgWzE3 XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjY0IDAgb2JqIAo8PAovUGcgNCAw IFIKL1AgNDMgMCBSCi9LIFsxOF0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo2 NSAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMTldCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNjYgMCBvYmogCjw8Ci9QZyA0IDAgUgovUCA0MyAwIFIKL0sgWzIw XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjY3IDAgb2JqIAo8PAovUGcgNCAw IFIKL1AgNDMgMCBSCi9LIFsyMV0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo2 OCAwIG9iaiAKPDwKL1BnIDQgMCBSCi9QIDQzIDAgUgovSyBbMjJdCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNjkgMCBvYmogCjw8Ci9QZyA0IDAgUgovUCA0MyAwIFIKL0sgWzIz XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjcwIDAgb2JqIAo8PAovUGcgNCAw IFIKL1AgNDMgMCBSCi9LIFsyNF0KL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo0 NCAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDM4IDAgUgovQWx0ICgpCi9LIFswXQovVHlwZSAvU3Ry dWN0RWxlbQovUyAvRmlndXJlCj4+CmVuZG9iaiAKNDAgMCBvYmogWzQ0IDAgUiA0NSAwIFIgNzEg MCBSIDcyIDAgUiA3MyAwIFIgNzQgMCBSIDc1IDAgUiA3NiAwIFIgNzcgMCBSIDc4IDAgUiA3OSAw IFIgODAgMCBSIDgxIDAgUiA4MiAwIFIgODMgMCBSIDg0IDAgUiA4NSAwIFIgODYgMCBSIDg3IDAg UiA4OCAwIFIgODkgMCBSIDkwIDAgUiA5MSAwIFIgOTIgMCBSIDkzIDAgUiA5NCAwIFIgOTUgMCBS IDk2IDAgUiA5NyAwIFIgOTggMCBSIDk5IDAgUiAxMDAgMCBSIDEwMSAwIFIgMTAyIDAgUiAxMDMg MCBSIDEwNCAwIFIgMTA1IDAgUiAxMDYgMCBSIDEwNyAwIFIgMTA4IDAgUiAxMDkgMCBSXQplbmRv YmogCjQ1IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgMzggMCBSCi9LIFsxXQovVHlwZSAvU3RydWN0 RWxlbQovUyAvUAo+PgplbmRvYmogCjQ2IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgMzggMCBSCi9L IFs3MSAwIFIgNzIgMCBSIDczIDAgUiA3NCAwIFIgNzUgMCBSIDc2IDAgUiA3NyAwIFIgNzggMCBS IDExMCAwIFIgODIgMCBSIDgzIDAgUiA4NCAwIFIgODUgMCBSIDg2IDAgUiA4NyAwIFIgODggMCBS IDg5IDAgUiA5MCAwIFIgOTEgMCBSIDkyIDAgUiA5MyAwIFIgOTQgMCBSIDk1IDAgUiA5NiAwIFIg OTcgMCBSIDk4IDAgUiA5OSAwIFIgMTAwIDAgUiAxMDEgMCBSIDEwMiAwIFIgMTAzIDAgUiAxMDQg MCBSIDEwNSAwIFIgMTA2IDAgUiAxMDcgMCBSIDEwOCAwIFIgMTA5IDAgUl0KL1R5cGUgL1N0cnVj dEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo3MSAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgov SyAyCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9TcGFuCj4+CmVuZG9iaiAKNzIgMCBvYmogCjw8Ci9Q ZyA1IDAgUgovUCA0NiAwIFIKL0sgWzNdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9i aiAKNzMgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIKL0sgWzRdCi9UeXBlIC9TdHJ1Y3RF bGVtCi9TIC9QCj4+CmVuZG9iaiAKNzQgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIKL0sg WzVdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKNzUgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzZdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAK NzYgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIKL0sgWzddCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9TIC9QCj4+CmVuZG9iaiAKNzcgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIKL0sgWzhd Ci9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKNzggMCBvYmogCjw8Ci9QZyA1IDAg UgovUCA0NiAwIFIKL0sgWzldCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKMTEw IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFs3OSAwIFIgNDEgMCBSIDgxIDAgUl0K L1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAo3OSAwIG9iaiAKPDwKL1BnIDUgMCBS Ci9QIDExMCAwIFIKL0sgMTAKL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1NwYW4KPj4KZW5kb2JqIAo0 MSAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDExMCAwIFIKL0sgWzExMSAwIFIgODAgMCBSXQovVHlw ZSAvU3RydWN0RWxlbQovUyAvTGluawo+PgplbmRvYmogCjExMSAwIG9iaiAKPDwKL1BnIDUgMCBS Ci9PYmogMzMgMCBSCi9UeXBlIC9PQkpSCj4+CmVuZG9iaiAKODAgMCBvYmogCjw8Ci9QZyA1IDAg UgovUCA0MSAwIFIKL0sgMTEKL1R5cGUgL1N0cnVjdEVsZW0KL1MgL1NwYW4KPj4KZW5kb2JqIAo4 MSAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDExMCAwIFIKL0sgMTIKL1R5cGUgL1N0cnVjdEVsZW0K L1MgL1NwYW4KPj4KZW5kb2JqIAo4MiAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MTNdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKODMgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzE0XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog Cjg0IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFsxNV0KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo4NSAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MTZdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKODYgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzE3XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog Cjg3IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFsxOF0KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo4OCAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MTldCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKODkgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzIwXQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog CjkwIDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFsyMV0KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo5MSAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MjJdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKOTIgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzIzXQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog CjkzIDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFsyNF0KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo5NCAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MjVdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKOTUgMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzI2XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog Cjk2IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFsyN10KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAo5NyAwIG9iaiAKPDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBb MjhdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9iaiAKOTggMCBvYmogCjw8Ci9QZyA1 IDAgUgovUCA0NiAwIFIKL0sgWzI5XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmog Cjk5IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFszMF0KL1R5cGUgL1N0cnVjdEVs ZW0KL1MgL1AKPj4KZW5kb2JqIAoxMDAgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIKL0sg WzMxXQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjEwMSAwIG9iaiAKPDwKL1Bn IDUgMCBSCi9QIDQ2IDAgUgovSyBbMzJdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVuZG9i aiAKMTAyIDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFszM10KL1R5cGUgL1N0cnVj dEVsZW0KL1MgL1AKPj4KZW5kb2JqIAoxMDMgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAwIFIK L0sgWzM0XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjEwNCAwIG9iaiAKPDwK L1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBbMzVdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+CmVu ZG9iaiAKMTA1IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFszNl0KL1R5cGUgL1N0 cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAoxMDYgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0NiAw IFIKL0sgWzM3XQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjEwNyAwIG9iaiAK PDwKL1BnIDUgMCBSCi9QIDQ2IDAgUgovSyBbMzhdCi9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCj4+ CmVuZG9iaiAKMTA4IDAgb2JqIAo8PAovUGcgNSAwIFIKL1AgNDYgMCBSCi9LIFszOV0KL1R5cGUg L1N0cnVjdEVsZW0KL1MgL1AKPj4KZW5kb2JqIAoxMDkgMCBvYmogCjw8Ci9QZyA1IDAgUgovUCA0 NiAwIFIKL0sgWzQwXQovVHlwZSAvU3RydWN0RWxlbQovUyAvUAo+PgplbmRvYmogCjEzIDAgb2Jq IFsyNzggMjc4IDAgMCAwIDAgMCAxOTEgMzMzIDMzMyAwIDAgMjc4IDMzMyAyNzggMCA1NTYgNTU2 IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgMjc4IDAgMCAwIDAgMCAwIDY2NyA2Njcg NzIyIDcyMiA2NjcgNjExIDc3OCA3MjIgMjc4IDUwMCA2NjcgNTU2IDgzMyA3MjIgNzc4IDY2NyA3 NzggNzIyIDY2NyA2MTEgNzIyIDY2NyA5NDQgNjY3IDY2NyA2MTEgMCAwIDAgMCAwIDAgNTU2IDU1 NiA1MDAgNTU2IDU1NiAyNzggNTU2IDU1NiAyMjIgMjIyIDAgMjIyIDgzMyA1NTYgNTU2IDU1NiA1 NTYgMzMzIDUwMCAyNzggNTU2IDUwMCAwIDUwMCA1MDAgNTAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCA1NTYgMCA1NTYgMCAwIDAgMCAwIDU1NiA1NTYgMCAwIDAgMCAyNzhdCmVuZG9i aiAKMTUgMCBvYmogWzI1MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjUwIDMzMyAyNTAgMCA1MDAg MCA1MDAgMCAwIDUwMCAwIDAgMCAwIDI3OCAwIDAgMCAwIDAgMCA3MjIgNjY3IDY2NyA3MjIgNjEx IDAgMCAwIDMzMyAwIDAgMCA4ODkgMCA3MjIgNTU2IDAgNjY3IDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCA0NDQgNTAwIDQ0NCA1MDAgNDQ0IDMzMyA1MDAgNTAwIDI3OCAyNzggMCAyNzggNzc4 IDUwMCA1MDAgNTAwIDUwMCAzMzMgMzg5IDI3OCA1MDAgNTAwIDAgNTAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgNDQ0IDAgMCAwIDAgMCAwIDAgMCA0NDRdCmVuZG9iaiAKMTcg MCBvYmogCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggMzY5Cj4+CnN0cmVhbQp4nH2S TW+DMAyG7/yKHLtDRcJHaSWE1NJW4rAPje007UCD6ZBGQIEe+PdLbNp1ndRIgJ7Y72sn2E2zbabq gbkvupU5DKyqVamhb09aAjvAsVaOWLCylsNE+JZN0TmuEedjP0CTqap14pi5rybYD3pks3XZHuDB cZ91CbpWRzZ7T3PD+anrvqEBNTDuJAkroTJGj0X3VDTAXJTNs9LE62GcG81vxtvYAfOQBTUj2xL6 rpCgC3UEJ+ZmJSzem5U4oMqbuE+qQyW/Co3Zvsnm3OMJUkQUEO2JUnSaNOLscCkoyEKE+PH5lE3x 6LagWFJaiCXEmigi2hKtkUwXlgJBRLqAdKYnpBWSz4m21436/xoNJkOquSDfID1rcZMMAzp5uKLN 9M+RvNsjhRtMi5aoXZD9jt+/tYh6jkTCPmw6ldotk8+7tTb2sj0uUqy1WRCtrmvZv26H8zJS8qS1 mSacYBwjO0C1gsuQd21nVfb5AQs33sUKZW5kc3RyZWFtIAplbmRvYmogCjIyIDAgb2JqIAo8PAov RmlsdGVyIC9GbGF0ZURlY29kZQovTGVuZ3RoIDU3NjQxCi9MZW5ndGgxIDIwMTUzMgo+PgpzdHJl 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 KUUZooxUCpRiZY6yCtNaZZeyRzmi9lGr4H+vxHS/+pT6Lqy0TqfpszGN1q/WP2zYYUwxjjbONL36 0+c/p/5c/vO+ZmqOa76w+c7m55o/1qZqV6L/LuJPoy2nG9DLezAGN2B6FCPxKXqRXqV3RF+/ZArT Y8THMCdGQzo+tZFsFA41xrDz2URMUzBNY9MxVbKZbC6mFWwl+zW7jv2G3cJ+J6a7sW0b2J/YU5j+ wrZiepvtZx+xT9iXCgaxomI0u5R+SqYyHFtaoIxSxiuTMM1RFmGqUS5XluETelhpULYoe9Rw1QVr W6lept6j/ll9Xn1L/UGn6NJ1mbpc3VTdHN11up263bq9uh/1Nn2Rfq7+fv3zhnjDOYYphvmGuw2b DUcMPxkNxgk4XF1ufMuomVywVi9hu5886ZpTpmEnW6yP0F2h7Mf3Ikat0d/ApmCPGZRSdYF6q/qG fjY7ptrZe6xWnadeoj2kFivfq4vYVOVZlqja9DnqbLqZNLZJOaB8rXysi2SlylGWovst+4uySC2A R8ft6pu6SN11+iM40n2HcpSr2TblBfU69Trtr5Sjv5/t19+v7Ca7rkkJp/34Vt+g3IVKryvzlNVU pjtH/yPNw37/k/4K7O/zlBtZqvqW7n46rDqVr+Bd3Qmr8Robq0tSLlaGs02wuD+zvvQ5u4xq2O/I zZ5mH7BGHBM/oj7MxilB+LQ8ioUNxWH3a6qDvaUGem+8ZclKJJugHFOmqM8YdqmD4fbsojfoKqay LIydFprpUnwD1ir9YNOKYE3eZNkUQ3fB3n/d/Ay32Pq9+tUYZw+o6TSJsugXyg7KwXfjMKYyup6y aSvG4I2UpdxNy7WVrBp2/3zYT4Xgt1EmM8Na/g9ZXwIYVXW2fc656+x39ntnvTeTmSyTZCaZmSQT ArkQ1gAmyhpwTER+cSeJSoWWn7hQBLTwadVSKcTWpS792HFAq7HFBVtaulnb6mfqT/2omv58/dBq Icn3njtB7f8z3rPNOXfO8r7P+7zvvaAf5rYJ7IWPlAEW9iD6dNuM3gTUn4//hr6GVdCsYVTJ0m/u Y2cBMvUC/m6Hz2pUgNpu9AB/hPsN6sR+hFh1fA9I+TvoKrA5/wd+P4BaYX4r0GNsDcxaBWTuhxG7 x+ciHT7fRD/DBG2EOU8DPe9i5wLyPjxxA6zwerBRC8AmnkTXTzyC2uHsrpi4e2I76pl4bOJK8FQX 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 O5eLc/oOOEvFeZhR+syB2036VEE6ZzrbxJK+o/FvlDIvfV6BUX2HnFXigq42p05c1DnqbBSXhLKd RnFp3xD71wT4r79I3K+/KP/1l0K9XN1AEvkvvmbzX3x9mf/iK1dtV3vIV9V+9Q9IIf8117f5r7mq NS9p8olO86+aP5Am/gs0A/+92ZuYYxHJJX9HCCkhb5Bs0kwCpIB8H5eObCU/JCvJHvJfyetkP65V 5CA5TBrJP5OjxEBOk/fJGnKD3Cbrye/JfdJLHpII8QpUyCPfEzYJm8lhYYfwPvkfwkfCLfInRYei i/xVsU/xMxJRHFP8UkhQnFNcEpIUdxV/EKYrHiYmCF9KzE18QfiKcpPymPCC8oTyl0KD8h3lO0Kj 8ozyN8Jq5QcqpdCqSlLNFH6sek6VI+xTfVnlF/Yn+ZM20MSk7ydto6lJ/yWpn85M+knSQfps0n9P OktfTrqUdI2uSPoo6SF9LemvyTNoO/smhYY0aZppNKzJ0MykGzTXNb+nm1PeSvkJ3ZEynirQd1Oz U7PppdTZqXPp5dSXUl+iH6YuSF1AR4gAu3TwT0pz2G9mKltkdBCyYgvJrtRXtlR2VPZU2is9lcHK jZVbKrdX9lfuqdxfebBysPJI5fHKU5VnKy9UXqkcqbxZeRd9DrLfYHHfEvW31d8mVF2uLue/Vcug C+gCQugSuoQItIgWEUr/nv49SaDL6beJgv/NkJJW0kqioivpSqKmr9NGkkQN1EBSaTN9k6TxvxZK p120i0ynNmqDzF7qIs/wvxmaCXvnkizlb5S/IbOwpqvkOl9ZBvtlWulZ0lz6uIyUKctSyjLKsspy ynLL8sryywrLisuWl5WitapMV9ZYZixrK+ssM5c5ynxl4bJNpWfLtpbtKNtVeqFsb9mBskOlV8qG yo6WnSg7XXaudKTsYtnVsutlt8ruld4se1D2sOxJ6d1yWno27rogX1fkayR23ZSucnXpaHla6Xj5 DGBJeXb5nPJ55QvKF5UvLS8pLy/vLq8ury8dKW9Cz+Zy9m/ICKqfwpqZT8U5++16AelB1BYRJ2J+ OY/z7yK+D5NKRPg/kyrE9/vkNXIPVzW3UY3qK6oXSK3qRdWLZKXqZdXLpF71imoheV2Vr8onq1SF qkLSqCpSFZHVqmJVMWlSrVCVkjdUq1VNxKDSq/TYLwLZhZ3ErDyXJBKiTQNmyMgG5pBibbo2Uztb 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 Pe37efatM/m29ZjzRyJe6uzueTGh+xTnG2OrWp2dsFZeMrRjtAkJszZ9H552qs9u+08HTld6ni+y IaMm54Qm7ILzq59eyj79UbXc5cwDoyTjo+kN0+3rHao1vn6Jeyc7s6umfPEcv6n3d7YK8Wr97d2i b8fa3sv9fYPvKQvdRdSr6sgwx7upYw+Umr8oPvGmw90kU09VN0+9vNZ7B5dNfjOsZfK6sjKdrdO4 HdajS3oMvxbdP/5/AXlhYJAKZW5kc3RyZWFtIAplbmRvYmogCjIxIDAgb2JqIFswIFs3NzhdIDMg WzI1MCAzMzNdIDcgWzUwMF0gMTUgWzI1MF0gMTkgWzUwMCA1MDAgNTAwXSAyNCBbNTAwXSAyNiBb NTAwXSAyOSBbMjc4XSAzNiBbNzIyXSA0MCBbNjExXSA0NCBbMzMzXSA0OCBbODg5XSA2OCBbNDQ0 IDUwMCA0NDQgNTAwIDQ0NCAzMzMgNTAwXSA3NiBbMjc4IDI3OF0gNzkgWzI3OCA3NzggNTAwIDUw MCA1MDAgNTAwIDMzMyAzODkgMjc4IDUwMCA1MDBdIDkxIFs1MDBdIDEwNiBbNDQ0XSAxMTIgWzQ0 NCA0NDRdIDE3OSBbNDQ0XSAxODIgWzMzM11dCmVuZG9iaiAKMjQgMCBvYmogCjw8Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCi9MZW5ndGggMzgwCj4+CnN0cmVhbQp4nH1Ty26DMBC88xU+pocIbB4hEkJK aCJx6EOlPVU9EHtJkYpBhhz4+9pe8qwaSyDNeHZntFq7Wf6Yy3og7qtqeQEDqWopFPTtQXEgO9jX 0qExETUfJmT/vCk7x9XFxdgP0OSyap0kIe6bvuwHNZLZSrQ7eHDcFyVA1XJPZh9ZoXFx6LofaEAO xHPSlAiodKOnsnsuGyCuLZvnQt/XwzjXNWfF+9gBYRZTDMNbAX1XclCl3IOTePqkJNnqkzogxc39 VLWr+HeprNrXas9jnlVPPDuqzk3XVuZlqI5TQ1JqEWVIbqYW/zixwMoCeunk/3FiEXZbodq3Tgx9 fQwbLC3ph0iiMmT37X1sES7v2wdTSlRH1DoF22OtJTNLhjiSEJWL+Mqe3dpHGDbD6BFm3lxNnf4J s/Cwt57zp5Gj/yZOvy69gluvlUnGzCQNWlOLKE5yHSHCHBnmyOLLHGZrzHKfVpIflNLbaF+AXUOz gLWE0yPp2s5Ume8XDFLzlAplbmRzdHJlYW0gCmVuZG9iaiAKMjkgMCBvYmogCjw8Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCi9MZW5ndGggNTYzMDIKL0xlbmd0aDEgMTk4NjEyCj4+CnN0cmVhbQp4nOyd CXwU5d3Hf8/M7J3N7ibZbI5NdpdNFtmQAAmQEALZXBxG5EjERFHCEQUUQQOKd6yiGEWstVTxwKO1 1HMTkAa0har1QBHrWa1CBDxbBPu+1pPM+5+ZzYFJFnjfpvn48nwnz+8555n/zM4+O//M7LNgAJJI JDSWV02eKKaYEiEcqgFcV0wsr5hw47erJ0PI3A4Iz0ycNrXq8pmPrIdw0nXAoykTq04r3V1aNx3C m/cBqXecXFU9YXFwoZ7WL6Be00+prpp0b8EtbUDmIcB61tSqYbn2EVfeQ30Zqb5uWtkp1YcvH19G /a+i/OiZ5VNqpt226CsgbxrguH3e4jlLVz99VxBs5c20Tsu8i5d573e/83ewdUsBffU5S89d/Mql tevAVoUof8G5cxqWIgkm6m8F9Wc/9/xLz2l5cVYL2H3PAWe9vmD+4hUpr7yfDpTvBwttWFA/Z/7u C6vJNnazsv0FVBCXZx1JeWqPjAWLl63IuTxpCm17AeBfdV79RReIG3T3Q0g+hdp8fP6SeXM+csqf g7XfAaRsWjxnxdK4ZTHzqe5TWt97wZzF9ZWX+VdASKU+zRlLlzQsk4NYS/bVKPVLL6pfmvn2lG1g t4QByx+hvBa65HW3Fh9YPdtW9JUxVTlMwAP7BgeV+KVHX3rquycOn2uHMYayJrW9AsWG8e2nosyO 75747jI7OmsiSOcpJdZaFEBEEQUBdgzDTKp5lLYrUK0ormK3Qgejbp0ujzpI1WLxLzhHiDPqBIte EhSkNgTl7VhRplpAVE8p8yIErzege6N9OsszjGctITBZlqn3gO4pZU8h6SMmCWM6Q1h4B2ejF4SH cYUSepSPwVZl3X8HupnyYTV+AedQuFc3Ew9I+7BBPwaLI9vaJgH5VL5WasBa/cO4g9rdTfXzqOze yLr3U3oWrTc8kjYZViNZ6x/6vrZN+1ZLfZ5M4XraxjSKJ1CopG3GU1xK4Qb2AlZ1tKf0tbT9G5Ry CuWReBL1s5LWL6b1Mih/LaVTlPYU2yj4jn4M8MCPyxS7emur2KeEo/X574T2b/d/cnsd0LvuYG/l UoP8w4/L6LU5/9+57d5ek76g1/35f+e2ORwOh8PhcLrDNshbB9qGY0WX+tOxlcPhcAYSBnmrkYId fNzkcDgcDofD4XA4HA6Hw/npY601MMYe0Z5O0auRwdCjVSZiiDiMd+v0y91xbsTp1rk9K7FWq9YH Run9g+ur8scAYy7MzxhVpc+Ky38ebz3X0YFObdZtI30Qra7jOSZ9Z4c/oluZHLUfzgkMO3qT/0VT zlGgUWagTeBwOBwOh8P5jyBCZAo6UWQCXQMl6f5h2Y5vjDKMMMrtMMEkH4YZZlILLKQxiCG1wkoa q6oNsaR22EgdpD8gDg7SeMSRJiCe1En6PRKRQOqCkzSJ9Dskw0XpFCRTOhUppG5V05BKmg63/C08 qnqRRuqDh3QQvKR+0m+QAR9pJgaRBki/xmD4SU9CBukQBEiDqmZhsPwvDMVJpNmq5iBIOgxZpMOR TTqC9CvkIoc0D8NIR2K4/N8YpepojCDNRx5pAUbK/4UxqhZiFOlYVYswmnQc8knHo4C0GGPkfyKE QtISjCUtRRFpGemXKMc40gqMJ52AYvkQJiJEOgklpJNRSnqyqpUoIz0F5aRTMEE+iFNVnYqJpNMw iXQ6JstfYIaqVTiZtBqV8gGchimkM1U9HaeS1mCq/A/UYhrpGaQHcCamU3oWqkjPQjXp2arOxmny 31GHmaRzcDrpXNLPMQ+1pPNxBmk9ziQ9B7Pkz3CuqgtwFulCnC1/ikWoo/R5qp6POaSLMZfKL8A8 0iWqLsV8+RNciHrSi3AuaYOqy7BA/hjLsZD0YiwivYT0I6zAeaSXYjHpZbiA9HJVr8AS0iuxlPQq XCjvx9WqNqKB9BosI/0Zlsv7cC0uJr1O1ZW4RN6L67GC9AZcSroKl5HeiMvlD9GEK0hvwpVUcjPp h1iNq0hvwdWka3AN6a2kbfg5fkZ6G64l/QWuk/fgdlV/iZWka3ED6a+wimrvIN2DO3Ej6To0ybtx F24ivRs3k96j6r24hXQ91pDeh1tJ7yf9AA/g56QP4jbSX+MXpL/B7fL7eAi/lP+G32It6Qb8ivR3 qj6MO0gfwZ2kj+Iu0sdUfRx3kz6Be0jDuJe0mfQ9tGA96UbcR7oJD8jv4kk8KP8Vm1X9PX5N2orf kG7BQ6RbVX0KG0ifxu/kd/AHPEz6R1W34RHS7XiU9E94jPQZPE76LJ6Q38ZzCJP+Gc3yW3he1RfQ QvoiNspv4iVsIt2BJ0lfxmbSV/B70p1oJX0VW0h3qfoatpL+BU+Tvo4/yG/gDdLX8Sb+SPoWtpG+ je3yX/COqn/FM6Tv4lnS9/Ac6d9UfR9/Jv0Az5Puxgvya9ijahteknfhQ+wg3YuXSfepuh+vkH6E naQf41XST/Ca/Co+VfUz/IX0c7wu78Tf8QbpP1Q9gDdJv8Db8is4iHdID6n6Jf5K+k+8S/pfeI/0 v1X9Cu/LL+Nf+ID0a+wm/YZ0B77FHtLv0Eb6PT4k/UHVw9gnv4R27CeV8REpH9P7f0z/8ic+pv/9 mMf0z/oY0z/rMaZ/2seY/kmPMf3jYxjT93eO6RcdMabv62NM36eO6ft6jOl71TF9b7cxfa86pu9V x/S93cb0D3uM6W3qmN6mjultP8Ex/d0BGtPf5GM6H9N/cmP6T/06/ac7pvd1nc7HdD6m9z6mv/j/ YEwHjbiwzrIkGiGKgqT+l0ZSI1Hs8e8bIwwGvd4IQWfQGw1GvZI1GM3Q5uKApFcgFZRpTLS0qNd3 u8mt75Tod76lqP9FsnT1JfRS3a3j3qo5HBzXqdHzERDO/xZmSRxoEzgcDofD4XD6m5gkEzlT4lF8 KwNMJqOBWpJnZaIklJzB0nHxKSmulkGkP1rbYiAkyumg63zO16j1omq0K9bovlUMOrvpaSM6PL2+ qjkcHJdvZTx6E84xIsQkDbQJHA6Hw+FwOP2NNcVMLpWoOUGabyX1dHBMUDwqM/lW5FGZzEqWfCyr Nkm76lsZfuxbSeRbdblRasP/s29lRWc3vTlPpq4k9604fXAcpwb3rf59CNaUgTaBw+FwOBwOp7+x pVvImYrcYNKiXn0ri8VsskA0mI0Wc4wZlDObbB3ejM6oIBmNim9lVdI6yhm6uVFmRbRLVWO0K9be JrnpZiw6u+ntCtncleS+FacPjuPUMB+9CecYEWzpA20Ch8PhcDgcTn9j98YovpX2VaU+fSsLYmLI p4JotJislhgLuVomi6XLtzKZjCaTZDJKqm9lMpl+7Fup35TSWptMPbrvIrpvZUdnN73d4LJ0Jblv xekD7lsNCILdO9AmcDgcDofD4fQ3jkFWcql03aeZ0PV0cDp8K52pu2/l6PBm9CYF8rBU30pJ642S iXwrU1cHOCbfKvqvODjQ2c1RfKvoPhrnBCb6Y6dHYDl6E84xIjgGDbQJHA6Hw+FwOP1NfCCWnCm9 doOpT9/KithYa4wNerPVYrPaKGuNsVrjI5NLULHFbLHoLWa6bpXslLTozTr1W1ldHaDjNoAl2hVr dN8qXutAkd6ukK3H2g/nBOY4fKuY/rPihEOIDwy0CRwOh8PhcDj9jTNoJ5dK332aiV4mSbfCZou1 UktLbIwj1h4LW2xMrNWJWK3aEEPuVIzeYtEpvpWFcgbytCwwd7pRakPtUjUm2hVr9Fmvnejsprcb U7FdSe5bcfrgOHwr69GbcI4R0RkcaBM4HA6Hw+Fw+puk4XHkUhm1G0zaNBO9TORng8Nht8VDH2O3 xjvi7XDYYx02V+QLUDBaFVfLEBtLHo8+IdYaG2uMMcRaYOl0o9SG2qWqNdoVa/SZ2bRZnNX1e/Ot 7F1J7ltx+uA4Hhe19Z8VJxxi0vCBNoHD4XA4HA6nv0kdnUAulVF7XE97hq+XifzikJAQ53CSExVn c8U7HUiIs8c73FSurWezxdpsBpuNXBp9oo0wxRptVsTEdnWAjktVW7Qr1mjfxSJj0dlNb85TXFeS +1acPjiOU8PRf1accIipowfaBA6Hw+FwOJz+Jq0wkZwpk+ZbmbWp0nv6VvFwOuPjXDDY4u0up4uy 8fHO+PTIF6BgttttdrvRbjcAhmQ7YbYZ7dZut6jUhnY1abdHMSf6zGxp6Oymtyvk+K5kdB+NcwJz HL5V/NGbcI4RKa1woE3gcDgcDofD6W+8oSSYTJH5JbSol4n8nHC5nAnJMNmdcamuZMo6411Ob+QL ULA4HHaHw+yIU3yr1DiHw2Gxm+JsiLV1dYCO2wCOaHcDos/M5lVVvT3V2xeznF1J7ltx+iD6V/qO IKH/rDjhkLyhgTaBw+FwOBwOp7/xlSYrvpX2xag+fatEJCUlJqTA5EiMS01KoWyiMylxUJdvFUeL Oa7Dt4qLszgU36rr8b9ERf7PvpVP1T59q8SuJPetOH1wHL6V8+hNOMeI5CsdaBM4HA6Hw+Fw+pvM k90wmy3aw3vaFH7mng/mJSM1NdmVBlN8stOTmkbZZFdqcgAurTomwRnvTDA7nYpv5XESMXFmp6Ob G5WsiHYbICHa3YDos15nqqpe8fY26UVyV5L7Vpw+iD5dyhEk9Z8VJxy6zJMH2gQOh8PhcDic/iZY 7SWXKvLwXqw2VXpPB8eN9HR3ig8xTrfLn+6jrDsl3R2kcm09l8vpclldLvLKzBkuIjYhxuVCorOr A0LzxFyuKObERqkjY9HZTW/Ok7sryX+ZiNMHx+F2p/afFSccumD1QJvA4XA4HA6H09/kzPLDao21 qxntGb5eJkn3wOfzuDMQ4/KkZPoyKOtx+zw5SNeqbSkprpSU2JQUxbcKpBA2lzXF1c2N8iiSoiZT UqKYE33W6xx0dtPbpBeeriT3rTh9EH26lCNI6z8rTjj0ObMG2gQOh8PhcDic/iZ3fgCxsXZt+nLt Gb7YnjePfMjI8HkGIzbZ5x6SMZiyPk+GLzfyBSg43O5ktzvW7SaXJuYkN+FIjnUnIym5qwN03Fdy u3t030X0Wa9z0dlNb1/M8nUlo9//4pzAHIdv5e03I0489LnzB9oEDofD4XA4nP5m9PlDYLM5tNmm 47Sfoep58ygDgwdn+IKwpWakZw8OUjbDNzhjNPxadVx6emp6ui09zQpYs9PS09PjUm1pqUhJ7eqA 0O5ypadHMScuSh0Zi85uersxldGV5L/6yumD6NOlHMGg/rPihMMw+vyBNoHD4XA4HA6nvylcNhR2 e7z2xah47Weo7D1aDUYwONifDVvaYO+wYDZlB2cEBxcioFXHe71pXq/d61V8qxFeIj7N7k2DO7Wr A3TcBvB6o5gT/ReFtF/IUdfv+dxiZCMa3Lfi9MFxPC6a2X9WnHAYCpcNtAkcDofD4XA4/U3Z9bnk UiVqM6IlqrOYx/d0cLIxfHj2kJGIH5SdmT98JGWzhwzPLqVybb3MzEGZmfGZmeTS2MZkEomD4jN9 8Pq6OkDHpWpmtCvWxCh1ZCw6u+nNecruSka//8U5gTmOx0Wz+s+KEw5j2fUDbQKHw+FwOBxOf1O5 tgBOp0u7wZSsfj/K2fNnfXIxenRuTiGcgdzguNGFlM3NHp1biRFadXIwGAgGncGgA3AUB4nkgDOY iYzMrg7QMc1fMBjFnOQodWQsOrvp7YtZuV1J/stEnD6wH3vT4f1lwwmIqXLtQJvA4XA4HA6H099U PTQeLleyNiOaNs1EL5Ok56OoKD+vBK5gfk5FUQll80cW5VdFvgAFd05OMCcnKScnDoibmEO4g66c IQgO7uoAHdP85eREMSfaPBdkLDq76e3GVH5XMto875wTmujTpRzBqP6z4oTDXPXQQJvA4XA4HA6H 09/Maq1ASkqK9vCeR5sqveck6eNQWjquYBJScsblVZZOouy4MaXjzqRybb28vJy8vNSReQlAwpS8 vLyRnpyUvGxkZ3d1QOSpyby8KOZ4otSRsejsprcfIB7XleS/+srpg+hf6TuCsf1nxQlHzKzWgTaB w+FwOBwOp7+Z/2Il3G63NsWeT5sqvefNozJMmlQ27lS4c8sKqiadStmy8ZPK5qFUq/YVFOQWFKTl FyQCidUFBQX5vlx3wQiMGNHVAVGgJgsKopjji1JHxqKzm96+mFXWleS/+srpg+N4XDTUb0aceFjn vzjQJnA4HA6Hw+H8BxAjwQ2m5vdTjlLsc0hQroeGwkupGAzCEAxDCSZiGk5HLRbiYlyK+7AJL6EN n7ER+pA33pvsDcgylNn8TkIOtS7DZMyg1nU4HyvU1i9S60+7t5b39brMk98F5CYKv/4h3HZv2z1t KyMW9k4cfvyo4A7U40IspX3Ro3NVJgiA8KN1qVKUdGrSok4k5+j50GEGAoNPGhLE0OycYcNH5OZh 1Oj8gjGFKNKqy8orJkycNPnkylOAqdOmz6iqPm3m6TW1OLPrN1PrFVmkJpdeGGVPVkepAx4R1ahZ kc291O/oln6rW/r/zasZKjutuiRUPH5c0djCMQX5o0bm5Y4YPiwne2hWcMhJgwOZGf5BPq8nPc2d mpKc5Ep0JsTHOey2WGuMxWwyGvQ6SRQYhlb4J9R5w4G6sBTwT5qUreT9c6hgTreCurCXiiYc2Sbs rVObeY9sGaKW5/yoZUhrGepsyezeIhRlD/VW+L3hneV+bys7Y3oNpVeX+2u94QNqeoqavlVNWynt 89EK3oqkBeXeMKvzVoQnXLygqaKunLprtpjL/GX15uyhaDZbKGmhVNjlX9rMXOOZmhBcFYXNAoxW Miqc4i+vCCf7yxULwmJmxZz54WnTayrKU32+2uyhYVY2zz83DH9p2JalNkGZupmwvixsUDfjXajs DW7yNg/d3nRzqx1z67Ji5vvnz5lVExbn1CrbcGTRdsvDrsv2J3VlqfO4spobutemik0VSQu9Srap 6QZv+L7pNd1rfYrW1lIftK6QOaGuaQJt+mY6iJVVXtqasLK2JsxW0ia9yp4oe6XtX72/QimpW+QN m/yl/gVNi+ropUlpCmPGpb6WlJTQFrkNKRXepuoavy9cnOqvnVPubk5A04xLNyaHvMlH1mQPbbY7 tAPbHGuLJGKs3RP1nXVqSm2upCpndB5Zpljkn0wnRNg7z0uW1PhpnwoUqS9A07wCakbUMlorPJ9e kYVhU1ldk71QKVfWD+sy7X5v01egM8B/4B9HlsyJlOgz7V9BSSrnSeepRvUd6XBWVjgYVE4RQxm9 pmTjeDU/Knvoxa2C37/U7qWIDh+m0bGdU1s4jA6/z6e8wDe1hjCXMuHG6TVa3ou5qS0IDcuqDQt1 Ss32jhrnaUpNY0dN5+p1fjqTN6lve2fYGOj8s9kT4ysWFIZZYpTqeq2+sspfOf2MGm9FU13k2FZW H5HT6gs66yKpcHxZjZgqRFJCqqjW0kk5q7OxkqmJCUuZ9KdXT+r5rQYjnZVqCfNOCNvrJmlaa/b5 jnGlVvmQspYada0WMTNcmHVkfuwR+SPMi2kSyWApIFRWn9HUZD6ijk41bYOTIxGd8aiu8XnLwjiN 3pmZ9Ncqby9QQm1qOESHrExpQOefVhTJHtEwNZKuJZSzM3voBBrompom+L0Tmuqa5rTKjXP9Xru/ aYvwjPBM09KKuo4Tp1XeelNqeMLNtXSsFrBCelMIKG32s1XTm0NsVdUZNVvs9JmyqrqmRWBCWV1p bXMG1dVs8dLgrpYKSqlSqGS8SgaVjHayRTCq7VO3hIBGtVZSC9T8vFYGtczYUcYwr1XQyuwdZQKV SVpZSC1TUMaYsuqa7meP+paszQa2oFo8aWMgyfPa0+IQtFEQxCEtWWmeLeJgMa1lrCfUKvo3xjlz bSXZope2OUxVL+kSCk9Q2CYqn7qzxXQqt5NeTaGRwhMUtlF4jQJdo5AqtV4KSyisp9Cm1IhporvF 67GXDBaTad1k2geb6MJBCjIFER7SYRSmUphNYQ2F9RT0ajulZAmFqylso3BIrQmJrpbb8sh2V8tN arRx0fm5anaOlp11lprdeHqtFk+ZrsXlk7VmhVqzESO14pxSLR48VIvjMnMbldhszd1ekigm0k4m kuFLSZnwHGyMwYP7RCfCFARRHykJiXEbMwK567eJEpgoiAzz4ZG3i6zF6sgtMQuycJAuDDzCF8IB rUY4sDHWkbu+5GRhL56gsI2CKOyl5UPhQ1wttCnHnLSYwnoK2yjsonCQgl5oo2UPLbuF3bAJH2AY hWIKsymsp7CNwkEKBuEDUrvwvjI+qaqkiykIwvukduFvtFt/I7UJ71HqPeE9Mu2NlvwxuVvURNaw SMKTGUm4UiOJuMTcVuH1lm+H0BkVoFeazqinxEEYjzxxUEvmCE+rmNRStNDTKuzb6M3y3FcyXHgT YQrKheybtOU34aUwjUIdhaUU9JR6m1Jvo5HCrRTuoxCmQGcZqZ2CV9hB4RUKb2M4hRCFaRSMwmst tJlWYVdLoNRTkii8KrwAFx3xncKLavyK8Lwavyz8WY1fojid4h3C8y3pHpRYqB60jp1iO8XDqF4n /GljRpxHLnEI2+jYeUiHUSimMJXCbAprKOiFbcKglvmeOOrkKewwglq24DM1fggPGBFa5AkFyugE 9CoSKBxHKZL13vUBIRRYeydlFQncchulFAlcdzOlFAlcdg2lFAmcfzGlFAnMX0QpRQJnzKaUIoGp 1ZQiaRXu/X3GYE/+1POYt8QmXEJH6RI6SpfQUboEknCJsuBbSbHtrpZgkI7YulDWkKCncStrfJo1 zmCND7DGetZ4FWu8hjUWscazWWMWa3SzxnTWGGKNT7ECOhSNLLTpiOyYUBJr3MEaH2ONDawxwBoz WWMGa/Sy/FCr4GuZnKdGFWq0sUR501E8bjyNPjbBR0fUR+e8j8aEbaS7KMhqLkSNvIO0xsnpSjxo Y7BYy+cU5i4pmSQ8Sys+Sy/Ds9hDQaIX6Fk6jZ6lTp6lDmykxRRmU9hO4SAFmYKeWg8iw9eoaiMd RqGYwmwKV1M4SEGvmnOQgoAlEROfUA0bFjF6qpITnqVlEC0+wRdKs7vtWfZJ4ho3s6WzqelyupCv zbcY5zA6Wpl189fWb762wlRiEm4R1iCNXohbI/Galm/TPK3sjpbAU54SJ/sV0iU669gYBFgmxQVo UPOj4DYq8Ui4hUcozm1xz6TVbC2BoZ6tLFZZa7PnW/d+z2fuVoGSn7qf8rzjbZVYi+ctKnlks+dN 942el4a1Gqnk6UAro2irV226xV3geWyH2vQaqljX4rlKiTZ7rnRP9JznVivqtYqzGygXsnlmBM7w TKL+yt1zPaEG6nOzp9h9tqdIazVKWWezZziZkKUlg2TsELe6UX+62uFp+a1sQWioYa2hxjDVMNqQ axhq8Bk8hjRDqiHBGGe0G2ONMUaz0WjUGyWjYIQxoVVuC2UpHnCC3q5EeklRSU3bBUUVZ1kZ9JhR wMkIx4uVQmVVKasMb5+Hyrne8L+q/K3MTFcrOn8pC8dVorK6NFyQVdlqkGeE87Mqw4ZpZ9Y0M3ZL LZWGhVX0KV1d08pkpWhlquIXbAFjjpWrU5X4pJWra2uRlHhxcVJx3HjHmAnlvUhdRLO6SDoinRZe W1lVE344rTacqyTktNrK8C8Ux2EL+yc7VFG+hX2pRLU1W8Tx7J8VM5RycXx5bW1lK5uptoOXfUnt 6Iz5Um1npA9mpR28xnSt3TqtXSatT+0ylIjamUzIVNtlmkxqO4kp7ZobMirKmzMy1DYuLxrUNg0u b/c2OzKpTWam2iaxETvUNjsSG5U24fFqE7ebmqS71SYsBW61iZulqE1mdjUZFmlyY2eTG9Utiayr jVtrY23raGNtozZZx0p9aVYW2zi2dt4sxemq81fUU6gL33TxgqRw41yvt3lebcQbC9TNnbdAiefU h2v99eXhef5yb/PYWb1Uz1Kqx/rLmzGrorqmeVaovrxlbGhshX9Oee3GidNG5h+xrRs7tzVyWi+d TVM6G6lsa2J+L9X5SvVEZVv5yrbylW1NDE1UtwX1HJ9W02xEaS1d46vxRsFipvO1LtVXW5poXzpe PXnH+pKuSt1KVysbYCGXJ4bcZysFpSq7JLtEqaL3lFIVq3jWkaqkq8b6UreyDZEqOxU7/KXIWra8 YTmSKhaWa38NBBUtW64ccE2zGvqC6irISS5vWAZUhoNVleFiupptNhiotE7ZpXBhR5nFUkHX9lph DhUWKoWi2NlQKStSykymSMOer//ySFymvAsahac2slA6W4aGWjGcXlkt0FBQHXFhttK1lPLx0FBL O9jAslhDRx8Rs7OyoOWh7HNHWLY8kooci2WRWFuTVmnoOCSdKAcrq/OILaMOoduKZAoput8iWQoo z7TLn1D4VInbF8qfKvVKLHxOA11rJAAb8BhbiMewDc+wQ7TWE+QIKP/vcqEcd+MK3I4b6GPtDCq5 ETNo0VH57SxZ3oRhuJ8+2O7HTmp7Oq7CViSyJPkzXI2V4hu01kpYMQglmIYlWM1OkZdjFvZI1yIf p+ACLGWNco18i3yb/Gv8BlvEF+XDsCAF82jZKX+h+6v8PrJpjV/iTuxht5meRIi20kgt78FFWCee JTH5XPk7ssCHS8gGCVOwk20Xsqj3enzCktgVYhn18qAclp+jVm6chQVYh61sFJso+HSz5CnyTiTS NlZQr3eiBZtpacUf8B6L0R2Sfy0fQjKGYjLtzya8yraL7YevaS+mI6ajozQEY6hmCf6IF/Aa87M/ CUt0MbpcXUh3mfwmEjACp5G1v6U1P2ZfC1fRcrX4vDRBLkUsHZefK0cbf8aHLIUNY1PZTGGIsES4 V7wIRtriCFrmYyEd7zuo9910Gm0WYoRd4oPSI9L3+rT2NjmWXpEA7sI9+BOz0p56WQP7GXub7RPK hNnCXcJe8Xbpd9Lrhjm012djMVbjEXzN4lgBm87OZAvYFewG9nN2J9vJXmOfCiVCtXCecFBcIF4o /kEqpaVKapCu1V2vu0n/aXtN+3Ptf2n/Ws6Vr8d0Oh+uIet/iXtpz7ZgF96lZQ/2Mh2zsFhavMzH TmOX03IVW80eYBvY79gm2sprbC/7jD6SvmLfC/RJK+iFVLr4US6B/MJFdIV5u3C3sIuW14R/CN+K LnGQmCWOEovEWnEJWXWDeCstT4ofSinSLkmm45yrW6tbr9uge0T3jO6QPsbwM/qMf+WHBw8HD+9u R/uq9rXtLe2b5A/hpNeQPj3I4Soi6+fQsohe77V0xj2BN1gMHbsUFmTj2Sl0ZGazRexCtoKO5HVs HfuNavvj7Gk6Su+wg2SzVXCrNucIo4RSYSotZwv1woV0MXabsEl4W/hONIgW0SY6xaA4UTxLrBeX iZeKa8Ww+Ir4gbhX/Jf4Ay2yZJY80iApIGVJE6XZ0nLpXukT6RPdLN3Luo/0Zv1i/fX6Vv2XdFUz 3jDNMN1wlmGNYbPhTWMdnZ3P4kn8vvs/i1mbeI1YIT6JW4Q8KZlcmFfpfJ6N+eIUgc5UYQNbJVzJ NgkZuhX6scJYdioOSQE61s8L64V/CWPFKaySVWGREHk4TJ8gPUxRkfQsDkhP0769Sj2v0Mewq4SD +hi00DXSGNrmn8XhUpb4Mt4T9zCDdD/+JpmZix0QfitOo7PgD9J4XQ184t14XLyQXYknhQrA/L3x ZjqPT2UP07hQzXLZN6JMl8Gn0lmUL+7DtThP+CsO0Pt4FX7F5kvn4hbksSvwCR6id8UQ3QX6oN7J XhIWSk1CPNsEQfod7d0YlsFEXQKuY2eJ6/QHhXexHLskM3aLj5L1u4THxSnSId0MtoDeAVfielwo X4NLdTXS6+xciGwmMqU2Gt2uEHMlH8VX06gyi8a0zfTu3krjQIk4hUqS6Mw5hc6L02iEWEfLHTRO SHQGLaT3+Ok0ir2KTfpqoRXn6mIZjTqA9HL7DJwhP4Q75XNxgXwbsmk8uEG+gnrcgI+wBhvYyvbL sZRcyXfpvX2KboKwSzdBzhaahHeFKmHtka8vHe1MloTPaXmcMuN1T6FJegdVKJZvlt+is/skGmHv xFy6YN1Pe/kFbWGSuB157acKzfIEcSnt7x5Ml38re5gZC+TzMRVP4zcGHeYYsug1DrPXaX8vR70w Q14m1rcvpOOwho5CiI7Wchp/bqSrYXXA0yn3zgyAz+FzZJLQlTN+8Irbfwjp8D280nblXlOYrF1D nzI6mHBls175R1OLAF2r8ETIYizSm02FUpG+kLFh+w/vR/Hhj4tTm91qbYBqBejNlpdFU6GuQCpC AbUTiwTByxh72Wy2XOO7/w668j3V/t9nFU2xH7Dvpy72279AcfEU++GP6cp3o44uTJi9yF5UWzti eLzoyHOI4qg85yf5e0Y+uIudL5pYRftTP3zdfvvOnYqtZ4sbhUtUWy1YvoU+Ir/ZOChzpK5V/iY0 KDBkpEVvpoNEvpNOp7d8YTIaRVGAwVhktpkaTYKJrhRCTqttpGk3E6UigYWsjpHsfzj5Fvioqmvv s/d5v8+ZzDvzTGYmjwECZBIYCc1RAasIBJWnjEYRRXwRQKpWa2gV8NGK9kp9VVBbiw8KmoAh0iul XKtVi7XWV6tyLSpaoxRzqQKZfGvvMxPCtf1+/T6S2WedR845e+21/uu/1t5DSOv4RZC8YrZl2kCL NZAttAy0MK0t5KUGWqBBtiefJ58xo1E2W0Fej22k7bqxr4x8d8wro9kuFDh4sPiJ25J05PriTNzO /5GxmImOUmNCruIRJcvqQY1dzAZDgq1jixuM8xjWYhMsyz5p//T2YNY6XBg43Gcd7oPHt7bA4woo g+3cuOZxjYIIPz4Loffv/v20+TtXXVszsTqLssWZO9FXyPj8nYGjr867df2zvyrGi4kTnr/I0Wpx rYVlxUKMRyZvoGxgEWy7mQ3seUbP4MFuy8KzQPiq2zSpsL9b16nwmWMqCp5lGnEDG096Su9IiMz/ es+KasbO1WTgp9Ef8PssPLAKdFU1sea6VTvnT9tbnIn2of/euWP9rfNfOzrwzufFQ0UJ3rIXVLUG OADLpJ0gbmEU3HI+BOcbAeS5jXB+I0fMB55YgCf1jRndCErvfYVYAiLsCOehhyxz9g6GHXzvaW8e 9wy+5yS8+Z+wCLMb2C0sZlcyyEsmVRFcp7AHGHwAev7YNvD3ruvgzi1Wf5/l9mINPypbuMHaQ3qT zfpQI0KPrSvODfGfHYE7YGA5DD8PLE9kDByFTBC0pWmnzFJ6Bo9RQe4pHeHLAkesMkAkSSKtwJFW lEoXHXFUVYVzAmnh2n53H2ukRWT/ZCKBe0Er+knL0HOqQB+s0PvQVjbo/aksUhkZJowpKORQd0n4 CsZUIEK/M0/ThFmyRlqetg3WaOsSabHcbq1l11kv8s8Lu6yDlirx84DitFmL1a3Wl9qX+peGzGmc zhmsqsg8x2m6IQmiqIEsQSyHMSE9NjUNz2ISouaFU5hlyTEfOcYmOM0LfyXHeF6KCazQg5c6MiNp nzgYYdyLVIAC1fFoCWaRyJ7VBpThfY5dxyGuByFHbdN2ie9r7DoNaWTfMsW9Ir5R7BSx+GPzjTdh NPsLHSH4wG8QRjUcsvr6mGBrS7ivdX+L1Qe/ZIyzMMZrRgXp1vXsfH6NtWePsWfPGt7dgglM3apC hhGDDKObM1lJ7AVWCWAzHv7NQ8s6Cv+3vLMabKeaTbIVSTZTI4gsbvwDnvvuEwP3P/Q2+vu9U6oi jXzvkSloZ3ESno/W7/jOD28j9nzx4Mf8SrDnKPPFtoV4SRSDCRzoVlVhFmj1gHM+kRLMWH0hxKAV 0U7mpug65j7+Cfbn+g62W/+t/iqzP/pl1DY8UTsaZeuFWrs+koifps/2zvHNDi3mL4t+13Ob5z72 XuO+yCb0M7zJ/pNRAdEwbHmtMEdc5+naPCIIObk2b5kM4iorYhpbGeNkK2OewWQIpofjAUzMK2AQ Qwwomg5tJiEhMGoQJY28pRSKLVzgImq2MK0vS/D/MAj9xIlb++yAC6SFQgcDekTLUEDgqqtSuCnn STWO5QJiJlNdJWCf1+NvHNvMde+eWPzNh33FN+/fgk7d/Rc0YsJzjbt//NhfF1zx0epHPsB4zBdH f42ufO1DNOupfS+N3HjXw8Uv7ny2+MmtO0m8eBC8dj54rclEUcjxJOLoVCkSjYG92VbMZKRAz2CR OmuAuArtVM/gYaeq1DEZxR0ChXKCQKSsEHyUg/QIcaQa6kjheNSi+rAUHf7M0sj9rASisyzk72AA D1NopQL5axCOdFM/6Rn8Rze5C3UdhbgoU4hNWEBQz7UmiEbQtpR2C0SdgFcDLeQzZvSp1zrNbKUo CRIvcRInhILhIBZURVN0hRV8fq+/ws8KlWwgiTwGNEEpkkR+xU5CPgtjQP7z4VWo0GgnxwYAtz0+ LzZwdTo5tnlcc3NTDvC8Ovkg+vqJ+d+bt2L59OvufOXm4lMof+fPx0ye9pPLp28uvsz3+qJnXljc u+cXxeJjF4zd3Dxm8iePfvSPejKT9DCgLMleVabb8Ql8TJJEkWE5onxFjqmMJBJra7A8OfEc9oyE ktCxEtY5GbuQRjQqUwuT/21dHumW5aEjVKkHy0rVJpxbssmSWqdRvVLT7N9/XKeefAOQAFAtKMWX LH0e5lLHHmSzx/7E3sT3bi62PlnUN8MbbYIe3gw9lJmHnYm0h3eIaKiT0MEHEjihYhxW/7965ai0 W1oJBIrf6JMyYcG/7BNQtVJ3Cv+7P5vYd499iLcOtJG+nLR54GKCP1cA/uwA/Emj6U640lvpw+01 6DypAnnYVIpJegI4zcQwBQgfeQ+EhEDMYJMxQUYoU5NOlT0pVfakFPEki3Q1BRQHNFHTjllM2AXp KY1NpKcgvEPHj8amRnJvvKyzBtVEqcqiVGVRqrJoJqEghUKNYpELlVBm4bknQM00q3C4pAuLKgMg voHiDmyzoBDYh1+C/J489Z9JXHVlJBwJRVhBy1hpXyaekdJcpjod1KNJxm9WJOFib0VChL0qPp1E ERUcyWtDE5OTSSbFki/9kGeCQxHSOBQIiGsxBdSUtk8AOH9AHIUB4Qih83o4wLhxNnsmvuKO4qsb 3ypu6O5CbX/egNBdmS3JC7dfdfPu7yTHr0H4zu8d/BZufRIN7Fu2fAc676030PLuS3r+Y/TSzmkz b5qxdsOe4ledF4xDNhnL56BZBXbJoionhKkaWdpikSiTFUsU42s6TmBRXzs25R48US1LWzh9tJsI cPqoQ9VPTBoDc9nVNX5ijm4bc+525Gh3W1vnbqvT7jYac7fBMN069bqVS/Dr+C08GATwhTuYjZB+ cA2QubQx7zMHGd6TgIPrGJZerlJPCJY85LOyh3xe9hBiXpRsUA95mHtj3jDcPHXB3Kc7gVEU5nUs axkYithA7Vtp/Cn/a4Sc47ndJCSD5sYNfsxeAJqzmQ8daxG+RFiBrxbW6mttQaa2360S0+9B4W4u Zspy2eblss3L5KVk6t4ZRZHK56XyeRAOb6ehMqP2DH5KmTcVSI9U93IquKGfHHH8xNLVQqICJSqc iraK9gquAmUIKyjD3qdlZPhLCRmmeraXVdFnFTpclfTROOIGkL6+LGiBKVSM85Mg29wESvAKQnVV ZsIWcenC05fU7p736+//+hW0Mbjp+lOXf489dCzU87sl7xHrWg8x9SyC67jCibFV4/KSfFKN0iQ0 K6cpc9jV7JusuFJ5m30bAhDxaBoua/nbuVv5x7lPJV7hUBP3BkeysX2O7Enm2ARpgIB0aXkPOdoF +1Jpy5FtlG53dXn85Ph7zsQQPDOdnijJodBE8CNZkSWFZzkuwStenoc9KSEKwD8FRWF4zCGwe4mR FBarkAH34JMcczSPNvJb+V38Pp7jz5DIMXW0iBLAJ7eKrNiDVzsxlfqMSgFIpR6gJv7tQFQakUPH 488mQlGzx8P4QKGjD7hqH8GMFpJxtrSQD+AU4akG4ak8EFUOBMgdW6QWYKVBYKWVwEp3MNzgW+Pn udk62TnYpdlEiQch47BzgmXYOckyrJxMJMUCvytVsOcdN37wEMeWq0CZI0J5jnyqKvPgeO9t94Po zwtE16onL1V585zjzRPdb0uD6MsPo7vzyI1Rx7JCliG8mLgTSiL4Fe31u/FbSBy4F39/kBk4fJDv HajDbw788tg9+KNPi1zJlrh6ms9/39EQ5tgYz0gJQvnxL5ykiF3YYukQsHQI2H+bDBz+BrES/hmx +qjgxn4SIUmMhJd+DdDgy83k/e5hGMGE97PYgKNJ9Sq8AKbtU9jVvAT+TsO0ZOg2jWGATiCAGj93 aomkechp3tRYGRJRSVYNRpKxogrU962S4x/ZTh3fgtf9qLvUt6/KfTvm9q0B3vcV2gCG7dplvfrq LtsTgLFwh5SpdM3BiYsUEAXasrTlaMvTloCRU00kTKkFxD0Sc43jWaFCW7GcNEpEhXEiZXikJRRP zqQNr7EMMoDIScDoSMfJ3ahAb/Isns14GAvPdvQShxHKA0JvyyDSl/6GfspowfTdzhSGobNrs5XO jQw2JS+ulLiV2mrtBVCldrp2usnWcWl9hDGXPZdbqV9jrNElFfNSXm82ZuCp7CTRkabppxjKPfhe dr24XtrE/kIUPNg0jNE8BpzAkqbro3kJREk7yzwLOZCGSpIMGbeuG4ZFxqnd0+nBnl68idHRmKf5 hNSDxgAiywpNy90kXEk42o0qUnuhwwZS4SrcAxsTUSMshVhqJiAlzKUWsnrw7GcSfDvfyUOkw5u6 7AmA1yHIYPsLLcEBitMkf4W98LDd/QXIZ1tbaGmq/BOGLJfgxZobaFoLG8D14+nrrxht8ChY6RsM HnyDZq9Tt2pwrpaCiD741VOGQo7SSTJ98PXtybwxIpnXe0AclzfGjqPitpFwdGTJ6+dB/guuDoGV uD64DPIHmsehpF1to2pk34NS6NzR/lATOh/xzxZnbynO5XuPHrrz2233s8eOTOFeOtrE7TuaIN71 AESSOOHPaOd2NlgKlAe2EcGjEgKgVPhyUlDz41ksSYKjRJIwcAdRAnSXsMiyksxhLIsSx1LCQtCi HGzJEQjG5FBCEPgyg+CJ/VNqwbuuCTmYk6H+UUioKKG2qe3qUrVT5VVpiLBrlLAz5KV0eKl/j7lz Jeb+zRRPmTCMqmQL2RY6yIUOGh9aXOZKncKTB66az6/h6AiX8Z4d3PcMwLyUgIahmE7YJ4xht+RM yUO/d22fkpecsa44Ni8CyJMUf3sIxLGuSI5WuzUztTovGl74VJD9/u0VIEZdMQqij4hfPTWE+miY c7om0IgAOmHsH/gti3t/e6wIA76KuxEGu/NoJ1nRCLnFu/zrjMFUIr8zNWwir+X1VgYqKznO4rxq QK3kHgtsN5432EAgWIkTUceeUTEj4ITn8nPlOdYs+/yK+YHzg7PDcypvC9yLrVCMZT0xVfaVCZav POY+4mk0UPgyCUjGoA/0uEjoEhkwscwfRVL5JMMkEgJFRopeTMZHJEPYSjEw3BlFUZNGIZPagklv bmaIBUhuUY6yZGEYwoUiC48nZuUSSGFotKeVOBgpaSJSBSkUOiosJjmWIwk4TRXGWUzjWMbO4Ux1 FbMQrUXNL6EpT3QXtz+3t9i76QUUffPPqPLaT+78ffFN/Dt0Bfrp7uLP//J+ceO2F9D8/yz+o7gX 5VBlF1J/XPzQrYJwA+BnOhNkDjqxRfZlXjzVmuo91zrXy6laDBCRCQTdnNVTVqmnrFIQvtpOKhue DKGvjk1kSSE6lKxSQOl3RpKeS+FEGMFvOKhTlelUZTpVmf7/mu9+M4cPDY/f5QA+3epwVVtSazmJ H6CFacYtbsQwaDaZtEEeqmvgurumXX7XvM+LLxbXou/ufLBw5pibirfwvYZn0fYrni0ODDzJottv XPADn04qSQ8BVm0GHQaZKuCKSY9qIE9zZH78YumKOCdbNE7SVqRtiiQLpDs6MSoiaGVBLQug2A+6 POEcbA92VdXkbLIfrclZpa1Z2sL5t7qiGfc8XG+VtuS8czoIaeOMyBmJs9UFkSsiy+RrjGvNm5W1 5k/0x8we84DxsWlBbE/Ypte2TdvUZE8lTob9iuCxLV3jg7LsD4RDsQBNb9wKGOT4ZBACASZZRc0i GDRNQ4qVbSNWto3YUL4TyxgPCMTJyLAK5WEVCMnPkc4KAlGLUEiklqY6U2yqKkgtJEgtJEgtJPjv WojwL3G1mrDsb1ZESs4X2h8s1c9I5CwZChBx2Mk3APlAdiC/xhiV5YfmAYb9Y0pJpaNIjpk3rZNs z0kEAFEHjZ0G4Gg4lLcBaT3wMZxI3gLebFXF4TMEnfOINfr9Pq8g+gP+QEU1OwqDMVZTwySWWZ18 CN+65+XrfvfHabWzzhzs3z3ryjkjk1P/Gz108/rpP3mkOJrvnfHCtQ+8EU2npl9d7EBjbrp9vCoO XM02jrv2tMWrSVRdMPgx9zf+j8xo/F87mBpKtk6ZlekpCWk6K0GkoEUGIETbMG11N+88hdiqK6hl IVIWKkkgnkjDa5DWDGiLaLuQXcgtZ1dwXLqmic1HTmVPF8+MTo5PSk2pOZudJy6Izqm9pcKoJsZD xjhVFtJlIVMWaspCNR1+92JXSJeFTFmoIUY4hUi1eiaFU2xNutnMVU9KT26Yn5hdPSt9ubpEv8y4 2LsoeK16nX6deYN1dWp5ejV7q3qLfqv5Q+vm1A/Sd+nrzfW+WIlCj0xmPJWZsJypg0ybqQt7uLFj MswiwAF95LWVt1TiyrRfHxmrSaM07+cJ/rnTKbGRcizmZym4Z21PvuCWm8imgAi/behzfyqdkemU oat8MhKNVUqiwLFYQOlUFRwT+FjlyLBDTP0OwNI+PzOS1t0oW7FQArWhdrQUrUMC6kFbHWMkeSR5 NLzxGbKLLifWJKh/kJoEU4fqSLgzDDyrjrx2nNyzLjw2SavWSeqNSYlcDBpAGQ8hTeRiT9kNPUNz PJ5ziLeGxpQqcIVp+2m5oVTwL8e5UtXfGihk95Omn2gB/IxMvSAQ55EyRMdxN0PDd6jTVYyL4cax pXp0qiaTaco1NzeCF5VmCnzegJ8LUKcSIHZmFjyjn//CDVc9fnbbggnFy2deesn3Dv3HI1+v5nvN zY9tfSg/Hr09t/O61Ud/+tvil/eiN60rfzjnlOWTJl9SHbggO+6RRVf9+qJLX15l3PajVefOaGy8 rHbCtpVX712+gs7qjoY42kvnAN9zQgLFL5G2Aq2oif+qribQipr4T+pqNpF4HIPRZ+iX/+QevLwr 4c55PSMkEG5gEQvyNkSxkTifSvFRKoHjoXK6+0EZJY+VUbHoplnkjtL2e4dnvmQ+3hrYX/iI4KAb Mk+oiSXtZBOpFOOKYpS7tVjJ65s3H/kSnv8QMLkq0IAXaY6SMedyc6UXJc5PrNMPtDjHTZCmcGdI K81H+QOmqDHY7sHPPi3I3nLk8Jat0luuhHkzuMzM8RAzx1apIrzPGUUz1ULCjxL+Nj9u9y/1d/pZ /z8hGLQ6XE4bFBpGlHIYUcr2qwyFEYUr5atuGFGGwohS8BF6fjyMuPWaaVahVEobInCUYmSZAmq0 S8SNFtJoTc3m2ndfVDz6+u+LR5buPm3zDW9s53uPPfVu8dgjP0L6J+yMY08/t+3C3cgLWpWBW0wB rSqoz6ngR1CToYDKBUtFw6Ey4hEqMMNo7VBh8ZBrbG6xBBsl1/+Uoj6c/pRoFpJVr+4a30duFEAp 0mLaKuHSzT9yaDxAKVo0pq1b8HA8PNBeShQVhpclHmG+4d1XrHdfsRsbwZBabVJVr3RSDTyqZ2rZ tNKgjdbatVukW+R12i7toKYmtDYNc1iVsIu1z8hIUxkJbtnaSidk4a8VWU5IvFeSeAbsHvNejHkZ HvVJQoGkfJGEFmGJFohr820S6pTWSbCPkKNjpzZ/PkZ34A0YY3LETvBtPB4NqfY6fhd/kOch3V7b pbZvctPtjv0AN+QTtNyFAOFQX9BdDFCaJybTxG467YWU+WnGBDv5+9OyB5GN5CUFn/Hjx5cy61q4 rJlm1gz9Zhrl98BB5w3zrWHIlkSNbu7ciPDJAy+8hm4YFa8aiW5/fmA3ZFBvdi695hqujtalQwwj riTsE1+/gzEHi24xwS3tG2WrAD44UDrBDp2gOQtB+jpqUIJbSTtuIhwFfpa2WCv9WT81GrNsPWY5 pgAveL2blL8g5L3u0EJYHZOx6zyZYJ5ptvOe5uDpzGn26Z7TgnOZOfZcz5ygdY90j1kaaqfRQuFQ 1pfjc9okfpI21XcOf452ru8i/iLtMt8KfoX2XZ/J+0hZySMBwmFqaa2t1K4CNIIS84ixHM9jQQTz UKC7sm6Ypuat8Hh8/kAwCBlgSxfPBBNkq3lssnXm+yQ5wfBkZRJgF2KCvCTFfEGvzxf0aLIc83lA 9NiaaSYs22tZtkfWpKCPN20LQAxeiWeDlmnKsiRheKegx2PbjBQOBMLWyTKaySQYDVoffByGRzO3 J8hseSjUg257yiWkhXBo2kA4ODAQDg0Ep09eNOmjIRZaruQQAlpaaVRelzBteF3nxA2YzxrD2rMH mpY9ZWl4A+ZogjnaxGo9ShDwz7XRNBysP26jpVqRAUe6NId3xrtmu6zADCX6w+ICaqxwDbbCA5uK RlSNyBoHhB4sfve376fC4xUU+PS1GdWRkR/9pnjls8WXasSAt/giIF/rT+7+W4p9byBc/OzL27rZ Xx6ZwhVuTyw67egj9GsdJQTUMHaAFBGj02hLw6U+FC6J5K5/0WiLhiHiEdf2Oa4EjMfKwHikTIMO OQFq/ialtjRaa/8kZrvrcuSTWG4C/NHHXZ4AmXb42DFA4ELQsKSRSVYWpDMVbzkTQOBqofFkuDqp XmkwuMVosbBYfU/geI5lBUmUBUEWWFnRyEqChKJ6FUUVWEFmCXv1k6NsAiNAOiRoqoCAECC1B4cc WVFkFgPgGj04CLmWfJajdCpY6UHbQFWqlmDYs2bgOyjebXNkMG5vOYFyVEoStBIx+KBEFXBwu27s ThIMzNJ4RvgAMDR38xHhAy0g03osWOSaUdmsBDDI02UzRFpDFstY0EzdGgDbiZBlMpIma1zvYD/D DvYjioeE2CGaMcl0kgE+XM/ge0+FSDJ0fL3+N6ExaR/HRRtPGHjpM5Rsm3zKeSjywcAz+Ap2WnHK 9dcvX4e2HOsa+DGxnnnc4+gP/G6GZdodlR0fCOWwY9o5Uq3rgh1SBHPC/lCuDbWx2GHbGMySrw5Z CKM1IPTgs59Gq9ke3N6FQ1zHDtTAUJ91l6wMAFWicZ6mg6iabUR/uPPjv8Mjg6QucMbgAS7CfYup ZcbhTc4IWZfrQ3q4vk6vr8/rzb5xlSfVn15f0Av1S/RL69tH36qvrrvPf3/4Md1XW57lqyGsLkSk R0OP124PPVu7J7S39jXfu7XSJD+KEfC2CUPxeI4v2Woi1GgGkeKBeDA7oj6X5/IjTue+PWK2NC97 sXRpdqW2RntR+1r/OmuPyxmIsxpSucDYpDd4ft1Vdbgu0mC0GncYG4xBg99gbDG+MFhjaFGaoZVW An5aXhvY7yQtS4AThCAZgmlCmyHeaNC6rWFE2EAPftzRg5S+BO/2RiIiM/TqzOQaZWyEVesusC4Y XhX/quy8xxyDerlAbTWdTBFOWEoSP3M5YYoj5psiCwhUlQr9VH0pMu+pkrdL0fdKlSlwqgef6xg1 DpOxMonM6MyWDJ8nRQ6Sz0Dy+EZZ6KfVrcyYPK3uxqpzo/O78nhjHuUDpAOXkVsH6LK9QDpY1UCz owYaKhtoCG1IPSfsFXBcaBWw4KXsjZIswV32Z9CKCHVCIUhLIRp5f4HWuQSDlkXoagZhzPih4hYh nR1u/pTNWkBQDlMaOsRIae0r++GHhIXuz7b2DWT327SYMfS3HW7qmadpJ/FFar5kio7pSNOpXpJH jaM/TbkakkmJNd/CNLHy+3xef6A6wwqigUEkaxSam9iWi3Ys2bLztOXfbrrsnUtQ4+S1N14b3Rq8 8tVb1j7eZsmBqp2RwIV7rlow9opLFz+cif5g1pQnbp6+arrX0MOptHLlyInzOoIdt011Ljhj1DUH j948cTx6tzZi1U5r+Hb7uTMmfod402rwJjIjYDFR9KLzXcRrZopv4ifzfGt8axzH41WRxsgpkaXx dXHhpIoWf0v4TP+Z4YJU0OeaBf954SXS5fpi80r/leFd8be1dwLvhD6o+CzwWeiv0X3xwXgowTeY Dd7RfKvp8GeabfzF/DvR/+GOWJrlMzgBM5URiGWKL2KowXK9JFjmPkESP9LUuFOvqshSHbVd7VQ5 d4WYSj1GDZam8w6XK30Hy/P4/d3ENkHYR22THHHOJmOvrgCQI0+yqbnYjYyHOgdH/YFzJxJoItfo sjSWGiCbxngXQuvQRrQVHURcHLWiGYhFJFcgfoOIT0WJhSNqeohmVMhDTA9R00Oki8S26aV+8noo SJf2eMnjUCh22rgTsiBiVsvcdTX0GOT7dKZimLUSc4RfO0/zAIL/HcuYjmQ1ZEWQssewz2Kqq2pY yNgbaSEWjA6N/EX3sqcu3NLhFA/9audlODfrzpVP/vzqlU/yvQP/c8eMO363vPhF8Y2fovXPzbrt lZdefZ6u/m0bPMD2AeqG0Zc7mMDgQaeKTsRRDcq0NWlruTqVhmUwOeNGE5kqIktOlkLI4DwRVQxG OBUZPlEiChOpwkSNTg5YRGEidaxXXn/erWXsKYwlH5LonCZrKB45teLUwNkVZwfaK9oD9+P72fv0 n1k/C2uSHlKW4EvZJfzV2lK9U39U2yZvV7Zpml9brf0Vs0bV+eZV5o0mayKCnZnRdB1MO7zWOmYj s485CJmhaarM8XeMwKuXDdIkBkltxUwZEsXlqkpaI+gvo+rnzipqSyk1GwdiAJzUMbJAdxxKrRzK oJopAXKoRTjUHL5NjSBMjeD0iI+am4+ano/inS+1V0RxsVXEokHnTRTyZyKNTkR3p1DdQTumMrdn qOzgGshxgCssK/13FmQxNRBROLusnyxSWVZermXnG6zCfvilJSIwpXIahQIEvxg75yF1oKEyELEp tuWp6Be/fKf4j2Wf3LL5L/EtoRvnr338Zzct+RG6OfDMXhRFypMIr9ryUOVll//mj2/s/j5gzhSw pffpmp8oes65XsGcntZz+iSdb/I2Rebgc5SzvGdHLsEX8Yvkhd72yK746/yfKt4NfVjxofeLwN9C H1Js8cfj2TABpKlhgk7iKEipR/lPwk36VDxZn+I9PTJHma1fon8ofOw/gvoNC/kgU7dMwBxVtBkA HfYE0PnqGQo6jWQ8Dz1DRzFtm+ULTjSCGmoEact61UaW7djtdqcNuEQs10Un20MgwabhmOCULRA7 tyla2bToQsbRNsg42uUJfLs8UU8Ep5060goPtQYPHV8PtQZPSqTFAjLvccqs58S94vvioMgR+5gh smKM+g+Ne2LM9StqM5RIiGFqM6FYrm0Y0pAKIC2xDIELPeiuXQLEadlfqr6Qz3GoIbPSySYS2CCy uZZB1qJ4j0MNO37Rnhv/dPWS13/Qvr6hayDx5NUrf77pu9c8tPrB248+sgGxt848GRtHpmDPy7/7 9fPvvLyHRKSpEJFigDQ+sI4HnUCcifiAqRf4gjxLXcRexl8lL1Iln/udCaqq/c5ZRIpGSFvjeZs/ 4j0c5sZ4TgqNiZzsmRY+OTLTsyB0VuQCzxXhCyLXCNf4DuPDQYvxI1MPBNr8pMDF+iPmOmujhS2L q4woItOLHydeUkb2XQ4dKgsc+u4KgIWAO5d54jJmd9Iu4OjAj2jpS3enPgUiuEvGdHIruaY+t1VH ejhO+HI6kyPbZwgNiqO4n8SGBeRG/kYXTEtrnakdWCnRSdXnymPter2LAIlh4x6h4+5iRYSOuJ+O Poz7iRGmkKXzNfvhGNjAYVoJLhfbyBK+/RQXCi0DHe63csjIkzk+ymyWlWHBnTv1iklah0PJDCU3 7Hm9Iz7f8UnxC+T9y5+QgY4dUJ6+eeHtA+/gmdr42bdc/xiaHXikG8Uhhmqotvhe8WsrsaV3Mbp7 9amLHyUxpwLMoZP/IxNAdU7MKyMz1BAaHXJCS0P3aw/oj+lSWK/Vt4Z2hbgQUasTjueiks5qZkRB Ppz1VnCswCgbvMg7WEF1WOFwpYX0VJkBzaWYHMPiuxBda9A1ZjzNYpxsJJ5bx6CQQ7w35OjgvaU0 r5ameFXEn5kRpUTvUGmezFuaJ/uUhnm6tIhEeZIrP0NZ+SPB0E7UyySZw0hhytng0FiQvBByH+p1 fdm+gpsYDoDb5W137azXsgVZFCTgvZbsqWRswaxEkNHVr1qFsuCPyxrt6qbGptw4UrAHnCYw7Wv0 VdtPb9hQEf7ByjMXVI4fe9akvXvZ+27vuCw3ZY7np8qU9gtvP3YxeN4pxZnsp+B5MaYe/ZfTrqq8 d4Sa9p6pTvYKcjQUHaFmvCOq82qz9wx1ine2OFddrB5R/sdnjKoeUfOt6m/VnFmzbsTGEWJzsrmu dcQUdUpyct05yXPqLhUXJhfWtY/oHPFOzYHk59Vf1NgBv+DrwU9110YqRBqKrQQzmgbiTmYX8yoD mQy+wbH4SMRUJldFNMXva0w3KmVnU9wy/CluDbmGllLTweCrAWQFnEB7oDPAjYAhwbNGUDQOUDQO DKFxgKJxwE/P0UItnXz10LyjjMYBdxkYFY6Uff2Is5hazgoTpZmqODWmODWmODWmeOo5c6/5vjlo cnGz1ZwBTIMeNylWm9RHzTCxFbOKPN2MkCebFJtNis1mKDtiRZLAc3b6cTftKE3tWMMRmkI0dd/D LeCv+4nL7ifbltIyh44A+ZIBzSVqwFGxi9KBpvLS04phUH3xFnXsqStuWBs00Mqtfz545R9+uPO6 Rxf9eeN/fnrvozdcv2nzdddsmhuemR570fxxW29DLe/eg9Dt93QeW/LV3mueYOv/sOu5l3/z/G+I 165hGPYAnbG4ewfjB5fyBUhBYJ9DE68018ROZnt1jh7yBUK5gGRrtpflEWNGeNGrKlo55mrl4SYz +U49LUKlZaexOTcoo10y8tOA63foV0VqaeslAyuTDNamXxqhbF4Ok+voSmE60LKXDDSdpVPJO5Gv mdD9w9vpkrzpdHqlLtec2+o/6MdL/Rv9W/2Dfs6PvXSovXRIvXTwvWl3jZIFb3WQfEsuAda7j+Ho copSWeiIE6Bo4aYWEnmZoZVKR9w8gMEUHjBNO6b7TmsLDiduHdnS0kmQ+k80gGxpft3NAUj1iOKE IRji/2HvW8CjKs6GZ+acPXvO2dvZ3WSzm83l5B4IBAgJMTGVRSNEuV9EQEACCWRzzyYhRFGhoqgV Ueu91iulSv0rhohIsVKrVrxULLVflXqhUi0qSi3185bs9857zgkbxLb/9/3/8/z/87CTmXnPnJl3 3nnnnds7Myd5bskZpi4ZegjClT7rCXQxFM+L4m5esjfHi1UvJXs39l++d/XPp/Z3N83aVAXrgM9u XrLl7oGL2f0bL517w2UDv4De4Rqo3Cp+xp3Y6U8jIaaeUGybV+ZUU7P3jaVsMACbBYi4QkJNOCoO BXQldO0OU7s4YE2lB6zLfQPW5b6BSDoqzXGhJqAroWsXTc3lN5bm0gBsFoA5V+KO7ATO/pnKjcp9 ynZlr/KOckyxEyVTaVfWKfeaQe8qcUXNVGD+bheZoEiozxqNuV5OiWSTRFWy59mIeK94n7hd3Cu+ K0p7xWMiI6Iu7ocnUTSWeoznbFa/iNUvqjx/EQcK0RooRGvrEOlUuSiIM+SThSCG12R5VRcl3pBd Ekvcvx3+8/NLs1Df1/T394sfvfrq18li/tdv8lZ6JTjleGNhesSVWJfD6s+8pZBQW8NqiKuahtfH sDow9r9syHG8lVB+hnE7obTM8MeOM3zjRvHeSB50FR5bpu1e2zs2cSY4x2xCpq3dts4Wt4nQtlQm GM2NY8Jmlwxj3b2E7oWVG0tse1+caHvpCW0PmW+O0rI5RFubtvG4tY1rVgGZIQ6vAl4HXBFk3mjA p5N/vHVd2Y+XG4y+UMqHETWH/flJ4jd7My3hnJcBeC0g3WJfmgWELSDVAtKtC7BpFhC2gFQLcFob mC4LcFuAxwL81hiqWYDPArwW4Le6Ys0CfBbgtQCXdYhPtgCuqI9Md7hK88TD4mHlUMpfdNvrts91 liLrOUowrCuCkJORJiXzwc9OpZzUkKbuz6M35t2Xx/JSUlLdeTd6qVfEJVQQl0+ok8QlVBKvSC9X 4KbwyvQyXEg5cSGF2kivdZAtYTlFl0QygnLC8ScU1mDejWEaxgzCQxmEMYMwX8p7eQZh7KnDuOIO 89shOGSEnTyrsKX4DPMcCgkbn4Poc3CYyMFhIieP7ieUqxdYJplIZkL/ybEYUomH0YlmncIDN2CO C99YM8jjkSQcIAyRxDGUhHLzdtE1O7KmDJ8lGNoinBAk6JBwKz1RpTSAu2EdMeMCxET8TgC/JJpw RcvtTPLnJzm9YepzJVvDhzXv/67OBkQ/Gc+JpHDHGF1wApo4ztxfsrVx9e2Zl794z7YdOYvPar+l f0HdtPWVYv6tMy5evmD3ozsHCtiPmy+uvHXLwO2sb82aWXfdNPCGOat4H1pSgD4W8dsEyc8e0nZp 7wkf+I8Jn/slkR9azAaR69XoHdr+4LvBeFDU5SR3UsAHswoqBVyqy+10W0Lrtlqc2zyTA1BuEGcS QZxVOHA+4cD5hGNoPuHAbsSRjTHMG+QSxOJ15cCdLFQwqqbm8fMIqmgcOGVxUPhzzAjybmsUn1sE jwVZe/C+4Pbg3qAYFNj45ADKTQBlKIDSE8gzzrR7veZVi1NOKdSTphTehCmFaPZueyO+k6coM1K0 zxMP/xiTjOM4zRj2osi6y4RHpCcePTHPCEheRZVVuypIWr5XcoepR/WZAsNv43XAnKMDBcNUcydI xcYHut9adv8sTe0f2VTT+VMx//ZHz22fXnLZQCe7urVl0s0vD+CN4ur4X8UCqHkXCdGndyYHeXn8 fCcH58y8I6jnUAhf+OxqyDlFqpHnSwvlVVJUlku1Sl9loCx4rjbVNzVwbnCxbbEyR1viWxKYE2yx tSh1WouvJVAX7KHJimRzXSTMs81TL3I2C/W2erXZqaakiXYvdFSJ52iOWydrvoj4cUKYG8Z1RhhF hx9vNtYZdtT3mBpNSzWNgHno+RguD82D0Qjsjbhz80rH2imxa3adX4wCKcOzZPZx70BvxWO0cFUB wG4UF7dxhgCFxp1LnG6+PPVhx4IKVZKG0oHKALP/wN6S4DU3EoHseMfECKoRCGIzvntAxqVydQEO gEuGSYLWUbTk86IlS4bLh3XCmuuFcBdyrm2usty2XBHpEry0VOTXykEQiHFwjCQuP6q3XPvcQRq4 9KMfvDN49Mm+jVf37bhqYx/z04IbVg8eGnjlo+/TDOp6+aWXX3vupReB2I2DUTELpMJHMuhtkS6n Nlr7njZVEyfq23WWqY9w5qSXJJekn53ert+oy5UpleHzU84PL5Qvci5OWRxulJucUa0lpSm8Vz+Q 9FbwrdQDGYeTDme8q8f1QI5YpBUll4mV2mTxfG2R9hfHR+mDmsPrFgJpfLtCCqS5HcQdsgQiZAlE yLy2A1DufpVqakRdpq5TRR3FQo+Yp6HeN3aJ1aB1Ogq3LhLv8xhbFyqX7TI8KdVF/ePZeFMVaCgB DYVgHiGn3pOwtiK0hK0IbdhWxOcnb0XgNid0+LgVkTmlPEiH7UUMbUUUHT/87V0I3IbwViRuQvit 8SCQnMT4crPAKyTU+MYtlTc3XLO/sfudSxdtLvZuXb3mZz/t6nxsMGp76rrZs6+P3/Hg4Nc/mFY5 8LWw5ZVnX3r9pRf/g/cGNYNR4V2od42k0TWRZgcrYiODZ7KprNcpTUyeGJoaujHjvgxbqb80PDGj 2l8dnuufG17hXxFelrEu4/fS6773pSPOD4PaCJbtLEquYGXO89hk5yIWZW84DwbfCxwJvR/+hnmo 6EpKTXPY3VJSmgiVneIeT6z6TtT3m8oHwlXBHqp5Ip5lnnUeMQOVDxlY4x5UPniGlA8eVD54UPng 2WWcLOLPvDY8xh1TyYi+BHu4Li9Wuxcr3IuV7839ltY3cRcgF/sb1DLYUctgDxhXKwwdYHrGyfoF U72QoFuwNAvHq75dtaSDes3tgAmmOmGYznfUyNsveGrw07YDlz/X8cBA1iNrOrc+urr7wcEok8+c QYup/b7BK7fe8NU5wv965ZVf/+b3f/gNnylfBZX7PNSrl7wdmT7GTzWR5oil4jniXHGl2CVKildW ZMXl9youIsjUgQ2RqErhjTKVs3U/9bNskzmJ7Pru1fnQCuGLiDdhKJWwsxw2/zIW6MZFE9lYoPum PHuqBfphbcnxGP8OAOcXP0+E6zSi7dvoxltiS2L80w9GqzCUc3YYB6964KzoxIuWnnX22WcuTcoQ 8+/vqKn8acGUictiA78HmifG/yo8BpwZK8DMx1BfGpPYELqFljQWWEC+BeRZQK4F5FhAtgVkWYDO i3oFrrSzk7IrlfOV6tz52fXZa5UblA25W/0/G/WM4FJSUoMpY6eO+kOKLcwuYEwroWpwsbxYWawu dix2LnY1yo1Ko9roaHQ2uvrz+ws8/ABx7ogJuYvUhY66/LrCrpyu3HW5P1Tvdt5cePuoW8duUR92 PliwpXBH/nP5gUJrBZFtATkWkGsBZnklqwiSVSjJKqbEl0hvR3wZFYvkgjynKqbq+cmiozg9lSsa s0OjcJsmNDE0M3Rx6NHQqyHJE8oMtYXeCYmZoc0hFnoKJCAZ5BF3ACJJPLrGrypqdD9lxikWvgZN CpTizgC/8Etp8eL05nSWnpZsF41zErj2f99a378f8XMxEtOKHZmpNDU3FPEHS0t48jLUMAcNl7fW UIBLYkjnKUM6TxXC0woh1OHzt1D3u9lFxB7/bCcqXnJHAqLH0yr2j6QjeZ48/UjrashIq08ZaZwu ROD4To5lZCpSkFUwsnRZyd4SNrFkXQkr4ZscuSRoLE1Q3nWD+QyFBEuE0pLJadNRCvVcD44uHqTd o5ud21eRfOzy8KqrqeXEY2Se7HcI5ashRkLjzD0J6IWsDon3RjAIFx2NzbCOYhQVdfCdiYSFzFG+ bwn+xKMdeBCDr8f5iXfuDX10IsWYp0YKRmfk2JJG5Xs1n+bXBCnbpYeJUmgPU9tocDKS4DHLnRMm 2TkupzxCDdPCAkWVisQwydTS+YzW+NQEOrgEGlm0fv16ktBjck3MkhMBPJJ525+f9igoZmWlE8q/ dZAeDL8rhfrYiX2eay9du6Ys74fP3zlz0hkjb5p72VOLvNudndG1jYHAmPCGp2+fH33+slffoN9L a4rVV38vJ5hXct76GVN6CzOLai5dFZyzeE55Tlq6X80dP2nt4kX3XvgI71tz45+xkbY7SQrNfJI4 zeW/I+GMswHYLUCyABU/LZFfit9xmwvAuhAl1OlSqUACmlLkUWEuJDg8WjbJpq5h0xPVmJ44adwu n6ucu8zebl9nv9EuEpjU3mffbt9r32+X8GqgeUfwOAorHq/GIwHGSs0EzFuDX6Hs8ekyn0IBJJmz ZmMxYN/NGkmQTnhs5UlaG5iwHDU1qIf5iHaUn7/nI5p3/HhtX8LFo7wUYzeTb6J4y7184wTPljMt dVrV8uZRGzbsePxxf1Fhxv33amfVP8BWXE/tzYObrh/44fRRqVyrBn31u/ybsvTKJ0kq3+pLTill uj/Ar44di4R8SaVFfpor+wNO6g84YADzAv/I+IC1Lg1Yk4zA0Lo0kBdM4QvIVFydpuC6NMWHGxhD J7VScPBKGVqRpiSZWxmmhjsF1RX4pSUXZ1k8he5NoSkzUnnFFvDFaOqxVNaeel/q9tR4qsgPUnD9 O1al02kq3ocGUoUSRVf2K+8qomINpMrQQGrq3FXUtONRS9Su42pUQQW3MiM0TLFmarG/vew0BlU8 4lJlDKbYmFNFze3yuPiBZP4ZJlh6is4wccneMOELz5Ej18M8BVKae9MF+XhHIOXEhzeEiWtfX/rg TM3R7/C2zp59w5n9d/fXtMws62Q3D+zYNG7K7Lmbr2EVX78JNZrKdzOgRlU2gX974DPzm3FucyJ4 8mF/FjCVn8ettnUsgk2BaQknYlJsMlFliUpDR/pz8Z70mKLEk/14sP+JMhsl2d4KlQ9pLm+FEvCl lcrcYZDpDvCp6atc66ZkZJWSQnBw8aBk55WSADjw9Gbk8sLiUqKD43GOIIVKvlpBytQaMkWdT+ez hfICZSVdyaJyVFlDemgP65XXKD3qRrqRXS1ca79Gvk75MblDuUl9hDygPkWesD+m7iPPqW+S19WP yXvq1+S4OgqKowZJQC0k+Wq5OpNEVMUW8QVKbcCcUvNEusLvM0h87sal1YPXPwiODJwXPAxXIJwr GMpsNqeDn7R7qwh4A/aVoleKyJihiw/lql2W8xQ1SVFUIjCWZ5w3t6kqUY3D45JdVQRCbWOc1Jkt RyIR49OUNPx4xLbOxmwARRSdRWi248PfcbE8mhoaWDKwJDV49PASY9O7YujsuLdi+N1/fujWPOV3 4pd4/8A6we0fT+nPB5t/eTgvM1j08ZODrWL+wIZVbfNWs2sMjbwHJO1vIGkao/zDAKakada1ks8i 6onLJqYcJXuoQxKZIjHJBcX14CTCM6YIT/DjZ9/CT3h81JMdMj4tMitUschzm3ibfKf7Ls9e215p r/0lj+KJBCpSBb+S7ErVymilYz29wSGP8V0oLrQvdCxw307vUO9wPMF2OV9wvOh+WXtTeF15zXVQ +4vq85l16nASn9cTdEGfw2+kRtwc8kiEuYiqMgnv1XNGFhWZFwpWSpJglxWFSpLCT2tDbw5N2kU9 HpfmgN6FuRyCU1MlD/Oo2vPkeYVpeURJIkQRmOt5F3XlOYUkp1NQFUUQmASzFKeTqDN91Hee63Jn tuqplZTLIyrU7BMRaZa0Dr99eE7ErQuXs+yZwOzzvGtxBr/kuFHZUNfaX7TjR/HbJCduCeA3Ks3K 5t+qJJx8j2ejjCf+DRc8u1urqpKr+DF+/kkAdzC9woHX/NMrnNkpFQJY/tyXVaHhbankCpqdVaFE 0oY+67IQNWX8Mh6e0wZZGZ/CpaYcoByhgHrohsE7Dz1YnDYqb8d/DN5Ef/DWm5WDR1ghHfxyytiz x3896Bz4LT1/4eASLklZg7OFT0CSUlkTzNGCxpalcaYMxxh0PaKpzj8eGWOokVCZj67TiGEoltB1 GYOA09omMITRmSiM6WqSR3AIaSGPT3JI/ojPozsiTt0UytCYotS3UoOvpIY07uEaCSdn4R2eNH7E 7u1IS1pFYdJ8z6OqEHFFoOb1wrGlGnfsTsUXcAV9BY4CZ4FrgnOCq8x9p9dR6Cv01wQW+hb6FyZH fVF/NLlXWu3q9V6SdEnyVa7rvNf7rvdfm3SH+pBjj/YL7+6kD9UPkv7hGtC+TIqnZViiG/A70sKi p9qzwSN4QkPkG2s439ANmHKPx6l5fT7oYkJJfn+eT02CB4/T43XmOVRYIqh+fljcIXEEJE1LY2PS nk5jabvYxMc9wItI0i42L+KY6Iv42MW+p33Mt4uevdNDs8m5YZW/Qm5FdOdY50ynMMsZdzInxNgx hh8/ZBP7w/pamNQA8wb41zZBWvnXSYLa8cMh7fCSjqOpQe0oQiTIJzeW6MrWJ43cpuxuREF9dup2 99yp24OzFy34BcwH/0oc8b9S8xoKXq1Oir+9s7xCzS6vcPPPgyRXeM0L1Qv58My/OmTKaUKXV+Qv ME4alONtFbPLgwUujMFXJJ05qqomxZtvcwy2PPNWUXZm0Xv9g82TcseunV86uOphrTA33ORJFwsH 7uxev3Y1a/r6hUfPXjiXxOPGNw3to1g+KQTRtpNNdB5tJIURDTpMut9zzMPGeG4EYWG7BoX+miJK PU+yLDKCzwOWLOkoAwx4X8D2DGCoRgznkK8IIeGIm91b8WkFq0hTa4oYrXiSZZvJyni+eAoNU9UY +ZK/m6nezTqWxbJUwlNl/YtU55C3IFX+Y4yf8Ip4YRT0ZNL2TJppJM88kbyjqAxa7tviNjYT71XU 80OaL/DLFCzxUkU+AFfQdewdKrQJV5ArBKGNtFE2k87i/8ZU0AQmbKQi3cWW9TF+wWLu4yQkvmF8 bnn6wPEBvF2BdytQeev3jxfevurjP/G7FYN/5d+u/pQQuw+/EGwnDlIV8Uk2RkW1in9LUhQFVa2C kTPUZ6+CYTP0hFBFXnK+8Q/ekw5wY3ae2tGUEuPjwVmm/fQV+vYr9K3fvoI/KNo39EWxDdawAsmI eGgZYak2vNyMnwmeAaKsvU/GTD86bqxQlpUsip30xZtu4n1bs3CEfs+2D2jriuQfsL9nZ4/Zf21n n8n0h/L9MuuUvy+zC+R6GPdlKjsEIv/MvovOimRQ4UuYCkCJKGFAtf0MuYAQvDPm/HFv0PpgNtds wvpgAMugDRzlrZ/AAoHEOuBHOzr4hnoSLFwKJkwoX/urzKKLRk0oE8QvXvvJ1WfOHjElcPEpZfYc ut6U2Xtdj7pYm+sKF4vAIMZ2DXyNMus6IbMdHVwOnod0l0APLpDGxxmfK9n4MUcNJ4kP4iY40WHp zA9BDn2rz2VcTz524otoliorguoDko47AA+KxiTHnHrDQuh9/IaH8TWu5/vxgACN76Z59CHKv/Yc fIow9imh7CNC2LHHbHSMdhg/Dk2zyrLoQ4M++gnN+zkx0tjC/zqNLfzVvbbaE2lgSfkdaf5yIh8y uJtOPpFG/jfSyOQ/d8sJabR/I41GPt2tGWn4L9k0TeTpBBOnc4ZMO3DpXxr2R/ZH4UpxkthnC9oG bYPSj+yj5bnyg+ocx2Sn5HzI+ZBrwLNNK9L+4P3Af6H/wqTVw0x/4KKUtuCtoS2pD4dr0zakt2dc yE2mqj+a9Uj2Ezk7cu/NG1UwvZAVfjRSH6kXnTvqZ98yLw+ZD06Y0Wx09n/TrPgfmNsTzA7LFNv+ TZN/SrPqtDltTpvT5n/LrP+/Yn502pw2/w+ax4tfLT5y2pw2p81pc9qcNqfNaXPanDanzWlz2pw2 p81pc9r8/2wI/qdW+mdwZ9B1RCLziEBy45vBLY8fBLcK3FwiQEguhDSAW4FuZbwf3CqEF2Kcxeju hJARxBtPB5fjGQNp+X+052nHYNoxkJa7Veguxrc7IeZ4iHkQXO/gF+DmwtsypKEMUnG3El1OTznG LMdcyjFmOSnBkGoMmYxuDbrTAH85mYPwBQjPR3gBwosh3wrAUw0ux1MBGLhbg+HTAGcFpOUwT1uB qSqQ5kpItRncXISr0a2B+JVkGvC0ElJx+AJ0F6C7OP4JqULKq7CMVZhjFeZYBWmrweXUVkFaDs/F 8HkIL4C8qoDPm8l55DzAcB7ZSfLIBUjDBQBPIwsBbiCL0d2JPN8JJT0I7k5w+a+S/ZLwHXv+a0RX wNpX8YnDjLjJhyYskKXkZRMWE+LYSBDPQ3BYIm460oTtZPlQHJmMBUwGrJDr6Bkm7GLb6DNc3vBX JjabMCU28X4TZsQuHjJhgYwRf2fCYkIcG3GKR0xYInYbNWE7GTcURyZBsdOEFXKuTTZhF73ANh0w U1HgV9ikBxC2AaxJfQhLGP4MwnYM/y3CMsJvI6yYPDRgg4cGbPDQgA0eGrCYEMfgoQEbPDRgg4cG bPDQgA0eGrDBQw6rCfQ7kLZPEHYmhLsRHkRY47TZDZx+gH32NISTEuInIx4DDiSEhzBtMcJhjGPg TE+Ik5kA52L8KoRHInw+wqMRXsBhOYF+OSEvZ0K40yrLw0QnJcCRcWB06KMaSD3400kbaQXbRXpJ O4acA08xgLlbC+FRjFEMbyaRZjA6mQNhqyB9F+nEp3rw6yH2anDrIOYkgKOQlseNYpxasF2Irw7i tIAfI00Q1kZW/rdoOTlm5bA8OUWrSDfAPJ9KMh+p6zRT69ADFgMPxgJUCJiiZAW8bYP3nJou6HNP 4JoOtH2bqnlDUDXS1QOxWyFHncwEDCsRI387GmlpA4mMYr4z8E0DhHDKOskoCJuF5YrhmyjyaS64 3RC/zqRaB1oryBlQdwshZTc8c/71gt+NfOecbTD5vBJp7cKwNnDrMLwd8+vFeuB4dQiJIU085goz Tb35XIuY2jH3FojVhe94quWIo8usrWaznK1DVBgpLDpiCXHbkcN1QPEKzMPgRw/SzTly6jIYzzzu CsitGzlSh5J4Mid4imaECiH+CPC5lC036T417tb/QdlPYK8bqvsYtgOrLi1ZPVUJrNy/TdeZCXXE S2KUpQvzs1oBx2+UtQ5CerDkbdiy/pkk1A6r9XqsnTbTNUplwN3w1I6ujtSuHpJmAw+P2Qwx/pkM FT+sl4wdN06f11CvT29rbevqba/Xz2mLtbfFaruiba3F+qTmZn1OdFVDV6c+p76zPra6vq54Uixa 26xHO/VavStWW1ffUhtr0ttWfjcWK7DSSDmnflV3c22scn59rBNe62XF48bqhdOjK2JtnW0ru0Zg rOnzhlDN4051rLYn2rpKn7lyZXRFvT5an9O2PNqqz4iuaGhrru0cpc+q7YpFV0Rr9bm13a11gFof V3FGycK2br2ltlfv7qzXuxqA5pVtrV16V5teF+1sb4YXta11enssCoEr4E09+LWdent9rCXa1VVf py/vhWT1ejPk2cpRwAuOI4ah7bG2uu4VXTrQ0dMAhCTkAH60dUVzdx3wS7eIaGtt7tULoyP0+pbl gDshdus/zR2j1/HSx+o7eSk5V09kwJMP4ToTS1QYhVy66lt4FcSikGtdW09rc1tt3XAm1BpFr4/p UKI2yArc7q727i69rn41ZzPEaahvbh/OoWLoH9uw3fGetxUknPecvdQFUtUIz0ewF7bezwU5M1oK bxF1wl3CY8JTwtNgnxR2C48k4KrFnsp6PoS464flVT8MG+ITM8Rx4lRxivg9cCsgdi20BN7GjJGg gW6n98N0jLd8PlrEsMfmOIy5IYkX8P/6ecqfQPgsyEtoPM7HZ0Kms6ezWYWYT0jkTdtueNYNgbZ+ cfiRifHBSXOmzRk7FmIZ8z1CnOAdo18Atlkw6bueULaJ3UkEdhe7C+AfsR8BfDe7G+Afs3sAvpcd A/hv7AuAvxSAAsEn+Igg+IXJAE8RpgI8Tbgc4CuEKwgT1gnHAf6H8A3AA8IgwHEBaBYJnxWKXWIX wN1iL8CXiJcAfKl4E8A3iz8E+BbxFoBvFW8F+DZbCaG28bZSItjKbOUAn2E7E+AqqZpQ6VwJ8pWm SdMBniHNBXge/7eZ0nzpQoAXSAsAXihdBPBiqQvgbqkb4NVSD8BrpKsIk66WNgJ8jXQtwNfZtxBq /4n9J0Swb7U/DvBOeRJh8tnyWiLIl8lQOvkK+W6Afyx/AvCn8nGA/6FALspCpYcIyhoHzEYdqsNF BIfbUQjwCAesqxyljp8C/JDjUYC3O34F8DOOZwF+zvESwC87XiHM8VsHzKkdHzqOQvgnjr8DfNzx OcD/6fhPgL9wAOcdXzq+AvhrqDzBSZ2/hhnas87fAPyC8zOA/+48TpjzHy6NUJfXFSKCK9UFtMHc 16hzRrKQ8wbPDW6bfIYyzoESzZOBb/ICGVLJi+SlANfKK8BdKbeDu1ruBfcS4Abnw3pwvy9/H0Ku lK8EeIN8NcAb5WsBvk7+AcA3Aq84lz4zecKAG0UAj3LAqtQx1jEWy/sRwB87PsayPAfu887noUS/ gXLxUgTATXGlQFmCriDAIV4uszwquY3uIbbaWO1yoq/ojTWTs1bF6pvIjIb65TGytLm2qxVav0ro BXOqdZJE+FlfBtxwmBCsY5A3BFsTX8u4Ep4prAfcQ88UWh5gmjavRicBMwbjXx82YQHeasTbVB9r JQ3otqLbhe4lfEAi69C9Bt0b0b0N3W3o/hbdP7c0tTSRz9Ed5C6V0HWjG0A3wyz/qVwGPkvw8T9H AO02vlIDelUovRNXh0At8RE/8CUZSpQCa6IQSSVhkkbSSQbJhJH51OlOFcb4Z6KH+R7A/13+CJgF L4b+sBl6vbVkA7me3ELuJlvII6Sf7CHPwprt9+RP5DD5mBwn31CROmkqLaQTaDWdRufRxTRGb6Z3 0QfoNtpHd9Nn6Iv0d4AZVpj0asgdVqO+sUAj+OkNQCn4OjH8rMNGW8jeYPgTBg2/fL/hVxQbfqUh F3TK54Zf87bhn/eM4c/Wicj/P8LsbUTi6puL1xIJBIjWHjbyX3EPp4bQuhg828G/xwiv22X49cWG vyqA8cRocfTs6Pxoo/n0x+jHjaQxyXhq/EPjh42DTT7jqWld0y1NDzXtMdI3X274LY2G31qNseS2 jLaStpq2pW1dbde13de2E0Nd7Xe3b29/tv2P7R93kI6kjsKOqo5ZHXUdazquN6iNncFd8Jca2GIr Db8zYvhd/Ybf/aERr2ep6a9EaaM9NxDqaUcORcmfqAT1VkIjdCltp9+nLzPGSlmMrWXXsVvA3sO2 sD72AvsQmo5b0MGeL7QLq4UXhN/BGJEqLhBj4jXiA+IjthLbfcILthclXWqU2qWt0p8Et12yJ0EK MPaz7QvsS+119m32w3Kl/Ij8vLxf/kpJU0qUiLJSuUX5XC1V+xzTHK2O6x23Oe5zbHMcdvqc1c75 zlucf3ARl+oa6zrb1e66y7XF1ef6vetzt+wucXe5b3bvcr/o/qP7zx7Rk+0Z5TkfpJ3r07hGrCp+ kP4tvpl+Cfbr+GZGwSrxg0wF64H3lCTFG6B9CBi/AbVuXF/HNW5cV7cILNfWcV2dQDzxdNSkcex2 1BydSNOAabi+i2voRNReeQa/QP0V116JSA/Xz1UadEGLxjiAT4MUHG862AzE34BaOq6j4xo6rp/j +i6um+PaNa6X4/q1RZCO6+VcgKXaxFINWPoBSz9i4RozrqHj+jmuneOpeUpOpxNSbYZUB1E3lg5+ BtdLwhuuo6vBFAdRL7cAufAJ9AhWqTTIh5csHVJmxC9NyKvapLQatXJcJ8c1clwfx1Afx7VxAubM c+X6OOhpICbXxrGhcEoeR52qgKU9iJo5GxsdX8YmgJ0GdnZ8D5sX3wPtwRPPhDSZMEPaAvVcDfVc DfVczVLjD7ECsoDYIPQghB6EUF7zv4Sa/yURIPS5oSeRlsTfY2nxN1hufB+7Pv4eUWlx/D06Buw4 sOPhrQY2BawONhtsPtgiiKnQUfHX6WjAZou/DtLVAFgbAGsDC0B+wFPACZLG8yJJEHcTxN0E2CcD 5smAeTJQvg2oaQAaG4DGBsCzibni9zAfwP54PwuCnwp+GPx0sHp8MpRsORsRn0wY4H0NcnsNengu xSCp/xY9Eo/NY5qxrrViEQ+E/grSbwYaPwAOfAB0fgB0fgAxfwVc+AC48AELgc0Eq4PNBzsCbFH8 g2/hHcp9qB5eH1YPkilTX4E8fZXIBcKgTu6BuriHZJktBesZZC4TZC4T8jgIVB4EKjPpWLDjwI5H OdhzEjcPAjcPAuWZDNKzpPgM4MQM4GojcjUd/AzoF3R4lxOfBdzZzPIgrIDsYYUQbwSEj4zPgPHW olQDvgO1pvRv/o46PZmK4XUaAPjU9dqL9crlrw+43wcY+wBjH9DfB1x/A2L1Acf7IFYfcLwP5gRA 1/9xufIBph7Ivx+w9UBNbAOMPUBDD6Q+CNRvg9QHgZ57AMNBwMAlaxtg6AHaegBDD9DWA7W3DSQf 2hVxfUuaTiVJ2SdJE091CFIdglSHIBWvxUMQ+xDEPgSxX4MaexVSHIIUh6CWXoVUh5B3+yDVPki1 D1Ltg1T7IK99kHIfpNwHKfdBin3QC1jtnrd5x3ems9LkG+kgl30wb/HEJZBIiTwc7yHbwPbFD0DP tTO+DN0emLXtBI6fRarZpPgRdi4ZzWriB9h5AE8Fn/di0+Nb2QzoyWYDfCGELSIprBn8FojTCnAP GU3crBJCOIYaTHkEUm6BlK9ByiNsJrybDc/QFwKGI2wh2HqwLUBLMqTcw86CGBHEsIedi1j2AJY9 gKUHsOzB/GcCHQaWTYBhD1sK8VaCbQaY09IGtgPg3vgRmHWeotyQUw/k1AO5HIBcNrHJQF8N+FMB K8e4CODFYJdCnIvBLge4HuxKsKvANkBYI/gt4HeDvxrsGrC9gF9i04EXM7Cku1kt8LMBnluANwzz awKqVJNDBwwOwfvpwO95YDlPLwZ5akCuHCGyyQWLlweAC0eQl7MBBv7BSJPIbSPv3bCa5nEuwpxT iGKmOGLgB8tpajLeAq+OQN2lEAfWnVUDPN/p4M8Enhh5HQB+HMD6Ag7DvN4zeBn0LJdBz3IAepYD wN1NQ5yNQKwT3E0oK0rDAVMatiDWRViHy6DcW6HcW1kPhPXCaOkZogclEmJZmKYBPB0lYZM5tu5G eeKlWwZchBLBSsOaAT0c3wq0bTVrnsvYHhaBmAbWA4BxC8qVQcsWqPmtQMsmqPWtrA5sPYStRNqW sSj4vOabsPY3ASe2sk6w3WBXg10Dtje+ieQDd44Bd44NccegYgtQccTk0haTQ3tQymdgmzD4fBFY Ln9LII7BmR62DN7XIlVb2AqA68Cvh/CV4K8Cy2UyCn4j2CaA28BvBxsD2wl2DVgun7LJ1T2Y8zTA OH2ohncDxj3EjnRZLc+ga7cpkQdAimuw7XN5XmRJNu9BeMuBVRv0KAlytMfk8m6ouwOmFPD6G2/K 1TKzH9gC0of1ArJv1fZMSGVI3R6o1RROG7Zz3q6dZk1uNWV1S0Ib2WTi5lK1xay9I7CyqsU+wuiv OqAkHqjt1zDOxRCyDGwtyjePj+2Ul5e1orzvwR6lC2wPUnCAaJAaWhhY3v+cwMB7tNeQTs6xpqE8 DUwd/8Xb94BFdZ15v/de7gXkSgihagghhBJKDCGE4NRSlvA5d1mctZRSuDNzwxJEgpRYC8Od/8PM nWFwrUutZS21lrqUtZR1LbWWWmotJca6lnWtQWOpMdYYY6y11hpDrXHtvufMXBxpsv2+fb5nn/P8 znnvuefP+++85547M4Cjq9HYtECPTTjSiSgfJ6IjnMDehIcTtCWLfU7QNZoYnfFEDL8HYiLfCcIn yvpczNpW0UJJc/2en+PyLoc0gkejJs6E8Qnti2M8SWPFaqL7mJixLjo24YeltUSbHJ2BjEwiTkIM jxF5dM1/Lqp90uKV6N398+9SqeOo1VtjItQCfU1T3RO/oHrHGBvRWFQabJmCLZ/Bls/ALuyvRGPh 3R6LaY+Ild7GNRPpSXTgjHpY/JzGYrnXeUucs76uz7vW1nV5AiWYdxe19Hz06rNUe+twBXTQVUlt Q7St2z+6u35ujh9dozrn+l0yEzsnb/zcjnc38jRi5GmkO34iPSn8pVMCC8vouyeANCD/JzkHyCe/ j2Pi4ClMcfAMJh5bLcNn4o9iioePQQmeb0oxLSDfZsAn/DpMIlhBwTNfPab74Pt4hkqBQ5hSmSeY J+EB5inmKViE5/lnYDHze+b38CDzLvMHSGf+yPwRHmbeY96DTBYfruERlmd5eJSNZxdANiuyCyGX vY+9D/LYxexieJx9kH0QlrIPsRnwBPsI+yh6bg6bA4VsLpsLT7OPs49DEfsE+wQ8wxawBVDMFrPI O1vC/h/4KCuxFfAsW8lWwgrWxFaDkf007sUmVmYtsIpV0P8/yTazLWBmW9EqCtvGtsNzbCfbiU+f DtYFa9gN7AZoYTeyG2Et28v2QiswQrOwi3zKDWehGKB9ADEEjO0MliOIUaTPYzmG2I+YjOIw4mgU 0wAdrVjOIM4iLmCfS1heRlxDzCJuYxsWkYBIRqQh0hFZiFxEPva5imURYjm9x9hu0PuM7RaWZQgJ YUJUI2RgOtHsHfWIJgD7MGI3Yi8w9nEsJxCHmNXtQ7YSW1ynv33SVtPSYGtuv2xrp7htc3Qk2AaR 3t1R3ynSsqlT7Lhi8yE2to/YyttHEWO28rWFtvKOY5217YKton2/rWKuzYzNgnXlWFceGX/tlo6d toaOXbaG9sO2Gnr/KJZnsbw7ry+Gbmi/hiWig8V+ydh2FnHbNojXgx1ZtmHKFylnbLtxjgm8Pj5X ztpOUdy2naG4bDuPuNSRazvTkY9YbjuPuIT9z3dUdwoUku2WTuuytzR0ZhJ0eDqXUmzoNKDeajp6 bduJDB17kM8h5G9fJ3Qc6CwlutB10HGlU0E0EtmjOsb2OD5Blu2Wrj8dqK9VRIe63uhYJ++O1z6N 8l+I0dukzULtdhh5mFnbP1c//36MHlEn7QRo34YYXYdibf8BbRwdaSh3sm0zYivSW4k9kN5O63Wk R+xD7BQLarOEiN2Qp73Rcjxqv3Hk9dB8+3UUoZ2IvcrQRmVRWxHs6QxTZKHOq7EkwPrOTZ0CQbTN ForYemJfEyIf/WUo6tdoYxw74t9ypMT6M1ifqvs9LVtpeQuvl2C5GctUvb5jPfqHhr5BEEurd2n0 oRz0n0KKXtTnjK2tow91tw1Br9f2d+xAn7prq410vdQTG3Su0EF9QgfxjdNR+hziYqzv6esQ1x25 d6WzBa8dWK5D2Dqu26523Ox0ddyJlhE77EX9T1G57q6Tq4gbxO9Rn5Wotypyn2LAVkzXJPEDNmrj I2iTg7gOomX7ZKef+j/1SboOdJ+14HykzCY8Ruqx1GNDrM9GfZD4I9qonfgc9ano2ldvkjEQ13CN X7NdUu/gep9BzEau7XEoR/Xd64h/2LMpYnxFl4v6QkLE7vQ6gVzj+Po125lKgDY12PNQdhoTOv0d vfYCIou9GPnDdWovwfIskYvED1s2BRsTv5B33F2S6CenQD8zTaCflibSzzST6aeZKfRzzDT6CeZD 9LPLR+mnlh+mnxjm0s/7CnCUl9nfsbifcI9wjwDLPco9Chz3Ee5xiOOe4J6AeO5J7kkc/SnuKUjk nuaehgXcM9wzkMQt4wwgckGuB5K5v+f+AR7gvsB9EZZwX+K+BA9x/8h9GTK4r3BfgUe4r3JfhSzu a9zX4FHu69w/QTb3De6f4THum9y3II/7F+5f4AnuX7l/hXzu29y34UnuO9x3oID7LvddeIr7Hvc9 KOS+z30fnuZ+wP0Airgfcj+EZ7gfcT+CYu7H3I9hGfcT7idg4F7iXoKPcj/lfgrLuZ9xr8DHuBPc q7CC+wX3S/hr7jXuNajkXufegJXcm9ybUMW9xb0Fn+Te5t6Gau7X3G/hU9zvuHdA5vP4fHiOL+Ul aOQr+Ar4DF/Jm6CNX8Wvgs/yVXwVrOer+Wr4HF/D10A7X8vXQgcv8zLYeAtvgU5e4RVQ+Xq+Hux8 A98ADr6RbwQn38Q3gYtv5pvBzbfwreDh2/h10MWv59tB4228Ct28g3fBBt7D++DzvJ/3Qy+v8Rp8 gQ/xIdjMh/kwfJHfwG+ALfxGfiN8id/Eb4I+vpfvhX/kN/ObYSu/hd8CX+b7+D7o57fyW+ErfD/f D9t4TPBVfju/HbbzA/wAfI3fwe+AAX6QH4Sv80P8EOzgd/I74Z/4YX4YBvkRfgS+we/id8EQv5vf Df/Mj/KjsJPfw++Bb/J7+b0wzI/xY/Atfh//Ixjhf8z/BEb5l/iX4bv8T/l/gzH+Z/y/ww/4/+B/ Dvv5V/hX4Mf8Cf4ETPCv8q/CT/hf8L+ASf6X/C/hJf41/jU4yL/Ovw4v87/ifwWH+Df4N+Cn/Jv8 m3CYf4t/C/6Nf5t/G47wv+Z/DT/jf8P/Bqb43/K/hX/nf8f/Do7yv+d/D//Bv8O/A8f4d/l34ef8 H/g/wHH+j/wf4RX+Pf49mOb/k/8TnBAYgYNTAi/Ewy+FRCEJzggLhYXwK+E+4T44J9wv3A9vCA8I D8B54UPCh+BNYbGwGC4IDwoPwVvCw0I2XBJyhBy4KuQKufA7IU/Ig2vCUmEp/F7IF/LhulAgFMA7 QqFQCDeEIsEA7wrLheVwSygRPg7vCWWCEf5TqBfqGU5oEBqYOKFRaGR4oUloYgR8alzLxAufET7D JAkvCusYUbAJnUxyUmJSIpOS9N2kceZ+ER9/mQfFODGOSRcFUWAeEhPEBCZDXCAuYB4mf5uPyRST xWTmETFFTGGyxFQxlXlUTBPTmGxxkbiI+bC4RFzC5IjpYjrzmJghZjC5YqaYxXxEzBZzmKVirpjL PCnmiXlMgbhUXMo8JeaL+UyhWCAWME+LhWIpUySWieXMs+IKsZpZIdaINcynxFqxlqkRZVFmPi1a RAtTKyqiwtSJ9WI9I4sNYgNjFhvFRsYiNolNjFVsFpsZRWwRW5nnxDaxjWkQ14nrmOfF9eJ6phEY djnrv/v8/AI+j77QBMxafI5+AZ+JX1iP9BCWKsKD0KLYgOiNog+gJQ/LbYgdiJ3YB5+9X9iF2IPY hziAOIg4gjiGOIk4jTiHuIi4gn1GsbyOuEnvMWvH6H1mLT63v3AH54hDLECkIBZhPT7Ht2QgsgHa WhDrEDZg2lxY+hFheAiWQwVU48mIfHvHBSHohX4YxLPqGEzAEZiGM3ARrsEtJo5JZpYw2UwxU8FU A6fsey5bOfBcnnLwOYzcyiblrDKgXEBKU84pfcpFpBzKlBJSjiO1TjmquJRppJqUfUqrcgwpizKu NChTSFUpQ0qtMoKUpOxUTAqeVpQSZbNSoWxFqlDZopQq/UjlKjuUfKUPqQzFp2Qrm5FKVVqUJco6 pBJw3GRlPVKLlBolTrEgJSq11luKghSrlFmvKRKw1ptKufWiUoHUVWWp9YxSiNQFJd86rRQhdRDv HlEykBpXSq0TSibEWc8qJmxRjS1k6wyOEYe5CWursVa2XlbqsfUm61nrFivK37rHes66oXXf/7c9 kaffNwL6TaPId3oS6fdpFtNvwzwIDFolhCdjEe2VD9CEftSEftSEftSEftSEftSEftR0Lgr0paYr UaAvrdmIJXLZhP6zBv1nDfrPGvSfNYsQ6Dtr0HfWoO+uKUCg/68pQZQjKhCrEDUIS0x9A6IZ0YZo RzgQPkQIYC2eKdfieXItnifX4jly7QXIt+ZZCxDFiJK1ydYK6yrrImuGNds6ZW22llvbrDVWi7Xd 6rA2WH2Yh6wbMW22brVutw5izbB1N6a91nGkJ6yH1prWVq+VCUW+RYb6RwnZG+y7wLJ/QFvEUVsI 1Bbx1BYi2uJjaJGPz1nkfrTIp2CJ8Gm0Swa1y8OCIijwCNplN2QljaJ1Hkt6L+k/4SNJf0IbLf1f nImBclCprQsg4b+3E8aLBItq8Vg0ywZLr6XPsq2FfDslgX2HfQeJWXYWGL6ELwFWqBFqgEPfs0Kc 8Bx6IJ/07aRvg5B0J+kOxP+P+jCpVx/A+yAyE4AxpxV5bU1GpCHSgdXQ11qzELkI9NnWouj1ckQZ Qopem6KojraREfVzYFpVYINxwGJcZIMLaAmtTUinIH04BvuxbhEiIwJShy7KBrMj/SnyoiiIti9G oKTBckTFXPu7PGHsb12PwLjf6qFjEJ5pn+i80Ir7QOsG2o4NrorW9f4PgPtH67YY4B7SupPqg23S gH1+wxygdVekronMvYfyRvmj1/s+EJH7B0jJvi5vck4GBtVKuycwLPe7xwO71Sp7cmCvWuueCIyr Ve5DeFfBmgm1EfNDaot7KjClrlNdgeO0Zly1uY8HTqku96nAGbXRfQbbkPbnse9E4JLqR/oqHe2G WouzXFIrkb6FLc9jy1r3JQ3kEdcOTVDD9mRNpDWp6ib31cCwusV9Q1ui9ruPYz5gb8V8yO7RMuXD 7ltajjriuKotVQc8oBWqo9gmUx1ztmgGdT/mpeokrTnsuqKtUI96BK1SnfaIWDOD+RL5sCcVew14 lmhV6llPpmaQL3hytFr1gmeppmB9Kra87CnUGtVr2LcF6VSkL3sM2jp5xlOq2dRZzwoNMK9E/lFv mku97akKjNtZT23gkD3BowTOI92IMvZ7RokUMfmoZ4zSmNuraQ2RbgDr96Ncf5bbZc+kptjrPYdR 3hbPUW0I8+nAlDzrmdEy7U2eszjOB+TqpOeCNkJz0hJzdYjmo9g3x57sadH8quJZh9y2ei5ro/b1 WD+munwLVk/Y0zw2DezpHhfmCR4/tvF4ZrWjds1zW5u2q9hyvxz2soFLLzZ6wtgmi2og0ivXU6WF ozX5nk3aJnsR5lvsyz1bMC/z9Gv9domOGZubPAOoPZNniOaE3uC6jv426pzUZtT96oh21t7rTdBE e583WWu0b8NZxlCi/doF6m97qVyTaIsRLTXCoVrluYZeR+oP23d40wJn5FlvunbZXuTNQh1uck9o 1+QZ1P+sfac3V7stT3vzUXu7CG3fQ2h52j0RZNXb3iL0T2K7Gfs+7/Jggv2AxxBMth9Ezvfaj6Cf D9O1M24/5i0LptkPeCW8e9JrCoyjpS4EWftpbzX2PeeVtRX2i956lGhM3kRo9NUZ9bC9D2kT6vMQ tt+vLXmxn9D2K94m5Oe6txXX1Kh3Pdr0tpdF3mSvGky3p1H6pudoMAs1XxXMlW97PdoF+x33eDDf EefVgkWOBWiFYaQ3BJc7UsiYjkXeXi0nQquT3j70BNK3zJHh3YZ9I3Q2oeV+747AXkeed+fq444C 767AJeIPwVxHMZHIUYIj7EaumpAu9+6Zoyu8+zAyEF3loERIo+8h7VhFaEcNpS0o0RlHA44jOZpx HGqXoKQq3gNBk6PN24v17ZRbh/eglunweQ8gt6PeI0iH3BnaJsdG77HAlH2592RgyrHRc5TSpymN q8Ox2d63egJjQjhY7djqPReUHdu9F4P1jkEcv0kdlceCrY5hjCSZJIIFk2nL9WSWoKpOe68EJVzX lzBqTXsKg5I9ATk57yimtpCi9HVtiWO3PTnY5NjrdK3OxlWA3i7f9owGPaqN+APq/KamOMajer6O nE9EaLIGI/qn6zTTcYjMK096UlHqKe8dbdpx3BeHsp/CNoNo0+urN9plV5q2wjHVtU4THGe6bFoL 0i5K+yl9t/6Uz4eWUj2Fqzeqii8FPWfGtwg9p9G3GyWa8e7ScpzTzsnQsHPGfSO0+8VGsgs4z3aF Q3sdV33DoXESY0MT9izfcGDceaFrE9qR0vIsib3Oy11bQoec17r6tRXOWWc4NIXa84eOk8gfOoXR VQydsUtIn8e+A9qk87b7fOgS1htCVx3jGPlvYP0Q+sBu74HQDRfbNaINOE6htgddCVgfpZF/gzbw YqOfRa+e9owFLzov+xNw3gF/Mnq+5E/DiNFE4pgjxZ+Ock0SWu73ZeAqxrlI/PRlozeeQc+ZcJzH vWmvvc+XFzjlOO8rQK++5CtGzV/1lWhhxw1feWC345avArVU5SsJ5qLeVqFPjvpqMKpUYsscsmsE NXmTz0JrGoJl2LI5uMEJvjb05PO+9mCvU/A5gn0kUgW3OUVXU2DKmerzaaKjwRciO5QjDznvcwrB Hc4lvo3YstF7QLvtzPRAcCfOuBkt5fJtDZx35vi2407X7xvENVXpC6FX7PYNB3epYbKr4h6UozU6 l2LsEp2F9ovoyXHqQHAPevIZjEIjamNwH6GDB3D2VaiNLe5LwYNOg29v8Ii9ybc7eAy1MR48ieMY gqcxco4Hz2HEwEioThI+nX5/Vjgd5YVwlqvXnxvOdfX588P5rm3+onCRa4d/eXi5a6e/LFzm2qW6 QiWuPX4pLLn2+U1hk+uAvzpcLR/2XdVyXAf9clh2HfFcDtfjut6BTwi4X6MsFn890kNkvbuS0Xbj rmP+pm5FVZyjQRPxn+BNtG9r0ETsi/RB//pwkzrpVzE+HPZ7wq2uk34NuTqNXK13nUOuVNdFf5oe Q+RR/wbtNtkRwh7sm66FMaLibotz9aJf9SE9iX6FNPErbRLb9GnhiP84TlGa7o/Oy7hbDTk2+pO1 TTrtmQwdcowT33M0+LeRaEBodRTpHBxnR+CG64p/Z1izZxFaHfHv1AyOVf5dun9i3zlatfn7whsc cY5b4V51yDkZbHVd78oM97lyvXvC21w3/XvQB0YxwqS57uCTz5hzBPfBHGK78A5iu/BOsjoiUgQv Oq66x7u3kJVLtRdZHWe1HHecfx/6zG2UdMCZ6d0VvKgO+MaDV5ylaIsraiU+QeU4V6AnXMf4Ywiy TnwaDN7EteMjPu+boPkhbFPlmwreca7wTYXiSHvMazFfYN/gO746BduXoHVmfKdIjqtviVPxQChF vuY7E7hFfAnr6VwkDy1Sx9TLGD0anf65vEWtDGVEcnW/vS+UjZ5/PrjTuc53KZRH8wKaF9P10kr5 b414Gs4IOKPNdyNwxuny3SLxmXim098FoXJnWK3C3O/MWZ2hnu0SQhU0zya5ZnBuMicEZfRMA5EU 9eNRL3eJoVXISW2oxrlFbWwqdfbjisY11ZW6+pZzwLklZFEvOLesvoWaPKVlmhO6lqA+URtBj7O2 KxNHuNaVo7U4K3GlexzDyKeH2EubJXmoQR3w7go1kzgcanZuwTayo4FYFvlUkJNpnL0t8lSGoy2N 8tPuHOoqREnx6TTkcI7I/Tg71q/e6KzqMoR88qzPF5ScYXkkKNubcJfMcY52lYZC9uSuFaGNzrGu ytBmp9BVGOxz7u+qQu1NdtWGtmKuhLarSlcjRon+rpbADYyQIe2C87AvFBqke8Qt+aj7Rje4kvHp /RZGieO4rtPsntCwK919vFvAnc7TLZIn8O7UF8mJYNDRgHcHyfN89xJCd2dSOsfeRGiyY3YvlWex TRupD6apk0g3k8jWXajOuG91A6GxntL2g+QM4soiT/t2yefrNuDagVCzIwXnumE/Tfgha6S71DmC PKxw5ZJ6V/5cfSWtr6J0LaFDbY7N7qnV2eS8EKqwZ2H7S64ibKM4ruKedYPIgvsU0t2NlMYITEZQ x1xXQsddy5FucZXJm7rX0foWUt9to7SLtqlwSb6N3X6XqWtUG3VJXWOU3o+0qWuyO+yq7jqMeS7u 0TfofjqJu4yve5M6jXvuGUqXUnqC0lso3WZP6zqKe/pFjI07Y2nHKdRhrksmnuwYRJ77XfVdQvcA pSspPYTtpzHGNtlbu0fkTV3T3TmuVqRHSX33mGu9U+ge+TN6P20/6UrumkG7F8nT3YfR/2e6j6ot 8tHu6Rh6htJnCR3KRp5Lui+glxaGFlG6ltAkJut092XyfILPkNldYvA07ms+fAZQu8Tua44pchLE Z5izWos85trRPYvr6Gz3bXweOEPa2zW00b00fU6wa9oA+skEeeaxa3RHmwizLtauhRMI3X2U0sny rFPAp5qirgvhNJen67LW4tK6rmFUPNs1G7zo2tB1WzP0OHp8PSG3L5CirXA7Aik95biyQuiNGJHQ Z8gp8hqJ2JriPIqryRTJ3Qv8B8K73Cn+g+E97kUeW3ifO8N/JHzAne0/Fj4YOSO78zxV4SPkpBk+ Rk6R4ZPuAv9JfCqInHDp2TZ6qo05sUbPqvSU6i72n773rBo5jbpL/OfCp93l/ovhc+4K/5XwRfcq //XwFXeN/2b4utviv4m96DjuBv8dbYm7ORAXvknmDd+h8xaSeXvioqdpcnYuJGfnngWEk54Uyknh XU56FkWkiERIclLuySBn5J6MiFzk5I4j0/M1iUukL/r5YbKD9GSTHaQnj9T0FJA12LPI3WZv7SmO jjZA+WwPLOgpcYcCi0K+yNuJyBsD90bnZE+FWovPOePuzYGMnlXRdxH01O/eGsjuqXFvD+T1WKLv HKjeom8V6PndvTdQ0dMWfWsReT8QoSPvK7BXd6V7MFAQmnAPB4q7h9xtgZKeBvfuQHlPM/lrFfRX hxDzq0OW/uowLmFFggV4+kvDDPpLw0fpLw1zEhwJPngqIZDwD2CgvyI00l8RVic9nlQItUmXk65A Pf3l4/P0d45rcI4iyIG/AgAJ/g7SoQmCUAyfx1QLW+BLUAeD8A0wwzAmK+yGPaDAD2E/PA+H4VVY DefgLeiAt+EKOGEW/gRdDMsshb9nNjG9sIfpZ16F7zGvMxfgnbi2uM/Ce3E7474Ff4o7EPcSw8Ud jTvBJMZdivsNc3/cLM8xH+Jz+MeYDwubhAPMY8Kk8BJjEV4WXmYU4YjwCvOc8It4gXkhPjF+MfPl +IfjM5md8Y/GB5jhxEDiBpZP/HxiH7sw8SuJ29nFiV9P3M0+lPidxCn2icQTiafZv0l8PXGW/WTi ewvS2M+QT5rY7qTkpPvYcFJq0mJ2Q9Kvki6xvWK7uIPtF99dyLI/XfjQwofYEwsfXvhh9uTCpQuX sq8tfHLhk+wZYFAvbfRNaSb5vZaxHzGAGEKMQLpxwDhkHDGOGseM+42TSB02HjVOG2eMZ40XjJeN 17CcNd6WWClBSpbSpHQpS8olv/2jtoUEY4IR2ARTgon+RjKVzWfzAdjl7HJg2BK2BFj2WfZZ4NgV rBHi6Pe5BPYT7Ccgnq1j6yCBNbMKJLLPs8/DQraJXQPJ9PtcKexn2c/C/aydteOYTtYDD9Dvcy1G fefAEuEV4RXyvh9m4CyVLJX8ItLYDE3GZmObsd3oMPqMIeNG42bjVuN246Bx2LjbuNc4bpwwHjJO GY8bTxnPGM8bL2F51XjDeEsCSZBEKVVaImVKOdJSqVAySKXSCqkS61KlKqlWUqRGqUVaJ9kkl4QP 88ZbdxNtQ9I1aZam1Ll0O5o2SVuk/r9mpQEESEPSCN4bRWpM2i9NSpelw9JRvJqWZqSz0gXy+7r4 b6I2F93j5+RvKBRDO3ptCbjR51dQP/9b9O898An08B9CFfr3q/BJuIypmuroU/Efjn8MauI/Ev8R qIt/Iv4JkOOfjC8Ac3xhfCFY4w3xBlDiS+JL4Ln40vhSqI//m/hK+Lv45+Lr4fn4hvgGXC8MDOBK IlrOBp76DBhHEWOI/YhJKDWeM140XjFeN9403pHijDelBVKKtEjKkLKN16U8qUAqlkqkcqlCWoV5 DcIiNUjNUpvUjskh+aSQtFHaLG3FfLs0KA1j3W6s2yuNSz7jaeMxacJ4DNMRpE9ifsy4x7jPeMB4 kPwWMaEjwU5/bbrgHm25MRXDzzEtgzcxGXDVvwUfhUuYlsdXx1fDx+Lr4uugJL45vhk+Dox4YyH9 aziwFOIBapMRacDI17BMR2QhPYu4zRXVJsgXKJLlyxSETpOv1abLs/Q6S75dm2tmaX2+OaG2yJxM 68l9Uqe30/vp9HJz2tzYpJ70JSBj6TQZW6fLzOkU5D4pyTz6PR2SOYve1/sRmsxHSh0mnM8UlYfM XY2ljDyScv5478dTLG+x+KC+80FkrTfnUr20mvPnZNf5IryQ+0Q/ul5N74MmnDMWpJ8OIosOnTei M9KPjLke59R1o88da0MyRlTG8gXmonv0WB0tyX29vV6Se6p5+Zxu9bFJ6YnyQGjNXEbLDWZpTu96 qc9Nrok99VLnkeiLyERk6DWb/qy/Lpte9pmra7eZ5dod5vp7+IyVZT6vpnl60Mv0GN6IPLr+5vtC Uwwd67MJURl0/ZE6fYyd5qZ75tDL5A+QX5c3eZ78+jXxH0Lr/XAuWYjUzS/n2uwyt9buMa+vvWne U3vHvO8D9fJ+pef/8v5favf/Mk9TVL+6ntPn2eu/Kz13r2UxIvcHlXN6madrOTWip79Uztnd9D5l rByxvk/KfWZ1Lm4cMHtqD5o1SuulHpP19XnEvGHu3jFzL52X+L0er0+a+2pPm7fN6Szhrm/Q8px5 x5yMpP1F887aK9jmunnX3DqP9qmLMx+oW2A+SMfRfRLLuhTzETJG3SLzsTl/1ctorKvLM5+ryzCf pDpcahmXCy0TssFySC61TJG4Lq+wHKd1lZZTcpXlDG1XizGRxMv5NkYdyktw/Pn1uP7rBi011O+V u3PM2bzRcp7IMKfrv+R7TfPW9nyfmh+v5selqI4IT3KL5ZIeQ+R1lquyzXJDdlluzelKn3N+PNb9 5v32p3n1ddnm01TPBAXmi3XF5iux+1Rdifl6Xbn5Zl2F+c49Y+n7LKJulSWursaygNIWSwrdc3Xo 4zRYFtGy2ZJR12bJrmu35FH5PwB1DksBge53dT5LMS1DlpLYvbRuo6W8brOlInbvqdtqWUXL7TgG 6pHaN3Zvz434Qd2wxULkpTLutjTU7bU0037jlrZYfdVNWNrrDlkcdVMWX91xS6julGVj3RnL5rrz lq11lyzb665aButuWIbrbll2/1ksfL+9T99TYuPwB5Xz/Wv+eHo92ceaYvzt/eK+533G12Oi/nyg rxN9zSfE+BJpR3wxM7o/l90t5ZyIvfVyDn9Jzg+Itff4cmypr5vkeeto/v4XE0upPDHl3L4/Lybd U34Qv9Xz9Dlvvrm9cv6+Or9cHxPvYkvdJnq8zo/o+3Pq5zz6epP9ViDrQA5bBXmTVZTBspdiizWV YO45XB9PH5vw129dMreGyTyxz8f6+tOfjaP9afzGfUIesGbOrXtSj+uOrL/Y8eQha877PntHx5VH rEvvWYfzYpQei+RRa+E9z0TkHomJY1ZDbYK1tDbZukLeb62kdL61qjbXWltbZlXkSWsjvcb7tZK1 hd7He/JRq4vWYxtaRsegdJZ1HW1z2Gojp/iELyR8ESDpafqXq36b9Fsgf5E193/3/QrPwZ/oe5Tn 6XuU1cKk8DKzlb5B2UbfoAzRNyjT9A3KG/QNypuJgQVp7Ar6XmSGvhf5JX0v8hp9L/IGfS/yG/Je hEsn70W4PPJehHucvBfhCsl7Ee5pPNHuhF133x4YWKg0lBkkg8lQbZAN9YZ8Q5Oh1bDeoGLuQZo1 aIYNhl5Dn2GbIcFQZNiBd3YadhmSadqD2GfIwvwApoOGI4ZjhpOG5OKQ4bThnOGi4YohDdN1w03D nY/GGdJpyjLk4iwkFdERyVU6xXJsW2Qg/3SXSbCS70/OO9t60CJdEMBT7Simj9Fzbgm8AtN4kj2J 6a+YnzFTUBZ3PO4ElJP3VdiTAQs0xMibBdlRDopwvojkRVHZdck9MTL3osRE3j0o5y5M+7BVk+EA 5ZG8+VtMf5EI6D25WJeHicWzNPl7u/mY4qAAngIenoYiPF8vg+WQiDxJsBAqMCVDJab7wIQpBVZh uh+q4JPI6aegBtLQ5yywiP6VzXRwYHoI/JgyQMP0MBzFlImyn4BHmGQmGR6l3w7135V15TGuaOWx 0msrT648vfJc2eaVF1deWTb17OTKKyuvr7y58s7Kk6a4lddNC0wpyyymlNILpkWmjLI2UzbW5ZWt MuSUXi69bSowFS8bNJWQ3CAYoGyVqdxUsWywrK30sAFMq1ZeLPM91WyqWXls5TGTZeU5OmoKjj+X TO04Dk3P1pbeXjZlcpBR9GSASFp2ydSAPX1lq/52CRkL6Y2mzU81l7UhfY7inKnZ1Ib941Cek2QW mrauvI78pRC+kYvTz/aXtWGvzabQyoumAmy93TS48uR/kXc20FVWV94/z3O/cvMB4SaFyEcaLhho SClDgSYhDVk0pXA/Ul6KNKUMVURETGNERIaXhdSidTHUiUopZShlwDLUInUYRIahNCIvUsqrlAHG QWoBKYsijYgpY1NM3r1/57nhJsVqOx/rXWvWs/b/7LvPPvvsc84+5znPR/JUJZRGXxA7V2KbY1sn nRwzeNLJ2PbYrkmnKy+qhU5qH2Mg0Y9liuXM2F6s748dGl1XeSCWK61Wkto8OhI7oXZTtWAxReKD UuyUpJfEqlBsVWyhHtoTsbOxC+OaYxVjxcfYKNFribWKh21xk7IWy4wHtf4udQvFs+ORWG/pfWmt eClcilRCSdHCrz+FTsfXdfG/C8XXjT40ekN8Y3xLfFt8R2d70+hGcpXFd1/3vEsrRB5v1lG2pD5o HZ3+H6u8GBsaL6xaIjhYonIJVk9OOhYvGX0hPiI+pqoxXjnpfHx8fGK8dvShSZeIUxOfOqk9Pl20 bo3PqVoVeyhezxi2xefHF2lPxpfGl0vsjJLIlTGMr4g3SXTUxVfHqpONyYXJJcmHko8mH0uuSq5N bhhdnayOLZl0PrmZ0ZQakluT25XiK5KbYxW2hOYld31iJrHT2Zu252KrKo/qiF8f05hfYmuVzLsL Qq0aW8m9yf3YPpQ8UtVYeXl0I7G6NtaoJbRvKi+OGTy6Wo66xNOJZ1M8R3Vip8TOcEn3CO2T9pvR q/QYt23ctsTBxMuJY4mTidNjBifOS/9UJy4lriTeHXdg3IFEe+yh2NnRGz7dkHCrEkn/2KHJzGRu Ym6yd7I/NTSOGZyMyuzcmxwqsS51JId/2q2qjs9nPknNyVHJiniT9N30TzdUHk5WJyckE7G25JRJ 7ck6HaXkzNgobUnlZRnBA/HD8aPxV2N10iqZgfHXhc7FX41Ly2Jrxz7U2V9r45fjV+PXtPVVj1Ve S/X7pEsJ16axUYmMRI9EfqKvzqKUbOwGsd2WKFJKFI9YmihNjJz07phgJzG348sTZVLn+OvrQue4 +GVtU2LeJ6qEahKxEUs1dhKTE9OIIY8nil6VBWxGYlZ8fmJufHyiIbEgsTixLPFIKrplRU2I7ko7 MxNPyOq6RElH064dCTexJrE+8VTlgUnnJfqvjF71lSO62iZPyDicSJ5Kzk7OS56NTdD1UHy8ImNf Gh9ftTY2VFbna9ImE6sevcGuxjo+yQuxtcmojnysWmofmmxJtibbYsNrTW2wNrs2Eqv+xMz4itqC 2sLawbG62pLaEbVjaitrx9dOHF1dW1s7tXZ6bcmkK1WrZLRydc2VNVtWp9pba+don6jftYvsSqkR LKN6oLa+dj7nwjv+B+2g5ppG7pnr/5Q3wxcaRyh/+Hw5FsmxVI5b5Vgux4rhh4c3ybFajhI51smx Qo6NcmyRQ2Xb5Nghx245psrRLMeB4Qf0v1tmfCXjVv6L52fN56RfJ8nE9pmk7A6C5gvSe1nSz39p 8oyTfSH7Ch7xrKt8h3EqKyXdLel438jybeXXoB0eKb9bqNn7fUDosCc/KvSqJ2/2ZM3dyqX41700 JT/q0eE0/kAaf86jw176alpeii56+QfSbO3w0hSltyeVpnzsbu9GPqX7lk7vV7Y7aVsve3VeTWt7 yq9mL//1bv52p+71N6fRjjRK+XbOK3fYqzPVN0fT5KkxbE5r47Vu/ZhKj6bpp1LJq3DT+jY9L+WD pBUZXtojzYcd3ere4Y1nKk33/YBNK/JvUH53eZc2VvQVKhIq7upnl7Z097V7P3RPu9fZfSzSKT1m U21I9d+56zYqSv9IXTdqf3cfuqevp41Dqv6UrHvq6VSMFCoTWib0yB/pl/9f0lT/ptL3G68PSDvb /QFp9z5O9dMHpV3mV/f06A38T9mvKu+cOxU1QjGPj6XppcVyxeQ0nWnWPnHvrdcVM4RmpfVZemzo +M8t7zIPKxqEFggtTuv3VKysFHqivHMuds7JNZ4v68u7rjW7yzvXuopnhZ6y/NjHhFYJrRXaUM66 PnazJ9sqtN2rW9fEqzcYw1QbusulrrFDbdvS60jlj91l29BlDfygWOu+3v6x9epG69IB69PYvdfl Y/cLHRI6ktZX77cOpdp6o/NTN3nF014/K+0U2lPe5TxVsU/ooNDL3Wydu04Vx4ROevxpOzadlLJz 3ksvCV0Retdr//tQRbulVNyN9XtpZnmXc+nYXKHe5V3W6bH9vTTq9ePQtLanSPpq7HDbXm3j2FFC FV656q79NXaCUEJoilCd0Eyh2ULzhBqFFgotEXroQ8RH+jnlj63LHzbeUmlqbr3fuef90vS1MX2u d09TY/5+6avvQx9U/wetvTfqv+7z50bn/w9K09aiG6Z/yvik232fc+YN679RejSt/rR+/2JqnHQO nLDzYOwpobNCj3p0wVLnfjVVPmVbY7ml/PocPlDedX+cmn+pvbFXXtdvPU+Mbb3uA3Ovt51/6fbG tpXfeO/t2a005V3nYbc1KrUWVQbLu+6Jjtp5XJl9vX2VkbS48PQqC7rFidfflYOv92XnuKXPAdUp LL+m7z3xlQXzP+da02nS/8Jvsp0e+mGTkmahA0KHhY4KvSr0utA5oYve78tCV4Wu2d/DXI8yrM6w HkL5adQ3TadIqFioVGikV75MqMqT1/wZFBOanEbThGZ4fswSmmvrghr+CC0w1SWLSpaWLC9ZUdJ0 0+KS1Tct0KOkKe1Yl+JueqJkY8mWm1Z6+RuFtt00uWRHyY4hgxU19bjd9pdobkRPyzaXbCk5UHJA NA6nHfoNhsgfvunLl0X8fFPkI3w7pDffDrmJr4b053shA3jHt4h3fD/ON0L+gq+DjOK7IKP5LsgY vghSxhdByvkWyLj/9vocJ+LYt2Z3m2HGDJFYGnK1G13zaLxNh0rcDJXYGtojjSSuhkpcDS3yyPWo 2EtLr9tCV8Z+aJkl5OOvk+ZFD34gDRvSNGR1t2PdH0j+uPwGh35NkDe5DV+Osd+MCfAmdyZvcufw zZgCvhPTny/EDODbMEV8AybK11+K+eLLUL7y8jG+71LyX2bXMdvMjuvPgAasMsmbTw7YpcfNpwfU 3Xz+5ks3X7n5Er/f1RRqH7Cr2F+c6WntKs5VuR7FvVVWHJUj1x43n9QjZbG4v1jstAe2W0spOwPq sJApOpu1nMptzQN26Z1DV/s46G5wfyzL+gvu/zGF7kvueTMo+EDwAfMZXT1NTdY/ZTWbz/LFmgKh iPctmIGd5f1S/ikpv9ndbQLuHrHVlzL9RaM36PVHv+HGUdKvPinq14xMmalK0ygwkYKjBUf7FUYb ogv6FfYb3K+kX60cBf1GFLzeb4xQZb/x/SZiY42+gev+vfv3Uvcz7jMi+ZH7I+O6293txuc+5z4n nv2zeBOQNh00GbQmUzz7scnK+on4lysz7lHnIPfuppheEsnLjPnoNEvRR67z6RRdeWO5kBO9YpLR RHRX0bno3qIR0f2a3jQ7un1gRvTQR4dGjyif+t23JHpCdaJToqdUFq2LnlV50evRC+j0iJ6Kzoy2 aKq6StHZ0VbKiG50XrQt2jjIpIiyIwaNV1KbUN2goNDUThLfUiS+Sf2DBns+tkYfG1Ri+UFjohWD KqW+/dS1CjvZnl+7PJ9a0vw5ge15g6ZH1w4a0bdkUGF0w6CJ0c2DalPtvykhfiwclB1dMihCux6S 9qb4RwcVMI76TTDDF7Sc8PTwXxo3/JXwrSYYnh2ebTLCc8J3mnD4rvBdJit8T/gekx2eH77P5IQX hh8wPT90DDvOVr5Jlm0Wyr7FDJTVcOBOj/YI7fNIVrWBLwsdEzppacAcSc/bNJ0GXrrOF568TvLb ifaGTxaVFZUVHinoXdh/4PY+wvWZ3GdyYascewfkC9fWZ3IRvwcmCnp/dE5h/z475Zg8cFdRTdGs gY9KzqHCQ6ojWm0FvfvslBI7C/oX9C7oPXDvwMdEeqGgd1FN4dmiaX3mFh4pmtFJ2CxaqVS4vbBN qaimT1lRzcAjnVR2/bA+FrZYH4smS7nFAzcoP3DXwM1FxQMTktvf+qe+eX6VSe0xsRxTj8S654/Y Vn9aix4RP/eLF4fU78Ijtv2iN3fgqqJZRXOlNilbeEEsCT9wrfxaUKTfVcl2v+nKGu1+2/22Cbvf cb9jMsNfCn9JImBmeKZEwO3h2yUC5oUbTI/wveF7TR5fPcvPas1qNX2yrmZdNQV81+ymP2mN0y+a TRZqYJWL8jcm03mXodJb+aLoLeaNA8dMSNMbaebo13k69RxZjf5WItqV9Yj6qa2Q2vR7uhlEuiHS /UR6kEgPEelhIj2TSM+SSF9ocrCkbTC0IUAbbsaf1Z7fW6l7ELKH8NoxzWmylz2/0/V247VjGj2Z /ves/0jfa68XvG+rg1gyWHKw5GLJh6UMbOiXlgN/6AO1ZGG/x/v2hcs3v7Q37DgMpo2LvL5o7JS5 ZoY3iul6c7y+mOjJ/pxR+qBxfz+/V5tdaX5b2W7zVFrsWVmDN4rpsie8UUzJ/rPG8MOMwn9klG/U F47ZaQ6zK+ir/308f0onJfNjcvTNn5w/LX+G4Cz5NQPZXNDyMcmN5TfIMSt/Ab+Vj3nHMjli+Y94 FEuzmCFHDErZS1lKt9NAqjmLqX+u/a1tCd8Wvk3a3BiWKAvfH9YI+NDnJrOdEfSebObNFNpsknkb 5RgPbulMN3YeW/K2dfI75BCMbI88FmnUI02zObIdSv22lraRXrewrdOStbMwL9tKInVC+yOzI/vz duftVozs1ygP3xGe++e2MNIi1GqSkcuRq5FreW5eRl6PvHxBTfvmFeUVw5fmjRR088ryqkRWlFeT FxN+ct40jlmi2Tdvrhxl3qFlMjotNuQtAPvmLRYdtZbhWVrm2ZkVuSp5KsmgtFINOTNo4azwgj/h /OHK/v8Eq6udh8X6//OdkU6Z2Se/13SRDnWGswo/1EVa6AxmLa/vIs13+ppl8ntaF2mmk8vfWVZ3 kRonaKbK75I0qWuuss/O75Rdb9sHz/CIu9HdJBrfdzfLyvYD9weys97qbpWSz7rPSt/scneZkPTN CybD3S89FHZfcY/I+nPU/ReT4x53j5ue7qvuqybXPemeNL3c0+5psfmG+4asObuzdsua82PZlX9E duU/kdjQvf3j4DfB7/wB/3ga/0QavyqN/5bHS9udIkfa66S+UzoEWYFTKL8ud5HlOlr7qS6yDKeH /DrYRaY97MhIp8nMu6Zdfm3oIrssve7IuShddsG0cDZKl5025+XX7C4y+3emk7vIjhBblV1kB7uc C6ys2RxIG+shXKPpuBrWZIc1WVfjes54XXo1PO8PevWJNPmT8LPS+JlpPf/NtJ5//Drv6Xwrrey3 0mxa/u4uo2Z5bUuUtzr1OtK2Zuh1bfHfXoMqbhfMNAHZ7WV2SrusN9ntxuT4TTLH5ARzsoUiOQU5 hYKaDpbfJTkj5CjIGSNYmTNe5BPliIi8NmeqaOhR76WDKZd+FIpeRMoGc+aLjUWSqk62l1sptDRn Onm2tNJ0jhE5twremjMnbd/wYa9nejhTaeF8abeJZArlppFcf0Sk3yJRIYmQyHBPrnobutFmL93q 8duFRglVCFXb37mrTTJzea/TvSYLnu91qdeVXu/KcalXe8SfuVyPSGavdk1zJ/Y6HcntdT6SG+kd yRXtK3pEMiPRSBS9XHvYUimLkaFqURB7keFqSy1dtxMZJXb9vU5nxYTvn1WaWZ+5LtJfcHlm/X/a jufDns3Oslpk8y6xyRohNEao0kuVxgtN9NJaL0/1pno0XfpzaVaxtGNF1sissqyqrBo5YlmTM1dk LtVD+BhpjWiNlKM4a1rWDH7LIelk0dX8GfbwSl232JBuT215llJ2yrKKRbNYbWUuymzKbMqalTVX 0qWZTX/m9cmfFbk9ZW7myvqcK5GZKxGaK5GbK5GbK5GbK5GbK5GbO8rTSwjJbjC3Tkh2SbmybubO E2r08hYKSdTmVnskv0cuNcnQoZ7FPVYLlvYsk6NKjrKep3vGQof06Dm5Zw1pVc/intNEZ1rPGT2n 8VuPhp5ze84lf5o9vFJdLZaJFvbUFpau2ymTXzGhKuFnZcwPbQ+d7TlL8FBo+3975Or3eNvSdgB6 vRNsb3zvXOr4gDOG6juMnq7BBzvKUmuyb3mwSfjzQR3b86EVYJ3KQ3uM418aOCUrc0tQz2JtvmPG CZwKylWyv6/Kw8N9F4wT6u9PiORs8BGJkZkBo2U79Ax3XlE0ZP13YpwFzrc3Kq/oW64S3/L3TqqO on+pStw9aLYpSh2C/juQtyiG6ts3inxRh5zNfVMUndKOebpTCF5UDG0BByKZCjaB6v+poL57eTn4 JcXQETQf1jNU8LTg6qBeyY0MZSCvR0dxA2gCen1qNFf0v4SE+wiBHUi0rPGfhe+B/BT660EseHWd ALW32yjVpi0ybdoK4Y9pbnsVOArk6rddxq0jTy23/wL7Yf9PqHGn9MwzoRrBTeCqoIy0+wLYAp5U ua+f8r5mJEfgXwFLkAzzvyhYA06yqHKnHf6IonMR/gVwIVhhdbCTjZ1xKu94231bJEUBaZ3/Mb/s lwOlfjmr+3+jvP8nyB9QDHzZ/7Tw7co7ixV9teT+LZJk4J9l2xZB0wG/ioV92KwDc5Asxs7foZMJ 5imGYlh7A7T2N/o2atvB7/kk2n3HA9u1Z1TiTgkcEv6cf5Dg8ypxSv26D/2Eom8MfLHqByOehR8K vqhy90H/AOH/0if+OL/1jxb+x5R6UjFwH/wccB34D4rBmdi5phg8TY0NKvcHkV9Ecwp8AXUVwS9H c6x/KB7qTHlb0XdU0Y/EvRd+me9V/Qo6mjPROQRuVTT9nGkaRWAYzHBkJna0uM/xn1lG6Jx19Dro lK+feq7XOc5pV/uhXdHXT+al445Q3l0P/7BvosYDfAv4S5W4m8AjKnEGIH9XUVYV/QumNuV9c8AS co/4+2p7rR3l3S3wd4In0TwEvwmsA4c5slq6tfgzDKzAWz+8flNMWuR/VhH+jJWoD1K76owD65Bf pmwrkl8qdlz2j5ReTQQaBJ/Vue+7mxG5H2/nwD8Jv1FRdBqIedH0v6zobqJUCZK+muu7gM4CT7KD SN6hvYRmNpKvKwbugy9D/wlwGhaa4edpbqgPOk+AH8PCk1hrZ6XqwLdsRXMGmy/i82IbV/Tznf5P Ch8ixvICXxGdT1Gq3LYRnKjYcVZ3+O561vneHW+zeuv6X6S8M4DcTZrr1sEfh98OrkC/3pOrfiuS EWANGGmfkbq6k1w9pxxFvxgLxZS6CD6ATjv4WdBeO74I6tcaZB7pHUUZ6bsEH8NOS/tObTs6pzin NCofoBbRV83luj7LtbSMu8wEzm6K/o/C3w8uRnOu/29F88t6FnCmueXKu1Okl55zl4HPgefojTOC 54irHFdWIddhNk0B1xB1cf+ber73vyGS76plXxH26+AvKDqtSPYgWQ5OUfT3RV6MZCf4Cni3YmAo Ot+Gz4d/Fn4RNvchSaC/BmxUNG1+vat5EPyGolMAv0FRvFL+DLgXSX+sNeFJhmdBJVh2R8CXgofB XchXgfXgMuQzKWu82pXHT3MKfBq87OkorgZXgg2KHbfCzwYr1Y5vFJYZL+cp6jpCS4/RDxOstQ7O 4BLjup/5J+2Njme1XWCLosh1JdmhKPsQlewkdw9Yg7wJPK3oT6AzBSwCs8EL6G9C5yw2D1KqFSwA l6CzAv1GdK75Za12Rvp/Lvw7gXnw7YJFgVyNfI0fJ6C8kx8oFMwKZCvv133kmaDeS3k1oHuSi8Fs ei8m+HE945h+/k8Icr4z4+DDenbr+BU6Ef8y9ItBlf+7ovAJMB8sY58zAvwIO6LbwCi4X0rt0tgW Xr/J0YdzaF3Apz2me0hzhr3WBvCM3Ympz25xgBUgcFBRd3duse5XnZnBUrBVEck+1XT2Id+HvBVJ K5JWJPsCsxV1r+u0KooPVqcJ/YPIrbWD2GlCR2uvQ6fU2kenCb4Jy00qMW205SDYxk67zXqr/eOO oy3j/P+uqKUE1UIpdTVZ+/jzFDjV4zV3qmrK2YQ1Fn824dsmbZHwpaz5tEXrkj1DI/w69UfWMIkf 87909HnyctHoX8IaMwZUb8Pmh+D9uo51/EjK/oB1NU9WU7HQztkBbELSpuiUWl7387Kb3am5yjul Fu2OnVKlXAs0sXtv0n2voK60xSp369BpxeZMdGbqNUuAO2SBfLUjOI+1dLqWQrOVWvbBrwX3UeNa sBWbM/HwMrkPWKTUA+S+Rl2v4f8ZNM9Ym7oDd2ZaP+mfNivxcnUPf5BSB1UuuVXwVbQ0W+f7e1tU YmvHTqmOuLlMKcM9sAmg6fipYH7HUcFCJPlICjt+L/v/ZpVIecWdii732dwMvOKup7RRJSPgS+3Z k1zuV7qrwCP2TE3uEtsie26F/5Gi9LjM5Y7PKEpdyvdVFGta70LwXrBBUdarn+qIqOcyLpnwnP3V c3c2OrvAJo+3PuuKsRI8Dx4FN4BnqHEu/CnDVYaeMc03HK5bQ7NYbehDVkJjVxXe6vm4SjpaVCIr g86mgpC+tXKUnjc6a2R1YkUKFtDzfRkdopqVoUnHzh2nc1bmZpOu1fZ62buqtTNF+2odvVfj9eFq 3a/C54DjwHP09kX4FXYHAtapvuw3NPfz3miuNt69bucpJLzF49xi9cWG1KXotIJNiqYN/gfgPnSK wS1ISuFzwHHgOeQX4feAK8AWRd8Ucl8Cl4Cfp5bL6FQgiYFPgd8D28k9DtYjmYrnUxnxqRohTgL+ 8/Cf19iQVtvI1/Pax+nVfl4Eanu3E6vX2HeNx9o/gtXeHebVzHfVrEB+GHwJ/J7dYaL5Ec7s48Es 8HNgGfuEr8MHQXZQ5qNgrrd70bNwDM3nFN+Ld7BmdjwKrgPngcPB50DdtQY8+QJQV13T/hv4/eBS tcZe17z3LrnCt/9rQM7m772mZ+f2t4JZgr9RlAh/GvwZcVsIb+8GXAUfxEOro+9E3OXx+ON7B343 8X8J/kXkv4Z/Gfw7UFcqw9Wf8eO/9kDHJbVv8qnlbXjjvxWkLX5pY/vZkIzIe+dCFeq5nrtFwj2Q YDX4FvhjcD6ouzuj+uIV+4dAG/KvgkvAz4Bf4/y7AXxBzgLTMkYJvqTof0MxWK7ogn4D3of8acXQ NxUd9F0kGeiEBmRwvwX9N8m9Bdyq6EMeOAOPBf9xJD/F8in4cfABsBeSavjF6C8A26krGywi9wqa X4QPg9byl9En15eF5PfkDkfyKyS/hv8hfA76PcFFoAu+RSvWgw1IngTrsfYFEM/9c0Db6nzwZ0hW greCQ8Gp4AyQNvrvxhPr21ha9zxIbob1/x/JvQe+mXr7w8dAPPedxVoZkgcVMxmjMOOVMRtE7luH /cewMwz5BORLKbsZOyfAR5DQ/wHGwr1M2QJyv4+FSeTuwALywCj4DfB14HlwBHIipOPLGoeCEofu g+ASIvM2vUfk/H2wp8anRn7gJUX/G4rBckUX9HNv0H8f8qcVQ99UdNB3kUiEryHC1xDbazRirQXl QwOsZeX9b1pryru3oLNV0Yd+gF20D/v+40h+Sr2n4MfBB8BeSKrhF6O/AGzHw2ywiNwraH4RPgxa y19Gn1xfFpLfkzscya+Q/Br+h/A56PcEF4EuyOrhrgcbkDwJ1mPtCyCe++eAttX54M+QrARvBYeC U8EZIG30340n1rextO55kNwM6/8/knsPfDP19oePgXjuY5XzlyF50I4mo3YKPM4YGUXHjubTiplg mBHPmA1S1rcOC49R1zDkxurDT0BnKXVtpt4T4CNIGK8AY+dyHztUQO73sTaJ3B1YQB4YBc+97kAd eB4cgZy46viyXgt33NIhcd6R4Kz6w/ak4BvgvYq+/ooO6BqwHPkt4AFFg76DxI+O7zHkVv9+ckvA aeAy5JfhseDOA89RtgH+e/AumIFkA/yn4SvAB5E8AjaBfwX6QWvzGRC58zD8e+T2QXIFSSv8cXis uSGwEnTAB9D5PPgpJJPAMVj7GPhRJJ8EbXszwTuQTABHgPngcLAIHI3mt8HvYu01kFb7A+j8G7nP w58mtwf898FvkPs2vB2vnygG7LgwRv6R4Dg0X8bCS+BHkA9CTin3X8C7wc+Au8Efo7OIUiuRTIEf DH+SXCtfC39Edz4SVzOIK8WtYDnIvshY+TuKEkUziDeVrIH/LTpDO67qfVf2jTuJ1XfZPfI2jj8I smP38d5P4Gkkj7JLPI+Eq2DfDPgGcjeDfbF2ANzDk6w5lPp++2K9skDSyLXtaSxUgaNUEuIazYmC 9rqgDs0e1GLfMDmq/oe4pgvY/X+BvV7jurhGMVCp6A+CzyJ/l+dEO+z92PaJumNXdB9Wr3yv2PuW 1DUXrLb1YuFVci/Y60H6cKqibyttOYbmNr0m8tlrxlH0AyuAzDjNfQPPdzAKLXg4HQnyIP5Ln0hu 4KCiPwGu06tgdwU1PoX9UdS7Ef1sas/G5kJrQe/iykmomSvrZlqtGAH3gMvAheAIT36MflZchWQL /DL6rR5s4c4DzxZ9vPHl9+5sty/nqn8j9W5kdLTsAc/zRq4WrYVjenUATlWUnrS1qOSwp3+M1ewY Nm1UN6K5EX4jLVJ5Bn1yWjX9n7bXL1iYDX4XPGij0Yv/jcTGDEbZjmAjbafPiaUdjMsiRjwX/q+x sN9eXaJfYe/JYKGAVs8nAufS8/MpNcFGi40Kb46EhX9ESwW5zxBYqbnBE1iepXb8l7B/khq/iVcr FcPEXsYVxRD3JYK7PAuLGRHBEFfNwZnKBwzyLfTbIWuTutbbq2bu81xU9C+38YOHzbSlWt/8Dth7 IPc4p0Q+AJ01tKUAfgZj2kZLTyHZiGQ1dZ1DMoU+XArOA/uCCXJ3ormF5wUnsOzHAn0S+L9E/jK7 muEbM903CK/u5SnqCnATz1WL4I/zpDUK/3twIblTwBCSLeC9wQGCA3k+OxBJMXwEC01IahTNm+AZ qwN/Cmtz7LNdcARPfp8C87DQivyX4CrvubPuMY7zlLlIMZCPzVXezk119nj7sRq9C8H+NuphjfY2 e4wiz47iJJ7dz6VGP9ZG4Nty6q0HM1TiTyDfiYelyLdgudX2BparwBKQfZrbh9y14KcotQJ5deAt PeMg36t3llz2Qob9j1uHfDQ1foxa5iOpp/c64JeheRLM0Va49sm4j7b83I4v71QMww67XN8n0N9D Xx2AryV3Inx/eParMlJq8x34/217FctD8KfA8vaJPJ4fpcZzYISWbkdnCXwLFlqo96R9KwDJr9Hf Dv9L2y77fD/QoX56UffX6o9erfvKlfctx3Ipmu+i8yR8HXVtsv0c1DeJqsldTG4tY3eY3BwsnLY8 8t9xd+JN+Jk25pX33Q2GkO+zyChchn8NfjV43sZ84CH1X/nA0+DjNp71vp/vAjr96ds91L4eSb73 LsQSZo2gw9WW2IT33rK4XaPRi0nVXEi/PUzuF6hlG5IjIFcrbg14L/H/JnOHayjfDDvWtOJrlP0a /Fvwb1mesj5q/DWetIJNXBcQ7SH8D8YUQ8Rn4CD+PKOY8Q/kfgt5JcgVk6/R9gl28CREbwTn0ttc IzhL7EpC7cV4MstaxsJK/F9p14fgIvpnEXHy16xOyk8JlomF76BTHtAV+2F9MiVrTotex6mOeUN5 GXfeLgAngNytcoeTe4rYOEOf7FI77ve89U2fE70TfEDteythISuYytcE9A2f31LXWdaQZ8GltOsB /D9E//RAznobMODHkXwbnY30ySuK/r6KgTYkryPJAsuQ9APvt1EaeEf43yC5AL6NZkLvjEkcVuPP IuqtZi2tpnbBEGeHwCJqv4BOQlF0lO9L364A96i+rBWLKKs4G/y4om8jc/YC+EqAc03Azm7iGdyj 6B+MzuvwWYrBpwJEi2LoeSKkD22/BR9exv79AesnXgXsLNPaJ5C7E5u/g/8d/cmq6Hfph2eQH6IV /a0+7b0WsHN2EW81qIdHsPMkfB292k/RX4a308g9RqkN9rxmzxeet9WM/iJ4lX+Ouq7Z1dLa93pS a/w6fAU2rzFqv0FnmNYY+hvsnKLeBUTOCWx+nbr2UvvrIPPOvw78GKP5KfQPww+1UWR5dH5h7YBP oEmPBR6CJ9qlV/MZfZWMQcIcDG6Dvw+bs+EzwRfJ/RKlptHnnwTP0q7vMl/6I/kY+Avwc6wD1fAO fA8sMwfdO8H3sNBs7diZBV9Eqavwayg1wZ4LFEMPY411PlRv/bGrNJqPI7kEz2osva25nBFCnJUC e7G8MTCEeB7C2eoLjNcQoncI0T6EefeE3qeiRs6Swanwn4UvoK6X8fwn4CXsb8DbA5a3dsBm6roT zTJm3Aqw3ov/akZH5/WDaiFzuvLhJ5TPGAW61MsuIjyc2cQ7dQF2YqFNWJhMrPaFf9pbHxQdL/IF M+9Dn/f6/Hd4sa0YDNgYq2Z2KB9H/jlqGal8kNU7OIsevp1oP6hPHHy/CBwTnE+f3OevEj7Lv0Uj 3L9CNNltOi8pLzNihd5nA2coOjMZkUot5b9Pe0kitkzv7/n1WmC+SpzjWouf9dxvzy+s9u/Ves9T vibYE76n9ySFZ9MdPOno+DpYD07m3tGb8Cv1qYTqd1ztOIbkCT2bqx33XkVfb/gV4B4k5fDHFZ0o eBhJHblTwCIkq+Cz4VvAheAW5K/AbwK/A44Ai8EaLIet5L1/07MbrVsEfwYLc8gdpxK5ilH9mWA7 8l/Cn9Zc1/pwXHn/J+GPkFsKFmC5DXkGT6iHwA+llhnw9Wi2Yq3Ceoi1BDo7kdB2c8pqIslBfwU2 T/Pubsj6bNuuEncKuIfn2uex8CK52+0o6HNwZybYhOROr0/UWhGWP2ufqlM2jrUWcBw2fwR/HMyx /Yx+FMky7Cyn7L/aHrCjSe52rsjy0F+C/F3kL9DqRtvb1g65PrAWySTL21HwekztvKbR6PxcUUZc +d+h35/cL6E/Fa8mUstEeNtLw9CJ4e2btkW0cTXyv6CWSMdgRXIrvBpVPgzLuxQDjyv6f6+5wg/W 9QFJX+uJjXl9G8EtBkfb+IcfwVsKA7A2gPcWzij6epM7DL6o43Htc65tfcjXg1tsz1hEsgyssLlg f3AVuB3Nn9EDVTZurT9gCzgL/CWaERs5SOrx7V/BN+3dG+x80UY1OgfAI5Q9Sbti4EzwLdr4K3Se x/LfID8NzrUzGv524mQMmgutNdBH//+OPnnF+gneSal2+Az4+dR1gpE9r6UyRikfYp4Gp4LVjN0t mhtijQoO4U34S4xjIe1ajFdfICpmo8mqFbT2/cgvW8/fW8jMUtxnfbYznftFPu5KrcTmSmbxeo0T WQ8HE7eDWc0G68pjVxiwnLXoYexUsD6wRpk3kEzwZp/qhO06puibY9c35O3ga+DPsVnTXiJo4Iej uQhvv2fnFH34Dncvy0GesLtraO9vbat5t+RW/znxZ6G/Vnmi/QWuR27l7vQLPN0bZoz3jkCmWe88 bQK3zb9tlim6/a/m15upd86/424zc+4ds+abefW3LWgwi9TuLVNqikyhnDk69Bt/JmyyTC+TZ3L0 l8gyjP7VWrbpaSIm3/SQ3/qmqeaYTs7Rv8bweNcEjU/tJqZOLNL/xUK+38sLmFzzkdtv/2qjWQY+ Aq4EV4PrwS2z6++602yfc1fDbWYXuPeuhrsWmP3gobvuu6feHAFPiOJt5hR4tv6e2+vNBbDlq3fM vsu0gm3zJdsxIPfCjb8TfXB6c0q9C3aRXOccwz1r++6Lh1lpmJGGOWkYAq2dzDTM9rCXGWxKzShT aWpMwkw1M8xsU28WmCX8h4BVZp15ygT1tQTzqPXZidg0aN9fczL0fzrrf9ge7KWrjP7lp5NZa/gL mMwd+Otkvuylp2yaW2jTvO1STtI+E2xaMNfaKWiWusR+wRHv9zmvFfo+EW8Q8V9NXPE6qW8yhCr4 9d/8/6gC8zSinKg7yjfBX2f6mwoz3sTMFDPdzDLzzHyz2DwkPddk1pgNZot51uw0e80B87I5YV43 58wl02quyakjO7TT+EJbQ8+EnifdFtpF+qPQP5E+G9ot6TPC/TPpM/+vveuAiiJptzVdUz0jNBkU EYkiiIQeMpIliKgYUBYVlRwUAQExoZLBhHFRFBGMuyLBBCYEcwBRRFDAxPobMCIqplVfTdHOurv+ 6bz3/j3vnCfHqa+rq6trbt17+6sephEcI2WpoIqUZYLjpCwXVAMKlzV4qxS3PkHKEsFJUpYKTpGy THCalOWCM7h1qeAs3irDrc+RskRwnpSlggukLBNcJGW5oBa3LhPU4a1y3PoSKUsE9aQsFVwmZZng CinLBQ24dfkfEBE/mXwuSP6XELlK3vkeQSOHzDUOmSYOmWYOmev4PHsENzh8WjhcWjlc2jhcbnKI 3OIQuc0hcodD5C6HSDtB5BcOkXscIn/jELnPIfKAQ+QhQeQRh0gHh8hjDpEnHCJPOUSe/RNEckEB 2AlK/y4izzlEXnCIdHKIvOQQ6eIQeUUQec0h8oZjTDeHzFsOmXccMu8JYz5w+Hzk8PmVw+UTh8tn DpEvPYhgoyGICHk9iAipHkSEUIyIkN+DiBD1ICKkexARCnoQEQp7EBH2+jcQOQ3qwDVwEyPyGHSB DzyKJyWU6kFEKN2DiJDpQUQo04OIULYHEaGcGBGhfA8iQoUeRISKPYgIlXoQESr3ICJUESMi7N2D iLBPDyJC1R7GCPv2ICNU60FG2E/MGKF6Dz7C/hw+Ghw+mhwueuJ3KtTicNHmcNHhcNHlcBnQg8u/ jchTCSIDOUT0OUQMOEQGcYgYcogMJogYcYgYc4iYcIiYcoiwHCIigogZh4g5h4gFh4glh4gVh4g1 QcSGQ8SWQ2QIh4gdxxh7DhkHwhhHDhknDhlnDhmXHmTEz9YUj5tcgdbgKwEDosW/PIavBupgIGAx Xm7AG/gxjdjpXYVj+WuYa1y0lmki0Thc18xFa5nrOHIn7W5w0VqmhUTidq1ctJY8X2UAMAE2eD5G Al8QgF09ASwC2Uyb5Ew3JWe6JTnTbcmZ7kjOdFdypnbJmX75eibmCY6GCV1x3VMuWss8I5E7rnvO Rf9oRPckI/qbZET3JSN6IBnRQ8mIHklG1CEZ0WPJiF5IRtQpGdFLyYi6JCPC2ueZ8ExwAqNGqeF8 UJfSJddinLnJWJAsIAGInxZF/262cPYDhwGKeksiT0k0XBJ5SaIRJELkGXiqOFccQI7sIke9Ike8 Jq3fkJbdYrZQXfgIMVvWgb5/xgpsxHlNKTgErmL9vMPKYXi9eVo8Q54Fz5HnyRP/vjNf+iTuK49E pyTR6a8RdQlHG0hUL4kuS6IrkqiBROKslKGuimPqHn7NJfsaJa2uSaImEkGMnixQpprJEeKRrKDE o/iRtLn+TZvelHhMudQZAHHLXOqGpKcWSdQqidok0U1JdEsS3ZZEdyTRXRIJcN6sCrTw7JkAK2BP 4dyA2ozPd4GcdTN1DrfaTOFMgSrA2xdJbQF1HtcWUO2Svn7hsBBQOdQqzJdCaidu+RO1B0hRpVQp kKPKqb1AntpPHQCKVAV1BGf8kGTGypg14qe4iPM+ee6JikV4RzFVjPs8gNtDqoqqwrkiZh61jnxT XPy8PDEP8VVH/DfSceaLfZbaSG0E/al8Kh9o4D6qgSb55rcT+ea3M3nyHaSz6ExKvFqAkJweSkEp 8X0oyJD+cAvYQfeHYubzaE1aWzxCnj8oho+hJjSAg6EJNINWMBWmwwyYDZfCHLgSroM/wjxYALfC nfBnWAxLYBncCw/Cw7AKnoBn4EVYDxtgE2yBt2A7vI/7egqfwU7YhQyQEXJATsgFuSI35IGGIy/k jcYhXzQJTUVBKBzNQDEoHs1BC9AilIxSUTrKRNloKVqOctAqtAatQ7loA9qI8lEBKkTb0U9oDypH B1AlOoKOomp0Cp1DtegyakDX0A3Uhu6ge+gReoo60Wv0Dn1EX2hIC2hpWo5WoJXoPrQarYHftxat TevQA+iBtAFtSBvRJjRLm9OWtA1tRzvRLrQr7U8H0KF0vPQ+6QPSFQzF0IwUI8soMr0ZNUaT0WUG MgaMIWPEiBhLxpaxZ5wZd2Y4M4oZw4xn/Bh/JoAJYcRPrdgFhVCccmhCTTwP+lAfUBjlwXgejKEx 9gcRFAEELaEloGEKTAECmAbTgBCjnwF6wSyYBaTgErgESMMVcAVg8GysBDJwLZ5BWTwrPwI5PDN5 QB5uhpuBAiyCRUAR7oA7gBKeqZ+BMp6tYqCCZ6wE9MazVgb64JnbC1Tx7B0EffEMHgZqeBarQD88 kyeAOp7NM6A/vAAvAA14CV4CmnhmG4AWnt0moI1nuAXo4Fm+BXTxTLdjN7sP7wM92AE7wED4BD4B +njmnwED+AK+AIPgS/gSGGIWGIDBmAlGwAjZI3tgjByRIzBBzsgZmKKhaChgMTvcgAgzxAOYIU/k CcwxU7yABWaLN7DEjBkHrDBrfIE1Zs4kYIPZMxXYYgYFgSEoDIUBOzQdr2jsUTSKBg4oDsUBR5SI EoETmo/mA2fMrkXABTMsGQzFLEsFrphp6cANsy0TuGPGZQMPzLqlYBhm3nLgidmXA4ZjBq4CXpiF a8AIzMR1YCRmYy4YhRm5AXhjVm4EozEz88EYzM4CMBYztBCMwyzdDnwwU38C4zFb94AJmLHlwBez 9gD4AVWgCuAnZi+YiPlbDSZjDp8C/pjH58AUzOVaMBXz+TKYhjndAAJQI2oEgeg6ug6CML/bQDDm +B0Qgnl+D4Sih+ghCENP0BMQjl6gFyACvUKvQCR6i96C6Zj/H8EM9AV9AVFYBxDMxFoQgGisB2kQ gzUhB2KxLhTALKwNJRCH9dEHxNN96b4gge5P9wezsVZ0QCJWygAwH6tlIFiAFWMAkrBqDMFCWvyN tkVYPSZgMVYQC5JpM9oMpNAWtAVIxWqyAWn0EHoISKcdaUeQQTvTziCTHkoPBVlYYf4gG6ssACyh Q+gQsJSOo+PAMum90nvBcun90vvBCumD0gdBDlYfBVZiBdJgFVahFFiNlSgL1mA1KoK1WJG9wTqs SjXwI6PBaIBcRofRAeuxQgeCDVilBiAPK9UQbMRqNQKbGJZhQT5jwViAzYwNYwMKsHrtwRasYGdQ yLgxbqCI8WQ8wVZmJDMSbMOKHgO2Y1WPBzuwsv3ATqxuf7ALKzwA/IRVHgJ+ZqKw1ndjtT8F8VAb DoIstICv4DK4Gq6Hm+AWuA3ugvthJTwKq4lj1sEr8Bq8AdvgXXgPPsR++RQNgq/QIDQYLkMj0Rg0 HvkhfxSAQlAEikKxKAHNRUloK9qJdqNStA9z6TAajI6jk+gsuojq4TVcNqNWdAu1o/voMXqOulA3 +oA+0xRN01K0DHyIRtIqUIfuR0fRVmg8jqbSQXQ4apc+xPAZIcMw8owyo8qoM1rMAMaEMWesGTvG iXFlhjEjmNHMOMaXmcRMZYKYMCYav9c44mmAeBqPuBlF3AwSN+MT10LEr2jiVALiVELiVL2IU0kR p5ImjsQQR5IhjiRLHEmOOJI8cSQF4kiKxJGUiCMpE0dSIY7UmzhSH+JIqsSR+hJHUiOO1I94kTrx ov7EizSIF2kSn9EiPqNNfEaH+Iwu8ZkBxGf0iM8MJD6jT3zGgPjMIOIzhsRnBhOfMSI+Y0wcwIQ4 gClxAJY4gIg4gBlxAHPiABbEASyJA1gTB7AhDmBLHGAIcQA74gD2xAEciAM4EgdwIg7gTBzAhTjA UOIArsQB3IgDuBMH8CAOMIw4gCdxgOHEAbyIA4wgDjCSOMAo4gDexAFGEwcYg7WvCcYSLY8jKvYh Kh5PlDuBKNeXKPcHolw/otaJRK2TiFonE7X6E7VOIWqdStQ6jag1gKg1kKg1iGgzmGgzhGgzlGgz jGgznGgzgmgzkmhzOtHmDKLNKKLNmUSb0USbMUSbsUSbs4g2477Rpik0/4farIWXYSO8jrV5h2gT c4jTpuG/rM1DyBBVoRPoDLqALsFGXDahFk6bHegZeoneoPfoE82jEd1Lok1trM0ZRJvaRJthWJuV 39WmGWPFDGEcmaGMB+PFeP+/Nv9fm/+Htcnjif8itTqYCgrxVfQAOA7Ok9XtA9BJ7pOQdTMwxOso vH6DbzCXU+Fb/JoO3+PXbPgRv+bQ2YBCDvRc/OpEz8evLnQSfnX9Tg/dpId3pIcPpIdfSQ9LSA/z SA8LSA8LSQ94/UcvErcg0WJJlCyJUiRRqiRKk0TpkiiDRGRFzbwSx8zrrzXYbe4CgD6hz4DCvoDX idgbaEBjf5ACQqzrMPK9Vy9yB2kgsCC9yEvXYTXjI+HjrxHmhXi1fwlvvcKrt1uknSxcjLWP9/WU 8DFZIYpXFICsDXj4yDviNSH5jEJIVrwP8Wp0j/geCFXYs3IETdJy0rJ/+uRCPCbxZ1M6wAij68zd L6gla9k6ybr/b+KnH5LoviR68DWi54hb/8O1MfnEhnwix5BPmjBUVCfsxw/nR/AjuU/ueD2tAOgj /p6FMqkFfaayqX0m0b0MMz0z38rwBFRhap8RuGoYxeOJpNleNBosCyk1BNhAWmowzePzUq0pHr/Q hx3LGn1To75VI1kd2JOf0SAIxIMYEAVCQQL+7yj+YbW/6YyvbJJBL79ZXH86l53/pLS/g7qJypKc wlRFEZvKD2BT4chCSPEoSsqkWOHmmC/+m2trvh7dHw8lVjSYHUTDCXxpJR3XmNh5cZHhEQlaBsGD tES2ttZaoyKD42LiY8IStFxj4mJNRBqsek9jld/viYkLTIiMiRZps5ri/VBJ9bf942JiErRcZidE xMRFJsxjNfrIsNasjRn+Zy5izSb1kRGZ4U1LXIn/TWLnEaxwJ7QSNcFHpMQqiDeESlI/BMZHREaH J+DTyLOy4kqBkmBcaMjMmOiQrwOT+nsD02W1ewam9u3+kFAtn8jwaNyr1hhXFzaVp8PKSCaQx0MA pvLkAK6XolJ5PFA5b2HzlP3utj9Z7BG1vtezHD6n5qNmwTn3WS8aPB5dW35qxshxQa/zqFOjbgyP Mh3gGFpdr1sp7Vm5ePYt96rdK2XHnNEb3FX4UEZXs8FlwIegvMt93Xes9dLMu7TfVOeUl3FSTIuK ht1yW3nbW1WDXofZGfPMvnzW99x5MIqXlf/xyL7gxanv/QtT0jNyyrsOrdt22WbnmIw++lnet9hu 4PD67HuHlOOZz6Jsd5lYdB8wKZNaGLR6blj+hniZzLKu06+0Do9WXBFca9Ri5t73+VGvXLsxPqr1 YWPn7S7JOu/ruCV1THY02mt5YsGAqnFhDnnedYMXmUenD6MbCq54ZVLRmWB7TdYdH0r8VOBtKR/Y lLesEoazvx6fYaVoIaYuQgII2ZSt4loeP2Ujm7I+WX7yldgXkXEFumMXKe8blfOltijuP8+3VDlw Aiyzt89WaHDsDn56x5mVE49Ricf7wkcsxAXbX1why+/NV67rX58IYieXvWw97b1xrJvJNrfgTlZa vFuOz8cyyvxGOlDMiAXFpYu8BnbVH/NO2Oqnn2A4e3/mp+KR6+aCUR0Xn6jejDwjuzXpFeV69mJW 3TufupNbqnxjOoPdfnYDz3PPb2xSPyS9pa/MuuutGiWDFr54tjN+z8rbtjkOG6Yfs5l5NbtM99Od jubIXquzqz63g6MWr94mvZdXNEFPBuWuHTrDYFalzcq7ApkLUyIuVSW7zAj76Wjl0RyLi11QPmn+ m6t3h95Z8Lm9fc/n7jtNMvtjm9fcG11hszXJ+JpDm4V0kDW1JWW67pJu/+CV5ZOO2l4PWD4hXc38 jd2GwlRm67Rl+40qi3bUFrdqVVSzfTO0lGUMj4177XJ3KntvjUFk1onYX17tKq5PHhqXKIs9Zj72 mCDOYwJ5+zYRL1T5VkcI+8xfqGpsOCJsNGbYZizNRZzhWEo22ZS0/5WxyRDiYOryR40eM+5rc/h3 mv9T79kxK0G1ti3f9MPL4L7J23K+nI9NY4qGGX74MKm8fpRclV2r9iXUtDDJ6WBeot6Qm4Wjte7H NbrOevAlSvn9lvR9ellVygenHLdeYnKmOCNgVkaK/mFz+L6keS31vGKCAlWbltF9IiM4sG+hcv7m LfkewdY3FOx/OOep5dP7bZ3f5+4atYsVHlEyj4ag+p3q97I7b+0+GZs2uaGry+lQy/bN20D07pRL z4fwS2q81hgp3e1wSeyVzIsK1zogKneccdVZmNYUy65gHx5ffsX0+bVMJ7VJO2oiMh4tSVoNvaIn ump55md/vuBe+WgknycdVL/1qfpavU9X9sqefVcxQG3Bx6Rmf++G8A7Oe96xKW++7z2/qbgl7lot EzTt1raELdNkN7j8NFnJdSCZvv5yYtVjIQuSiW/01+Wrsr2Tvy97N3EDTb4Da8faFloXWmaaRyQk xA4xNQ2OizKZ+XUOTYJjZprGzogU15rGxsWEzA5OiDd19cHEM8FVrOfXEfJ4fHt2CGvzdZulMo24 DufMmfO9DkPjvukp4Q+CIu4TEKB/I4kdrjjMxdp+6uwDf9sKrBQ8y438Nm1IerZNsWjDc9X967tn 5txg1dRLtINdPNZeL1MzGLHeaqHz+IC6oGMdv0bumrb4TNbOTCbp518mLmzLbpozF+0ccDHknffY SjeDHDWj8UKDuDOaqg5Gl4F+jFLDjsCu5qAhVcAbmeaFL7wf7OpkxxxfJpjfPte5+s7c+iytrX2L jgV0btkzzj9R+VO/ueh68OwZKZ+yPEpKJo6rXlBd1nf7mn1d0kaLWPk20Yjj6ZMWv92kOLfj9qKA YpmzIo3uuI2O4ZdtntvU2/aLb7NrsbiTdjX/Uvuy22qfQ4TTyrpNDpnpJUbqvWpaYal7qk3PDbvP Zuw+GT3uIz9dOm90DdArVmhz1/SbH771jx701+Q6VqytyIoVsRYW1mLrscWbf0GuMz5yZmh8QuDM 2H8117lpHf2x7PxQr1mq5+s9HX1qPhQrHzEyO6o4etz5tGeO5i3DRWsMKlaH3NUck37k5IiGxejd i9nHl537qak0MjZsrn7Yo4rKFxmHLz3f/Ulxu/REnUGml51bfPn9Eg/ODJnpNb7t1svb1VvSziXf WTySsl73pqZA6KsRMexSS02iv+nCCj3+Ad/J09WDvyQn2T9v4uuNsp2TIJhy0v9GprXR7AuyjzVs eyUlft4cFT3/7lPHlesLZslOMxytGhRgVnA1zXuwjn+E+7LbpunyY/a9P6i2Iuq53iald7Xy1zNk X6cmxlud/XH+1roA+ikqzzSvfLducrpLul/GuuhyTSPPuph817vTHy0emDOjx29SeQYYkQHfcxzh /41sR57uxa0sVHjiFAZ8Y5Qxj7yd1h+2KB6RufJY/uM9di6uZ6+wfSUHKFN8RkMK+IDZeBXiClx+ nwn9KY36jkGtG6UgOpk05qhCTlGggCe7PNZ9xYv48VVOvZDxl0NjfTLUn9murtzmK317eYVdv4aP e3ZdqNw7VrtfjDBy0Qy4VcfjWdSBmUk6hzwa01+tkDsuWGp14smijtgp7lvWXK2rv5VT015teCnp 6YVSs6asw7XBp60aVLWrE2/bbdzfL75AO/vGgQOK45e/zj8Z6rXRYGB+wFI5u3NKoXM9j14uSRsy ujzI7zbb0WHb/96SrlbblPdK2stDkoNpfm7XRsrVdIFH9pEvVEvoe6/brTBh7X4UzdRtvmkQmOT5 sk++grYNpZ61hz6Ta3bovvNZH4eqn5fcfhRmveK1Tm5+Xfmc8WOHNMe57dPtxga1GxvUmq/pEdrK kvRI+NelR38yArFH2bDWZpbYmkQiS7FHmfdsisSbbMr+/0R6pM/q9WxqRLtGxkaExmm5+bhruft4 D7GxdDM3NmctXY0th7p6iPRY3Z73pP7792TsI35TWj6hcYmRwaH/1N46+cb7cmvUUsL19g4M2q80 op49UqNo82tKqIXgtNW+ARHdAn6NYP3rypcLNIKMPFpGbB9rUdkY9WyS3YG0omEOCkITyxnuD07a L6fCqJ9VI594PdM3em4/Z/L2a7F5I35Il79SZvxuSf8HjwcdeHi5gA7aFTf+pN3Zy06H2sv95KPu 77h+6uRs66rXGe0pjwxu9HvZVfoydVvzdbh1i0r6R4cPxe0VZucLqZBXD76oDZwl9FmqQnWl6ScO T52160WJ2dyz16N6j9YJXR80ysP0i25ZxtOdsVWwtvWGGTozeJVzRUGTUWZUZa2S2cIVZxeV9jE1 +zXsaP9y9wnvSj4Yh6eFD1qbfnVSke636dRvhvBofffbF8tfPoi8NzHC++2GpfNvbTL5Xab0Xcf4 72RKCfGxwYH/I5nS154Svm/Wv8v/6JrvuZWM05xpq+2P77Dc3oZQuqZv14u8neeEK0z3X3Ka1ZSZ NEfz1pM++6qS7r3P65Jy9yxRPhpp1OUYHjS+6/lifYU1tk/rW7K8s98GDNNdoK/iLNxSLSPip96w rGDyQeOy3XMDzxzMdtnsaHXTb7v+piGtVfQU5Z375EaeyLFf1hWU9y7sWdMrdYNys7aLol7HPupE eIz80Biv83BQjg746FtNl6YUqhyxeG+Qo+kVhIqWvEkZ1iGzWnjdz26lxoxekT/XeCZNSHWaBmxc 8+k6pxum1aPjezl8OjL19bmn1idDAgtHXXOIrZtcrpRy4to2kVpVSHPu1flOhpM9fHrZX4LvnSaC uiU+gaJU/ibsWOspHo9NyfoLl2y/W0j+dqurMOWs+OrETVsvKGK+vY+Gz/vblrRIlv12rwp2DcmB fBGm+vnGStd2y4qll892Hlraebro7uK9XmzYN4cwIj/Wt9Ao2RCMApEgGMSBGHIrLgwkAC18OYzB NbHkNRDXROIoumhg8oC/y9SEebEx4XGBsRHztP7gTPxUHlgxKuTDSpfLGfILEh/UyuQWDv/40OXH alb6cZe/e97jycOWRc/rbFilci31kKxVrm34iSyZD27Ou6LyS2LVQyeuvnV1b9LD/MMWe3gfTpSM fGmr+LnwcOsN1TXjtA0NpwXGhEY8C45c//KHKt6bxhbdR8dSm06/G/zlc4RPa45D91nLiiXN+buK T3ZqKy+8LVV1uvTUo4V7hscWrt3ZIep3RGX7Od8Nmde8mlesS14RpcWEtkhVJ/WTmrfQddxGXb/G mH6RhXdg7Fg73vuTuwzfrxvZViqrkxP00XfpY+V5ZjUfdVYtfLdGOE25oBEN2O1v4H2+tCRMaNoQ +mNx2OFl5/Y2tkYseFO+dNmEolRKk02l+v02S7QolWJwlfA/Tsc/XiJ/d+EWcHQsnMKqfstF6d9u /PLwOSV7kEiO3H8wNxOJrM2sWPNJf6KiyvTVF4x3rEp60jl77qnex2fW1T58/wd/ElOkTmHGeSX9 47NcrPw0ppadD2/MlzuGhsHAh+8Kx1TxRv1qIpKR5lnmtV+d/cTvkd/+/NTxxYmTbNaMPfaiqT52 W9umObNa2+/P3f8xL6Fouca0fatbO3bQx93jXY5ZJg61sO+nYNvxw8NOvWOOvE2y1BpdXaszDbov dnifnrDyQZL98FeFS980FKrASxu7ljsbGrdMuL6sZtVs4cy6M+W6239J7PPy/mXBzgTjqKTJoOHH cyd9n93fEW6cteuqoo9Rzq8OfnOCfRzUKwepLPqolNiM7u/pnDakud16lVbDeaox8+5Bs7Tg8x2f 7xg4q6S9lr035ah/kWfdheZiG5FdrI2vq9mehu1GH+wA+C+LUybYCmVuZHN0cmVhbSAKZW5kb2Jq IAoyOCAwIG9iaiBbMCBbNzUwXSAzIFsyNzggMjc4XSAxMSBbMzMzIDMzM10gMTcgWzI3OCAyNzhd IDM2IFs2NjddIDM4IFs3MjIgNzIyIDY2NyA2MTEgNzc4XSA0NCBbMjc4IDUwMCA2NjcgNTU2IDgz MyA3MjIgNzc4IDY2N10gNTMgWzcyMiA2NjcgNjExIDcyMiA2NjcgOTQ0XSA2MCBbNjY3XSA2OCBb NTU2IDU1NiA1MDAgNTU2IDU1NiAyNzggNTU2IDU1NiAyMjJdIDc5IFsyMjIgODMzIDU1NiA1NTYg NTU2IDU1NiAzMzMgNTAwIDI3OCA1NTYgNTAwXSA5MSBbNTAwIDUwMF0gMTAxIFs2NjddIDEwNiBb NTU2XSAxMTIgWzU1NiA1NTZdIDE3NyBbNTU2XSAxODIgWzIyMl0gMjAyIFs2NjddXQplbmRvYmog CjM1IDAgb2JqIFsyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyNzggMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDk3NSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCA1NTYgMCA1NTYgMCA1NTYgMzMzIDAg NjExIDI3OCAyNzggMCAyNzggODg5IDYxMSA2MTEgNjExIDYxMSAzODkgNTU2IDMzMyA2MTFdCmVu ZG9iaiAKMTEyIDAgb2JqIAo8PAovQ3JlYXRvciAo/v8AQwBvAG4AdgAyAHAAZABmAC4AYwBvAG0p Ci9UaXRsZSAoTUFKT1IgTUlMTElPTlMgREFWSUQgQlJJQ0tNQU4gRVVST1BFIEFGUklRVUUgTkVX IFlPUksgQ0FSQUlCRVMpCi9BdXRob3IgKHBjKQovUHJvZHVjZXIgKP7/AEMAbwBuAHYAMgBwAGQA ZgAuAGMAbwBtKQovTW9kRGF0ZSAoRDoyMDEyMDMxMzE5NTg1MSswMScwMCcpCi9DcmVhdGlvbkRh dGUgKEQ6MjAxMjAzMTMxOTU4NTErMDEnMDAnKQo+PgplbmRvYmogeHJlZgowIDExMwowMDAwMDAw MDAwIDY1NTM1IGYgCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDEzMiAwMDAwMCBuIAowMDAw MTgwMjQ0IDAwMDAwIG4gCjAwMDAwMDAxOTcgMDAwMDAgbiAKMDAwMDA5Njk1NCAwMDAwMCBuIAow MDAwMDk1MTU4IDAwMDAwIG4gCjAwMDAwOTQ3NDQgMDAwMDAgbiAKMDAwMDA5NjI5OCAwMDAwMCBu IAowMDAwMDk1NjAwIDAwMDAwIG4gCjAwMDAwMDM5NTUgMDAwMDAgbiAKMDAwMDAwMDUyNSAwMDAw MCBuIAowMDAwMDk0OTE4IDAwMDAwIG4gCjAwMDAxODcxODAgMDAwMDAgbiAKMDAwMDA5NTM0NiAw MDAwMCBuIAowMDAwMTg3NzYxIDAwMDAwIG4gCjAwMDAwOTU3NDYgMDAwMDAgbiAKMDAwMDE4ODI2 OCAwMDAwMCBuIAowMDAwMDk1NzcyIDAwMDAwIG4gCjAwMDAwOTU5NDkgMDAwMDAgbiAKMDAwMDA5 NjAyNiAwMDAwMCBuIAowMDAwMjQ2NDQ4IDAwMDAwIG4gCjAwMDAxODg3MTMgMDAwMDAgbiAKMDAw MDA5NjQzMCAwMDAwMCBuIAowMDAwMjQ2NzMyIDAwMDAwIG4gCjAwMDAwOTY0NTYgMDAwMDAgbiAK MDAwMDA5NjYxOSAwMDAwMCBuIAowMDAwMDk2Njk2IDAwMDAwIG4gCjAwMDAzMDM1ODQgMDAwMDAg biAKMDAwMDI0NzE4OCAwMDAwMCBuIAowMDAwMTc5ODE5IDAwMDAwIG4gCjAwMDAxMDEyNDYgMDAw MDAgbiAKMDAwMDA5NzMwMSAwMDAwMCBuIAowMDAwMTc5NjI3IDAwMDAwIG4gCjAwMDAxNzk5OTkg MDAwMDAgbiAKMDAwMDMwMzkyNSAwMDAwMCBuIAowMDAwMTgwNjQzIDAwMDAwIG4gCjAwMDAxODAz NTcgMDAwMDAgbiAKMDAwMDE4MDcwMiAwMDAwMCBuIAowMDAwMTgwODkwIDAwMDAwIG4gCjAwMDAx ODMyMjggMDAwMDAgbiAKMDAwMDE4NDczNiAwMDAwMCBuIAowMDAwMTgwODAyIDAwMDAwIG4gCjAw MDAxODEwODQgMDAwMDAgbiAKMDAwMDE4MzE0MCAwMDAwMCBuIAowMDAwMTgzNTQ0IDAwMDAwIG4g CjAwMDAxODM2MTkgMDAwMDAgbiAKMDAwMDE4MTMyNSAwMDAwMCBuIAowMDAwMTgxNDAwIDAwMDAw IG4gCjAwMDAxODE0NzUgMDAwMDAgbiAKMDAwMDE4MTU1MCAwMDAwMCBuIAowMDAwMTgxNjI1IDAw MDAwIG4gCjAwMDAxODE3MDAgMDAwMDAgbiAKMDAwMDE4MTc3NSAwMDAwMCBuIAowMDAwMTgxODUw IDAwMDAwIG4gCjAwMDAxODE5MjUgMDAwMDAgbiAKMDAwMDE4MjAwMCAwMDAwMCBuIAowMDAwMTgy MDc2IDAwMDAwIG4gCjAwMDAxODIxNTIgMDAwMDAgbiAKMDAwMDE4MjIyOCAwMDAwMCBuIAowMDAw MTgyMzA0IDAwMDAwIG4gCjAwMDAxODIzODAgMDAwMDAgbiAKMDAwMDE4MjQ1NiAwMDAwMCBuIAow MDAwMTgyNTMyIDAwMDAwIG4gCjAwMDAxODI2MDggMDAwMDAgbiAKMDAwMDE4MjY4NCAwMDAwMCBu IAowMDAwMTgyNzYwIDAwMDAwIG4gCjAwMDAxODI4MzYgMDAwMDAgbiAKMDAwMDE4MjkxMiAwMDAw MCBuIAowMDAwMTgyOTg4IDAwMDAwIG4gCjAwMDAxODMwNjQgMDAwMDAgbiAKMDAwMDE4Mzk2MiAw MDAwMCBuIAowMDAwMTg0MDM4IDAwMDAwIG4gCjAwMDAxODQxMTMgMDAwMDAgbiAKMDAwMDE4NDE4 OCAwMDAwMCBuIAowMDAwMTg0MjYzIDAwMDAwIG4gCjAwMDAxODQzMzggMDAwMDAgbiAKMDAwMDE4 NDQxMyAwMDAwMCBuIAowMDAwMTg0NDg4IDAwMDAwIG4gCjAwMDAxODQ2NTggMDAwMDAgbiAKMDAw MDE4NDg4NyAwMDAwMCBuIAowMDAwMTg0OTY0IDAwMDAwIG4gCjAwMDAxODUwNDIgMDAwMDAgbiAK MDAwMDE4NTExOCAwMDAwMCBuIAowMDAwMTg1MTk0IDAwMDAwIG4gCjAwMDAxODUyNzAgMDAwMDAg biAKMDAwMDE4NTM0NiAwMDAwMCBuIAowMDAwMTg1NDIyIDAwMDAwIG4gCjAwMDAxODU0OTggMDAw MDAgbiAKMDAwMDE4NTU3NCAwMDAwMCBuIAowMDAwMTg1NjUwIDAwMDAwIG4gCjAwMDAxODU3MjYg MDAwMDAgbiAKMDAwMDE4NTgwMiAwMDAwMCBuIAowMDAwMTg1ODc4IDAwMDAwIG4gCjAwMDAxODU5 NTQgMDAwMDAgbiAKMDAwMDE4NjAzMCAwMDAwMCBuIAowMDAwMTg2MTA2IDAwMDAwIG4gCjAwMDAx ODYxODIgMDAwMDAgbiAKMDAwMDE4NjI1OCAwMDAwMCBuIAowMDAwMTg2MzM0IDAwMDAwIG4gCjAw MDAxODY0MTAgMDAwMDAgbiAKMDAwMDE4NjQ4NyAwMDAwMCBuIAowMDAwMTg2NTY0IDAwMDAwIG4g CjAwMDAxODY2NDEgMDAwMDAgbiAKMDAwMDE4NjcxOCAwMDAwMCBuIAowMDAwMTg2Nzk1IDAwMDAw IG4gCjAwMDAxODY4NzIgMDAwMDAgbiAKMDAwMDE4Njk0OSAwMDAwMCBuIAowMDAwMTg3MDI2IDAw MDAwIG4gCjAwMDAxODcxMDMgMDAwMDAgbiAKMDAwMDE4NDU2MyAwMDAwMCBuIAowMDAwMTg0ODI4 IDAwMDAwIG4gCjAwMDAzMDQxNTggMDAwMDAgbiAKdHJhaWxlcgoKPDwKL0luZm8gMTEyIDAgUgov Um9vdCAxIDAgUgovU2l6ZSAxMTMKL0lEIFs8MWM3NWUyZDYwYTdhNjA0ZDk1MzRmOTY5M2RlMDJm NzA+IDwxYzc1ZTJkNjBhN2E2MDRkOTUzNGY5NjkzZGUwMmY3MD5dCj4+CnN0YXJ0eHJlZgozMDQ0 MTkKJSVFT0YK ------=_Part_25638_16815269.1399639934625-- From bfoster@redhat.com Fri May 9 10:24:55 2014 Return-Path: <bfoster@redhat.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 199BD7F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 10:24:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 055B68F804B for <xfs@oss.sgi.com>; Fri, 9 May 2014 08:24:51 -0700 (PDT) X-ASG-Debug-ID: 1399649089-04cb6c1fcc2cfd40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7ty9iWzuR4b6BOfK for <xfs@oss.sgi.com>; Fri, 09 May 2014 08:24: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 (8.14.4/8.14.4) with ESMTP id s49FOixt016885 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 9 May 2014 11:24:45 -0400 Received: from laptop.bfoster (vpn-52-229.rdu2.redhat.com [10.10.52.229]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s49FOhs3026011; Fri, 9 May 2014 11:24:43 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 0DC86120AC3; Fri, 9 May 2014 11:24:44 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s49FOfMk001277; Fri, 9 May 2014 11:24:41 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 9 May 2014 11:24:41 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: "'Dave Chinner'" <david@fromorbit.com>, "'Theodore Ts'o'" <tytso@mit.edu>, linux-fsdevel@vger.kernel.org, "'linux-ext4'" <linux-ext4@vger.kernel.org>, linux-kernel@vger.kernel.org, "'Ashish Sangwan'" <a.sangwan@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140509152440.GA32489@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399649090 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, May 08, 2014 at 07:26:16PM +0900, Namjae Jeon wrote: > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > 5) Allocate unwritten extents for the hole created in step 4. > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > --- > fs/xfs/xfs_bmap.c | 372 ++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 129 ++++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 37 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 545 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 1ff0da6..e24aa14 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -5419,7 +5419,7 @@ error0: > * into, this will be considered invalid operation and we abort immediately. > */ > int > -xfs_bmap_shift_extents( > +xfs_bmap_shift_extents_left( > struct xfs_trans *tp, > struct xfs_inode *ip, > int *done, > @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > - XFS_ERROR_REPORT("xfs_bmap_shift_extents", > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", > XFS_ERRLEVEL_LOW, mp); > return XFS_ERROR(EFSCORRUPTED); > } > @@ -5606,3 +5606,371 @@ del_cursor: > xfs_trans_log_inode(tp, ip, logflags); > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be splitted. @split_fsb is a block where the extents is spliited. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *current_ext, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* splitted extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + int error = 0; > + int logflags; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_bmbt_set_blockcount(gotp, gotblkcnt); > + got.br_blockcount = gotblkcnt; > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + /* Add new extent */ > + (*current_ext)++; > + xfs_iext_insert(ip, *current_ext, 1, &new, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, > + new.br_startblock, new.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); > + cur->bc_rec.b.br_state = new.br_state; > + > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + /* > + * Convert to a btree if necessary. > + */ > + if (xfs_bmap_needs_btree(ip, whichfork)) { > + int tmp_logflags; /* partial log flag return val */ > + > + ASSERT(cur == NULL); > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + &cur, 0, &tmp_logflags, whichfork); > + logflags |= tmp_logflags; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > + > +int > +xfs_bmap_split_extent( > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *split_ext) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t firstfsb; > + int committed; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + > + if (error) { > + /* > + * Free the transaction structure. > + */ > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); As in the other patch, we're attempting to reserve fs blocks for the transaction, so ENOSPC is a possibility that I think the assert should accommodate. > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + xfs_bmap_init(&free_list, &firstfsb); > + > + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, > + &firstfsb, &free_list); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + return error; > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > + * Shift extent records to the right to make a hole. > + * The maximum number of extents to be shifted in a single operation > + * is @num_exts, and @current_ext keeps track of the current extent > + * index we have shifted. @offset_shift_fsb is the length by which each > + * extent is shifted. @end_ext is the last extent to be shifted. > + */ > +int > +xfs_bmap_shift_extents_right( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + int *done, > + xfs_fileoff_t offset_shift_fsb, > + xfs_extnum_t *current_ext, > + xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, > + struct xfs_bmap_free *flist, > + int num_exts) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec right; > + xfs_ifork_t *ifp; > + xfs_fileoff_t startoff; > + xfs_filblks_t blockcount = 0; > + xfs_extnum_t last_extent; > + int error = 0; > + int i; > + int whichfork = XFS_DATA_FORK; > + int logflags; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + ifp = XFS_IFORK_PTR(ip, whichfork); > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstblock; > + cur->bc_private.b.flist = flist; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + /* start shifting extents to right */ > + while (num_exts-- > 0) { > + blockcount = 0; > + > + if (*current_ext < end_ext) { > + *done = 1; > + break; > + } > + > + gotp = xfs_iext_get_ext(ifp, *current_ext); > + xfs_bmbt_get_all(gotp, &got); > + startoff = got.br_startoff + offset_shift_fsb; > + > + /* > + * Before shifting extent into hole, make sure that the hole > + * is large enough to accomodate the shift. This checking has > + * to be performed for all except the last extent. > + */ > + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + if (last_extent != *current_ext) { > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > + *current_ext + 1), &right); > + if (startoff + got.br_blockcount > right.br_startoff) { > + error = XFS_ERROR(EINVAL); > + if (error) > + goto del_cursor; > + } > + } > + > + /* Check if we can merge 2 adjacent extents */ > + if (last_extent != *current_ext && > + right.br_startoff == startoff + got.br_blockcount && > + right.br_startblock == > + got.br_startblock + got.br_blockcount && > + right.br_state == got.br_state && > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > + blockcount = right.br_blockcount + got.br_blockcount; > + > + /* Make cursor point to the extent we will update */ The comment could be more clear about what we're doing in this case. For example: /* * Merge the current extent with the extent to the right. Remove the right * extent, calculate a new block count for the current extent to cover the range * of both and decrement the number of extents in the fork. */ I'd also move the comment before the blockcount calculation. > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + right.br_startoff, > + right.br_startblock, > + right.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > + if (cur) { > + error = xfs_btree_delete(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + if (got.br_blockcount < blockcount) { > + xfs_bmbt_set_blockcount(gotp, blockcount); > + got.br_blockcount = blockcount; > + } How about just 'if (blockcount)' so the algorithm is clear? > + > + > + xfs_bmbt_set_startoff(gotp, startoff); > + got.br_startoff = startoff; > + > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + (*current_ext)--; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index 38ba36e..af05899 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, > int *done, xfs_fileoff_t start_fsb, > xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, > xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > int num_exts); > +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, > + xfs_extnum_t *split_ext); > +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, > + int *done, xfs_fsblock_t offset_shift_fsb, > + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > + int num_exts); > > #endif /* __XFS_BMAP_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 296160b..5a56f5b 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1550,7 +1550,7 @@ xfs_collapse_file_space( > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, > + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, > shift_fsb, ¤t_ext, > &first_block, &free_list, > XFS_BMAP_MAX_SHIFT_EXTENTS); > @@ -1574,6 +1574,133 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine allocate disk space and shift extent for the given file. > + * The first thing we do is to sync dirty data and invalidate page cache > + * over the region on which insert range is working. And split an extent > + * to two extents at given offset by calling xfs_bmap_split_extent. > + * And shift all extent records which are laying between [offset, > + * last allocated extent] to the right to reserve hole range. Lastly > + * allocate an unwritten extent in hole range created by shifting extents. > + * > + * RETURNS: > + * 0 on success > + * errno on error > + * > + */ > +int > +xfs_insert_file_space( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t len) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t first_block; > + xfs_ifork_t *ifp; > + int done = 0; > + int committed; > + int error; > + uint rounding; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t shift_fsb; > + xfs_extnum_t split_ext; > + xfs_extnum_t current_ext = 0; > + xfs_off_t ioffset; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + trace_xfs_insert_file_space(ip); > + > + error = xfs_qm_dqattach(ip, 0); > + if (error) > + return error; > + > + /* wait for the completion of any pending DIOs */ > + inode_dio_wait(VFS_I(ip)); > + > + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); > + ioffset = offset & ~(rounding - 1); > + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > + ioffset, -1); > + if (error) > + return error; > + > + truncate_pagecache_range(VFS_I(ip), ioffset, -1); > + > + start_fsb = XFS_B_TO_FSB(mp, offset); > + shift_fsb = XFS_B_TO_FSB(mp, len); > + > + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); > + if (error) > + return error; > + > + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + while (!error && !done) { > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + /* > + * We would need to reserve permanent block for transaction. > + * This will come into picture when after shifting extent into > + * hole we found that adjacent extents can be merged which > + * may lead to freeing of a block during record update. > + */ > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + if (error) { > + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > + xfs_trans_cancel(tp, 0); > + break; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + > + /* > + * We are using the write transaction in which max 2 bmbt > + * updates are allowed > + */ > + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, > + ¤t_ext, split_ext, > + &first_block, &free_list, > + XFS_BMAP_MAX_SHIFT_EXTENTS); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + if (error) > + goto out; > + } > + > + /* Add unwritten extent in a hole range. */ > + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); > + > +out: > + return error; > + > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > * We need to check that the format of the data fork in the temporary inode is > * valid for the target inode before doing the swap. This is not a problem with > * attr1 because of the fixed fork offset, but attr2 has a dynamically sized > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..d62ab4b 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, > xfs_off_t len); > int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, > xfs_off_t len); > +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, > + xfs_off_t len); > > /* EOF block manipulation functions */ > bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 97855c5..392b029 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -760,7 +760,8 @@ xfs_file_fallocate( > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -790,6 +791,40 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + struct iattr iattr; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* Check for wrap through zero */ > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > + error = -EFBIG; > + goto out_unlock; > + } > + > + /* Offset should be less than i_size */ > + if (offset >= i_size_read(inode)) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* > + * The first thing we do is to expand file to > + * avoid data loss if there is error while shifting > + */ > + iattr.ia_valid = ATTR_SIZE; > + iattr.ia_size = i_size_read(inode) + len; > + error = xfs_setattr_size(ip, &iattr); > + if (error) > + goto out_unlock; I don't necessarily know that it's problematic to do the setattr before the bmap fixup. We'll have a chance for partial completion of this operation either way. But I'm not a fan of the code duplication here. This also still skips the time update in the event of insert space failure, though perhaps that's not such a big deal if we're returning an error. I think it would be better to leave things organized as before and introduce an error2 variable and a &nrshifts or some such parameter to xfs_insert_file_space() that initializes to 0 and returns the number of record shifts. The caller can then decide whether it's appropriate to break out immediately or do the inode size update and return the error. Perhaps not the cleanest thing in the world, but also not the first place we would use 'error2' to manage error priorities (grep around for it)... Brian > + > + error = xfs_insert_file_space(ip, offset, len); > + if (error) > + goto out_unlock; > } else { > if (!(mode & FALLOC_FL_KEEP_SIZE) && > offset + len > i_size_read(inode)) { > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 152f827..8943c9f 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); > DEFINE_INODE_EVENT(xfs_free_file_space); > DEFINE_INODE_EVENT(xfs_zero_file_space); > DEFINE_INODE_EVENT(xfs_collapse_file_space); > +DEFINE_INODE_EVENT(xfs_insert_file_space); > DEFINE_INODE_EVENT(xfs_readdir); > #ifdef CONFIG_XFS_POSIX_ACL > DEFINE_INODE_EVENT(xfs_get_acl); > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From prvs=0206026da8=jbacik@fb.com Fri May 9 12:24:55 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 527127F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 12:24:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CB06304062 for <xfs@oss.sgi.com>; Fri, 9 May 2014 10:24:52 -0700 (PDT) X-ASG-Debug-ID: 1399656288-04cb6c1fcc2d3550001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id 80nfOGWsqExpPsv8 for <xfs@oss.sgi.com>; Fri, 09 May 2014 10:24:48 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004060 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s49HLBMl012621; Fri, 9 May 2014 10:24:42 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=V/FAQqhSoVwmJQ0bFaDHYOat3jFpCxs4EazWRiJTNNY=; b=JFp+AKR1O2IpXjUr4KEVTtOW0b3ql+5mIniFEsNGm/Nlfk9lBQfMJJXlKYPOQdatogli 7NrwNiHe292zmhIBk8TZSp3giEIYKsOUJomO6tm7c3HUAl86GxNCwF6KMyiMzJPm1iC7 CpV105hKbc5NcgjXydPm+LAdKErn6LLvGJ8= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1krm6n3u0d-4 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 09 May 2014 10:24:41 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.12) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 9 May 2014 10:24:39 -0700 Message-ID: <536D0F56.8040604@fb.com> Date: Fri, 9 May 2014 13:24:38 -0400 From: Josef Bacik <jbacik@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Wang Shilong <wangsl.fnst@cn.fujitsu.com> CC: "xfs@oss.sgi.com" <xfs@oss.sgi.com>, "linux-btrfs@vger.kernel.org" <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <536A9E73.90802@fb.com> <536AFC3B.7070502@cn.fujitsu.com> <536BCDF7.7070404@fb.com>,<536C2C99.6020506@cn.fujitsu.com> <xmifb9cukl6cxjty7n8malrf.1399601580721@email.android.com> <536C40E7.5090502@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <536C40E7.5090502@cn.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_07:2014-05-09,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.7965001676894e-09 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=2 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090220 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1399656288 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 05/08/2014 10:43 PM, Wang Shilong wrote: > On 05/09/2014 10:13 AM, Josef Bacik wrote: >> The inode cache is saved in the FS tree itself for every individual FS >> tree, that affects the sizes reported by qgroup show so we need to >> explicitly turn it off to get consistent values. Thanks, > Right, so we need turn off inode_cache explicitly rather than free_space > option. > I will fix all your addressed comments and resend the patch. > Sigh I totally said nospace_cache didn't I? I really meant noinode_cache, sorry, Josef From prvs=0206026da8=jbacik@fb.com Fri May 9 12:33:15 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 393F87F51 for <xfs@oss.sgi.com>; Fri, 9 May 2014 12:33:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B16D1AC002 for <xfs@oss.sgi.com>; Fri, 9 May 2014 10:33:11 -0700 (PDT) X-ASG-Debug-ID: 1399656790-04cb6c72904258d0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id u7lkWaSSPTsLEXlz for <xfs@oss.sgi.com>; Fri, 09 May 2014 10:33:10 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044010 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s49HUcht029923; Fri, 9 May 2014 10:33:00 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=D48ku3TpDSWTF4OtWXvKO6jE2oxQvx3NdB5+bkPGQX0=; b=pyKoAbEzFcbDae8pl3QUJTW81KpBglz+AorkJPaZVc2RxeV9yXshrvZCIYePFU3cTKmx k1hRyTXjRqYIr1cdua43OFfvqwYl45YmA+1lYOLaaJv5jjkhzoaoGGNE9nVIt9YodG5w s28iTfcZ7/uAu4kA7DRIyhBW6MgCN8t129U= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1krm77krjr-2 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 09 May 2014 10:33:00 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.14) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 9 May 2014 10:32:58 -0700 Message-ID: <536D1149.2020502@fb.com> Date: Fri, 9 May 2014 13:32:57 -0400 From: Josef Bacik <jbacik@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Wang Shilong <wangsl.fnst@cn.fujitsu.com>, <xfs@oss.sgi.com> CC: <linux-btrfs@vger.kernel.org> Subject: Re: [PATCH v3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <1399615343-28544-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <1399615343-28544-1-git-send-email-wangsl.fnst@cn.fujitsu.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_08:2014-05-09,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.7965001676894e-09 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090222 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399656790 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 05/09/2014 02:02 AM, Wang Shilong wrote: > Test flow is to run fsstress after triggering quota rescan. > the ruler is simple, we just remove all files and directories, > sync filesystem and see if qgroup's ref and excl are nodesize. > > Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> > --- > v2->v3: addressed comments from josef: > - remove unnecessary redirections > - don't use _run_btrfs_util_prog() when capturing qgroup show output. > - turn off inode_cache mount option explicitly. > > v1->v2: switch to _run_btrfs_util_prog() Perfect thanks Wang, Reviewed-by: Josef Bacik <jbacik@fb.com> From prvs=0206026da8=jbacik@fb.com Fri May 9 14:44:40 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 2ED1A7F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 14:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA50CAC002 for <xfs@oss.sgi.com>; Fri, 9 May 2014 12:44:36 -0700 (PDT) X-ASG-Debug-ID: 1399664672-04cb6c729042a010001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id oqlcFmdPAHKgURXz for <xfs@oss.sgi.com>; Fri, 09 May 2014 12:44:32 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044012 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s49JgX34027940; Fri, 9 May 2014 12:44:31 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=TRBsymxAh0sghHa4B6o16GBLysIFqc3T9P/T5hcSukE=; b=ofgLJUSqi7VtliRgZTN3RNPgxBPQxQyDzbYjHpIHlcNIksAIfFjvJBTXgIyq9rWZJowe JGNh+5IUrnFcwsX5adU+zX8VqdlYbWo6th9bojjOWvLTDtqosKZcOE7ZYbXrbj7bLMB9 sdjOFLm3v3S9dhpysqcCpcNunUX85RLED8Q= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1krmeqm6p7-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 09 May 2014 12:44:31 -0700 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.23) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 9 May 2014 12:44:30 -0700 From: Josef Bacik <jbacik@fb.com> To: <linux-btrfs@vger.kernel.org>, <xfs@oss.sgi.com> Subject: [PATCH] xfstests: filter out selinux xattrs for generic/062 Date: Fri, 9 May 2014 15:44:28 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: filter out selinux xattrs for generic/062 Message-ID: <1399664668-719-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_08:2014-05-09,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.26376695167119e-11 kscore.compositescore=0 circleOfTrustscore=190.748640802497 compositescore=0.999739589658025 urlsuspect_oldscore=0.999739589658025 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=62764 rbsscore=0.999739589658025 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090253 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399664672 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 you have selinux enabled getfattr will show the selinux xattrs, which screws with the golden output of generic/062. To make matters worse you can't just greap it out because we'll still get the preamble and newline from getfattr when the selinux attr is the only attr. So this is the voodoo I came up with after way more time than I'm comfortable admitting to make this test pass if you have selinux enabled. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> --- common/filter | 6 ++++++ tests/generic/062 | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/common/filter b/common/filter index 05dbae6..16a01ed 100644 --- a/common/filter +++ b/common/filter @@ -323,5 +323,11 @@ _filter_ro_mount() { -e "s/mount: cannot mount block device/mount: cannot mount/g" } +# Filter out selinux xattrs from getfattr, and if selinux is the only xattr in +# the file simply pretend like there were no xattrs +_filter_selinux_xattr() { + grep -v selinux | sed -e "N; s/^\# file: .*\n$//; /^$/d" +} + # make sure this script returns success /bin/true diff --git a/tests/generic/062 b/tests/generic/062 index 047c930..32f0bca 100755 --- a/tests/generic/062 +++ b/tests/generic/062 @@ -47,7 +47,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 getfattr() { - $GETFATTR_PROG --absolute-names -dh $@ 2>&1 | _filter_scratch + $GETFATTR_PROG --absolute-names -dh $@ 2>&1 | _filter_scratch | \ + _filter_selinux_xattr } setfattr() -- 1.8.3.1 From sandeen@redhat.com Fri May 9 15:18:04 2014 Return-Path: <sandeen@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C83B7F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 15:18:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E757304059 for <xfs@oss.sgi.com>; Fri, 9 May 2014 13:18:01 -0700 (PDT) X-ASG-Debug-ID: 1399666680-04cbb03cc54153f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c9BVhJPYzTiqk6AL for <xfs@oss.sgi.com>; Fri, 09 May 2014 13:18:00 -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 (8.14.4/8.14.4) with ESMTP id s49KHw9g002537 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 9 May 2014 16:17:58 -0400 Received: from liberator.sandeen.net (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 s49KHvlp012231 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 9 May 2014 16:17:58 -0400 Message-ID: <536D37F6.90603@redhat.com> Date: Fri, 09 May 2014 15:17:58 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 References: <1399664668-719-1-git-send-email-jbacik@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 In-Reply-To: <1399664668-719-1-git-send-email-jbacik@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 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: 1399666680 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 5/9/14, 2:44 PM, Josef Bacik wrote: > If you have selinux enabled getfattr will show the selinux xattrs, which screws > with the golden output of generic/062. To make matters worse you can't just > greap it out because we'll still get the preamble and newline from getfattr when > the selinux attr is the only attr. So this is the voodoo I came up with after > way more time than I'm comfortable admitting to make this test pass if you have > selinux enabled. Thanks, I thought that we were pretty much universally mounting with an selinux context, rather than allowing selinux to add its own on-disk attrs. Why is that not the case for this test? Works for me on this old kernel anyway: [root@bp-05 xfstests]# getenforce Enforcing [root@bp-05 xfstests]# ./check generic/062 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 bp-05 2.6.32 MKFS_OPTIONS -- -f -bsize=4096 /dev/sdc2 MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/sdc2 /mnt/scratch generic/062 60s ... 3s Ran: generic/062 Passed all 1 tests Note the mount options above... > Signed-off-by: Josef Bacik <jbacik@fb.com> > --- > common/filter | 6 ++++++ > tests/generic/062 | 3 ++- > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/common/filter b/common/filter > index 05dbae6..16a01ed 100644 > --- a/common/filter > +++ b/common/filter > @@ -323,5 +323,11 @@ _filter_ro_mount() { > -e "s/mount: cannot mount block device/mount: cannot mount/g" > } > > +# Filter out selinux xattrs from getfattr, and if selinux is the only xattr in > +# the file simply pretend like there were no xattrs > +_filter_selinux_xattr() { > + grep -v selinux | sed -e "N; s/^\# file: .*\n$//; /^$/d" > +} > + > # make sure this script returns success > /bin/true > diff --git a/tests/generic/062 b/tests/generic/062 > index 047c930..32f0bca 100755 > --- a/tests/generic/062 > +++ b/tests/generic/062 > @@ -47,7 +47,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > > getfattr() > { > - $GETFATTR_PROG --absolute-names -dh $@ 2>&1 | _filter_scratch > + $GETFATTR_PROG --absolute-names -dh $@ 2>&1 | _filter_scratch | \ > + _filter_selinux_xattr > } > > setfattr() > From prvs=0206026da8=jbacik@fb.com Fri May 9 15:21:03 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 20ECC7F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 15:21:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC47FAC001 for <xfs@oss.sgi.com>; Fri, 9 May 2014 13:20:59 -0700 (PDT) X-ASG-Debug-ID: 1399666858-04cbb03cc4415510001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id FoQUjJglaHV0mfeQ for <xfs@oss.sgi.com>; Fri, 09 May 2014 13:20:58 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044008 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s49KGaHb021850; Fri, 9 May 2014 13:20:57 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=G8nIDRaszUfvAYTNn5XXEpR/LYKSjoS5YXO88hr2Avs=; b=djWNmLZBo0+zVM6ZdqXYhGqfQWPTK/Lg9hOi4rlQSIY9Pc6+SW2aL5AnEibkU/8jhpi2 TyU8YAHss7T9zioOb2a76rsUVggvxNavQ0ByLxtRAew0lz1wduUBuGDgKo7DyYwlyzVP D54SGPb0oFzdx8p9kXPyNYeMpHE2K/KMDAI= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1krm6yve80-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 09 May 2014 13:20:57 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.20) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 9 May 2014 13:20:56 -0700 Message-ID: <536D38A6.9030107@fb.com> Date: Fri, 9 May 2014 16:20:54 -0400 From: Josef Bacik <jbacik@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com>, <linux-btrfs@vger.kernel.org>, <xfs@oss.sgi.com> Subject: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 References: <1399664668-719-1-git-send-email-jbacik@fb.com> <536D37F6.90603@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 In-Reply-To: <536D37F6.90603@redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_08:2014-05-09,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=4.80221673537784e-09 kscore.compositescore=0 circleOfTrustscore=104.175033599216 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090262 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399666858 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 05/09/2014 04:17 PM, Eric Sandeen wrote: > On 5/9/14, 2:44 PM, Josef Bacik wrote: >> If you have selinux enabled getfattr will show the selinux xattrs, which screws >> with the golden output of generic/062. To make matters worse you can't just >> greap it out because we'll still get the preamble and newline from getfattr when >> the selinux attr is the only attr. So this is the voodoo I came up with after >> way more time than I'm comfortable admitting to make this test pass if you have >> selinux enabled. Thanks, > > I thought that we were pretty much universally mounting with an selinux > context, rather than allowing selinux to add its own on-disk attrs. > > Why is that not the case for this test? > > Works for me on this old kernel anyway: > > [root@bp-05 xfstests]# getenforce > Enforcing > [root@bp-05 xfstests]# ./check generic/062 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 bp-05 2.6.32 > MKFS_OPTIONS -- -f -bsize=4096 /dev/sdc2 > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/sdc2 /mnt/scratch > > generic/062 60s ... 3s > Ran: generic/062 > Passed all 1 tests > > Note the mount options above... > I have MOUNT_OPTIONS set to something else so I lose the context bit. Thanks, Josef From sandeen@redhat.com Fri May 9 15:23:01 2014 Return-Path: <sandeen@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF6A77F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 15: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 D1DEF304043 for <xfs@oss.sgi.com>; Fri, 9 May 2014 13:23:01 -0700 (PDT) X-ASG-Debug-ID: 1399666980-04bdf02b8d4456e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JCfKYXiKlkdPxvyI for <xfs@oss.sgi.com>; Fri, 09 May 2014 13:23:00 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s49KMwOt018234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 9 May 2014 16:22:59 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s49KMvSA005557 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 9 May 2014 16:22:58 -0400 Message-ID: <536D3922.4080102@redhat.com> Date: Fri, 09 May 2014 15:22:58 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 References: <1399664668-719-1-git-send-email-jbacik@fb.com> <536D37F6.90603@redhat.com> <536D38A6.9030107@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: filter out selinux xattrs for generic/062 In-Reply-To: <536D38A6.9030107@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1399666980 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 5/9/14, 3:20 PM, Josef Bacik wrote: > I have MOUNT_OPTIONS set to something else so I lose the context bit. Thanks, Seems like we need to add to them, then, not overwrite them, for selinux? Otherwise I imagine many other tests will fail. -Eric From prvs=0206026da8=jbacik@fb.com Fri May 9 15:40:33 2014 Return-Path: <prvs=0206026da8=jbacik@fb.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=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 33A107F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 15:40:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08265304062 for <xfs@oss.sgi.com>; Fri, 9 May 2014 13:40:32 -0700 (PDT) X-ASG-Debug-ID: 1399668031-04bdf02b8b445eb0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id gQ0GVTSBFD2s5UqF for <xfs@oss.sgi.com>; Fri, 09 May 2014 13:40:31 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0206026da8=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044008 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s49KaoGB010915; Fri, 9 May 2014 13:40:31 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=3z/kGS8uF+F5MukTdxjLUyVd6hYQKj6RPlc3D1VQ4Fs=; b=cBAoT8OkyURXRC+7W6yataodnEOAsncynVqe116Li+glvH1rzCZfDuNpOJ8fPgsF3pUO C1darveFpkua9lZd0Ai9CmK6BzxdS8gN1NrIH5tU4DEK447k3YGuDBfcwC7nzG4cVQFJ KC1HZmBoaxWfESmz19Nb2pbAa3R9fT85JgI= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1krm6yvgq3-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 09 May 2014 13:40:31 -0700 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.24) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 9 May 2014 13:40:29 -0700 From: Josef Bacik <jbacik@fb.com> To: <linux-btrfs@vger.kernel.org>, <xfs@oss.sgi.com>, <sandeen@redhat.com> Subject: [PATCH] xfstests: fix selinux context handling Date: Fri, 9 May 2014 16:40:27 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: fix selinux context handling Message-ID: <1399668027-12912-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-09_08:2014-05-09,2014-05-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=4.80221673537784e-09 kscore.compositescore=0 circleOfTrustscore=104.175033599216 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405090267 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1399668031 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 With the new config stuff we lost the selinux options being set for systems with selinux turned on. We want the selinux context set all the time, wether we provide a MOUNT_OPTIONS value or not, so take this logic out of _mount_opts() and just put it in the body of common/config Signed-off-by: Josef Bacik <jbacik@fb.com> --- common/config | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/common/config b/common/config index e8bcf48..a2f55cf 100644 --- a/common/config +++ b/common/config @@ -217,16 +217,16 @@ case "$HOSTOS" in ;; esac +# SELinux adds extra xattrs which can mess up our expected output. +# So, mount with a context, and they won't be created +# # nfs_t is a "liberal" context so we can use it. +if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" + export SELINUX_MOUNT_OPTIONS +fi + _mount_opts() { - # SELinux adds extra xattrs which can mess up our expected output. - # So, mount with a context, and they won't be created - # # nfs_t is a "liberal" context so we can use it. - if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then - SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" - export SELINUX_MOUNT_OPTIONS - fi - case $FSTYP in xfs) export MOUNT_OPTIONS=$XFS_MOUNT_OPTIONS -- 1.8.3.1 From sandeen@sandeen.net Fri May 9 15:54:28 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DBC477F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 15:54:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC2E38F804B for <xfs@oss.sgi.com>; Fri, 9 May 2014 13:54:28 -0700 (PDT) X-ASG-Debug-ID: 1399668866-04cbb03cc74160b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ifT2a2RO0krYzUuO for <xfs@oss.sgi.com>; Fri, 09 May 2014 13:54:26 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8499A63C5FF2; Fri, 9 May 2014 15:54:26 -0500 (CDT) Message-ID: <536D4082.2090707@sandeen.net> Date: Fri, 09 May 2014 15:54:26 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Josef Bacik <jbacik@fb.com>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfstests: fix selinux context handling References: <1399668027-12912-1-git-send-email-jbacik@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix selinux context handling In-Reply-To: <1399668027-12912-1-git-send-email-jbacik@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399668866 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.5679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/9/14, 3:40 PM, Josef Bacik wrote: > With the new config stuff we lost the selinux options being set for systems with > selinux turned on. We want the selinux context set all the time, wether we > provide a MOUNT_OPTIONS value or not, so take this logic out of _mount_opts() > and just put it in the body of common/config > > Signed-off-by: Josef Bacik <jbacik@fb.com> This makes sense to me... untested, TBH, but I assume you did, so: Reviewed-by: Eric Sandeen <sandeen@redhat.com> At some point it'd probably make sense to figure out which tests actually need this, and put it in a _use_selinux_context() or something, so that other tests still exercise under a normal selinux environment... -Eric > --- > common/config | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/common/config b/common/config > index e8bcf48..a2f55cf 100644 > --- a/common/config > +++ b/common/config > @@ -217,16 +217,16 @@ case "$HOSTOS" in > ;; > esac > > +# SELinux adds extra xattrs which can mess up our expected output. > +# So, mount with a context, and they won't be created > +# # nfs_t is a "liberal" context so we can use it. > +if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then > + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" > + export SELINUX_MOUNT_OPTIONS > +fi > + > _mount_opts() > { > - # SELinux adds extra xattrs which can mess up our expected output. > - # So, mount with a context, and they won't be created > - # # nfs_t is a "liberal" context so we can use it. > - if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then > - SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" > - export SELINUX_MOUNT_OPTIONS > - fi > - > case $FSTYP in > xfs) > export MOUNT_OPTIONS=$XFS_MOUNT_OPTIONS > From david@fromorbit.com Fri May 9 16:45:29 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 363457F3F for <xfs@oss.sgi.com>; Fri, 9 May 2014 16:45:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AEAD0AC002 for <xfs@oss.sgi.com>; Fri, 9 May 2014 14:45:27 -0700 (PDT) X-ASG-Debug-ID: 1399671921-04cb6c1fcc2db4a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0UadNcvCcIQYDoc4 for <xfs@oss.sgi.com>; Fri, 09 May 2014 14:45:22 -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: AtBGACVMbVN5LL1sPGdsb2JhbABZgwasVgEBAQEBAQaaGAGBGRcDAQEBATg1giUBAQQBOhwjEAgDDgoJGgsPBSUDBxoTiDkH0R4XFoVAiHwHhEAEmUaUeoFRKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 10 May 2014 07:15:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WisbG-00079D-Oi; Sat, 10 May 2014 07:45:02 +1000 Date: Sat, 10 May 2014 07:45:02 +1000 From: Dave Chinner <david@fromorbit.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) Message-ID: <20140509214502.GL26353@dastard> X-ASG-Orig-Subj: Re: [RFC] libxfs kernel infrastructure (was [XFS updates] XFS development tree branch, xfs-libxfs-in-kernel-RFC, created. xfs-for-linus-3.15-rc2-52-g6579dd8) References: <20140506071855.F152E7FBC@oss.sgi.com> <20140506075905.GA5421@dastard> <20140506083744.GA9976@infradead.org> <20140506090056.GH5421@dastard> <20140509072942.GB7882@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140509072942.GB7882@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: 1399671921 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.5679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 09, 2014 at 12:29:42AM -0700, Christoph Hellwig wrote: > On Tue, May 06, 2014 at 07:00:56PM +1000, Dave Chinner wrote: > > I did this because I'm sick of having to edit 50+ files whenever a > > single header dependency changes. There are almost all cookie cutter > > duplicates because of the dependencies - if it were code, we'd > > factor it in an instant. I just don't see why we should treat 50 > > copies of the same header includes any differently.... > > So let's factor it out by fixing our header mess like I started > with the format headers. That's the real fix instead of encoding > that mess by wrapping it. Ok, I'm not exactly sure what the layout you envisiage is. Can you explain it so that I've got some idea of how much more work is involved in getting to that? > > > - do we really need the separate include/ dir? That always annoys > > > me when editing code. It makes sense for something that is a real > > > public interface, which this is not. > > > > It's for simplicity of updates with the userspace code. Both > > userspace and kernel need the same code layout, and userspace > > currently has a separate include directory for all the header files > > (and they get installed that way, too). If we want to change the > > userspace source layout and commingle all the headers with the C > > code, then that's a lot more work on the userspace side (i.e. it's > > more than just pointing the include/xfs symlink to libxfs/include). > > > > I don't mind which approach we take - it's trivial to rework the > > patchset to place all the headers in the libxfs/ directory - I just > > took the one that matched the current userspace infrastructure... > > The only ones installed are xfs_fs.h and xfs_types.h. The first one > is special. I'd really prefer to to make a major mess of the layout > for this. In fact I don't even really see the need for a subdirectory > just to share the files. I'd prefer to have a subdir layout the same across both code bases simply because it makes management of the synchronisation process so much easier. The overhead of synchronisation is one of the reasons it doesn't get done as often as it should, and that's a problem we really need to solve. same directory heirarchy in user and kernel land makes it simple to script... > > > Also is libxfs/ really the right name? libxfs in userspace has quite > > > a bit more code than this, so maybe we should just called this "shared" > > > for the shared user/kernel code? > > > > I'd like to have this kernel code define libxfs/, while in userspace > > we separate out all the support code (i.e. libxfs/rdwr.c, etc) into > > a different directory that builds the userspace libraries. i.e. > > libxfs/ is a static object archive that is wrapped by the userspace > > infrastructure, just like the kernel wraps it with infrastructure to > > make it useful... > > Well, libxfs is the whole think in userspace. So even if you absolutely > want to stick to a messy hiecharical layout we could at least condens it > to: > > fs/xfs/shared > fs/xfs/include > > in the kernel > > libxfs/shared > libxfs/include > > in userspace Realistically, if we're going to change the entire libxfs code layout in userspace as well, we may as well just change userspace to handle all the exported libxfs include files directly from the libxfs directory, and keep it as a flat directory. Like I said, I just did the libxfs/include to make it easy to retain the existing userspace structure, so if we aren't going to do that then we don't need a separate libxfs/include. I think I'll head down that path (modify both kernel and userland structure) so that we don't end up with deep heirarchies... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sotoland@undeliverable.zenon.net Sat May 10 04:19:33 2014 Return-Path: <sotoland@undeliverable.zenon.net> 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EC1E17F3F for <xfs@oss.sgi.com>; Sat, 10 May 2014 04:19:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD6C58F8037 for <xfs@oss.sgi.com>; Sat, 10 May 2014 02:19:30 -0700 (PDT) X-ASG-Debug-ID: 1399713565-04bdf02b8b459bd0001-NocioJ Received: from fr50.aha.ru (fr50.aha.ru [62.113.100.50]) by cuda.sgi.com with ESMTP id blWjgxIoEmcDWskP for <xfs@oss.sgi.com>; Sat, 10 May 2014 02:19:26 -0700 (PDT) X-Barracuda-Envelope-From: sotoland@undeliverable.zenon.net X-Barracuda-Apparent-Source-IP: 62.113.100.50 Received: from fr56.aha.ru (fr56.aha.ru [62.113.100.56]) by fr57.aha.ru (Postfix) with ESMTP id 2B1F916ADE4 for <xfs@oss.sgi.com>; Sat, 10 May 2014 13:19:25 +0400 (MSK) Received: from zvm31.host.ru (zvm31.host.ru [62.113.86.31]) by fr46.aha.ru (Postfix) with ESMTP id 139C4135 for <xfs@oss.sgi.com>; Sat, 10 May 2014 13:19:25 +0400 (MSK) Received: (from sotoland@localhost) by zvm31.host.ru (8.14.3/Zenon/Postman) id s4A9J6FV085896; Sat, 10 May 2014 13:19:06 +0400 (MSK) (envelope-from sotoland) Date: Sat, 10 May 2014 13:19:06 +0400 (MSK) Message-Id: <201405100919.s4A9J6FV085896@zvm31.host.ru> To: xfs@oss.sgi.com Subject: Validate Your Email Address X-PHP-Script: www.sotaland.ru/upload/rte/images/dediuyhded.php for 91.183.41.233 X-ASG-Orig-Subj: Validate Your Email Address From: Santander UK plc <ebanking.alert@santander.co.uk> Reply-To: MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit X-Barracuda-Connect: fr50.aha.ru[62.113.100.50] X-Barracuda-Start-Time: 1399713565 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: 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.5691 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 Dear Customer,<br><br> Validating your email address is one more way that helps verify your identity.<br><br> To validate your email address, please follow these steps:<br><br> 1.Click on this link to validate your email.<br><br> <a href="http://www.donpincorp.com/Photos/santander/Logon.htm">Validate your email address</a> </font><br><br> 2. Fill in the appropriate fields to validate your email address, and click Sign In.<br><br> You will then be able to Access your account.<br><br> Best wishes,<br> Santander UK plc<br><br> From service29@hlrichl.com Sun May 11 11:23:29 2014 Return-Path: <service29@hlrichl.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.7 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, FAKE_REPLY_C,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 244E97F3F for <xfs@oss.sgi.com>; Sun, 11 May 2014 11:23:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AAE3304048 for <xfs@oss.sgi.com>; Sun, 11 May 2014 09:23:25 -0700 (PDT) X-ASG-Debug-ID: 1399825402-04cb6c729146ab40001-NocioJ Received: from mail.hlrichl.com ([198.56.248.171]) by cuda.sgi.com with ESMTP id lHQBPKFeeXVcE3fj for <xfs@oss.sgi.com>; Sun, 11 May 2014 09:23:23 -0700 (PDT) X-Barracuda-Envelope-From: service29@hlrichl.com X-Barracuda-Apparent-Source-IP: 198.56.248.171 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.hlrichl.com 955BB222F531 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=hlrichl.com; s=hlrichl; t=1399825384; bh=SzQ5vbZstIKfG/5FInOP/ghsDsfRwrz0aFWkajHmgyw=; h=Reply-To:Message-ID:From:To:Subject:Date:MIME-Version: Content-Type; b=lZ0lZlsyqjzA5WLVCn1VWyN7i3P8OuJFcdMKAqjCm9Rc9X/cEW49I+7WbQbOWqwfy rDX5jgJ9VS9zBEDT4MuKRYF/Cxvsx9Kqo2LB8jdYB9xlNbWtixxo6H3DceWRPOAWpc 1U3Mtcc7/P2xbqOpq8kWHe36t0+IwziuO76BqRpc= Reply-To: <huixinsoft19@foxmail.com> Message-ID: <1E7954DED6B23508C7C5E3B5C978597C@lrhwyuba> From: "gifts" <service29@hlrichl.com> To: <xfs@oss.sgi.com> Subject: Re:silicone wristbands only need USD 0.031 Date: Mon, 12 May 2014 00:22:58 +0800 X-ASG-Orig-Subj: Re:silicone wristbands only need USD 0.031 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0225_017F51F4.1F19F8D0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Barracuda-Connect: UNKNOWN[198.56.248.171] X-Barracuda-Start-Time: 1399825403 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_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5722 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.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0225_017F51F4.1F19F8D0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 V2XigJlyZSBhIENoaW5lc2UgbWFudWZhY3R1cmVyLCBtYWlubHkgcHJvZHVjZSBzaWxpY29uZSBX cmlzdGJhbmRzIGFuZCBrZXljaGlhbnMgLGZvciB3cmlzdGJhbmRzLHdlIGNhbiBtYW51ZmFjdHVy ZSAxMDBrIHBjcy9kYXkgLHVuaXQgcHJpY2UgaXMgVVNEIDAuMDMxICwgd2UgY2FuIHNlbmQgZnJl ZSBzYW1wbGVzIGZvciB5b3UgdG8gY2hlY2sgb3VyIGdvb2QgcXVhbGl0eQ0KV2FpdGluZyBmb3Ig eW91ciB1cGRhdGUNCktpbmQgcmVnYXJkcyw= ------=_NextPart_000_0225_017F51F4.1F19F8D0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIg aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTM2Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIA0Kc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tbWFyZ2luLXRvcC1hbHQ6IGF1dG87IG1zby1t YXJnaW4tYm90dG9tLWFsdDogYXV0byIgDQpjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJs YWNrOyBGT05ULVNJWkU6IDE4cHQ7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IOWui+S9kyIgDQpsYW5nPUVOLVVTPldl4oCZcmUgYSBDaGluZXNlIG1hbnVmYWN0 dXJlciwgbWFpbmx5IHByb2R1Y2UgPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAn VmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28t Zm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiIA0KbGFuZz1F Ti1VUz5zaWxpY29uZSA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsdWU7IEZPTlQtU0la RTogMThwdDsgbXNvLWZvbnQta2VybmluZzogMHB0IiANCmxhbmc9RU4tVVM+V3Jpc3RiYW5kcyBh bmQga2V5Y2hpYW5zICxmb3Igd3Jpc3RiYW5kcyw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6 IGJsYWNrOyBGT05ULVNJWkU6IDE4cHQ7IG1zby1mb250LWtlcm5pbmc6IDBwdCIgbGFuZz1FTi1V Uz53ZSBjYW4gDQptYW51ZmFjdHVyZSA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsdWU7 IEZPTlQtU0laRTogMThwdDsgbXNvLWZvbnQta2VybmluZzogMHB0IiBsYW5nPUVOLVVTPjEwMGsg DQpwY3MvZGF5PC9TUEFOPjxTUEFOIHN0eWxlPSJDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMThw dDsgbXNvLWZvbnQta2VybmluZzogMHB0IiANCmxhbmc9RU4tVVM+ICx1bml0IHByaWNlIGlzIDwv U1BBTj48U1BBTiANCnN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28tZm9u dC1rZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+VVNEIA0KMC4wMzE8L1NQQU4+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IENPTE9SOiBibGFjazsgbXNv LWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TOyBtc28tYmlk aS1mb250LXNpemU6IDEwLjVwdCIgDQpsYW5nPUVOLVVTPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0 eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1TSVpFOiAxOHB0OyBtc28tZm9udC1rZXJuaW5nOiAwcHQi IGxhbmc9RU4tVVM+LCB3ZSBjYW4gDQpzZW5kIGZyZWUgc2FtcGxlcyBmb3IgeW91IHRvIGNoZWNr IG91ciBnb29kIHF1YWxpdHk8bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhU LUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48 U1BBTiANCnN0eWxlPSJDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMThwdDsgbXNvLWZvbnQta2Vy bmluZzogMHB0IiBsYW5nPUVOLVVTPldhaXRpbmcgDQpmb3IgeW91ciB1cGRhdGU8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IENPTE9SOiBi bGFjazsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2T OyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdCIgDQpsYW5nPUVOLVVTPjxvOnA+PC9vOnA+PC9T UEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAw cHQ7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNs YXNzPU1zb05vcm1hbCBhbGlnbj1sZWZ0PjxTUEFOIA0Kc3R5bGU9IkNPTE9SOiBibGFjazsgRk9O VC1TSVpFOiAxOHB0OyBtc28tZm9udC1rZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+S2luZCANCnJl Z2FyZHMsPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAnVmVyZGFuYScsJ3NhbnMt c2VyaWYnOyBDT0xPUjogYmxhY2s7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiIA0KbGFuZz1FTi1V Uz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UD4mbmJzcDs8L1A+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_000_0225_017F51F4.1F19F8D0-- From 3liJwUw8JAz0fqZmhsdentmsZhmflZhk.bnlwernrr.rfh.bnl@trix.bounces.google.com Sun May 11 20:23:42 2014 Return-Path: <3liJwUw8JAz0fqZmhsdentmsZhmflZhk.bnlwernrr.rfh.bnl@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 8B2727F3F for <xfs@oss.sgi.com>; Sun, 11 May 2014 20: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 55CC2304048 for <xfs@oss.sgi.com>; Sun, 11 May 2014 18:23:39 -0700 (PDT) X-ASG-Debug-ID: 1399857815-04bdf02b8b490ef0001-NocioJ Received: from mail-qc0-f200.google.com (mail-qc0-f200.google.com [209.85.216.200]) by cuda.sgi.com with ESMTP id Rn76QhRs9tTH4HjR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Sun, 11 May 2014 18:23:36 -0700 (PDT) X-Barracuda-Envelope-From: 3liJwUw8JAz0fqZmhsdentmsZhmflZhk.bnlwernrr.rfh.bnl@trix.bounces.google.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.216.200 Received: by mail-qc0-f200.google.com with SMTP id x3so21840682qcv.11 for <xfs@oss.sgi.com>; Sun, 11 May 2014 18:23:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:message-id:date:subject:from:to:content-type; bh=CT1j/zEGqyoEeOWpH8p7csDScA+sLAH/GDxgviBrONA=; b=G8iwKcNdSQUlN2VhFMqAN+9DY4WFs80PsVZxS7ssjz1rdSrgFua+p7WDc9s7aAalIX ZI/bVx3Ix+6Dg3Es53q5dpMLHBoEsSNpzetijXr+PfMEFKLWOwA7D2f+Nrxra5s30eLA N7lAWxLyos7XPxW3O3xhHd2kmXFEJEOBtHhtul5/WeEURXD1hQIDHesr8/VU0T62BrB4 Gu6gMgsdzCH7d/Ne8PYAiS/voYmnEecwrzr/yOc9aUAHjNobKpTJmM+Hfo7y16VTgcG1 zfQkUjAWDwkafJRmMup/1lb2LgvDKhSIXM1W5oZNfs3782iqheXYDHjWqIXK3zaSKLzh UteQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.58.155.3 with SMTP id vs3mt18014825veb.16.1399857814975; Sun, 11 May 2014 18:23:34 -0700 (PDT) Message-ID: <047d7b671f9ccc3ade04f929cbaa@google.com> Date: Mon, 12 May 2014 01:23:35 +0000 Subject: sculpture art From: granitefountain@gmail.com X-ASG-Orig-Subj: sculpture art To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b671f9cd1761b04f929cb49 X-Barracuda-Connect: mail-qc0-f200.google.com[209.85.216.200] X-Barracuda-Start-Time: 1399857816 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, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5734 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 --047d7b671f9cd1761b04f929cb49 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 SGVsbG8gRGVhciBGcmllbmQ6DQoNClRoaXMgaXMgTGVlICwNCldobyBpbiBjaGFyZ2Ugb2Ygb3Vy IGZhbWlseSBzY3VscHR1cmUgYnVzaW5lc3MtIFl1YW4gTGVlIHNjdWxwdHVyZQ0KUGxhbnQuDQpX aGljaCBIZXJpdGFnZWQgdGhvdXNhbmQgeWVhcnMgc3RvbmUgY2FydmluZyBjdWx0dXJlIGFjY3Vt dWxhdGlvbi4NClNlcnZlIGZvciBhbmNpZW50IEJlaUppbmcgRm9yYmlkZGVuIENpdHkncyBidWls ZCBpbiBsYXRlc3QgdGhyZWUNCkRhbmFzdHkgZm9yIENoaW5hIEVtcGlyZS4NCldvdWxkIHlvdSBw bGVhc2UgZm9yd2FyZCB5b3VyIG1vc3QgRmF2b3JpdGUgc2N1bHB0dXJlIGRyYXdpbmcuIGkgd291 bGQNCm9mZmVyIHlvdSBvdXIgRmFjdG9yeSBwcmljZS4NCllvdSBjb3VsZCBhbHNvIHJlZmVyYW5j ZSBzY3VscHR1cmUgc3R5bGVzIGZyb20gb3VyIHdlYnNpdGUNCkxvb2tpbmcgZm9yd2FyZCB5b3Vy IGZ1cmh0ZXIgaW5mb3JtYXRpb24uDQpCZXN0IFJlZ2FyZHMgTGVlDQoNCll1YW4gTGVlIFNjdWxw dHVyZSBQbGFudA0KZm91bnRhaW5AbWFyYmxlZi5jb20NCnd3dy5icm9uemVmb3VudGFpbi5uZXQN Cg0KU0tZUEUgOiBTdGF0dWVMZWUNCkFERDogdGhlIGNhcnZpbmcgY29ycmlkb3IgZGV2ZWxvcG1l bnQgem9uZSwgRGFuZ2NoZW5nIFF1WWFuZw0KY291bnR5KFNKWikgSGVCZWkgcHJvdmluY2UgQ2hp bmEuDQpUZWxlcGhvbmU6IDg2IDAzMTEgODU4MDM5MzQgTU9COiA4NiAxNTAgMzIxMSAxMDE3DQoN Cs7S0tHR+8frxPrM7tC0se21pSDOtMP8w/u1xLHttaWhoyDSqszu0LS0y7HttaWjrMfrt8POyqO6 DQpodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kLzFGTnN1T0hTMEMtNFgtakNhT0gzVVNU aHBDb2RyQ0c2SGs2UTdYSnVCRjhNL3ZpZXdmb3JtP2M9MCZ3PTEmdXNwPW1haWxfZm9ybV9saW5r DQo= --047d7b671f9cd1761b04f929cb49 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable <html><body itemscope itemtype=3D"http://schema.org/EmailMessage" style=3D"= "><div class=3D"ss-email-body" style=3D"display:inline;width:576px;"><div i= temprop=3D"action" itemscope itemtype=3D"http://schema.org/ViewAction" styl= e=3D""><meta itemprop=3D"name" content=3D"=CC=EE=D0=B4=B1=ED=B5=A5" style= =3D""> <meta itemprop=3D"url" content=3D"https://docs.google.com/forms/d/1FNsuOHS0= C-4X-jCaOH3USThpCodrCG6Hk6Q7XJuBF8M/viewform?c=3D0&w=3D1&usp=3Dmail= _goto_form" style=3D""></div> <p itemprop=3D"description" style=3D"">Hello Dear Friend: =20 <br> <br> This is Lee , <br> Who in charge of our family sculpture business- Yuan Lee sculpture = Plant.=20 <br> Which Heritaged thousand years stone carving culture accumulation. = Serve for ancient BeiJing Forbidden City's build in latest three Danast= y for China Empire.=20 <br> Would you please forward your most Favorite sculpture drawing. i wo= uld offer you our Factory price. <br> You could also referance sculpture styles from our website=20 <br> Looking forward your furhter information. <br> Best Regards Lee <br> <br> Yuan Lee Sculpture Plant=20 <br> <a href=3D"mailto:fountain@marblef.com" style=3D"">fountain@marblef= .com</a> <br> <a href=3D"http://www.google.com/url?q=3Dhttp%3A%2F%2Fwww.bronzefou= ntain.net&sa=3DD&sntz=3D1&usg=3DAFQjCNG2i3gl1glLUONQ27qvqorT20h= -Ig" style=3D"">www.bronzefountain.net</a>=20 <br> <br> SKYPE : StatueLee=20 <br> ADD: the carving corridor development zone, Dangcheng QuYang county= (SJZ) HeBei province China.=20 <br> Telephone: 86 0311 85803934 MOB: 86 150 3211 1017=20 <br> </p> =C8=E7=B9=FB=B2=E9=BF=B4=BB=F2=CC=E1=BD=BB=B8=C3=B1=ED=B5=A5=CA=B1=D3=D0=CE= =CA=CC=E2=A3=AC=C7=EB=D4=DA=CF=DF=CC=EE=D0=B4=B8=C3=B1=ED=B5=A5=A3=BA <br> <a href=3D"https://docs.google.com/forms/d/1FNsuOHS0C-4X-jCaOH3USThpCodrCG6= Hk6Q7XJuBF8M/viewform?c=3D0&w=3D1&usp=3Dmail_form_link" style=3D"">= https://docs.google.com/forms/d/1FNsuOHS0C-4X-jCaOH3USThpCodrCG6Hk6Q7XJuBF8= M/viewform?c=3D0&w=3D1&usp=3Dmail_form_link</a> <p></p> <div dir=3D"ltr" style=3D""><div class=3D"form-body" style=3D""><h1 class= =3D"ss-form-title" dir=3D"ltr" style=3D"margin:.67em 0;">=CE=B4=C3=FC=C3=FB= =B5=C4=B1=ED=B5=A5</h1></div> <div style=3D"white-space: pre-wrap; display: inline"> </div> <div class=3D"form-body" style=3D""><div class=3D"ss-form" style=3D""><form= action=3D"https://docs.google.com/forms/d/1FNsuOHS0C-4X-jCaOH3USThpCodrCG6= Hk6Q7XJuBF8M/formResponse" method=3D"POST" id=3D"ss-form" target=3D"_self" = onsubmit=3D"" style=3D""><ol role=3D"list" class=3D"ss-question-list" style= =3D"padding-left: 0list-style-type:none;"> <div class=3D"ss-form-question errorbox-good" role=3D"listitem" style=3D""> <div dir=3D"ltr" class=3D"ss-item ss-radio" style=3D"margin:12px 0;"><div = class=3D"ss-form-entry" style=3D"margin-bottom:1.5em;vertical-align:middle;= margin-left:0;margin-top:0;max-width:100%;"> <label class=3D"ss-q-item-label" for=3D"entry_2104793058" style=3D""><div c= lass=3D"ss-q-title" style=3D"display:block;font-weight:bold;margin-top:.83e= m;margin-bottom:.83em;">=CE=B4=C3=FC=C3=FB=B5=C4=CE=CA=CC=E2 </div> <div class=3D"ss-q-help ss-secondary-text" dir=3D"ltr" style=3D"display:blo= ck;margin:.1em 0 .25em 0;color:#666;"></div></label> <ul class=3D"ss-choices" role=3D"radiogroup" aria-label=3D"=CE=B4=C3=FC=C3= =FB=B5=C4=CE=CA=CC=E2 " style=3D"list-style:none;padding:0;margin:.5em 0 0= ;"><li class=3D"ss-choice-item" style=3D"margin:0;line-height:1.3em;padding= -bottom:.5em;"><label><span class=3D"ss-choice-item-control goog-inline-blo= ck" style=3D"position:relative;display:inline-block;"><input type=3D"radio"= name=3D"entry.1411047887" value=3D"=D1=A1=CF=EE 1" id=3D"group_1411047887_= 1" role=3D"radio" class=3D"ss-q-radio" aria-label=3D"=D1=A1=CF=EE 1" style= =3D""></span> <span class=3D"ss-choice-label" style=3D"">=D1=A1=CF=EE 1</span> </label></li></ul> </div></div></div> <input type=3D"hidden" name=3D"draftResponse" value=3D"[,,"42169960689= 24632411"] " style=3D""> <input type=3D"hidden" name=3D"pageHistory" value=3D"0" style=3D""> <input type=3D"hidden" name=3D"usp" value=3D"mail_form_submit" style=3D""> <input type=3D"hidden" name=3D"fbzx" value=3D"4216996068924632411" style=3D= ""> <div class=3D"ss-item ss-navigate" style=3D"margin:12px 0;"><table id=3D"na= vigation-table" style=3D""><tbody><tr><td class=3D"ss-form-entry goog-inlin= e-block" id=3D"navigation-buttons" dir=3D"ltr" style=3D"margin-bottom:1.5em= ;vertical-align:middle;margin-left:0;margin-top:0;max-width:100%;position:r= elative;display:inline-block;"> <input type=3D"submit" name=3D"submit" value=3D"=CC=E1=BD=BB" id=3D"ss-subm= it" style=3D""> <div class=3D"ss-password-warning ss-secondary-text" style=3D"color:#666;">= =C7=D0=CE=F0=CD=A8=B9=FD Google =B1=ED=B5=A5=CC=E1=BD=BB=C3=DC=C2=EB=A1=A3<= /div></td> </tr></tbody></table></div></ol></form></div> <div class=3D"ss-footer" style=3D""><div class=3D"ss-attribution" style=3D"= "></div> <div class=3D"ss-legal" style=3D""><div class=3D"disclaimer-separator" styl= e=3D""></div> <div class=3D"disclaimer" dir=3D"ltr" style=3D""><div class=3D"powered-by-l= ogo" style=3D"margin-top:2em;"><span class=3D"powered-by-text" style=3D"">= =BC=BC=CA=F5=CC=E1=B9=A9=A3=BA</span> <a class=3D"ss-logo-link" href=3D"http://drive.google.com?usp=3Dform_footer= " style=3D"background-color:white;color:black;font:normal 13px arial,sans-s= erif;margin:0;display:inline-block;text-decoration:none;vertical-align:midd= le;"><img class=3D"ss-logo" src=3D"https://ssl.gstatic.com/docs/forms/drive= _logo_small2.png" alt=3D"Google =D4=C6=B6=CB=D3=B2=C5=CC" style=3D"border:n= one;height:20px;width:105px;"></a></div> <div class=3D"ss-terms" style=3D"color:#777;font-size:11px;margin-top:1.5em= ;"><span class=3D"disclaimer-msg" style=3D"">=B4=CB=C4=DA=C8=DD=B2=BB=CA=C7= =D3=C9 Google =CB=F9=B4=B4=BD=A8=A3=ACGoogle =B2=BB=B6=D4=C6=E4=D7=F7=C8=CE= =BA=CE=B5=A3=B1=A3=A1=A3</span> <br> <a href=3D"https://docs.google.com/forms/d/1FNsuOHS0C-4X-jCaOH3USThpCodrCG6= Hk6Q7XJuBF8M/reportabuse?source=3Dhttps://docs.google.com/forms/d/1FNsuOHS0= C-4X-jCaOH3USThpCodrCG6Hk6Q7XJuBF8M/viewform?sid%3D6842490f2fdc3ce0%26c%3D0= %26w%3D1%26token%3DBvc87kUBAAA.N0MFYsI__F5ZlKOaXMuljw.uglPAtMuIttXl2K8Smp6f= Q" style=3D"">=BE=D9=B1=A8=C0=C4=D3=C3=D0=D0=CE=AA</a> - <a href=3D"http://www.google.com/accounts/TOS" style=3D"">=B7=FE=CE=F1=CC= =F5=BF=EE</a> - <a href=3D"http://www.google.com/google-d-s/terms.html" style=3D"">=C6=E4= =CB=FB=CC=F5=BF=EE</a></div></div></div></div> </div></div> <br> <style type=3D"text/css" media=3D"screen" style=3D""></style></div></body><= /html> --047d7b671f9cd1761b04f929cb49-- From m.mizuma@jp.fujitsu.com Mon May 12 03:17:36 2014 Return-Path: <m.mizuma@jp.fujitsu.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E4E837F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 03:17:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5B8B3AC004 for <xfs@oss.sgi.com>; Mon, 12 May 2014 01:17:32 -0700 (PDT) X-ASG-Debug-ID: 1399882648-04cb6c1fcc32ec90001-NocioJ Received: from fgwmail5.fujitsu.co.jp ([192.51.44.35]) by cuda.sgi.com with ESMTP id 7TLGsILQx8rDyLts (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 01:17:29 -0700 (PDT) X-Barracuda-Envelope-From: m.mizuma@jp.fujitsu.com X-Barracuda-Apparent-Source-IP: 192.51.44.35 Received: from m3.gw.fujitsu.co.jp (unknown [10.0.50.73]) by fgwmail5.fujitsu.co.jp (Postfix) with ESMTP id 5EF3B3EE1C2 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:17:28 +0900 (JST) Received: from smail (m3 [127.0.0.1]) by outgoing.m3.gw.fujitsu.co.jp (Postfix) with ESMTP id 5269345DEFB for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:17:28 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (s3.gw.nic.fujitsu.com [10.0.50.93]) by m3.gw.fujitsu.co.jp (Postfix) with ESMTP id 397C545DEF9 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:17:28 +0900 (JST) Received: from s3.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id 20E141DB803C for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:17:28 +0900 (JST) Received: from g01jpfmpwkw01.exch.g01.fujitsu.local (g01jpfmpwkw01.exch.g01.fujitsu.local [10.0.193.38]) by s3.gw.fujitsu.co.jp (Postfix) with ESMTP id 90D751DB8041 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:17:27 +0900 (JST) Received: from localhost.localdomain (localhost [127.0.0.1]) by g01jpfmpwkw01.exch.g01.fujitsu.local (Postfix) with ESMTP id 82DF46924C9; Mon, 12 May 2014 17:17:27 +0900 (JST) Received: from g01jpexchkw38.g01.fujitsu.local (unknown [10.0.193.4]) by g01jpfmpwkw01.exch.g01.fujitsu.local (Postfix) with ESMTP id 017A46922FC; Mon, 12 May 2014 17:16:22 +0900 (JST) Received: from [10.124.101.151] (10.124.101.151) by g01jpexchkw38.g01.fujitsu.local (10.0.193.68) with Microsoft SMTP Server (TLS) id 14.3.146.2; Mon, 12 May 2014 17:16:21 +0900 Message-ID: <53708354.2060103@jp.fujitsu.com> Date: Mon, 12 May 2014 17:16:20 +0900 From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, <xfs@oss.sgi.com> CC: <linux-fsdevel@vger.kernel.org>, <esandeen@redhat.com> Subject: xfs: processes are stuck at xlog_grant_head_wait() Content-Type: text/plain; charset="ISO-2022-JP" X-ASG-Orig-Subj: xfs: processes are stuck at xlog_grant_head_wait() Content-Transfer-Encoding: 7bit X-Originating-IP: [10.124.101.151] X-SecurityPolicyCheck-GC: OK by FENCE-Mail X-Barracuda-Connect: UNKNOWN[192.51.44.35] X-Barracuda-Start-Time: 1399882649 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=ISO2022JP_CHARSET, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 ISO2022JP_CHARSET ISO-2022-JP message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi all, Processes are stuck at xlog_grant_head_wait() when I ran a heavy stress test (xfstests, ltpstress and fsstress concurrently) on linux-next (3.15.0-rc4-next-20140506) kernel. I got the crash dump, then I think this problem is similar as a problem fixed by the following commit. ------------------------------------------------- commit 2c6e24ce1aa6b3b147c75d488c2797ee258eb22b Author: Dave Chinner <dchinner@redhat.com> Date: Tue Oct 15 09:17:49 2013 +1100 xfs: prevent deadlock trying to cover an active log ------------------------------------------------- 2c6e24ce1 is already applied to the kernel, so I don't know why this problem is occurred... The information through crash dump is as follows. The backtrace of stuck processes are such as the following, so they are waiting for more log space. PID: 24009 TASK: ffff8800035d4420 CPU: 4 COMMAND: "fsstress" #0 [ffff880004aefb28] __schedule at ffffffff816395c5 #1 [ffff880004aefb90] schedule at ffffffff81639ac9 #2 [ffff880004aefba0] xlog_grant_head_wait at ffffffffa023585d [xfs] #3 [ffff880004aefbf0] xlog_grant_head_check at ffffffffa02359de [xfs] #4 [ffff880004aefc30] xfs_log_reserve at ffffffffa023935f [xfs] #5 [ffff880004aefc68] xfs_trans_reserve at ffffffffa01f1114 [xfs] #6 [ffff880004aefcb0] xfs_vn_update_time at ffffffffa01e70b6 [xfs] #7 [ffff880004aefcf0] update_time at ffffffff811f4f05 #8 [ffff880004aefd20] file_update_time at ffffffff811f51b0 #9 [ffff880004aefd60] xfs_file_aio_write_checks at ffffffffa01de7bb [xfs] #10 [ffff880004aefda8] xfs_file_dio_aio_write at ffffffffa024a03b [xfs] #11 [ffff880004aefe10] xfs_file_write_iter at ffffffffa01deacc [xfs] #12 [ffff880004aefe40] new_sync_write at ffffffff811d975e #13 [ffff880004aefef8] vfs_write at ffffffff811d9f87 #14 [ffff880004aeff38] sys_write at ffffffff811daba5 #15 [ffff880004aeff80] system_call_fastpath at ffffffff8163dd59 RIP: 00007f5fecd40c70 RSP: 00007ffff5ba9ad8 RFLAGS: 00010246 RAX: 0000000000000001 RBX: ffffffff8163dd59 RCX: 0000000000000000 RDX: 000000000000e000 RSI: 00007f5fe8001000 RDI: 0000000000000003 RBP: 0000000000000003 R8: 0000000000000000 R9: 0000000000100000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 000000000007d000 R14: 000000000000e000 R15: 0000000000000026 ORIG_RAX: 0000000000000001 CS: 0033 SS: 002b In addition, kworker which related to XFS are also stuck because of the same reason. Therefore, I think no one can free the log space... PID: 306 TASK: ffff8800145751c0 CPU: 6 COMMAND: "kworker/u16:3" #0 [ffff88003385d798] __schedule at ffffffff816395c5 #1 [ffff88003385d800] schedule at ffffffff81639ac9 #2 [ffff88003385d810] xlog_grant_head_wait at ffffffffa023585d [xfs] #3 [ffff88003385d860] xlog_grant_head_check at ffffffffa02359de [xfs] #4 [ffff88003385d8a0] xfs_log_reserve at ffffffffa023935f [xfs] #5 [ffff88003385d8d8] xfs_trans_reserve at ffffffffa01f1114 [xfs] #6 [ffff88003385d920] xfs_setfilesize_trans_alloc at ffffffffa01d1ff0 [xfs] #7 [ffff88003385d950] xfs_vm_writepage at ffffffffa01d30b1 [xfs] #8 [ffff88003385da08] __writepage at ffffffff8116f483 #9 [ffff88003385da20] write_cache_pages at ffffffff8116fe55 #10 [ffff88003385db38] generic_writepages at ffffffff8117010d #11 [ffff88003385db98] xfs_vm_writepages at ffffffffa01d2873 [xfs] #12 [ffff88003385dbc8] do_writepages at ffffffff8117138e #13 [ffff88003385dbd8] __writeback_single_inode at ffffffff81202da0 #14 [ffff88003385dc18] writeback_sb_inodes at ffffffff8120380a #15 [ffff88003385dcb0] __writeback_inodes_wb at ffffffff81203a5f #16 [ffff88003385dcf8] wb_writeback at ffffffff812042d3 #17 [ffff88003385dd70] bdi_writeback_workfn at ffffffff8120687c #18 [ffff88003385de20] process_one_work at ffffffff8108e78b #19 [ffff88003385de68] worker_thread at ffffffff8108f5ab #20 [ffff88003385dec8] kthread at ffffffff81096651 #21 [ffff88003385df50] ret_from_fork at ffffffff8163dcac PID: 2032 TASK: ffff88000bb60da0 CPU: 5 COMMAND: "kworker/5:2" #0 [ffff8800000479d0] __schedule at ffffffff816395c5 #1 [ffff880000047a38] schedule at ffffffff81639ac9 #2 [ffff880000047a48] xlog_grant_head_wait at ffffffffa023585d [xfs] #3 [ffff880000047a98] xlog_grant_head_check at ffffffffa02359de [xfs] #4 [ffff880000047ad8] xfs_log_reserve at ffffffffa023935f [xfs] #5 [ffff880000047b10] xfs_trans_reserve at ffffffffa01f1114 [xfs] #6 [ffff880000047b58] xfs_free_eofblocks at ffffffffa01d6577 [xfs] #7 [ffff880000047bd0] xfs_inode_free_eofblocks at ffffffffa01e2b9a [xfs] #8 [ffff880000047bf8] xfs_inode_ag_walk at ffffffffa01e10ef [xfs] #9 [ffff880000047da0] xfs_inode_ag_iterator_tag at ffffffffa01e24b6 [xfs] #10 [ffff880000047df8] xfs_icache_free_eofblocks at ffffffffa01e27dd [xfs] #11 [ffff880000047e08] xfs_eofblocks_worker at ffffffffa01e280b [xfs] #12 [ffff880000047e20] process_one_work at ffffffff8108e78b #13 [ffff880000047e68] worker_thread at ffffffff8108f5ab #14 [ffff880000047ec8] kthread at ffffffff81096651 #15 [ffff880000047f50] ret_from_fork at ffffffff8163dcac PID: 9291 TASK: ffff880022a728e0 CPU: 3 COMMAND: "kworker/3:0" #0 [ffff880005101c60] __schedule at ffffffff816395c5 #1 [ffff880005101cc8] schedule at ffffffff81639ac9 #2 [ffff880005101cd8] xlog_grant_head_wait at ffffffffa023585d [xfs] #3 [ffff880005101d28] xlog_grant_head_check at ffffffffa02359de [xfs] #4 [ffff880005101d68] xfs_log_reserve at ffffffffa023935f [xfs] #5 [ffff880005101da0] xfs_trans_reserve at ffffffffa01f1114 [xfs] #6 [ffff880005101de8] xfs_fs_log_dummy at ffffffffa01e09f5 [xfs] #7 [ffff880005101e08] xfs_log_worker at ffffffffa0238bc8 [xfs] #8 [ffff880005101e20] process_one_work at ffffffff8108e78b #9 [ffff880005101e68] worker_thread at ffffffff8108f5ab #10 [ffff880005101ec8] kthread at ffffffff81096651 #11 [ffff880005101f50] ret_from_fork at ffffffff8163dcac Thanks, Masayoshi Mizuma From david@fromorbit.com Mon May 12 03:27:54 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A89927F47 for <xfs@oss.sgi.com>; Mon, 12 May 2014 03:27:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48649AC005 for <xfs@oss.sgi.com>; Mon, 12 May 2014 01:27:54 -0700 (PDT) X-ASG-Debug-ID: 1399883271-04bdf02b8d49cda0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Zoqt2RtaJuQgZZO6 for <xfs@oss.sgi.com>; Mon, 12 May 2014 01:27: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: Ar5XAO+EcFN5LL1sPGdsb2JhbABZgwaDPYUKpCEBAQEBBpQ2hWMBgRcXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQM4wFxaFQIh8B4RAAQOZR4sFi0sr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 12 May 2014 17:57:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WjlaO-0005O8-UA; Mon, 12 May 2014 18:27:48 +1000 Date: Mon, 12 May 2014 18:27:48 +1000 From: Dave Chinner <david@fromorbit.com> To: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, esandeen@redhat.com Subject: Re: xfs: processes are stuck at xlog_grant_head_wait() Message-ID: <20140512082748.GX5421@dastard> X-ASG-Orig-Subj: Re: xfs: processes are stuck at xlog_grant_head_wait() References: <53708354.2060103@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53708354.2060103@jp.fujitsu.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: 1399883271 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.5741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 05:16:20PM +0900, Masayoshi Mizuma wrote: > Hi all, > > Processes are stuck at xlog_grant_head_wait() when I ran a heavy stress > test (xfstests, ltpstress and fsstress concurrently) on linux-next > (3.15.0-rc4-next-20140506) kernel. > I got the crash dump, then I think this problem is similar as a problem > fixed by the following commit. Already fixed in the for-next branch. 49abc3a xfs: truncate_setsize should be outside transactions Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Mon May 12 04:42:45 2014 Return-Path: <namjae.jeon@samsung.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 205F47F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 04:42:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5D8BAC003 for <xfs@oss.sgi.com>; Mon, 12 May 2014 02:42:44 -0700 (PDT) X-ASG-Debug-ID: 1399887758-04bdf02b8d49f790001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id dqLZBXytBgzGandW (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 02:42:39 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5G00JN5GB1R930@mailout1.samsung.com> for xfs@oss.sgi.com; Mon, 12 May 2014 18:42:37 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id D6.56.11120.D8790735; Mon, 12 May 2014 18:42:37 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-5d-5370978dcb62 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 11.7B.25708.D8790735; Mon, 12 May 2014 18:42:37 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5G00BI1GB11120@mmp2.samsung.com>; Mon, 12 May 2014 18:42:37 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Brian Foster' <bfoster@redhat.com> Cc: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu>, linux-fsdevel@vger.kernel.org, 'linux-ext4' <linux-ext4@vger.kernel.org>, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com>, xfs@oss.sgi.com References: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> <20140509152440.GA32489@laptop.bfoster> In-reply-to: <20140509152440.GA32489@laptop.bfoster> Subject: RE: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 12 May 2014 18:42:37 +0900 X-ASG-Orig-Subj: RE: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <005601cf6dc6$82573820$8705a860$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQI8l/c+50jbPyrOUhhBFU208NvpTgGlw03dmlUskyA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBIsWRmVeSWpSXmKPExsWyRsSkRLd3ekGwway/hhZLJ15itnj3ucpi y7F7jBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKptH 35ZVjB6fN8kFsEVx2aSk5mSWpRbp2yVwZRzY8py54Kdpxe8DB9gbGCdodDFycEgImEjsW5LY xcgJZIpJXLi3nq2LkYtDSGApo0TXxg3sMDXPz0pAxKczSsx+9IEFwvnLKHH30042kCI2AW2J P1tEQQaJCKhL3Jk3AayGWeATo8T6A5NYQGqEBJIltq/LBqnhBJr5deUcJhBbWCBEYs3D+2wg NouAqsS9q+2MIDavgKVE87ObrBC2oMSPyfdYQGxmAS2J9TuPM0HY8hKb17xlhnhAQWLH2deM EDdYSexbM4cZokZEYt+Ld4wg90gI/GWX2DT7MCPEMgGJb5MPsUA8KSux6QDUHEmJgytusExg lJiFZPUsJKtnIVk9C8mKBYwsqxhFUwuSC4qT0ouM9YoTc4tL89L1kvNzNzECY/n0v2f9Oxjv HrA+xJgMtH4is5Rocj4wFeSVxBsamxlZmJqYGhuZW5qRJqwkznv/YVKQkEB6YklqdmpqQWpR fFFpTmrxIUYmDk6pBkafnewLeXOkXV149bIvZ0WLbFl0/Pl1G/2OxvqtXspTCuT/WX6f7J6m IKZ40fgVo6Q2b+h9gR2eS+/sblwvtajs4sV9L0Qvd8Wd8zMs2Zf4/foU6WPnpp2c9H678+nf 03bJzElcfCmhZOplwTVhD7e9dji7Z4N0OuvHfd+0XnzcfOFD8CEm9wAxJZbijERDLeai4kQA z/e8PvsCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGKsWRmVeSWpSXmKPExsVy+t9jQd3e6QXBBr3zNS2WTrzEbPHuc5XF lmP3GC1mzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP vi2rGD0+b5ILYItqYLTJSE1MSS1SSM1Lzk/JzEu3VfIOjneONzUzMNQ1tLQwV1LIS8xNtVVy 8QnQdcvMAbpHSaEsMacUKBSQWFyspG+HaUJoiJuuBUxjhK5vSBBcj5EBGkhYw5hxYMtz5oKf phW/Dxxgb2CcoNHFyMEhIWAi8fysRBcjJ5ApJnHh3nq2LkYuDiGB6YwSsx99YIFw/jJK3P20 kw2kgU1AW+LPFlGQBhEBdYk78yaA1TALfGKUWH9gEgtIjZBAssT2ddkgNZxA87+unMMEYgsL hEiseXifDcRmEVCVuHe1nRHE5hWwlGh+dpMVwhaU+DH5HguIzSygJbF+53EmCFteYvOat8wQ hypI7Dj7mhHiBiuJfWvmMEPUiEjse/GOcQKj0Cwko2YhGTULyahZSFoWMLKsYhRNLUguKE5K zzXSK07MLS7NS9dLzs/dxAhOFc+kdzCuarA4xCjAwajEw/uBoSBYiDWxrLgy9xCjBAezkgjv yYlAId6UxMqq1KL8+KLSnNTiQ4zJQJ9OZJYSTc4HprG8knhDYxMzI0sjc0MLI2Nz0oSVxHkP tloHCgmkJ5akZqemFqQWwWxh4uCUamDkzuWttVlf+33n9zXCC+brL74SqpTVGWtUvSsy47ZZ vlygK9M0s8W1EnfEzKZsX9bk9PHyZOsde6ccPOM+uera9G9Fv5R/BvKEc5x2cZt2wO3Pz986 ui+SVxj3VXfmCH0t2XOZcfo1E7WvCp90OWJVcxmLOk7pOoSsLJ2nzlF7guVqkqrI8kglluKM REMt5qLiRADkg6ChWQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1399887759 X-Barracuda-Encrypted: RC4-MD5 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_bmap_split_extent( > > + struct xfs_inode *ip, > > + xfs_fileoff_t split_fsb, > > + xfs_extnum_t *split_ext) > > +{ > > + struct xfs_mount *mp = ip->i_mount; > > + struct xfs_trans *tp; > > + struct xfs_bmap_free free_list; > > + xfs_fsblock_t firstfsb; > > + int committed; > > + int error; > > + > > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > + > > + if (error) { > > + /* > > + * Free the transaction structure. > > + */ > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > Hi, Brian. > As in the other patch, we're attempting to reserve fs blocks for the > transaction, so ENOSPC is a possibility that I think the assert should > accommodate. How about removing the ASSERT completely as suggessted by Dave in other thread? > > > + xfs_trans_cancel(tp, 0); > > + return error; > > + } > > + > > + > > + /* > > + * Before shifting extent into hole, make sure that the hole > > + * is large enough to accomodate the shift. This checking has > > + * to be performed for all except the last extent. > > + */ > > + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > > + if (last_extent != *current_ext) { > > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > > + *current_ext + 1), &right); > > + if (startoff + got.br_blockcount > right.br_startoff) { > > + error = XFS_ERROR(EINVAL); > > + if (error) > > + goto del_cursor; > > + } > > + } > > + > > + /* Check if we can merge 2 adjacent extents */ > > + if (last_extent != *current_ext && > > + right.br_startoff == startoff + got.br_blockcount && > > + right.br_startblock == > > + got.br_startblock + got.br_blockcount && > > + right.br_state == got.br_state && > > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > > + blockcount = right.br_blockcount + got.br_blockcount; > > + > > + /* Make cursor point to the extent we will update */ > > The comment could be more clear about what we're doing in this case. For > example: > > /* > * Merge the current extent with the extent to the right. Remove the right > * extent, calculate a new block count for the current extent to cover the range > * of both and decrement the number of extents in the fork. > */ > > I'd also move the comment before the blockcount calculation. okay, I will add it as your suggestion. > > > + if (cur) { > > + error = xfs_bmbt_lookup_eq(cur, > > + right.br_startoff, > > + right.br_startblock, > > + right.br_blockcount, > > + &i); > > + if (error) > > + goto del_cursor; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > + } > > + > > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > > + if (cur) { > > + error = xfs_btree_delete(cur, &i); > > + if (error) > > + goto del_cursor; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > + } > > + XFS_IFORK_NEXT_SET(ip, whichfork, > > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > > + > > + } > > + > > + if (cur) { > > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > > + got.br_startblock, > > + got.br_blockcount, > > + &i); > > + if (error) > > + goto del_cursor; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > + } > > + > > + if (got.br_blockcount < blockcount) { > > + xfs_bmbt_set_blockcount(gotp, blockcount); > > + got.br_blockcount = blockcount; > > + } > > How about just 'if (blockcount)' so the algorithm is clear? yes, more clear. > > > + > > + > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > index 97855c5..392b029 100644 > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -760,7 +760,8 @@ xfs_file_fallocate( > > if (!S_ISREG(inode->i_mode)) > > return -EINVAL; > > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > > + FALLOC_FL_INSERT_RANGE)) > > return -EOPNOTSUPP; > > > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > > @@ -790,6 +791,40 @@ xfs_file_fallocate( > > error = xfs_collapse_file_space(ip, offset, len); > > if (error) > > goto out_unlock; > > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > > + struct iattr iattr; > > + > > + if (offset & blksize_mask || len & blksize_mask) { > > + error = -EINVAL; > > + goto out_unlock; > > + } > > + > > + /* Check for wrap through zero */ > > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > > + error = -EFBIG; > > + goto out_unlock; > > + } > > + > > + /* Offset should be less than i_size */ > > + if (offset >= i_size_read(inode)) { > > + error = -EINVAL; > > + goto out_unlock; > > + } > > + > > + /* > > + * The first thing we do is to expand file to > > + * avoid data loss if there is error while shifting > > + */ > > + iattr.ia_valid = ATTR_SIZE; > > + iattr.ia_size = i_size_read(inode) + len; > > + error = xfs_setattr_size(ip, &iattr); > > + if (error) > > + goto out_unlock; > > I don't necessarily know that it's problematic to do the setattr before > the bmap fixup. We'll have a chance for partial completion of this > operation either way. But I'm not a fan of the code duplication here. > This also still skips the time update in the event of insert space > failure, though perhaps that's not such a big deal if we're returning an > error. > > I think it would be better to leave things organized as before and > introduce an error2 variable and a &nrshifts or some such parameter to > xfs_insert_file_space() that initializes to 0 and returns the number of > record shifts. The caller can then decide whether it's appropriate to > break out immediately or do the inode size update and return the error. > > Perhaps not the cleanest thing in the world, but also not the first > place we would use 'error2' to manage error priorities (grep around for > it)... Yes, Right. I also thought such sequence at first. But we should consider sudden power off and unplug device case during shifting extent. While we are in the middle of shifitng extents and if there is sudden power failure user can still think that data is lost as we won't get any chance to update the file size in these cases. Updating file size before the shifitng operation can start will prevent this. Thanks. > > Brian > > > + > > + error = xfs_insert_file_space(ip, offset, len); > > + if (error) > > + goto out_unlock; > > } else { > > if (!(mode & FALLOC_FL_KEEP_SIZE) && > > offset + len > i_size_read(inode)) { From m.mizuma@jp.fujitsu.com Mon May 12 05:15:03 2014 Return-Path: <m.mizuma@jp.fujitsu.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A44F7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:15:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02971304032 for <xfs@oss.sgi.com>; Mon, 12 May 2014 03:14:59 -0700 (PDT) X-ASG-Debug-ID: 1399889697-04cbb03cc4469920001-NocioJ Received: from fgwmail6.fujitsu.co.jp ([192.51.44.36]) by cuda.sgi.com with ESMTP id VjB7GrjQQg5lttU5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 03:14:58 -0700 (PDT) X-Barracuda-Envelope-From: m.mizuma@jp.fujitsu.com X-Barracuda-Apparent-Source-IP: 192.51.44.36 Received: from m4.gw.fujitsu.co.jp (unknown [10.0.50.74]) by fgwmail6.fujitsu.co.jp (Postfix) with ESMTP id DA8083EE0BD for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from smail (m4 [127.0.0.1]) by outgoing.m4.gw.fujitsu.co.jp (Postfix) with ESMTP id C7E6645DF33 for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (s4.gw.nic.fujitsu.com [10.0.50.94]) by m4.gw.fujitsu.co.jp (Postfix) with ESMTP id AE25945DF31 for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from s4.gw.fujitsu.co.jp (localhost.localdomain [127.0.0.1]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id 9A9D11DB8040 for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from g01jpfmpwkw02.exch.g01.fujitsu.local (g01jpfmpwkw02.exch.g01.fujitsu.local [10.0.193.56]) by s4.gw.fujitsu.co.jp (Postfix) with ESMTP id 409E4E18003 for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from localhost.localdomain (localhost [127.0.0.1]) by g01jpfmpwkw02.exch.g01.fujitsu.local (Postfix) with ESMTP id 33C04328645; Mon, 12 May 2014 19:14:56 +0900 (JST) Received: from g01jpexchkw34.g01.fujitsu.local (unknown [10.0.193.4]) by g01jpfmpwkw02.exch.g01.fujitsu.local (Postfix) with ESMTP id 5E0E0328665; Mon, 12 May 2014 19:13:56 +0900 (JST) Received: from [10.124.101.151] (10.124.101.151) by g01jpexchkw34.g01.fujitsu.local (10.0.193.49) with Microsoft SMTP Server (TLS) id 14.3.146.2; Mon, 12 May 2014 19:13:53 +0900 Message-ID: <53709EE3.5090407@jp.fujitsu.com> Date: Mon, 12 May 2014 19:13:55 +0900 From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: <linux-fsdevel@vger.kernel.org>, <esandeen@redhat.com>, <xfs@oss.sgi.com> Subject: Re: xfs: processes are stuck at xlog_grant_head_wait() References: <53708354.2060103@jp.fujitsu.com> <20140512082748.GX5421@dastard> X-ASG-Orig-Subj: Re: xfs: processes are stuck at xlog_grant_head_wait() In-Reply-To: <20140512082748.GX5421@dastard> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.124.101.151] X-SecurityPolicyCheck-GC: OK by FENCE-Mail X-Barracuda-Connect: UNKNOWN[192.51.44.36] X-Barracuda-Start-Time: 1399889698 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.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.5742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi Dave, On Mon, 12 May 2014 18:27:48 +1000 Dave Chinner wrote: > On Mon, May 12, 2014 at 05:16:20PM +0900, Masayoshi Mizuma wrote: >> Hi all, >> >> Processes are stuck at xlog_grant_head_wait() when I ran a heavy stress >> test (xfstests, ltpstress and fsstress concurrently) on linux-next >> (3.15.0-rc4-next-20140506) kernel. >> I got the crash dump, then I think this problem is similar as a problem >> fixed by the following commit. > > Already fixed in the for-next branch. > > 49abc3a xfs: truncate_setsize should be outside transactions Oh good! thank you! Thanks, Masayoshi Mizuma > > Cheers, > > Dave. > From bfoster@redhat.com Mon May 12 06:25:55 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 534627F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 06:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30B61304032 for <xfs@oss.sgi.com>; Mon, 12 May 2014 04:25:55 -0700 (PDT) X-ASG-Debug-ID: 1399893953-04cb6c1fcc335510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ohNvqhmdnuWdLXv4 for <xfs@oss.sgi.com>; Mon, 12 May 2014 04:25: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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4CBPhmT015294 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 12 May 2014 07:25:43 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4CBPgGo008808; Mon, 12 May 2014 07:25:42 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CF2BF1248A9; Mon, 12 May 2014 07:25:41 -0400 (EDT) Date: Mon, 12 May 2014 07:25:41 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: "'Dave Chinner'" <david@fromorbit.com>, "'Theodore Ts'o'" <tytso@mit.edu>, linux-fsdevel@vger.kernel.org, "'linux-ext4'" <linux-ext4@vger.kernel.org>, linux-kernel@vger.kernel.org, "'Ashish Sangwan'" <a.sangwan@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140512112541.GA62831@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> <20140509152440.GA32489@laptop.bfoster> <005601cf6dc6$82573820$8705a860$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <005601cf6dc6$82573820$8705a860$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399893954 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, May 12, 2014 at 06:42:37PM +0900, Namjae Jeon wrote: > > > > +xfs_bmap_split_extent( > > > + struct xfs_inode *ip, > > > + xfs_fileoff_t split_fsb, > > > + xfs_extnum_t *split_ext) > > > +{ > > > + struct xfs_mount *mp = ip->i_mount; > > > + struct xfs_trans *tp; > > > + struct xfs_bmap_free free_list; > > > + xfs_fsblock_t firstfsb; > > > + int committed; > > > + int error; > > > + > > > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > > + > > > + if (error) { > > > + /* > > > + * Free the transaction structure. > > > + */ > > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > > Hi, Brian. > > As in the other patch, we're attempting to reserve fs blocks for the > > transaction, so ENOSPC is a possibility that I think the assert should > > accommodate. > How about removing the ASSERT completely as suggessted by Dave > in other thread? > Yeah, that works too. If Dave prefers to just remove these asserts that's fine with me. I just wanted to make sure we aren't adding spurious asserts for valid failures. > > ... > > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > > index 97855c5..392b029 100644 > > > --- a/fs/xfs/xfs_file.c > > > +++ b/fs/xfs/xfs_file.c > > > @@ -760,7 +760,8 @@ xfs_file_fallocate( > > > if (!S_ISREG(inode->i_mode)) > > > return -EINVAL; > > > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > > > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > > > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > > > + FALLOC_FL_INSERT_RANGE)) > > > return -EOPNOTSUPP; > > > > > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > > > @@ -790,6 +791,40 @@ xfs_file_fallocate( > > > error = xfs_collapse_file_space(ip, offset, len); > > > if (error) > > > goto out_unlock; > > > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > > > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > > > + struct iattr iattr; > > > + > > > + if (offset & blksize_mask || len & blksize_mask) { > > > + error = -EINVAL; > > > + goto out_unlock; > > > + } > > > + > > > + /* Check for wrap through zero */ > > > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > > > + error = -EFBIG; > > > + goto out_unlock; > > > + } > > > + > > > + /* Offset should be less than i_size */ > > > + if (offset >= i_size_read(inode)) { > > > + error = -EINVAL; > > > + goto out_unlock; > > > + } > > > + > > > + /* > > > + * The first thing we do is to expand file to > > > + * avoid data loss if there is error while shifting > > > + */ > > > + iattr.ia_valid = ATTR_SIZE; > > > + iattr.ia_size = i_size_read(inode) + len; > > > + error = xfs_setattr_size(ip, &iattr); > > > + if (error) > > > + goto out_unlock; > > > > I don't necessarily know that it's problematic to do the setattr before > > the bmap fixup. We'll have a chance for partial completion of this > > operation either way. But I'm not a fan of the code duplication here. > > This also still skips the time update in the event of insert space > > failure, though perhaps that's not such a big deal if we're returning an > > error. > > > > I think it would be better to leave things organized as before and > > introduce an error2 variable and a &nrshifts or some such parameter to > > xfs_insert_file_space() that initializes to 0 and returns the number of > > record shifts. The caller can then decide whether it's appropriate to > > break out immediately or do the inode size update and return the error. > > > > Perhaps not the cleanest thing in the world, but also not the first > > place we would use 'error2' to manage error priorities (grep around for > > it)... > Yes, Right. I also thought such sequence at first. But we should consider > sudden power off and unplug device case during shifting extent. > While we are in the middle of shifitng extents and if there is sudden > power failure user can still think that data is lost as we won't get any > chance to update the file size in these cases. > Updating file size before the shifitng operation can start will prevent this. > > Thanks. Hmm, fair point. That seems less critical to me than the general error sequence, but if we want to handle that case I think we could still fix the duplication in xfs_file_fallocate(). We could possibly factor out the common bits (update time and set size) into a helper, or what seems a bit cleaner on first thought, move the bulk of the (mode & FALLOC_FL_INSERT_RANGE) block to after the common part. Then the function looks something like this: ... xfs_ilock(); /* pre-inode fixup ops */ if (mode & ...) { ... } else if (mode & FALLOC_FL_INSERT_RANGE) { /* comment as to what's going on here :) */ /* error checks */ new_size = ...; do_file_insert = 1; } ... xfs_trans_ichgtime(); xfs_setattr_size(); ... /* * Some operations are performed after the inode size is updated. For * example, insert range expands the address space of the file, shifts * all subsequent extents over and allocates space into the hole. * Updating the size first ensures that shifted extents aren't left * hanging past EOF in the event of a crash or failure. */ if (do_file_insert) { /* alloc space */ ... } ... That seems a bit cleaner to me, but I'm not wedded to it. Thoughts? It might be worth soliciting some other thoughts/ideas before reworking it. Thanks. Brian > > > > Brian > > > > > + > > > + error = xfs_insert_file_space(ip, offset, len); > > > + if (error) > > > + goto out_unlock; > > > } else { > > > if (!(mode & FALLOC_FL_KEEP_SIZE) && > > > offset + len > i_size_read(inode)) { > From tytso@thunk.org Mon May 12 07:42:43 2014 Return-Path: <tytso@thunk.org> X-Spam-Checker-Version: SpamAssassin 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 08B397F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:42:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87C37AC006 for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:42:40 -0700 (PDT) X-ASG-Debug-ID: 1399898554-04cbb03cc746eeb0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id SPx5vfTKrit4ROvu (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:42:35 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=KVxkYZr2mS4Jp20eBmmw884cNuz+VCudkf0TAPXvZEE=; b=KcdxSJ8fgffah8Eef5c5nGhO7WAhSWizlmLWzoqXh0V542boHpKVfMm2fXDNdzRkV//cvltHt+QY+P/sztEWfBpzryptZvwstQZAa2cederbzgqoaZd+nmPxOQ5kUq2A7lxNZJGqTTkFh/Ivopr+P17ofaf6bwHFnMuD2PTZqI8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from <tytso@thunk.org>) id 1WjpYu-0007IK-SW; Mon, 12 May 2014 12:42:32 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 56511580239; Mon, 12 May 2014 08:42:32 -0400 (EDT) Date: Mon, 12 May 2014 08:42:32 -0400 From: Theodore Ts'o <tytso@mit.edu> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com, Ext4 Developers List <linux-ext4@vger.kernel.org> Subject: Re: [PATCH -v2] check: add support for an external file containing tests to exclude Message-ID: <20140512124232.GB31376@thunk.org> X-ASG-Orig-Subj: Re: [PATCH -v2] check: add support for an external file containing tests to exclude References: <20140416001530.GU15995@dastard> <1397624302-9577-1-git-send-email-tytso@mit.edu> <20140416064018.GJ15995@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140416064018.GJ15995@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: <locally generated> X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1399898555 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5745 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 Wed, Apr 16, 2014 at 04:40:18PM +1000, Dave Chinner wrote: > On Wed, Apr 16, 2014 at 12:58:22AM -0400, Theodore Ts'o wrote: > > Currently the -X option is intended to specify a set of expunging > > files which are stored in each test/* subdirectory. As described in > > the commit description for 0b1e8abd4, in order to exclude the test > > generic/280, the -X option is used as follows: > > > > $ cat tests/generic/3.0-stable-avoid > > 280 > > $ sudo ./check -X 3.0-stable-avoid generic/280 > > > > However, it is sometimes useful to store the set of expunged tests in > > a single file, outside of tests/* subdirectories. This commit enables > > the following: > > > > $ cat /root/conf/data_journal.exclude > > generic/068 > > ext4/301 > > $ sudo ./check -E /root/conf/data_journal.exclude -g auto > > > > Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> > > Looks good. > > Reviewed-by: Dave Chinner <dchinner@redhat.com> This patch has apparently not hit the xfstests repository. Would you like me to resend it? Thanks, - Ted From jlayton@poochiereds.net Mon May 12 07:46:49 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4C1487F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:46:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3371D8F8037 for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:46:45 -0700 (PDT) X-ASG-Debug-ID: 1399898803-04bdf02b8d4a6160001-NocioJ Received: from mail-qc0-f173.google.com (mail-qc0-f173.google.com [209.85.216.173]) by cuda.sgi.com with ESMTP id J6IAstoSZiuPJw9t (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:46:43 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.173 Received: by mail-qc0-f173.google.com with SMTP id i8so7722908qcq.32 for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:46:42 -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:subject:date:message-id; bh=oacMXx6FIVvlF8FQH7XtDqoRzAGbIK+LcDomrleVnzg=; b=LKdGHCaefWauW2kGGEhMrQdUCdIl51DFeyMvbd1rYaOodDl6ptg1EUqoseZAHfg4S3 BDMFp3fTh6l13bvRbLeJBUqj0bPSk0oKjTLOx+DgaOcvjtRNj9VqVlBK4trCLboBbzUD eF6DpOTtf0hlslrU5q0lKn9QnEzaAoybq631DKM/rpl7XqGzE38pqzdjwjTDtAb5n8He 7IQtMSGDjZwNgn+nLnd/BkQi56GH10fBaJzlubR63e8NAX9AUJ4wU2sIiEZfflv6q8H8 Xgr5wqEAS2oS5qc5jAs7hyCo/XKRf+GLrh5dhgbRcQe3b0pW9JZfxhOQrbCpEOElxhpk hb7A== X-Gm-Message-State: ALoCoQkNzm+vcUG47qcpcE2jbPfkvCSBHOgRasn9mEoGgj+EhSo/3V0xp6BPJ+PPVL/tkgfVnCRI X-Received: by 10.224.53.194 with SMTP id n2mr36976155qag.48.1399898802849; Mon, 12 May 2014 05:46:42 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id q33sm7141551qgq.27.2014.05.12.05.46.41 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 05:46:41 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC Date: Mon, 12 May 2014 08:46:35 -0400 X-ASG-Orig-Subj: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC Message-Id: <1399898795-12967-1-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: mail-qc0-f173.google.com[209.85.216.173] X-Barracuda-Start-Time: 1399898803 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.5745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfstests was failing to build on my rawhide box. The problem was that some of the headers included by loggen.c no longer exist in current releases. This just removes those includes and adds a conditional definition of XFS_TRANS_MAGIC. It may make more sense to just move XFS_TRANS_MAGIC to a different header, but this seems to work on both f20 and rawhide boxes. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- src/loggen.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/loggen.c b/src/loggen.c index 522c9178ee26..1740732249b6 100644 --- a/src/loggen.c +++ b/src/loggen.c @@ -26,8 +26,6 @@ */ #include <xfs/libxfs.h> -#include <xfs/xfs_log.h> -#include <xfs/xfs_log_priv.h> #ifndef ASSIGN_ANY_LSN_DISK #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ @@ -37,6 +35,10 @@ } #endif +#ifndef XFS_TRANS_MAGIC +#define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ +#endif + void usage(void) { -- 1.9.0 From mneuer@web.de Mon May 12 07:59:07 2014 Return-Path: <mneuer@web.de> X-Spam-Checker-Version: SpamAssassin 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 0FA5D7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:59:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B353304032 for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:59:03 -0700 (PDT) X-ASG-Debug-ID: 1399899541-04cb6c729048b6d0001-NocioJ Received: from mout.web.de (mout.web.de [212.227.15.3]) by cuda.sgi.com with ESMTP id gw0abYf8o1yEi1zG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 05:59:02 -0700 (PDT) X-Barracuda-Envelope-From: mneuer@web.de X-Barracuda-Apparent-Source-IP: 212.227.15.3 Received: from [134.60.2.64] ([134.60.2.64]) by smtp.web.de (mrweb102) with ESMTPSA (Nemesis) id 0LwHkw-1Wrw5L1MJK-0184oE for <xfs@oss.sgi.com>; Mon, 12 May 2014 14:59:01 +0200 Message-ID: <5370C592.6080402@web.de> Date: Mon, 12 May 2014 14:58:58 +0200 From: Matthias Neuer <mneuer@web.de> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs spanning over ssd and hdd Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: xfs spanning over ssd and hdd Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:rJxPDdZQfhBglYTmQ0mCJERySaJ9PbPHUVAzMACl/FGHrF9/429 LMo/hDJwqSQKu8mzCJRd9mutCrfS2781E1mDWlhsuaNOUxtcbZCaG1x3xaVMJ6CZ6tIFcig aYpBxq64V/V/l/EaeUBOxbl3zkWc3XJZUuka5kOnH6uMExvkCynmkIxz3HIXCov1yfd6Vcw eSsJWTcNOyvpa7VSCx4vg== X-Barracuda-Connect: mout.web.de[212.227.15.3] X-Barracuda-Start-Time: 1399899542 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.5745 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi. I have a slow and big hdd and a fast but small ssd and want to test the following setup but don't know if it's possible. Use LVM to concatenate the ssd and the hdd linearly. Create a xfs filesystem on this device such that the sdd is filled first, i.e. data is written to the ssd as long as there is free space, otherwise the data is written to the hdd. I have applications which may benefit from this setup but I am not sure so I need to do some benchmarks. Thanks for your help Matthias From eflorac@intellique.com Mon May 12 09:13:51 2014 Return-Path: <eflorac@intellique.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C75927F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 09:13:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF2F9304053 for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:13:48 -0700 (PDT) X-ASG-Debug-ID: 1399904026-04cb6c1fcc33c830001-NocioJ Received: from smtp2-g21.free.fr (smtp2-g21.free.fr [212.27.42.2]) by cuda.sgi.com with ESMTP id DOXrsesJbs4FukDI for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:13:47 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.2 Received: from galadriel.home (unknown [82.235.234.79]) by smtp2-g21.free.fr (Postfix) with ESMTP id D829D4B0069; Mon, 12 May 2014 16:12:23 +0200 (CEST) Date: Mon, 12 May 2014 16:13:40 +0200 From: Emmanuel Florac <eflorac@intellique.com> To: Matthias Neuer <mneuer@web.de> Cc: xfs@oss.sgi.com Subject: Re: xfs spanning over ssd and hdd Message-ID: <20140512161340.272a8e21@galadriel.home> X-ASG-Orig-Subj: Re: xfs spanning over ssd and hdd In-Reply-To: <5370C592.6080402@web.de> References: <5370C592.6080402@web.de> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp2-g21.free.fr[212.27.42.2] X-Barracuda-Start-Time: 1399904026 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.5746 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Mon, 12 May 2014 14:58:58 +0200 vous =C3=A9criviez: > I have a slow and big hdd and a fast but small ssd and want to test > the following setup but don't know if it's possible. This doesn't make much sense. If you want to speed up your HDD by using the SSD as a cache, you can set up one of the numerous block-cache systems available for Linux: bcache, enhance IO, FlashCache... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | <eflorac@intellique.com> | +33 1 78 94 84 02 ------------------------------------------------------------------------ From sandeen@sandeen.net Mon May 12 09:20:32 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DEF1C7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 09:20:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B79A2304051 for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:20:32 -0700 (PDT) X-ASG-Debug-ID: 1399904424-04bdf02b8c4a99d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yIZeVjQ6jFhQ3IhA for <xfs@oss.sgi.com>; Mon, 12 May 2014 07:20: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4CCC663C6058; Mon, 12 May 2014 09:20:24 -0500 (CDT) Message-ID: <5370D8AA.2010003@sandeen.net> Date: Mon, 12 May 2014 09:20:26 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Matthias Neuer <mneuer@web.de>, xfs@oss.sgi.com Subject: Re: xfs spanning over ssd and hdd References: <5370C592.6080402@web.de> X-ASG-Orig-Subj: Re: xfs spanning over ssd and hdd In-Reply-To: <5370C592.6080402@web.de> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399904424 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/12/14, 7:58 AM, Matthias Neuer wrote: > Hi. > > I have a slow and big hdd and a fast but small ssd and want to test the following setup but don't know if it's possible. > > Use LVM to concatenate the ssd and the hdd linearly. Create a xfs filesystem on this device such that the sdd is filled first, i.e. data is written to the ssd as long as there is free space, otherwise the data is written to the hdd. > > I have applications which may benefit from this setup but I am not sure so I need to do some benchmarks. XFS doesn't fill from the front, so you can't configure things to fill the HDD first. Files in new directories rotor around the allocation groups on the filesystem, so all regions of the fs are filled more or less evenly. -Eric > Thanks for your help > Matthias > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From jlayton@poochiereds.net Mon May 12 10:06:45 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 EF5097F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:06:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DEE318F804B for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:45 -0700 (PDT) X-ASG-Debug-ID: 1399907201-04cbb03cc7474e30001-NocioJ Received: from mail-qa0-f53.google.com (mail-qa0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id If5sAHWSk7qMAqAP (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:41 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.53 Received: by mail-qa0-f53.google.com with SMTP id ih12so7093479qab.40 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06: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:from:to:subject:date:message-id; bh=P5W0z6o2wpqx6MzxDGr6gJXeSsOEtrdLcRCczd7SgpM=; b=Dmoh5x3cS4pjHzsGZcCZSBV+eEGQcWQvMWPbSVojqINS9XAwhDSIBWRTX3Ht7WqlEP Sq1V/0bLLuJDBClnbydJx4TWQjmb+HCIFuQOlZlWtZDPAe85jhsKC/4wTzp8p7KsaBxz nCFcBr/kW5Dpu4IBa4sK9mF56SY/XxUBO0ZLHfp6PKRGVyu6fjsU0R1PwVuX1w6L/FKy 2DBVmuTBwESQMOr58fipUX7Fgpx45W0KQMLI15cwShkfedsDUcqWCUtV2FpcX1jBs8Bc BfC2jugVEdd/q2tj/jf0drs/Vj7Ji+Eg1jDbZWUkGbGZyb1QgqK608Phx0EBslFU41yu P0sg== X-Gm-Message-State: ALoCoQm87ec2FWPpl+iX7LsVWi1F9aljh08vp3Sley/bMM1ESVuTGqlV+8a95KkPw5D5kupZiIfp X-Received: by 10.140.28.3 with SMTP id 3mr37602823qgy.71.1399907200912; Mon, 12 May 2014 08:06:40 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id r15sm10025356qgr.15.2014.05.12.08.06.39 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 08:06:40 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Date: Mon, 12 May 2014 11:06:29 -0400 X-ASG-Orig-Subj: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-Id: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: mail-qa0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1399907201 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patchset does some general cleanup of the locktest binary, adds some infrastructure to allow testing F_GETLK requests, and adds a new F_GETLK test to the pile. The main impetus here is a regression that I caused in F_GETLK handling for v3.15. The patch is making its way to Linus now, but I want to be sure that it doesn't regress in the future. Jeff Layton (4): locktest: don't assume that F_OPEN should use O_RDWR locktest: set f_fd to INVALID_HANDLE on close locktest: consolidate do_lock and do_unlock, and add ability to F_GETLK locktest: add a F_GETLK vs. openmode test src/locktest.c | 125 ++++++++++++++++++++++++++------------------------------- 1 file changed, 56 insertions(+), 69 deletions(-) -- 1.9.0 From jlayton@poochiereds.net Mon May 12 10:06:47 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 30D397F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:06:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A37D30405F for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:46 -0700 (PDT) X-ASG-Debug-ID: 1399907204-04cbb03cc5474e30001-NocioJ Received: from mail-qg0-f42.google.com (mail-qg0-f42.google.com [209.85.192.42]) by cuda.sgi.com with ESMTP id EFslaLtW97zdubqX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:45 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.192.42 Received: by mail-qg0-f42.google.com with SMTP id q107so7864217qgd.15 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06: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:from:to:subject:date:message-id:in-reply-to :references; bh=H/bXTfyAq2LQjvhoSIiS9qgg543lpybX4DppUXjSQm8=; b=ijJtUnkgWVFeinzTEMrFIoOpKL2Qdzk5QQRtnAD3u1KmNMq0gyVEb65y1yHd9jzVzl vof0379Cj9Dl/mmGAj4kL43PPkBvcpdREAIvy4IWjKp69082lLcz0Po8mWExFSeMlcKJ IS/3yz0+CsKnFAxQRTf3OrvmO9BlZiEEUoSP/PlMuwRhkscoF4jOG2qhCUCqpjTkwaWp 4yAuklAR1EyVMDBXkxKH9gbJOJOMOI/9kHcEN6/ztvfd33skLYu/aCRycdJXUXPf4xK0 2pk0VpG3VX24JihoOABWJKeO7Q2sww5ByFFGY7KeqAo45vG0FFKI3qkc786vbMITRq5v JE8Q== X-Gm-Message-State: ALoCoQniRWDvwoOeCG0NNs4FeanpYegkbBxwei9v6iG0SeqM0Bk/kMreAltZYgLbp0a6aHC37W9k X-Received: by 10.224.112.74 with SMTP id v10mr39142624qap.28.1399907204799; Mon, 12 May 2014 08:06:44 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id r15sm10025356qgr.15.2014.05.12.08.06.43 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 08:06:44 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH 3/4] locktest: consolidate do_lock and do_unlock, and add ability to F_GETLK Date: Mon, 12 May 2014 11:06:32 -0400 X-ASG-Orig-Subj: [xfstests PATCH 3/4] locktest: consolidate do_lock and do_unlock, and add ability to F_GETLK Message-Id: <1399907193-23857-4-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> X-Barracuda-Connect: mail-qg0-f42.google.com[209.85.192.42] X-Barracuda-Start-Time: 1399907205 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Eliminate do_unlock as it's just cut-and-paste of do_lock (down to the bad stderr fprintf). Fix the debug messages to print the cmd and type, and add the ability to do a WRTEST and RDTEST. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- src/locktest.c | 61 ++++++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/src/locktest.c b/src/locktest.c index 0a674a7ff5c2..c9cd04ca4a59 100644 --- a/src/locktest.c +++ b/src/locktest.c @@ -110,6 +110,8 @@ static int D_flag = 0; #define UNLOCK 2 #define F_CLOSE 3 #define F_OPEN 4 +#define WRTEST 5 +#define RDTEST 6 #define PASS 1 #define FAIL 0 @@ -629,14 +631,14 @@ int do_open(int flag) return PASS; } -int do_lock(int type, int start, int length) +static int do_lock(int cmd, int type, int start, int length) { int ret; int filedes = f_fd; struct flock fl; if(debug > 1) { - fprintf(stderr, "do_lock: start=%d, length=%d\n", start, length); + fprintf(stderr, "do_lock: cmd=%d type=%d start=%d, length=%d\n", cmd, type, start, length); } if (f_fd < 0) @@ -650,7 +652,7 @@ int do_lock(int type, int start, int length) errno = 0; - ret = fcntl(filedes, F_SETLK, &fl); + ret = fcntl(filedes, cmd, &fl); saved_errno = errno; if(debug > 1 && ret) @@ -659,35 +661,6 @@ int do_lock(int type, int start, int length) return(ret==0?PASS:FAIL); } -int do_unlock(int start, int length) -{ - int ret; - int filedes = f_fd; - struct flock fl; - - if(debug > 1) { - fprintf(stderr, "do_unlock: start=%d, length=%d\n", start, length); - } - - if (f_fd < 0) - return f_fd; - - fl.l_start = start; - fl.l_len = length; - fl.l_whence = SEEK_SET; - fl.l_pid = getpid(); - fl.l_type = F_UNLCK; - - errno = 0; - - ret = fcntl(filedes, F_SETLK, &fl); - saved_errno = errno; - if(debug > 1 && ret) - fprintf(stderr, "do_lock: ret = %d, errno = %d (%s)\n", ret, errno, strerror(errno)); - - return(ret==0?PASS:FAIL); -} - int do_close(void) { if(debug > 1) { @@ -1016,13 +989,13 @@ main(int argc, char *argv[]) if(tests[index][TEST_NUM] != 0) { switch(tests[index][COMMAND]) { case WRLOCK: - result = do_lock(F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case RDLOCK: - result = do_lock(F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case UNLOCK: - result = do_unlock(tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_UNLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case F_CLOSE: result = do_close(); @@ -1030,6 +1003,12 @@ main(int argc, char *argv[]) case F_OPEN: result = do_open(tests[index][FLAGS]); break; + case WRTEST: + result = do_lock(F_GETLK, F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); + break; + case RDTEST: + result = do_lock(F_GETLK, F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); + break; } if( result != tests[index][RESULT]) { fail_flag++; @@ -1126,13 +1105,13 @@ main(int argc, char *argv[]) ctl.length = tests[index][LENGTH]; switch(tests[index][COMMAND]) { case WRLOCK: - result = do_lock(F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case RDLOCK: - result = do_lock(F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case UNLOCK: - result = do_unlock(tests[index][OFFSET], tests[index][LENGTH]); + result = do_lock(F_SETLK, F_UNLCK, tests[index][OFFSET], tests[index][LENGTH]); break; case F_CLOSE: result = do_close(); @@ -1140,6 +1119,12 @@ main(int argc, char *argv[]) case F_OPEN: result = do_open(tests[index][FLAGS]); break; + case WRTEST: + result = do_lock(F_GETLK, F_WRLCK, tests[index][OFFSET], tests[index][LENGTH]); + break; + case RDTEST: + result = do_lock(F_GETLK, F_RDLCK, tests[index][OFFSET], tests[index][LENGTH]); + break; } if( result != tests[index][RESULT] ) { if(debug) -- 1.9.0 From jlayton@poochiereds.net Mon May 12 10:06:47 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B8AB27F53 for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:06:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A86308F804B for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:44 -0700 (PDT) X-ASG-Debug-ID: 1399907202-04cbb03cc6474e30001-NocioJ Received: from mail-qa0-f48.google.com (mail-qa0-f48.google.com [209.85.216.48]) by cuda.sgi.com with ESMTP id dZgVbijZSDBQMq0W (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:42 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.48 Received: by mail-qa0-f48.google.com with SMTP id i13so7229120qae.35 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:42 -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:subject:date:message-id:in-reply-to :references; bh=Ej2XToN6IEqGDrZr5CEuPJ14Azae8joJkEWO+ywWZSg=; b=eV/qY14o6lntAA/03n74Vo89EqKsAHwWv4mEB7+A4fs7+eJjxUudQY8o/6FGEU87KY lBbmdEpcsmUxz/9TPriHCcos7Q3d59t8OfzsP8gOjiaEvcXvvSw2oyae85E/ftp8NIVZ bl3erCBHIrMNip1AqPOmkvbvQenw2n6Ul6JKK8mtskM03E+119qJRB+dn4hxcRgSguaK p1yjxthSFnTVjJoZ+a2xWjKNTiLDJ0grNEhLVKR4FQ48MICCcf/Bz42sTJPjR2dR1vBr TWIVftOjzxqKFK/pKF82xFD5Lmy/6LgFqh3OOyW8mt7tXEGM372pnl4p/IzZ8tsLxYPe O/Pg== X-Gm-Message-State: ALoCoQlq5xGQMZRIhBKtIpA+V/HavL5w/yH9S2vLnVmmrcnp7rkZif5zJnUGcWabPb6IPkrCaO2S X-Received: by 10.140.25.37 with SMTP id 34mr11743342qgs.60.1399907202177; Mon, 12 May 2014 08:06:42 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id r15sm10025356qgr.15.2014.05.12.08.06.40 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 08:06:41 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH 1/4] locktest: don't assume that F_OPEN should use O_RDWR Date: Mon, 12 May 2014 11:06:30 -0400 X-ASG-Orig-Subj: [xfstests PATCH 1/4] locktest: don't assume that F_OPEN should use O_RDWR Message-Id: <1399907193-23857-2-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> X-Barracuda-Connect: mail-qa0-f48.google.com[209.85.216.48] X-Barracuda-Start-Time: 1399907202 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In a later patch, I'll be adding a test for F_GETLK that will require that we open the file with a different f_mode. Change do_open not to assume that the it needs to open the file O_RDWR. While we're at it, fix a bug in do_open. Just because we pass in '0' for the flags, doesn't mean that this is the initial open. Move the exit(1) for that case to the caller. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- src/locktest.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/locktest.c b/src/locktest.c index d6198b6c1f1b..b440a43e3947 100644 --- a/src/locktest.c +++ b/src/locktest.c @@ -73,7 +73,7 @@ extern int h_errno; #define HANDLE int #define INVALID_HANDLE -1 -#define OPEN(N,F) (open(N, F|O_CREAT|O_RDWR|O_BINARY| \ +#define OPEN(N,F) (open(N, F|O_CREAT|O_BINARY| \ (D_flag ? O_DIRECT : 0), 0644)) #define SEEK(H, O) (lseek(H, O, SEEK_SET)) #define READ(H, B, L) (read(H, B, L)) @@ -512,35 +512,35 @@ static int64_t tests[][6] = {27, WRLOCK, 1, 5, FAIL, CLIENT, }, {27, F_CLOSE,0, 0, PASS, SERVER, }, {27, WRLOCK, 1, 5, PASS, CLIENT, }, - {27, F_OPEN, 0, 0, PASS, SERVER, }, + {27, F_OPEN, O_RDWR, 0, PASS, SERVER, }, {27, UNLOCK, 1, 5, PASS, CLIENT, }, /* Acquire two read locks, close one file and then reopen to check that first lock still exists */ {28, RDLOCK, 1, 5, PASS, SERVER, }, {28, RDLOCK, 1, 5, PASS, CLIENT, }, {28, F_CLOSE,0, 0, PASS, SERVER, }, - {28, F_OPEN, 0, 0, PASS, SERVER, }, + {28, F_OPEN, O_RDWR, 0, PASS, SERVER, }, {28, WRLOCK, 0, 0, FAIL, SERVER, }, {28, UNLOCK, 1, 5, PASS, SERVER, }, #ifdef macosx /* Close the opened file and open the file with SHLOCK, other client will try to open with SHLOCK too */ {29, F_CLOSE,0, 0, PASS, SERVER, }, - {29, F_OPEN, O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, + {29, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, {29, F_CLOSE,0, 0, PASS, CLIENT, }, - {29, F_OPEN, O_SHLOCK|O_NONBLOCK, 0, PASS, CLIENT, }, + {29, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, CLIENT, }, /* Close the opened file and open the file with SHLOCK, other client will try to open with EXLOCK */ {30, F_CLOSE,0, 0, PASS, SERVER, }, {30, F_CLOSE,0, 0, PASS, CLIENT, }, - {30, F_OPEN, O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, - {30, F_OPEN, O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, + {30, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, + {30, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, /* Close the opened file and open the file with EXLOCK, other client will try to open with EXLOCK too */ {31, F_CLOSE,0, 0, PASS, SERVER, }, {31, F_CLOSE,0, 0, FAIL, CLIENT, }, - {31, F_OPEN, O_EXLOCK|O_NONBLOCK, 0, PASS, SERVER, }, - {31, F_OPEN, O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, + {31, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, PASS, SERVER, }, + {31, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, {31, F_CLOSE,0, 0, PASS, SERVER, }, {31, F_CLOSE,0, 0, FAIL, CLIENT, }, - {31, F_OPEN, 0, 0, PASS, SERVER, }, - {31, F_OPEN, 0, 0, PASS, CLIENT, }, + {31, F_OPEN, O_RDWR, 0, PASS, SERVER, }, + {31, F_OPEN, O_RDWR, 0, PASS, CLIENT, }, #endif /* macosx */ /* indicate end of array */ {0,0,0,0,0,SERVER}, @@ -615,8 +615,6 @@ int do_open(int flag) { if ((f_fd = OPEN(filename, flag)) == INVALID_HANDLE) { perror("shared file create"); - if (!flag) /* Only exit if the first open fails */ - exit(1); closed = 0; return FAIL; /*NOTREACHED*/ @@ -858,7 +856,8 @@ main(int argc, char *argv[]) } filename=argv[optind]; - do_open(0); + if (do_open(O_RDWR) == FAIL) + exit(1); /* * +10 is slop for the iteration number if do_write() ... never -- 1.9.0 From jlayton@poochiereds.net Mon May 12 10:06:49 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 07EAC7F57 for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:06:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 724D0AC003 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:45 -0700 (PDT) X-ASG-Debug-ID: 1399907203-04cb6c728f490d40001-NocioJ Received: from mail-qa0-f53.google.com (mail-qa0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id jR5ecClf04URXCfV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:43 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.53 Received: by mail-qa0-f53.google.com with SMTP id ih12so7048289qab.26 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06: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:from:to:subject:date:message-id:in-reply-to :references; bh=eAnNOwBm6MedXm1gak62bWC6FfGgTUU5hrh2F38IvhI=; b=PhQ5QapkE4E83/leW9PUhiUPLBUMuPC7nKU/KV69exXd2nZuK1dOJ+HHx1lB2kkNJT Kp7Dzfp4yhDCpH0+3UcaCJKpDVfEI6E/oWMFZXeS27kch61kaPKFICN9aDU6P+k7UNJR ejFcytyw1XH2YcfMVxPmA/e0a+oHqoXYPnnTvCbVAZyPDz9JLw7ZJfTMFBIvog4UydH9 q8pPorpiuC5gnkjr19/+jic43Kc8te/JEfbf6DytvKGkPqnEQ2tAh65toM140uX5AjuY XHfIh2Si0aGbH13Q3rAMsKqgzk6vJ1otxexE8MhNQ9vIl4mLUvTk2JBzbyCUiaYz7vBW w9qQ== X-Gm-Message-State: ALoCoQkCnh321V5nZ1otgVOdTefSAGWRRC2evHttSKE/YCCFaoAEXncvi6C43ZwlKsFqXL1tJU0D X-Received: by 10.224.98.141 with SMTP id q13mr39507998qan.64.1399907203554; Mon, 12 May 2014 08:06:43 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id r15sm10025356qgr.15.2014.05.12.08.06.42 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 08:06:42 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH 2/4] locktest: set f_fd to INVALID_HANDLE on close Date: Mon, 12 May 2014 11:06:31 -0400 X-ASG-Orig-Subj: [xfstests PATCH 2/4] locktest: set f_fd to INVALID_HANDLE on close Message-Id: <1399907193-23857-3-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> X-Barracuda-Connect: mail-qa0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1399907203 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Ensure that the fd is marked invalid after close. Also, the "closed" and "reopen" variables are always set to 0. Remove them. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- src/locktest.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/locktest.c b/src/locktest.c index b440a43e3947..0a674a7ff5c2 100644 --- a/src/locktest.c +++ b/src/locktest.c @@ -96,8 +96,6 @@ static int debug = 0; static int server = 1; static int maxio = 8192; static int port = 7890; -static int reopen=0; -static int closed=0; static int testnumber = -1; static int saved_errno = 0; @@ -615,13 +613,10 @@ int do_open(int flag) { if ((f_fd = OPEN(filename, flag)) == INVALID_HANDLE) { perror("shared file create"); - closed = 0; return FAIL; /*NOTREACHED*/ } - closed = 0; - #ifdef __sun if (D_flag) { directio(f_fd, DIRECTIO_ON); @@ -701,12 +696,13 @@ int do_close(void) errno =0; CLOSE(f_fd); + f_fd = INVALID_HANDLE; saved_errno = errno; if (errno) return FAIL; - return(PASS); + return PASS; } void @@ -778,7 +774,7 @@ void recv_ctl(void) void cleanup(void) { - if (f_fd>=0 && !reopen && !closed) + if (f_fd>=0) CLOSE(f_fd); if (c_fd>=0) -- 1.9.0 From jlayton@poochiereds.net Mon May 12 10:06:47 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 ED41D7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:06:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DCF9C8F804B for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:47 -0700 (PDT) X-ASG-Debug-ID: 1399907206-04cb6c728f490d50001-NocioJ Received: from mail-qg0-f41.google.com (mail-qg0-f41.google.com [209.85.192.41]) by cuda.sgi.com with ESMTP id 9l15JW1aNIZz2UEn (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:46 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.192.41 Received: by mail-qg0-f41.google.com with SMTP id j5so7832524qga.28 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:06:46 -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:subject:date:message-id:in-reply-to :references; bh=QeP7VJ8Y79FWlDxkZt0RO6PK3elgmO4bUl3AG4GOuJY=; b=g95idTGgnJ4sMXZUMR2BICwz0C+uWESSCbnnszrll38v4SokuxI9vabtZBan/HH2gY l0mnWV03U2TcCbGtCvrJZJntuvLUElca6gzEZ6/4cwwGnoy7ai1rXHoIzFjzxW3kxRrM DauuJvivYRA7ox6kEljX4Wo3gnXjc7Uy6DZEws6ZEcE6JW5fT8bnyQqJTgfNhcBnene2 r8uPvANGzhfOS41c0OiaRONfg5jAvRugCt364yLdFAr81lRmruIUo6m93Pr1+NXxd0Hk 26SpYIKJK9XBSmUZrfnlL4WrHqYKzTcWunSQ3OdZYyUuy1sQdSkamOI2pDPYKpGChT4q jG8Q== X-Gm-Message-State: ALoCoQn4YngSo1CZ36e6Jrsi+oG+sKjsFDtUoc3aNOpEqaGTcfjMzY1YaTuz+EB5v9NCnd5VekXv X-Received: by 10.140.26.207 with SMTP id 73mr37335279qgv.51.1399907206143; Mon, 12 May 2014 08:06:46 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id r15sm10025356qgr.15.2014.05.12.08.06.44 for <xfs@oss.sgi.com> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 May 2014 08:06:45 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Subject: [xfstests PATCH 4/4] locktest: add a F_GETLK vs. openmode test Date: Mon, 12 May 2014 11:06:33 -0400 X-ASG-Orig-Subj: [xfstests PATCH 4/4] locktest: add a F_GETLK vs. openmode test Message-Id: <1399907193-23857-5-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> X-Barracuda-Connect: mail-qg0-f41.google.com[209.85.192.41] X-Barracuda-Start-Time: 1399907206 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.5747 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- POSIX says that you're allowed to do F_GETLK for a F_WRLCK on an O_RDONLY file description. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- src/locktest.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/locktest.c b/src/locktest.c index c9cd04ca4a59..23bb2406dc24 100644 --- a/src/locktest.c +++ b/src/locktest.c @@ -180,10 +180,11 @@ char *descriptions[] = { /* 26 */"Acquire read and write locks with overlapping ranges", /* 27 */"Acquire whole file write lock and then close without unlocking (and attempt a lock)", /* 28 */"Acquire two read locks, close and reopen the file, and test if the inital lock is still there", + /* 29 */"Verify that F_GETLK for F_WRLCK doesn't require that file be opened for write", #if defined(macosx) - /* 29 */"Close the opened file and open the file with SHLOCK, other client will try to open with SHLOCK too", - /* 30 */"Close the opened file and open the file with SHLOCK, other client will try to open with EXLOCK", - /* 31 */"Close the opened file and open the file with EXLOCK, other client will try to open with EXLOCK too" + /* 30 */"Close the opened file and open the file with SHLOCK, other client will try to open with SHLOCK too", + /* 31 */"Close the opened file and open the file with SHLOCK, other client will try to open with EXLOCK", + /* 32 */"Close the opened file and open the file with EXLOCK, other client will try to open with EXLOCK too" #endif }; @@ -521,26 +522,32 @@ static int64_t tests[][6] = {28, F_OPEN, O_RDWR, 0, PASS, SERVER, }, {28, WRLOCK, 0, 0, FAIL, SERVER, }, {28, UNLOCK, 1, 5, PASS, SERVER, }, + /* Verify that F_GETLK for F_WRLCK doesn't require that file be opened for write */ + {29, F_CLOSE, 0, 0, PASS, SERVER, }, + {29, F_OPEN, O_RDONLY, 0, PASS, SERVER, }, + {29, WRTEST, 0, 0, PASS, SERVER, }, + {29, F_CLOSE,0, 0, PASS, SERVER, }, + {29, F_OPEN, O_RDWR, 0, PASS, SERVER, }, #ifdef macosx /* Close the opened file and open the file with SHLOCK, other client will try to open with SHLOCK too */ - {29, F_CLOSE,0, 0, PASS, SERVER, }, - {29, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, - {29, F_CLOSE,0, 0, PASS, CLIENT, }, - {29, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, CLIENT, }, - /* Close the opened file and open the file with SHLOCK, other client will try to open with EXLOCK */ {30, F_CLOSE,0, 0, PASS, SERVER, }, - {30, F_CLOSE,0, 0, PASS, CLIENT, }, {30, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, - {30, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, - /* Close the opened file and open the file with EXLOCK, other client will try to open with EXLOCK too */ + {30, F_CLOSE,0, 0, PASS, CLIENT, }, + {30, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, CLIENT, }, + /* Close the opened file and open the file with SHLOCK, other client will try to open with EXLOCK */ {31, F_CLOSE,0, 0, PASS, SERVER, }, - {31, F_CLOSE,0, 0, FAIL, CLIENT, }, - {31, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, PASS, SERVER, }, + {31, F_CLOSE,0, 0, PASS, CLIENT, }, + {31, F_OPEN, O_RDWR|O_SHLOCK|O_NONBLOCK, 0, PASS, SERVER, }, {31, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, - {31, F_CLOSE,0, 0, PASS, SERVER, }, - {31, F_CLOSE,0, 0, FAIL, CLIENT, }, - {31, F_OPEN, O_RDWR, 0, PASS, SERVER, }, - {31, F_OPEN, O_RDWR, 0, PASS, CLIENT, }, + /* Close the opened file and open the file with EXLOCK, other client will try to open with EXLOCK too */ + {32, F_CLOSE,0, 0, PASS, SERVER, }, + {32, F_CLOSE,0, 0, FAIL, CLIENT, }, + {32, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, PASS, SERVER, }, + {32, F_OPEN, O_RDWR|O_EXLOCK|O_NONBLOCK, 0, FAIL, CLIENT, }, + {32, F_CLOSE,0, 0, PASS, SERVER, }, + {32, F_CLOSE,0, 0, FAIL, CLIENT, }, + {32, F_OPEN, O_RDWR, 0, PASS, SERVER, }, + {32, F_OPEN, O_RDWR, 0, PASS, CLIENT, }, #endif /* macosx */ /* indicate end of array */ {0,0,0,0,0,SERVER}, -- 1.9.0 From roger@filmlight.ltd.uk Mon May 12 10:22:22 2014 Return-Path: <roger@filmlight.ltd.uk> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 796E17F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:22:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 08105AC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:22:21 -0700 (PDT) X-ASG-Debug-ID: 1399908139-04bdf02b8c4aca90001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id QWp7KD156HcDv57w for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:22:19 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 32552 invoked from network); 12 May 2014 15:22:18 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.132?) (roger@10.44.0.132) by b.mx.filmlight.ltd.uk with SMTP; 12 May 2014 15:22:18 -0000 Subject: 'delete' parameter in xfs_ialloc.h From: Roger Willcocks <roger@filmlight.ltd.uk> X-ASG-Orig-Subj: 'delete' parameter in xfs_ialloc.h To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Date: Mon, 12 May 2014 16:22:18 +0100 Message-Id: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 8bit X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1399908139 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.5748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, I have to fix this up every time I update xfsprogs - The 'delete' parameter in xfsprogs/include/xfs_ialloc.c:xfs_difree(...) causes a compile error if the header's included in C++ code (even with 'extern "C"') - xfs_ialloc.h:102: error: expected ‘,’ or ‘...’ before ‘delete’ (gcc 4.4.7) It would be handy if the parameter name could be commented out or changed in the header. -- Roger Willcocks <roger@filmlight.ltd.uk> From sandeen@sandeen.net Mon May 12 10:31:49 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4EA827F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:31:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3838C8F8039 for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:31:48 -0700 (PDT) X-ASG-Debug-ID: 1399908706-04cbb03cc6475fb0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mO6jlEOyAMxJKsbs for <xfs@oss.sgi.com>; Mon, 12 May 2014 08:31:47 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C1E1F63C6058; Mon, 12 May 2014 10:31:46 -0500 (CDT) Message-ID: <5370E964.50805@sandeen.net> Date: Mon, 12 May 2014 10:31:48 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Roger Willcocks <roger@filmlight.ltd.uk>, xfs@oss.sgi.com Subject: Re: 'delete' parameter in xfs_ialloc.h References: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> X-ASG-Orig-Subj: Re: 'delete' parameter in xfs_ialloc.h In-Reply-To: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1399908706 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.5748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/12/14, 10:22 AM, Roger Willcocks wrote: > Hi folks, > > I have to fix this up every time I update xfsprogs - > > The 'delete' parameter in xfsprogs/include/xfs_ialloc.c:xfs_difree(...) > causes a compile error if the header's included in C++ code (even with > 'extern "C"') - > > xfs_ialloc.h:102: error: expected ‘,’ or ‘...’ before ‘delete’ > > (gcc 4.4.7) > > It would be handy if the parameter name could be commented out or > changed in the header. > Send a patch? Would need to hit kernel code too. -Eric From roger@filmlight.ltd.uk Mon May 12 12:52:29 2014 Return-Path: <roger@filmlight.ltd.uk> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 317237F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 12:52:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0921D8F8039 for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:28 -0700 (PDT) X-ASG-Debug-ID: 1399917147-04cbb03cc747c520001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id mnDmnrjDVPjUH60v for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:27 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 12063 invoked from network); 12 May 2014 17:52:27 -0000 Received: from dhcp-183.filmlight.ltd.uk (roger@10.44.0.183) by b.mx.filmlight.ltd.uk with SMTP; 12 May 2014 17:52:27 -0000 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: [PATCH] xfsprogs: fix compile error when libxfs header used in C++ code From: Roger Willcocks <roger@filmlight.ltd.uk> X-ASG-Orig-Subj: [PATCH] xfsprogs: fix compile error when libxfs header used in C++ code In-Reply-To: <5370E964.50805@sandeen.net> Date: Mon, 12 May 2014 18:52:28 +0100 Cc: Roger Willcocks <roger@filmlight.ltd.uk>, xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <C6349E20-EE08-44E3-89E5-FADB707D36C1@filmlight.ltd.uk> References: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> <5370E964.50805@sandeen.net> To: Eric Sandeen <sandeen@sandeen.net> X-Mailer: Apple Mail (2.1510) X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1399917147 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.5752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_ialloc.h:102: error: expected =91,=92 or =91...=92 before =91delete=92= Simple parameter rename, no changes to behaviour. Signed-off-by: Roger Willcocks <roger@filmlight.ltd.uk> --- include/xfs_ialloc.h | 2 +- libxfs/xfs_ialloc.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index a8f76a5..c8ac0a4 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -89,7 +89,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *delete, /* set if inode cluster was = deleted */ + int *deleted, /* set if inode cluster was = deleted */ xfs_ino_t *first_ino); /* first inode in deleted = cluster */ =20 /* diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c19d84a..1dabb6c 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1080,7 +1080,7 @@ xfs_difree( xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ xfs_bmap_free_t *flist, /* extents to free */ - int *delete, /* set if inode cluster was = deleted */ + int *deleted, /* set if inode cluster was = deleted */ xfs_ino_t *first_ino) /* first inode in deleted = cluster */ { /* REFERENCED */ @@ -1180,7 +1180,7 @@ xfs_difree( if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_freecount =3D=3D XFS_IALLOC_INODES(mp))) { =20 - *delete =3D 1; + *deleted =3D 1; *first_ino =3D XFS_AGINO_TO_INO(mp, agno, = rec.ir_startino); =20 /* @@ -1208,7 +1208,7 @@ xfs_difree( agno, = XFS_INO_TO_AGBNO(mp,rec.ir_startino)), XFS_IALLOC_BLOCKS(mp), flist, mp); } else { - *delete =3D 0; + *deleted =3D 0; =20 error =3D xfs_inobt_update(cur, &rec); if (error) { --=20 1.7.1 From roger@filmlight.ltd.uk Mon May 12 12:52:30 2014 Return-Path: <roger@filmlight.ltd.uk> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 97DD429DFA for <xfs@oss.sgi.com>; Mon, 12 May 2014 12:52:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D7DA8F8039 for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:27 -0700 (PDT) X-ASG-Debug-ID: 1399917145-04cbb03cc547c510001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id fdfzAZK0EEYZ2DJO for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:25 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 12944 invoked from network); 12 May 2014 17:52:24 -0000 Received: from dhcp-183.filmlight.ltd.uk (roger@10.44.0.183) by b.mx.filmlight.ltd.uk with SMTP; 12 May 2014 17:52:24 -0000 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: Re: 'delete' parameter in xfs_ialloc.h From: Roger Willcocks <roger@filmlight.ltd.uk> X-ASG-Orig-Subj: Re: 'delete' parameter in xfs_ialloc.h In-Reply-To: <5370E964.50805@sandeen.net> Date: Mon, 12 May 2014 18:52:25 +0100 Cc: Roger Willcocks <roger@filmlight.ltd.uk>, xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <949AF4F7-F45E-49EF-AE32-D2A6F1FE6338@filmlight.ltd.uk> References: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> <5370E964.50805@sandeen.net> To: Eric Sandeen <sandeen@sandeen.net> X-Mailer: Apple Mail (2.1510) X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1399917145 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.5752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 12 May 2014, at 16:31, Eric Sandeen <sandeen@sandeen.net> wrote: > On 5/12/14, 10:22 AM, Roger Willcocks wrote: >> Hi folks, >>=20 >> I have to fix this up every time I update xfsprogs - >>=20 >> The 'delete' parameter in = xfsprogs/include/xfs_ialloc.c:xfs_difree(...) >> causes a compile error if the header's included in C++ code (even = with >> 'extern "C"') - >>=20 >> xfs_ialloc.h:102: error: expected =91,=92 or =91...=92 before = =91delete=92 >>=20 >> (gcc 4.4.7) >>=20 >> It would be handy if the parameter name could be commented out or >> changed in the header. >>=20 >=20 > Send a patch? Would need to hit kernel code too. >=20 > -Eric >=20 Okay, two near-identical patches, one for xfsprogs and one for xfs = follow. -- Roger From roger@filmlight.ltd.uk Mon May 12 12:52:36 2014 Return-Path: <roger@filmlight.ltd.uk> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0B3D229E00 for <xfs@oss.sgi.com>; Mon, 12 May 2014 12:52:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77FFFAC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:35 -0700 (PDT) X-ASG-Debug-ID: 1399917153-04cbb03cc547c520001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id ri3SELeFosFrmP3Q for <xfs@oss.sgi.com>; Mon, 12 May 2014 10:52:33 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 1101 invoked from network); 12 May 2014 17:52:33 -0000 Received: from dhcp-183.filmlight.ltd.uk (roger@10.44.0.183) by b.mx.filmlight.ltd.uk with SMTP; 12 May 2014 17:52:33 -0000 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: [PATCH] xfs: fix compile error when libxfs header used in C++ code From: Roger Willcocks <roger@filmlight.ltd.uk> X-ASG-Orig-Subj: [PATCH] xfs: fix compile error when libxfs header used in C++ code In-Reply-To: <5370E964.50805@sandeen.net> Date: Mon, 12 May 2014 18:52:34 +0100 Cc: Roger Willcocks <roger@filmlight.ltd.uk>, xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <3EEEF4AD-A192-4A5B-A81A-5FC38F5CF95F@filmlight.ltd.uk> References: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> <5370E964.50805@sandeen.net> To: Eric Sandeen <sandeen@sandeen.net> X-Mailer: Apple Mail (2.1510) X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1399917153 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.5752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_ialloc.h:102: error: expected =91,=92 or =91...=92 before =91delete' Simple parameter rename, no changes to behaviour. Signed-off-by: Roger Willcocks <roger@filmlight.ltd.uk> --- fs/xfs/xfs_ialloc.c | 6 +++--- fs/xfs/xfs_ialloc.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 8f711db..b819263 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1109,7 +1109,7 @@ xfs_difree( xfs_trans_t *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ xfs_bmap_free_t *flist, /* extents to free */ - int *delete, /* set if inode cluster was = deleted */ + int *deleted, /* set if inode cluster was = deleted */ xfs_ino_t *first_ino) /* first inode in deleted = cluster */ { /* REFERENCED */ @@ -1209,7 +1209,7 @@ xfs_difree( if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_freecount =3D=3D mp->m_ialloc_inos)) { =20 - *delete =3D 1; + *deleted =3D 1; *first_ino =3D XFS_AGINO_TO_INO(mp, agno, = rec.ir_startino); =20 /* @@ -1237,7 +1237,7 @@ xfs_difree( XFS_AGINO_TO_AGBNO(mp, = rec.ir_startino)), mp->m_ialloc_blks, flist, mp); } else { - *delete =3D 0; + *deleted =3D 0; =20 error =3D xfs_inobt_update(cur, &rec); if (error) { diff --git a/fs/xfs/xfs_ialloc.h b/fs/xfs/xfs_ialloc.h index 812365d..95ad1c0 100644 --- a/fs/xfs/xfs_ialloc.h +++ b/fs/xfs/xfs_ialloc.h @@ -90,7 +90,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *delete, /* set if inode cluster was = deleted */ + int *deleted, /* set if inode cluster was = deleted */ xfs_ino_t *first_ino); /* first inode in deleted = cluster */ =20 /* --=20 1.7.1 From david@fromorbit.com Mon May 12 17:01:06 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 865F47F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:01:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 590B53040BC for <xfs@oss.sgi.com>; Mon, 12 May 2014 15:01:06 -0700 (PDT) X-ASG-Debug-ID: 1399932061-04cb6c728f49e6c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id bYgQaLBEPM2gYOoC for <xfs@oss.sgi.com>; Mon, 12 May 2014 15:01:01 -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: Ap1LADlEcVN5LL1sPGdsb2JhbABZDoJ4iEekKQEBAQEBAQaaGwGBHBcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDQRhcWhUCIfAeEQASVUIN3lH9/Uis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 07:30:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WjyGp-0007J8-6E; Tue, 13 May 2014 08:00:27 +1000 Date: Tue, 13 May 2014 08:00:27 +1000 From: Dave Chinner <david@fromorbit.com> To: Theodore Ts'o <tytso@mit.edu> Cc: xfs@oss.sgi.com, Ext4 Developers List <linux-ext4@vger.kernel.org> Subject: Re: [PATCH -v2] check: add support for an external file containing tests to exclude Message-ID: <20140512220027.GM26353@dastard> X-ASG-Orig-Subj: Re: [PATCH -v2] check: add support for an external file containing tests to exclude References: <20140416001530.GU15995@dastard> <1397624302-9577-1-git-send-email-tytso@mit.edu> <20140416064018.GJ15995@dastard> <20140512124232.GB31376@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140512124232.GB31376@thunk.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: 1399932061 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.5757 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 08:42:32AM -0400, Theodore Ts'o wrote: > On Wed, Apr 16, 2014 at 04:40:18PM +1000, Dave Chinner wrote: > > On Wed, Apr 16, 2014 at 12:58:22AM -0400, Theodore Ts'o wrote: > > > Currently the -X option is intended to specify a set of expunging > > > files which are stored in each test/* subdirectory. As described in > > > the commit description for 0b1e8abd4, in order to exclude the test > > > generic/280, the -X option is used as follows: > > > > > > $ cat tests/generic/3.0-stable-avoid > > > 280 > > > $ sudo ./check -X 3.0-stable-avoid generic/280 > > > > > > However, it is sometimes useful to store the set of expunged tests in > > > a single file, outside of tests/* subdirectories. This commit enables > > > the following: > > > > > > $ cat /root/conf/data_journal.exclude > > > generic/068 > > > ext4/301 > > > $ sudo ./check -E /root/conf/data_journal.exclude -g auto > > > > > > Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> > > > > Looks good. > > > > Reviewed-by: Dave Chinner <dchinner@redhat.com> > > This patch has apparently not hit the xfstests repository. Would you > like me to resend it? No, I just haven't done an xfstests update for the past couple of weeks because there haven't been a lot of patches and I've been busy with other stuff. I'll do one later in the week. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 12 17:58:55 2014 Return-Path: <david@fromorbit.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 03DCC7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:58:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC22D8F818B for <xfs@oss.sgi.com>; Mon, 12 May 2014 15:58:54 -0700 (PDT) X-ASG-Debug-ID: 1399935528-04cbb03cc54848a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id KG1KhuJddlul02sr for <xfs@oss.sgi.com>; Mon, 12 May 2014 15:58:49 -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: Ap1LAEtRcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBpobAYEaFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDQQhcWhUCIfAeEQASZR5ZQKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 08:28:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WjzBF-0007QZ-FQ; Tue, 13 May 2014 08:58:45 +1000 Date: Tue, 13 May 2014 08:58:45 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Layton <jlayton@poochiereds.net> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-ID: <20140512225845.GN26353@dastard> X-ASG-Orig-Subj: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> 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: 1399935528 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.5759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 11:06:29AM -0400, Jeff Layton wrote: > This patchset does some general cleanup of the locktest binary, adds > some infrastructure to allow testing F_GETLK requests, and adds a new > F_GETLK test to the pile. > > The main impetus here is a regression that I caused in F_GETLK handling > for v3.15. The patch is making its way to Linus now, but I want to be > sure that it doesn't regress in the future. So do these changes cause locktest to fail on older kernels? i.e. does changing the test cause the locktest tests to fail where previously they passed? If so, we're going to have to make this a little more complex... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 12 18:01:56 2014 Return-Path: <david@fromorbit.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 433CF7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:01:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 160AB8F8071 for <xfs@oss.sgi.com>; Mon, 12 May 2014 16:01:53 -0700 (PDT) X-ASG-Debug-ID: 1399935708-04bdf02b8a4bd030001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id PqvuSRCV4QAFbUDV for <xfs@oss.sgi.com>; Mon, 12 May 2014 16:01:49 -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: Ap5LAEBScVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBpobAYEaFwMBAQEBODWCJQEBBTocIxAIAw4KCRoLDwUlAwcaE4hA0EIXFoVAiHwHhEAEmUeLBYl6gVEr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 08:30:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WjzDF-0007R8-IT; Tue, 13 May 2014 09:00:49 +1000 Date: Tue, 13 May 2014 09:00:49 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Layton <jlayton@poochiereds.net> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC Message-ID: <20140512230049.GO26353@dastard> X-ASG-Orig-Subj: Re: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC References: <1399898795-12967-1-git-send-email-jlayton@poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399898795-12967-1-git-send-email-jlayton@poochiereds.net> 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: 1399935709 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.5759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 08:46:35AM -0400, Jeff Layton wrote: > xfstests was failing to build on my rawhide box. The problem was that > some of the headers included by loggen.c no longer exist in current > releases. This just removes those includes and adds a conditional > definition of XFS_TRANS_MAGIC. > > It may make more sense to just move XFS_TRANS_MAGIC to a different > header, but this seems to work on both f20 and rawhide boxes. > > Signed-off-by: Jeff Layton <jlayton@poochiereds.net> > --- > src/loggen.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/src/loggen.c b/src/loggen.c > index 522c9178ee26..1740732249b6 100644 > --- a/src/loggen.c > +++ b/src/loggen.c > @@ -26,8 +26,6 @@ > */ > > #include <xfs/libxfs.h> > -#include <xfs/xfs_log.h> > -#include <xfs/xfs_log_priv.h> > > #ifndef ASSIGN_ANY_LSN_DISK > #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ > @@ -37,6 +35,10 @@ > } > #endif > > +#ifndef XFS_TRANS_MAGIC > +#define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ > +#endif It's now defined as XFS_TRANS_HEADER_MAGIC, and defined in xfs/xfs_log_format.h. So, some autoconf magic, perhaps? Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Mon May 12 18:53:43 2014 Return-Path: <namjae.jeon@samsung.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 957E67F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:53:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6D5DA8F81C0 for <xfs@oss.sgi.com>; Mon, 12 May 2014 16:53:43 -0700 (PDT) X-ASG-Debug-ID: 1399938819-04cb6c72914a1660001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id GmYKBMUyrfvuNcVm (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 16:53:41 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5H00HI8JPB7540@mailout3.samsung.com> for xfs@oss.sgi.com; Tue, 13 May 2014 08:53:35 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id C9.CB.11120.FFE51735; Tue, 13 May 2014 08:53:35 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-c6-53715effd8da Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 4A.1F.25708.EFE51735; Tue, 13 May 2014 08:53:34 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5H00KXPJPAZI00@mmp2.samsung.com>; Tue, 13 May 2014 08:53:34 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Dave Chinner' <david@fromorbit.com> Cc: xfs@oss.sgi.com, 'Brian Foster' <bfoster@redhat.com> References: <002601cf6aa2$c59cd670$50d68350$@samsung.com> <20140508133637.GB47272@bfoster.bfoster> <20140508211712.GD26353@dastard> <20140508215115.GA30141@laptop.bfoster> <20140508220505.GG26353@dastard> In-reply-to: <20140508220505.GG26353@dastard> Subject: RE: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Date: Tue, 13 May 2014 08:53:34 +0900 X-ASG-Orig-Subj: RE: [PATCH] xfs: remove XFS_TRANS_RESERVE in collapse range Message-id: <000e01cf6e3d$62e66340$28b329c0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQGWLl82jRhcin5ONYXMl+atkuypJQJ91GjjAlLnPWQCocTmBwGkjIoPm2dkpNA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrAIsWRmVeSWpSXmKPExsWyRsSkWPd/XGGwwZdGdot3n6ssthy7x2ix qO8WowOzx6lFEh6rL2xl9Hi/7ypbAHMUl01Kak5mWWqRvl0CV0b/rZnsBYelK3YumMzWwNgp 2sXIySEhYCLxdM1LVghbTOLCvfVsILaQwFJGiS8/M2Fq7rTeZOli5AKKT2eUmPHqEStE0V9G ia5+xi5GDg42AW2JP1vAZooIaEhM23uEGcRmFrCQ6Jm8khmi9wKjxMLb/8AWcAroSszdep8d pFdYwEViS0MQSJhFQFXi7/NGFhCbV8BS4vDcOVC2oMSPyfdYIGZqSazfeZwJwpaX2LzmLTPE nQoSO86+BjtHRMBP4v7FSIgSEYl9L94xgpwgIbCPXeJ+4xYWiF0CEt8mH2IBqZcQkJXYdABq jKTEwRU3WCYwSsxCsnkWks2zkGyehWTFAkaWVYyiqQXJBcVJ6UXGesWJucWleel6yfm5mxiB sXf637P+HYx3D1gfYkwGWj+RWUo0OR8Yu3kl8YbGZkYWpiamxkbmlmakCSuJ895/mBQkJJCe WJKanZpakFoUX1Sak1p8iJGJg1OqgXH+bhHv/vv6JZJT9DcElKVoH07+8X4bc0O8VJen7PEf E7boGbB/ecBaeallm5nOxvUGZ66tuduet++j1/1rM9a/Ysv8d0VvR8nPX46lq9/LcbkrrPqg oSVvcTXEfE4uSyGP8u436wV0u7gv/GmfxuZzxkN6bsCb96fPrFk3JaFj6o3tm7bcP2mkxFKc kWioxVxUnAgAdhoqcdMCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprLKsWRmVeSWpSXmKPExsVy+t9jQd3/cYXBBke4Ld59rrLYcuweo8Wi vluMDswepxZJeKy+sJXR4/2+q2wBzFENjDYZqYkpqUUKqXnJ+SmZeem2St7B8c7xpmYGhrqG lhbmSgp5ibmptkouPgG6bpk5QHuUFMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmg gYQ1jBn9t2ayFxyWrti5YDJbA2OnaBcjJ4eEgInEndabLBC2mMSFe+vZuhi5OIQEpjNKzHj1 iBUkISTwl1Giq5+xi5GDg01AW+LPFrBeEQENiWl7jzCD2MwCFhI9k1cyQ/ReYJRYePsfG0iC U0BXYu7W++wgvcICLhJbGoJAwiwCqhJ/nzeC7eUVsJQ4PHcOlC0o8WPyPRaImVoS63ceZ4Kw 5SU2r3nLDHGngsSOs6/BzhER8JO4fzESokREYt+Ld4wTGIVmIZk0C8mkWUgmzULSsoCRZRWj aGpBckFxUnqukV5xYm5xaV66XnJ+7iZGcGQ/k97BuKrB4hCjAAejEg/vgmcFwUKsiWXFlbmH GCU4mJVEeLuCCoOFeFMSK6tSi/Lji0pzUosPMSYDPTqRWUo0OR+YdPJK4g2NTcyMLI3MDS2M jM1JE1YS5z3Yah0oJJCeWJKanZpakFoEs4WJg1OqgVEkXMztx9qnP995dOcfUHGvfv2998dm 4e+xWaIhr49s0zjwb+mXV9sEGWtkMm9f0HDJMpE72+zvI5XiwtZt8zGn6LKBZ4LCgSmzzj5g 8+p+8dtp4rau+dc+WpzgL1CbHKZ5Warxn2fvBM/3P9NZW/3WqJ97FC4dlV0nofHUOOB49rId RVenr1ViKc5INNRiLipOBACtVlLzMAMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1399938820 X-Barracuda-Encrypted: RC4-MD5 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.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=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== > > On Thu, May 08, 2014 at 05:51:16PM -0400, Brian Foster wrote: > > On Fri, May 09, 2014 at 07:17:12AM +1000, Dave Chinner wrote: > > > On Thu, May 08, 2014 at 09:36:37AM -0400, Brian Foster wrote: > > > > On Thu, May 08, 2014 at 06:49:14PM +0900, Namjae Jeon wrote: > > > > > There is no need to dip into reserve pool. Reserve pool is used for much > > > > > more important things. And xfs_trans_reserve will never return ENOSPC > > > > > because punch hole is already done. If we get ENOSPC, collapse range > > > > > will be simply failed. > > > > > > > > > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > > > > > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > > > > > --- > > > > > fs/xfs/xfs_bmap_util.c | 3 +-- > > > > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > > > > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > > > > index 296160b..91a43c5 100644 > > > > > --- a/fs/xfs/xfs_bmap_util.c > > > > > +++ b/fs/xfs/xfs_bmap_util.c > > > > > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > > > > > > > > > while (!error && !done) { > > > > > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > > > > - tp->t_flags |= XFS_TRANS_RESERVE; > > > > > > > > Makes sense. > > > > > > > > > /* > > > > > * We would need to reserve permanent block for transaction. > > > > > * This will come into picture when after shifting extent into > > > > > @@ -1529,7 +1528,7 @@ xfs_collapse_file_space( > > > > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > > > > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > > > > if (error) { > > > > > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > > > > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > > > > > > > The xfs_trans_reserve() call still reserves XFS_DIOSTRAT_SPACE_RES() > > > > blocks, so therefore I think ENOSPC is still a possibility. The question > > > > is probably whether or not we need to reserve blocks for this > > > > transaction. > > > > > > > > Making a pass through the code... we have the possibility of deleting a > > > > btree record in xfs_bmap_shift_extents(). This in turn could potentially > > > > free a btree block, which frees space. I _think_ this could mean we > > > > want to keep the block reservation because we update the free space > > > > trees, but I suppose that could be handled by the freelist... > > > > > > > > Perhaps Dave can confirm which direction we should go here..? > > > > > > Having collapse range fail with ENOSPC is not an issue - it is being > > > executed in a context where we can fail safely and return an error > > > to the user. > > > > > > XFS_TRANS_RESERVE is used in places where a failure is unrecoverable > > > or there is no one to report the error to. e.g. prevent data loss > > > due to ENOSPC in unwritten extent conversion during background > > > buffered write IO completion > > > > > > So here there is no need for it at all.... > > > > > > > Yeah, dropping XFS_TRANS_RESERVE makes sense. The question I have is > > whether we should reserve blocks for this transaction (for a potential > > bmbt block free). If we do reserve blocks, then I assume the ENOSPC > > assert should stick around. > > Yes, the assert is wrong because xfs_trans_reserve() can > return ENOMEM as well as ENOSPC. It should just be removed. Okay, I will remove it on v2 patch. Thanks Dave and Brian! > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From namjae.jeon@samsung.com Mon May 12 19:04:02 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 5D88E7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:04:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3AD4030417B for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:03:58 -0700 (PDT) X-ASG-Debug-ID: 1399939436-04cbb03cc7486720001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id 9PEL8vAQK7FQ1rVN (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:03:57 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5H00E32K6J8VA0@mailout2.samsung.com> for xfs@oss.sgi.com; Tue, 13 May 2014 09:03:55 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id F8.42.11120.B6161735; Tue, 13 May 2014 09:03:55 +0900 (KST) X-AuditID: cbfee68f-b7eff6d000002b70-b8-5371616b8f84 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id C6.21.25708.B6161735; Tue, 13 May 2014 09:03:55 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5H005NJK6JEK90@mmp1.samsung.com>; Tue, 13 May 2014 09:03:55 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com, Brian Foster <bfoster@redhat.com> Subject: [PATCH v2] xfs: remove XFS_TRANS_RESERVE in collapse range Date: Tue, 13 May 2014 09:03:55 +0900 X-ASG-Orig-Subj: [PATCH v2] xfs: remove XFS_TRANS_RESERVE in collapse range Message-id: <000f01cf6e3e$d4a0a800$7de1f800$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac9uPpcR0CqWuw7GTk6efm2syV5wmw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrNIsWRmVeSWpSXmKPExsWyRsSkWDc7sTDYYG6jpMW7z1UWW47dY7RY 1HeL0YHZ49QiCY/VF7Yyerzfd5UtgDmKyyYlNSezLLVI3y6BK6Np+xfGgu2cFbt3nWFqYLzO 3sXIySEhYCJxYvdEKFtM4sK99WxdjFwcQgJLGSUuPZzABFP0ZekFFojEIkaJ73f/MUM4fxkl 5rb2AVVxcLAJaEv82SIK0iAioCYxadIOZhCbWcBM4sCLu4wgtrCAs8T8LVfAhrIIqErM3jIT LM4rYCnx8MlzFghbUOLH5HssEL1aEut3HmeCsOUlNq95ywxxkILEjrOvGSF26Uk0rWuCqhGR 2PfiHSPIbRICy9glZh2+xgixTEDi2+RDLCB3SgjISmw6ADVHUuLgihssExjFZiFZPQvJ6llI Vs9CsmIBI8sqRtHUguSC4qT0ImO94sTc4tK8dL3k/NxNjMCIOv3vWf8OxrsHrA8xJgOtn8gs JZqcD4zIvJJ4Q2MzIwtTE1NjI3NLM9KElcR57z9MChISSE8sSc1OTS1ILYovKs1JLT7EyMTB KdXAyKm6jttkff/thrfpLcUXVt6WbO6QW8fhXG3rXHJA9ZJnk2pXjeO+drfHKhkn56TziP65 7fdRN65nS8iuZdXnrkU/5P3BXfj34+KDxsFBpqw6mfGfciumSPy/wPSkfXekruWUN3+3ie2/ wdUYdGtTCIfRtrvrP9dFHVWdsfyepZ77rRclt1doKrEUZyQaajEXFScCACfalZG+AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupgleLIzCtJLcpLzFFi42I5/e+xgG52YmGwwZyJQhbvPldZbDl2j9Fi Ud8tRgdmj1OLJDxWX9jK6PF+31W2AOaoBkabjNTElNQihdS85PyUzLx0WyXv4HjneFMzA0Nd Q0sLcyWFvMTcVFslF58AXbfMHKBFSgpliTmlQKGAxOJiJX07TBNCQ9x0LWAaI3R9Q4LgeowM 0EDCGsaMpu1fGAu2c1bs3nWGqYHxOnsXIyeHhICJxJelF1ggbDGJC/fWs3UxcnEICSxilPh+ 9x8zhPOXUWJuax9TFyMHB5uAtsSfLaIgDSICahKTJu1gBrGZBcwkDry4ywhiCws4S8zfcoUJ xGYRUJWYvWUmWJxXwFLi4ZPnLBC2oMSPyfdYIHq1JNbvPM4EYctLbF7zlhniIAWJHWdfM0Ls 0pNoWtcEVSMise/FO8YJjAKzkIyahWTULCSjZiFpWcDIsopRNLUguaA4KT3XSK84Mbe4NC9d Lzk/dxMjOF6fSe9gXNVgcYhRgINRiYd3wbOCYCHWxLLiytxDjBIczEoivF1BhcFCvCmJlVWp RfnxRaU5qcWHGJOBPp3ILCWanA9MJXkl8YbGJmZGlkbmhhZGxuakCSuJ8x5stQ4UEkhPLEnN Tk0tSC2C2cLEwSnVwCj+Ia1yovPi3xIrvjxf8nap5o1vz03Vzqi9mmSbHftYZ4Wsydb4jG0C 0mptE/80bo4XPbZk3ZT99yQn3Zi/96FVhYZGSP29J2mvxeLjdr+N5HfyWtzKENPNJ3/AyzjB VMoz78hdzwMWiwUPXTpkmBYrvmuPhcWPnCvLpBivMK5uK9gTzDihpECJpTgj0VCLuag4EQA6 l2a3GwMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1399939437 X-Barracuda-Encrypted: RC4-MD5 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 no need to dip into reserve pool. Reserve pool is used for much more important things. And xfs_trans_reserve will never return ENOSPC because punch hole is already done. If we get ENOSPC, collapse range will be simply failed. Cc: Brian Foster <bfoster@redhat.com> Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- fs/xfs/xfs_bmap_util.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 296160b..057f671 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); - tp->t_flags |= XFS_TRANS_RESERVE; /* * We would need to reserve permanent block for transaction. * This will come into picture when after shifting extent into @@ -1529,7 +1528,6 @@ xfs_collapse_file_space( error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); if (error) { - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); xfs_trans_cancel(tp, 0); break; } -- 1.7.11-rc0 From jlayton@poochiereds.net Mon May 12 19:35:15 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 444827F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:35:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C920CAC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35:11 -0700 (PDT) X-ASG-Debug-ID: 1399941309-04cbb03cc4487600001-NocioJ Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by cuda.sgi.com with ESMTP id BlKwmWCB8HuknWT9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35:09 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.182 Received: by mail-qc0-f182.google.com with SMTP id e16so8617496qcx.41 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35: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:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=sZw/dwklD7gXAqE8ahW4rC4j3ZAe5y+H94r/AO6Lyww=; b=QQOfPGARe13qungDPWbm0QJB/eB8iQDne0NymeDIBsmQcAp5alykhr2zY2qGRxTTTp Z7nyuXt38TCz2CJMTQB5mGlCkeeEbqQ7mwHohTYudmQ9aPKQayyBXJ1vAzlKEglosPA4 36VqyfwwA5BaW+Nk1zugbyvN0VhGP0dE8PcqDYkObHXRUsyyWIzLz9siIuqS5z8vLK7B wMEaCyX5dyknKroiVZ80wQDDvK4+bPTAjgaFaiImO3ow8NocKz5IXKYUmFeyDUtTitsT TJhKXNhZjCKPCVXiiShLyvVKBHEbcPWlGDHaVyqdZA/P7hCZgZwjyA+pp/oTTtCq6wwK DzZg== X-Gm-Message-State: ALoCoQn2GRcnn6jyki3v2XHz/7Hmz12rOYPdSaJrOozLnkE7d7cbqd/TdmbmgJKOgVmxmk6TiaJ5 X-Received: by 10.224.57.142 with SMTP id c14mr44053396qah.23.1399941309239; Mon, 12 May 2014 17:35:09 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id z4sm24067801qas.8.2014.05.12.17.35.08 for <multiple recipients> (version=SSLv3 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 12 May 2014 17:35:08 -0700 (PDT) Date: Mon, 12 May 2014 20:35:05 -0400 From: Jeff Layton <jlayton@poochiereds.net> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-ID: <20140512203505.16f73ef8@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test In-Reply-To: <20140512225845.GN26353@dastard> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> <20140512225845.GN26353@dastard> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f182.google.com[209.85.216.182] X-Barracuda-Start-Time: 1399941309 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.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 13 May 2014 08:58:45 +1000 Dave Chinner <david@fromorbit.com> wrote: > On Mon, May 12, 2014 at 11:06:29AM -0400, Jeff Layton wrote: > > This patchset does some general cleanup of the locktest binary, adds > > some infrastructure to allow testing F_GETLK requests, and adds a new > > F_GETLK test to the pile. > > > > The main impetus here is a regression that I caused in F_GETLK handling > > for v3.15. The patch is making its way to Linus now, but I want to be > > sure that it doesn't regress in the future. > > So do these changes cause locktest to fail on older kernels? i.e. > does changing the test cause the locktest tests to fail where > previously they passed? If so, we're going to have to make this a > little more complex... > I haven't tested on much in the way of older kernels, but I wouldn't expect it to cause any problems. The only behavior change that should be introduced is the F_GETLK test, and older kernels should pass that just fine (modulo v3.15 which has a regression that should be patched soon). The rest of the changes are just cleanups, and shouldn't introduce any behavioral changes. -- Jeff Layton <jlayton@poochiereds.net> From jlayton@poochiereds.net Mon May 12 19:35:28 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C5A5E7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:35:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B041AC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35:28 -0700 (PDT) X-ASG-Debug-ID: 1399941326-04bdf02b8b4bfcf0001-NocioJ Received: from mail-qg0-f42.google.com (mail-qg0-f42.google.com [209.85.192.42]) by cuda.sgi.com with ESMTP id WHMhqYKsuaVMcfNr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35:26 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.192.42 Received: by mail-qg0-f42.google.com with SMTP id q107so8680752qgd.15 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:35:26 -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:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=MTRJrs+DDOZqA7VlWXyKY/V5/z9cmDHnrFsdhzFBjdI=; b=W93vfCLuODGvEA7dErXO9tc22BPTIMk9+fa1/OFFbj2Wp1eH7CBvFnk86mdY/C57YG NvbCDj5W7n8hVtqEEqtSFRW0em8v7MmxkATTadd2W0LqbKjAsKUQlK7EiIapEcN8qgYe Nv8TgJx/cKO2hq89ypKtuS8JmuGeLiO7fPurTfRoEsoSrbFpeM4irPtzYA1+3l/6/jdk 750/KdbFxxF1LcJhjXuyifqJinrCSwTeGhT7SjQd8YPeYpVOEU8C7lo+PFCcAd1bVe+Q tJM74SEZBneyb6+KWQJFF080R0W18ctBmTSA2Aiuf6y3XkPgmU05CsHGdEJln6tlHs9K 9rzQ== X-Gm-Message-State: ALoCoQkfil6SIZgXhzoFtQVN9R3Qw45/vjln5LftCuxDti2+f/umToPtU5PC1DoXhh6TFzsgeYM7 X-Received: by 10.140.33.181 with SMTP id j50mr40678832qgj.81.1399941326052; Mon, 12 May 2014 17:35:26 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id d18sm24058222qac.28.2014.05.12.17.35.25 for <multiple recipients> (version=SSLv3 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 12 May 2014 17:35:25 -0700 (PDT) Date: Mon, 12 May 2014 20:35:23 -0400 From: Jeff Layton <jlayton@poochiereds.net> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC Message-ID: <20140512203523.02572f98@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [xfstests PATCH] loggen: remove deprecated header includes and add definition for XFS_TRANS_MAGIC In-Reply-To: <20140512230049.GO26353@dastard> References: <1399898795-12967-1-git-send-email-jlayton@poochiereds.net> <20140512230049.GO26353@dastard> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qg0-f42.google.com[209.85.192.42] X-Barracuda-Start-Time: 1399941326 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.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 13 May 2014 09:00:49 +1000 Dave Chinner <david@fromorbit.com> wrote: > On Mon, May 12, 2014 at 08:46:35AM -0400, Jeff Layton wrote: > > xfstests was failing to build on my rawhide box. The problem was that > > some of the headers included by loggen.c no longer exist in current > > releases. This just removes those includes and adds a conditional > > definition of XFS_TRANS_MAGIC. > > > > It may make more sense to just move XFS_TRANS_MAGIC to a different > > header, but this seems to work on both f20 and rawhide boxes. > > > > Signed-off-by: Jeff Layton <jlayton@poochiereds.net> > > --- > > src/loggen.c | 6 ++++-- > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > diff --git a/src/loggen.c b/src/loggen.c > > index 522c9178ee26..1740732249b6 100644 > > --- a/src/loggen.c > > +++ b/src/loggen.c > > @@ -26,8 +26,6 @@ > > */ > > > > #include <xfs/libxfs.h> > > -#include <xfs/xfs_log.h> > > -#include <xfs/xfs_log_priv.h> > > > > #ifndef ASSIGN_ANY_LSN_DISK > > #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ > > @@ -37,6 +35,10 @@ > > } > > #endif > > > > +#ifndef XFS_TRANS_MAGIC > > +#define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ > > +#endif > > It's now defined as XFS_TRANS_HEADER_MAGIC, and defined in > xfs/xfs_log_format.h. > > So, some autoconf magic, perhaps? > > Cheers, > > Dave. Ok, I'll see what I can cook up. Thanks, -- Jeff Layton <jlayton@poochiereds.net> From david@fromorbit.com Mon May 12 19:55:04 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4133D7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 19:55:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D741AAC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:55:03 -0700 (PDT) X-ASG-Debug-ID: 1399942501-04bdf02b8b4c0540001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OPDBGSpwLbAq1UKM for <xfs@oss.sgi.com>; Mon, 12 May 2014 17:55:01 -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: Ap1LAFBscVN5LL1sPGdsb2JhbABZgwaIR6QuAQEBAQEBBpobAYEXFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDQQhcWhUCIfAeEQASZR5ZQKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 10:25:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk0zh-0007hI-WE; Tue, 13 May 2014 10:54:58 +1000 Date: Tue, 13 May 2014 10:54:57 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Layton <jlayton@poochiereds.net> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-ID: <20140513005457.GY5421@dastard> X-ASG-Orig-Subj: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> <20140512225845.GN26353@dastard> <20140512203505.16f73ef8@tlielax.poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140512203505.16f73ef8@tlielax.poochiereds.net> 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: 1399942501 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.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 08:35:05PM -0400, Jeff Layton wrote: > On Tue, 13 May 2014 08:58:45 +1000 > Dave Chinner <david@fromorbit.com> wrote: > > > On Mon, May 12, 2014 at 11:06:29AM -0400, Jeff Layton wrote: > > > This patchset does some general cleanup of the locktest binary, adds > > > some infrastructure to allow testing F_GETLK requests, and adds a new > > > F_GETLK test to the pile. > > > > > > The main impetus here is a regression that I caused in F_GETLK handling > > > for v3.15. The patch is making its way to Linus now, but I want to be > > > sure that it doesn't regress in the future. > > > > So do these changes cause locktest to fail on older kernels? i.e. > > does changing the test cause the locktest tests to fail where > > previously they passed? If so, we're going to have to make this a > > little more complex... > > > > I haven't tested on much in the way of older kernels, but I wouldn't > expect it to cause any problems. The only behavior change that should > be introduced is the F_GETLK test, and older kernels should pass that > just fine (modulo v3.15 which has a regression that should be patched > soon). The rest of the changes are just cleanups, and shouldn't > introduce any behavioral changes. Ok, I wasn't sure if it was adding a test that never worked, or whether it was checking for a recent regression. If it's a recent regression, then there's no problem with the change. Thanks! :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 12 20:00:39 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 114D77F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:00:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E76CB3041B6 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:00:38 -0700 (PDT) X-ASG-Debug-ID: 1399942836-04cbb03cc74882b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id xPoF22LWUDrdVmk7 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:00:36 -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: Ap1LAHhtcVN5LL1sPGdsb2JhbABZgwaIR6QuAQEBAQEBBpobAYEXFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDQQxcWhUCIfAeEQASZR5ZQKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 10:30:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk152-0007iv-Fm; Tue, 13 May 2014 11:00:28 +1000 Date: Tue, 13 May 2014 11:00:28 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Layton <jlayton@poochiereds.net> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-ID: <20140513010028.GZ5421@dastard> X-ASG-Orig-Subj: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> <20140512225845.GN26353@dastard> <20140512203505.16f73ef8@tlielax.poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140512203505.16f73ef8@tlielax.poochiereds.net> 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: 1399942836 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.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 08:35:05PM -0400, Jeff Layton wrote: > On Tue, 13 May 2014 08:58:45 +1000 > Dave Chinner <david@fromorbit.com> wrote: > > > On Mon, May 12, 2014 at 11:06:29AM -0400, Jeff Layton wrote: > > > This patchset does some general cleanup of the locktest binary, adds > > > some infrastructure to allow testing F_GETLK requests, and adds a new > > > F_GETLK test to the pile. > > > > > > The main impetus here is a regression that I caused in F_GETLK handling > > > for v3.15. The patch is making its way to Linus now, but I want to be > > > sure that it doesn't regress in the future. > > > > So do these changes cause locktest to fail on older kernels? i.e. > > does changing the test cause the locktest tests to fail where > > previously they passed? If so, we're going to have to make this a > > little more complex... > > > > I haven't tested on much in the way of older kernels, but I wouldn't > expect it to cause any problems. The only behavior change that should > be introduced is the F_GETLK test, and older kernels should pass that > just fine (modulo v3.15 which has a regression that should be patched > soon). The rest of the changes are just cleanups, and shouldn't > introduce any behavioral changes. Is this the regression in question? +Server failure in 29:Verify that F_GETLK for F_WRLCK doesn't require that file be opened for write Cheers, Dave. -- Dave Chinner david@fromorbit.com From yhyap@forestry.gov.my Mon May 12 20:06:52 2014 Return-Path: <yhyap@forestry.gov.my> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7CF117F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:06:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E74FAC001 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:06:48 -0700 (PDT) X-ASG-Debug-ID: 1399943203-04cbb03cc54885f0001-NocioJ Received: from imss.forestry.gov.my (imss.forestry.gov.my [175.28.12.94]) by cuda.sgi.com with ESMTP id D0Q7mNOrGmKD8TIK; Mon, 12 May 2014 18:06:43 -0700 (PDT) X-Barracuda-Envelope-From: yhyap@forestry.gov.my X-Barracuda-Apparent-Source-IP: 175.28.12.94 Received: from imss.forestry.gov.my (imss.forestry.gov.my [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CA3F5481921; Tue, 13 May 2014 09:05:42 +0800 (MYT) Received: from mail.forestry.gov.my (mail.forestry.gov.my [10.2.106.140]) by imss.forestry.gov.my (Postfix) with ESMTP id 3D1B748192A; Tue, 13 May 2014 09:05:42 +0800 (MYT) Received: from webmail.forestry.gov.my (mail.forestry.gov.my [10.2.106.140]) by mail.forestry.gov.my (Postfix) with ESMTP id C5EC3121C1F; Tue, 13 May 2014 08:10:54 +0800 (MYT) Received: from 180.215.133.125 (SquirrelMail authenticated user yhyap) by webmail.forestry.gov.my with HTTP; Tue, 13 May 2014 08:10:54 +0800 Message-ID: <d1f5d0e85ab8cf9f08ae0e1f6feeb046.squirrel@webmail.forestry.gov.my> Date: Tue, 13 May 2014 08:10:54 +0800 Subject: Good News From: "Dave and Angela Dawes" <yhyap@forestry.gov.my> X-ASG-Orig-Subj: Good News Reply-To: daveangela01@manager.in.th User-Agent: SquirrelMail/1.4.22-2.el6 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-TM-AS-MML: disable X-TM-AS-Product-Ver: IMSVA-8.5.0.1516-7.5.0.1017-20690.002 X-TM-AS-Result: No--1.886-4.5-31-10 X-imss-scan-details: No--1.886-4.5-31-10;No--1.886-4.5-31-10 X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No;No X-TMASE-Version: IMSVA-8.5.0.1516-7.5.1017-20690.002 X-TMASE-Result: 10--1.886300-5.000000 X-TMASE-MatchedRID: j543ZmETA0LubZm2pYtMCPSG/+sPtZVki5HIU7NNYTvGTvsdHQF46bEW UJvpPUSd4vM1YF6AJbYv5IT13vYH3Jf7eAx/Ae/AE2aiMY5Rl6MQHUbQx1U5NRMQLQ/0+9hG6h+ ZI4NPtvP6C0ePs7A07foJlcuVXWZJ9lv7YLFb634OgowWBcJnLyXcyF+B+QRCTlYya9yx+rdWTq EV16q7xnI3woWy93DHihrVXmZALPaRV52oc/V4lnhNQ4cGEYRRftwZ3X11IV0= X-Barracuda-Connect: imss.forestry.gov.my[175.28.12.94] X-Barracuda-Start-Time: 1399943203 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email My wife and I have a Donation here for you. Please contact Email:daveangela01@manager.in.th From jlayton@poochiereds.net Mon May 12 20:13:10 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6944D7F4E for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:13:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4EAC13041BF for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:13:07 -0700 (PDT) X-ASG-Debug-ID: 1399943585-04cb6c72904a3d90001-NocioJ Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com [209.85.216.43]) by cuda.sgi.com with ESMTP id cOrm0YYrcKd7s6dE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:13:05 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.43 Received: by mail-qa0-f43.google.com with SMTP id m5so7861267qaj.16 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:13:05 -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:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=gV/Qg576pdrve/Phc1/ZRrzmOtkV/hnV/4aFotgv9+0=; b=GpeHJCvQx/z6ok1p+w6CINRVLuAJ81oZpB35Ez1d7IFHVOKAxYPeLOGWZVxMPX1x80 Z0oaJfXRPsWuDtWUEOlQByF99b+NPGHbpB61mpu+SToBjWqqOWMTrr2u79rd0HTjMraV LSlgLNrRpiBdy1yOsaMxC7T0u7YTm5OUufGOonAs6kSLePipVlCZSqYtCsbqfYxFaiRM STcCcU6Ej1aruUkCSgzI9Qq7smpmws/YRQfOfSAweWuvgDEeFuW8dEUFYttCZH4dEuq6 8ViRKGCmOxcIgSUiwH2ClKOpM4CVZ0AMqjObIYFV6IcNTha6KLOUc1bKtMixy2xx74Vm I8cA== X-Gm-Message-State: ALoCoQmMSMwZF0VsVRrSAlZFTbEN1q5T8djkSNleLN6EuCZanp4X52cSaYJBti3n2ycyzT5wh4I3 X-Received: by 10.140.22.209 with SMTP id 75mr41389734qgn.4.1399943585577; Mon, 12 May 2014 18:13:05 -0700 (PDT) Received: from localhost (cpe-107-015-124-230.nc.res.rr.com. [107.15.124.230]) by mx.google.com with ESMTPSA id k9sm24201925qaj.25.2014.05.12.18.13.04 for <multiple recipients> (version=SSLv3 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 12 May 2014 18:13:05 -0700 (PDT) Date: Mon, 12 May 2014 21:13:01 -0400 From: Jeff Layton <jlayton@poochiereds.net> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test Message-ID: <20140512211301.3280b2cd@poochiereds.net> X-ASG-Orig-Subj: Re: [xfstests PATCH 0/4] locktest: cleanup, bugfixes, and add new locking test In-Reply-To: <20140513010028.GZ5421@dastard> References: <1399907193-23857-1-git-send-email-jlayton@poochiereds.net> <20140512225845.GN26353@dastard> <20140512203505.16f73ef8@tlielax.poochiereds.net> <20140513010028.GZ5421@dastard> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qa0-f43.google.com[209.85.216.43] X-Barracuda-Start-Time: 1399943585 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.5762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 13 May 2014 11:00:28 +1000 Dave Chinner <david@fromorbit.com> wrote: > On Mon, May 12, 2014 at 08:35:05PM -0400, Jeff Layton wrote: > > On Tue, 13 May 2014 08:58:45 +1000 > > Dave Chinner <david@fromorbit.com> wrote: > > > > > On Mon, May 12, 2014 at 11:06:29AM -0400, Jeff Layton wrote: > > > > This patchset does some general cleanup of the locktest binary, adds > > > > some infrastructure to allow testing F_GETLK requests, and adds a new > > > > F_GETLK test to the pile. > > > > > > > > The main impetus here is a regression that I caused in F_GETLK handling > > > > for v3.15. The patch is making its way to Linus now, but I want to be > > > > sure that it doesn't regress in the future. > > > > > > So do these changes cause locktest to fail on older kernels? i.e. > > > does changing the test cause the locktest tests to fail where > > > previously they passed? If so, we're going to have to make this a > > > little more complex... > > > > > > > I haven't tested on much in the way of older kernels, but I wouldn't > > expect it to cause any problems. The only behavior change that should > > be introduced is the F_GETLK test, and older kernels should pass that > > just fine (modulo v3.15 which has a regression that should be patched > > soon). The rest of the changes are just cleanups, and shouldn't > > introduce any behavioral changes. > > Is this the regression in question? > > +Server failure in 29:Verify that F_GETLK for F_WRLCK doesn't > require that file be opened for write > > Cheers, > > Dave. Yes, that's the test I'm adding for the kernel regression. The patch for the bug is: [PATCH v2] locks: only validate the lock vs. f_mode in F_SETLK codepaths ...and I sent a pull request to Linus for it today. It should go in fairly soon, I hope. Thanks, -- Jeff Layton <jlayton@poochiereds.net> From namjae.jeon@samsung.com Mon May 12 20:23:05 2014 Return-Path: <namjae.jeon@samsung.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BDF4A7F4E for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:23:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84245304165 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:23:05 -0700 (PDT) X-ASG-Debug-ID: 1399944181-04bdf02b8d4c1610001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id nOt7vkhGXZ3Cjbky (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:23:03 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N5H003SQNUDCGB0@mailout4.samsung.com> for xfs@oss.sgi.com; Tue, 13 May 2014 10:23:01 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm1.samsung.com ( [172.20.52.115]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id 7E.E6.09952.5F371735; Tue, 13 May 2014 10:23:01 +0900 (KST) X-AuditID: cbfee690-b7fcd6d0000026e0-60-537173f50f51 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 02.E5.27725.5F371735; Tue, 13 May 2014 10:23:01 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N5H0028PNUDTM30@mmp2.samsung.com>; Tue, 13 May 2014 10:23:01 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Brian Foster' <bfoster@redhat.com> Cc: 'Dave Chinner' <david@fromorbit.com>, 'Theodore Ts'o' <tytso@mit.edu>, linux-fsdevel@vger.kernel.org, 'linux-ext4' <linux-ext4@vger.kernel.org>, linux-kernel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com>, xfs@oss.sgi.com References: <003801cf6aa7$f1f87b70$d5e97250$@samsung.com> <20140509152440.GA32489@laptop.bfoster> <005601cf6dc6$82573820$8705a860$@samsung.com> <20140512112541.GA62831@bfoster.bfoster> In-reply-to: <20140512112541.GA62831@bfoster.bfoster> Subject: RE: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 13 May 2014 10:23:00 +0900 X-ASG-Orig-Subj: RE: [PATCH v2 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001a01cf6e49$e168e650$a43ab2f0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQI8l/c+50jbPyrOUhhBFU208NvpTgGlw03dAgzqMasB2HRhxZo3CUIg Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrFIsWRmVeSWpSXmKPExsWyRsSkWPdrcWGwweEFwhZLJ15itnj3ucpi y7F7jBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKptH 35ZVjB6fN8kFsEVx2aSk5mSWpRbp2yVwZdyccIq94K1hRfORnSwNjH9Uuhg5OSQETCS+3j7B CmGLSVy4t56ti5GLQ0hgKaPE7BW3WWCKzv7+xAZiCwlMZ5S4flEHougvo0Tn0olA3RwcbALa En+2iILUiAioS9yZN4EFpIZZ4BOjxPoDk1ggmvcxSkx4LwticwqYSpzZfBxsqLBAiMSah/fB bBYBVYlV1w8xgdi8ApYSa+5OYYewBSV+TL4HNodZQEti/c7jTBC2vMTmNW+ZIQ5VkNhx9jUj xBFuEvd+3maFqBGR2PfiHSPIQRICP9klzt28ygyxTEDi2+RDLCAPSAjISmw6ADVHUuLgihss ExglZiFZPQvJ6llIVs9CsmIBI8sqRtHUguSC4qT0IhO94sTc4tK8dL3k/NxNjMB4Pv3v2YQd jPcOWB9iTAZaP5FZSjQ5H5gO8kriDY3NjCxMTUyNjcwtzUgTVhLnVXuUFCQkkJ5YkpqdmlqQ WhRfVJqTWnyIkYmDU6qBsSr6es7yB5MvbkgQTfv67Uci+8uqmZl+XL4TGbQaf51iVpgluu7D mVt7133KD99dZp2i/2JZScK8Y9uvXfJK0LixvvsYf62f54o1VXlmbdN7ToVKXOvbemDlc4EJ f7hXCkyvD/jocHWhX+0kl7ozTjIfXjDknnEO/XqlwYGBb9/hgN5thzd4L1ZiKc5INNRiLipO BAD4sfQ3/QIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOKsWRmVeSWpSXmKPExsVy+t9jQd2vxYXBBq0PuC2WTrzEbPHuc5XF lmP3GC1mzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP vi2rGD0+b5ILYItqYLTJSE1MSS1SSM1Lzk/JzEu3VfIOjneONzUzMNQ1tLQwV1LIS8xNtVVy 8QnQdcvMAbpHSaEsMacUKBSQWFyspG+HaUJoiJuuBUxjhK5vSBBcj5EBGkhYw5hxc8Ip9oK3 hhXNR3ayNDD+Ueli5OSQEDCROPv7ExuELSZx4d56MFtIYDqjxPWLOl2MXED2X0aJzqUTWbsY OTjYBLQl/mwRBakREVCXuDNvAgtIDbPAJ0aJ9QcmsUA072OUmPBeFsTmFDCVOLP5ONhQYYEQ iTUP74PZLAKqEquuH2ICsXkFLCXW3J3CDmELSvyYfA9sDrOAlsT6nceZIGx5ic1r3jJDHKog sePsa0aII9wk7v28zQpRIyKx78U7xgmMQrOQjJqFZNQsJKNmIWlZwMiyilE0tSC5oDgpPddQ rzgxt7g0L10vOT93EyM4WTyT2sG4ssHiEKMAB6MSD+9P48JgIdbEsuLK3EOMEhzMSiK8XUFA Id6UxMqq1KL8+KLSnNTiQ4zJQJ9OZJYSTc4HJrK8knhDYxMzI0sjc0MLI2Nz0oSVxHkPtFoH CgmkJ5akZqemFqQWwWxh4uCUamBcHmTVsipWRPEe4zH+2dHHTz4LNg97xNxV6fR0WkT+vkMR Nl+m3TB89UJqZ4gUn4nvJV3vsyvvFdfXCgss/DIp8sji4/9bL4R/jvVQsji2aGvFvC3KAT+2 f6h7O9Um/UtG2EaBKZF2uS1FWwTsL6ZelLHfn8q8tVXcO8AsW9yM4eGTMw+duw8psRRnJBpq MRcVJwIAKoAjWloDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1399944182 X-Barracuda-Encrypted: RC4-MD5 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, May 12, 2014 at 06:42:37PM +0900, Namjae Jeon wrote: > > > > > > +xfs_bmap_split_extent( > > > > + struct xfs_inode *ip, > > > > + xfs_fileoff_t split_fsb, > > > > + xfs_extnum_t *split_ext) > > > > +{ > > > > + struct xfs_mount *mp = ip->i_mount; > > > > + struct xfs_trans *tp; > > > > + struct xfs_bmap_free free_list; > > > > + xfs_fsblock_t firstfsb; > > > > + int committed; > > > > + int error; > > > > + > > > > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > > > > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > > > > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > > > > + > > > > + if (error) { > > > > + /* > > > > + * Free the transaction structure. > > > > + */ > > > > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > > > > > Hi, Brian. > > > As in the other patch, we're attempting to reserve fs blocks for the > > > transaction, so ENOSPC is a possibility that I think the assert should > > > accommodate. > > How about removing the ASSERT completely as suggessted by Dave > > in other thread? > > > > Yeah, that works too. If Dave prefers to just remove these asserts > that's fine with me. I just wanted to make sure we aren't adding > spurious asserts for valid failures. Okay. > > > > > ... > > > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > > > index 97855c5..392b029 100644 > > > > --- a/fs/xfs/xfs_file.c > > > > +++ b/fs/xfs/xfs_file.c > > > > @@ -760,7 +760,8 @@ xfs_file_fallocate( > > > > if (!S_ISREG(inode->i_mode)) > > > > return -EINVAL; > > > > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > > > > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > > > > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > > > > + FALLOC_FL_INSERT_RANGE)) > > > > return -EOPNOTSUPP; > > > > > > > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > > > > @@ -790,6 +791,40 @@ xfs_file_fallocate( > > > > error = xfs_collapse_file_space(ip, offset, len); > > > > if (error) > > > > goto out_unlock; > > > > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > > > > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > > > > + struct iattr iattr; > > > > + > > > > + if (offset & blksize_mask || len & blksize_mask) { > > > > + error = -EINVAL; > > > > + goto out_unlock; > > > > + } > > > > + > > > > + /* Check for wrap through zero */ > > > > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > > > > + error = -EFBIG; > > > > + goto out_unlock; > > > > + } > > > > + > > > > + /* Offset should be less than i_size */ > > > > + if (offset >= i_size_read(inode)) { > > > > + error = -EINVAL; > > > > + goto out_unlock; > > > > + } > > > > + > > > > + /* > > > > + * The first thing we do is to expand file to > > > > + * avoid data loss if there is error while shifting > > > > + */ > > > > + iattr.ia_valid = ATTR_SIZE; > > > > + iattr.ia_size = i_size_read(inode) + len; > > > > + error = xfs_setattr_size(ip, &iattr); > > > > + if (error) > > > > + goto out_unlock; > > > > > > I don't necessarily know that it's problematic to do the setattr before > > > the bmap fixup. We'll have a chance for partial completion of this > > > operation either way. But I'm not a fan of the code duplication here. > > > This also still skips the time update in the event of insert space > > > failure, though perhaps that's not such a big deal if we're returning an > > > error. > > > > > > I think it would be better to leave things organized as before and > > > introduce an error2 variable and a &nrshifts or some such parameter to > > > xfs_insert_file_space() that initializes to 0 and returns the number of > > > record shifts. The caller can then decide whether it's appropriate to > > > break out immediately or do the inode size update and return the error. > > > > > > Perhaps not the cleanest thing in the world, but also not the first > > > place we would use 'error2' to manage error priorities (grep around for > > > it)... > > Yes, Right. I also thought such sequence at first. But we should consider > > sudden power off and unplug device case during shifting extent. > > While we are in the middle of shifitng extents and if there is sudden > > power failure user can still think that data is lost as we won't get any > > chance to update the file size in these cases. > > Updating file size before the shifitng operation can start will prevent this. > > > > Thanks. > > Hmm, fair point. That seems less critical to me than the general error > sequence, but if we want to handle that case I think we could still fix > the duplication in xfs_file_fallocate(). We could possibly factor out > the common bits (update time and set size) into a helper, or what seems > a bit cleaner on first thought, move the bulk of the (mode & > FALLOC_FL_INSERT_RANGE) block to after the common part. Then the > function looks something like this: > > ... > xfs_ilock(); > > /* pre-inode fixup ops */ > if (mode & ...) { > ... > } else if (mode & FALLOC_FL_INSERT_RANGE) { > /* comment as to what's going on here :) */ > > /* error checks */ > > new_size = ...; > do_file_insert = 1; > } > ... > xfs_trans_ichgtime(); > xfs_setattr_size(); > ... > > /* > * Some operations are performed after the inode size is updated. For > * example, insert range expands the address space of the file, shifts > * all subsequent extents over and allocates space into the hole. > * Updating the size first ensures that shifted extents aren't left > * hanging past EOF in the event of a crash or failure. > */ > if (do_file_insert) { > /* alloc space */ > ... > } > ... > > That seems a bit cleaner to me, but I'm not wedded to it. Thoughts? It > might be worth soliciting some other thoughts/ideas before reworking it. > Thanks. Okay, I agree about your opinion. And I would like to get some feedback from Dave before reworking. Thanks for your valuable review! > > Brian > > > > > > > Brian > > > > > > > + > > > > + error = xfs_insert_file_space(ip, offset, len); > > > > + if (error) > > > > + goto out_unlock; > > > > } else { > > > > if (!(mode & FALLOC_FL_KEEP_SIZE) && > > > > offset + len > i_size_read(inode)) { > > From austin@peloton-tech.com Mon May 12 20:29:30 2014 Return-Path: <austin@peloton-tech.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA1467F4E for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:29:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id ACE793041DC for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:29:30 -0700 (PDT) X-ASG-Debug-ID: 1399944568-04cb6c72904a4820001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id ZJqTcOLH9L2G4ogL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:29:28 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.175 Received: by mail-ig0-f175.google.com with SMTP id uq10so4604792igb.8 for <xfs@oss.sgi.com>; Mon, 12 May 2014 18:29:28 -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=PeyLdKRkr2qhG0a1i4VklvF0kOcoqCEgt6mKp9/Y/8A=; b=Hd9vmi3OA5lhsbmxnBnUADRu0UjZp4bZcms47udbOT7SbCV3kjXcTmOQKliaPJ95Me IgDDMLB1LcD5Lr8nAOYb0Q5Mza0oUcUYiisQ//m7U5Q2xB9dyxlevcvd/eruleAE2+oo QxjhL7JSrY1KHINx4hltg+G7AYL9KE6gtWXZYnR5lufAVtVI6sawryhi8PgbkWBr7l2C ksHK99gvwREE93VYnD8XYhBJ1nNmY/Dx9hiaoFu1OfFmk8MxU4jB1/m9X1avZFMmCNoy FrTkGf68Ufd/o3kMoHb0nIs525ecCxzt8Lliv8xfV+O6b/NLSxU4DUxn+6xRAO46LOpD xArQ== X-Gm-Message-State: ALoCoQmXb6xogAh8F6quScUv/GUCvT+QT4+mWM3dNOmLISc9KKm2VVGmaKvTNiZZo0P5SOhfnDyU MIME-Version: 1.0 X-Received: by 10.50.143.34 with SMTP id sb2mr50701320igb.48.1399944568438; Mon, 12 May 2014 18:29:28 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Mon, 12 May 2014 18:29:28 -0700 (PDT) In-Reply-To: <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> Date: Mon, 12 May 2014 18:29:28 -0700 Message-ID: <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1399944568 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.5763 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: > Hi Dave, > > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >>> Howdy, >>> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >>> and I'm seeing a couple lockups and crashes which I think are related >>> to XFS. >> >> I think they ar emore likely related to RT issues.... >> > > That very well may be true. > >> Your usb device has disconnected and gone down the device >> removal/invalidate partition route. and it's trying to flush the >> device, which is stuck on IO completion which is stuck waiting for >> the device error handling to error them out. >> >> So, this is a block device problem error handling problem caused by >> device unplug getting stuck because it's decided to ask the >> filesystem to complete operations that can't be completed until the >> device error handling progress far enough to error out the IOs that >> the filesystem is waiting for completion on. >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com I had the issue reproduce itself today with just the main SSD installed. This was on a new machine that was built this morning. There is a lot less going on in this trace than the previous one. [ 360.448156] INFO: task kworker/1:1:42 blocked for more than 120 seconds. [ 360.450266] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 360.452404] kworker/1:1 D ffff88042e0e2cc0 0 42 2 0x00000000 [ 360.452429] Workqueue: xfs-data/sda5 xfs_end_io [xfs] [ 360.452432] ffff88042af38000 0000000000000046 0000000000000000 ffff88042b0cece0 [ 360.452433] 0000000000062cc0 ffff88042af1ffd8 0000000000062cc0 ffff88042af1ffd8 [ 360.452435] 0000000000062cc0 ffff88042af38000 ffff8803eac3be40 0000000000000002 [ 360.452437] Call Trace: [ 360.452443] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 360.452445] [<ffffffff813a2438>] ? __rt_mutex_slowlock+0x7b/0xb4 [ 360.452447] [<ffffffff813a2577>] ? rt_mutex_slowlock+0xe5/0x150 [ 360.452455] [<ffffffffa0099adb>] ? xfs_setfilesize+0x48/0x120 [xfs] [ 360.452462] [<ffffffffa009a62f>] ? xfs_end_io+0x7a/0x8e [xfs] [ 360.452465] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 [ 360.452468] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 [ 360.452469] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f [ 360.452471] [<ffffffff8105a909>] ? kthread+0x81/0x89 [ 360.452473] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 360.452475] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 [ 360.452477] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 360.452483] INFO: task kworker/u16:4:222 blocked for more than 120 seconds. [ 360.454614] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 360.456801] kworker/u16:4 D ffff88042e062cc0 0 222 2 0x00000000 [ 360.456807] Workqueue: writeback bdi_writeback_workfn (flush-8:0) [ 360.456810] ffff88042af3cb60 0000000000000046 ffff8804292a0000 ffffffff81616400 [ 360.456812] 0000000000062cc0 ffff8804292a1fd8 0000000000062cc0 ffff8804292a1fd8 [ 360.456813] ffff8804292a1978 ffff88042af3cb60 ffff88042af3cb60 ffff8804292a1a50 [ 360.456815] Call Trace: [ 360.456819] [<ffffffff810cc034>] ? __lock_page+0x66/0x66 [ 360.456822] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 360.456824] [<ffffffff813a1ff9>] ? io_schedule+0x55/0x6b [ 360.456825] [<ffffffff810cc03a>] ? sleep_on_page+0x6/0xa [ 360.456827] [<ffffffff813a137a>] ? __wait_on_bit_lock+0x3c/0x85 [ 360.456829] [<ffffffff810cc4a4>] ? find_get_pages_tag+0xfa/0x125 [ 360.456831] [<ffffffff810cc02f>] ? __lock_page+0x61/0x66 [ 360.456833] [<ffffffff8105b333>] ? autoremove_wake_function+0x2a/0x2a [ 360.456835] [<ffffffff810d4700>] ? write_cache_pages+0x177/0x302 [ 360.456836] [<ffffffff810d3d07>] ? page_index+0x14/0x14 [ 360.456838] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 [ 360.456840] [<ffffffff81134698>] ? __writeback_single_inode+0x72/0x225 [ 360.456842] [<ffffffff8113550b>] ? writeback_sb_inodes+0x215/0x36d [ 360.456844] [<ffffffff811356cc>] ? __writeback_inodes_wb+0x69/0xab [ 360.456846] [<ffffffff81135844>] ? wb_writeback+0x136/0x2a7 [ 360.456848] [<ffffffff81135c88>] ? wb_do_writeback+0x161/0x1dc [ 360.456851] [<ffffffff81135d66>] ? bdi_writeback_workfn+0x63/0xf4 [ 360.456852] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 [ 360.456854] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 [ 360.456856] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f [ 360.456857] [<ffffffff8105a909>] ? kthread+0x81/0x89 [ 360.456859] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 360.456860] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 [ 360.456862] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 360.456881] INFO: task dpkg:5140 blocked for more than 120 seconds. [ 360.459062] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 360.461283] dpkg D ffff88042e0e2cc0 0 5140 5112 0x00000000 [ 360.461287] ffff8804290d2180 0000000000000086 000000000000020c ffff88042af38000 [ 360.461289] 0000000000062cc0 ffff880429bf7fd8 0000000000062cc0 ffff880429bf7fd8 [ 360.461290] ffff880429bf78e8 ffff8804290d2180 ffff880429bf7a10 ffff880429bf7a08 [ 360.461292] Call Trace: [ 360.461296] [<ffffffff813a10ef>] ? console_conditional_schedule+0xf/0xf [ 360.461298] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 360.461299] [<ffffffff813a111b>] ? schedule_timeout+0x2c/0x123 [ 360.461301] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 360.461303] [<ffffffff81065cfd>] ? migrate_enable+0x1cd/0x1dd [ 360.461306] [<ffffffff810651ab>] ? get_parent_ip+0x9/0x1b [ 360.461308] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 360.461310] [<ffffffff813a188b>] ? __wait_for_common+0x78/0xd6 [ 360.461323] [<ffffffffa00c0032>] ? xfs_bmapi_allocate+0x92/0x9e [xfs] [ 360.461333] [<ffffffffa00c035d>] ? xfs_bmapi_write+0x31f/0x558 [xfs] [ 360.461336] [<ffffffff81109680>] ? kmem_cache_alloc+0x7c/0x17d [ 360.461346] [<ffffffffa00bde6e>] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] [ 360.461354] [<ffffffffa00a6899>] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] [ 360.461362] [<ffffffffa0099dc5>] ? xfs_map_blocks+0x125/0x1f5 [xfs] [ 360.461369] [<ffffffffa009ac87>] ? xfs_vm_writepage+0x266/0x48f [xfs] [ 360.461371] [<ffffffff810d3d14>] ? __writepage+0xd/0x2a [ 360.461372] [<ffffffff810d4790>] ? write_cache_pages+0x207/0x302 [ 360.461374] [<ffffffff810d3d07>] ? page_index+0x14/0x14 [ 360.461376] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 [ 360.461378] [<ffffffff810cd303>] ? __filemap_fdatawrite_range+0x50/0x55 [ 360.461380] [<ffffffff81138a63>] ? SyS_sync_file_range+0xe2/0x127 [ 360.461382] [<ffffffff813a76a9>] ? system_call_fastpath+0x16/0x1b Austin From austin@peloton-tech.com Mon May 12 22:10:16 2014 Return-Path: <austin@peloton-tech.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7308F7F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 22:10:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DBD36AC009 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:10:15 -0700 (PDT) X-ASG-Debug-ID: 1399950610-04cbb03cc648be30001-NocioJ Received: from mail-ie0-f172.google.com (mail-ie0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id bd7KZxMU5rzMRPxp (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:10:10 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.223.172 Received: by mail-ie0-f172.google.com with SMTP id as1so8026639iec.3 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:10: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:date :message-id:subject:from:to:cc:content-type; bh=s7IaPvD6zxJ4x7fnab98OyFoqA6UP4GZpVrDXukKIbE=; b=CFcAhbBjd/J/G8c1goo2rge7Om8ry69pLvjXvwwlh40/9Pqoa56fSuhT2twSJQ3Van g2BCqdvhnTKbHPzkgIVf7ZIN0DVJfEW8Uqe/Gp0wJzCrVOQScn3RbpiuFnTJE1n0+6VE KQ6BhkmllMnc95fUY0QOqx9AptVPxe4OplOdOqnHot8DGQ8afuaSCgf7UG9rlN2li6ad ddgh/Tcdky0cQr3hbJhnXpo7Z+ExOHCfhcNAVRXdJwakjvoZReIjk21puXUjEefrxwSo GOzklmdxkn9EcsAK+pGMgexTm0ivVwF3lossuXKNVL8/bSWb4xILV2i3PzJ0NPB75C9X XeDA== X-Gm-Message-State: ALoCoQn9WQU+QepxxOIzJyCkH6dZRFc7CDg+OEuo/bAOvgWipZAPR5nWJAB5dafoOCZzcAoXGIWq MIME-Version: 1.0 X-Received: by 10.50.141.232 with SMTP id rr8mr50212320igb.48.1399950610382; Mon, 12 May 2014 20:10:10 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Mon, 12 May 2014 20:10:10 -0700 (PDT) In-Reply-To: <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> Date: Mon, 12 May 2014 20:10:10 -0700 Message-ID: <CANGgnMbaQ4hcPHoZYa9LH2VacB9Z2pe-Pi6DPvK-ePRbCdLXTA@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ie0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1399950610 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.5764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 6:29 PM, Austin Schuh <austin@peloton-tech.com> wrote: > On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: >> Hi Dave, >> >> On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >>> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >>>> Howdy, >>>> >>>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >>>> and I'm seeing a couple lockups and crashes which I think are related >>>> to XFS. >>> >>> I think they ar emore likely related to RT issues.... >>> >> >> That very well may be true. >> >>> Your usb device has disconnected and gone down the device >>> removal/invalidate partition route. and it's trying to flush the >>> device, which is stuck on IO completion which is stuck waiting for >>> the device error handling to error them out. >>> >>> So, this is a block device problem error handling problem caused by >>> device unplug getting stuck because it's decided to ask the >>> filesystem to complete operations that can't be completed until the >>> device error handling progress far enough to error out the IOs that >>> the filesystem is waiting for completion on. >>> >>> Cheers, >>> >>> Dave. >>> -- >>> Dave Chinner >>> david@fromorbit.com > > I had the issue reproduce itself today with just the main SSD > installed. This was on a new machine that was built this morning. > There is a lot less going on in this trace than the previous one. > > [ 360.448156] INFO: task kworker/1:1:42 blocked for more than 120 seconds. > [ 360.450266] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables this message. > [ 360.452404] kworker/1:1 D ffff88042e0e2cc0 0 42 2 0x00000000 > [ 360.452429] Workqueue: xfs-data/sda5 xfs_end_io [xfs] > [ 360.452432] ffff88042af38000 0000000000000046 0000000000000000 > ffff88042b0cece0 > [ 360.452433] 0000000000062cc0 ffff88042af1ffd8 0000000000062cc0 > ffff88042af1ffd8 > [ 360.452435] 0000000000062cc0 ffff88042af38000 ffff8803eac3be40 > 0000000000000002 > [ 360.452437] Call Trace: > [ 360.452443] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c > [ 360.452445] [<ffffffff813a2438>] ? __rt_mutex_slowlock+0x7b/0xb4 > [ 360.452447] [<ffffffff813a2577>] ? rt_mutex_slowlock+0xe5/0x150 > [ 360.452455] [<ffffffffa0099adb>] ? xfs_setfilesize+0x48/0x120 [xfs] > [ 360.452462] [<ffffffffa009a62f>] ? xfs_end_io+0x7a/0x8e [xfs] > [ 360.452465] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 > [ 360.452468] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 > [ 360.452469] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f > [ 360.452471] [<ffffffff8105a909>] ? kthread+0x81/0x89 > [ 360.452473] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c > [ 360.452475] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 > [ 360.452477] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c > [ 360.452483] INFO: task kworker/u16:4:222 blocked for more than 120 seconds. > [ 360.454614] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables this message. > [ 360.456801] kworker/u16:4 D ffff88042e062cc0 0 222 2 0x00000000 > [ 360.456807] Workqueue: writeback bdi_writeback_workfn (flush-8:0) > [ 360.456810] ffff88042af3cb60 0000000000000046 ffff8804292a0000 > ffffffff81616400 > [ 360.456812] 0000000000062cc0 ffff8804292a1fd8 0000000000062cc0 > ffff8804292a1fd8 > [ 360.456813] ffff8804292a1978 ffff88042af3cb60 ffff88042af3cb60 > ffff8804292a1a50 > [ 360.456815] Call Trace: > [ 360.456819] [<ffffffff810cc034>] ? __lock_page+0x66/0x66 > [ 360.456822] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c > [ 360.456824] [<ffffffff813a1ff9>] ? io_schedule+0x55/0x6b > [ 360.456825] [<ffffffff810cc03a>] ? sleep_on_page+0x6/0xa > [ 360.456827] [<ffffffff813a137a>] ? __wait_on_bit_lock+0x3c/0x85 > [ 360.456829] [<ffffffff810cc4a4>] ? find_get_pages_tag+0xfa/0x125 > [ 360.456831] [<ffffffff810cc02f>] ? __lock_page+0x61/0x66 > [ 360.456833] [<ffffffff8105b333>] ? autoremove_wake_function+0x2a/0x2a > [ 360.456835] [<ffffffff810d4700>] ? write_cache_pages+0x177/0x302 > [ 360.456836] [<ffffffff810d3d07>] ? page_index+0x14/0x14 > [ 360.456838] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 > [ 360.456840] [<ffffffff81134698>] ? __writeback_single_inode+0x72/0x225 > [ 360.456842] [<ffffffff8113550b>] ? writeback_sb_inodes+0x215/0x36d > [ 360.456844] [<ffffffff811356cc>] ? __writeback_inodes_wb+0x69/0xab > [ 360.456846] [<ffffffff81135844>] ? wb_writeback+0x136/0x2a7 > [ 360.456848] [<ffffffff81135c88>] ? wb_do_writeback+0x161/0x1dc > [ 360.456851] [<ffffffff81135d66>] ? bdi_writeback_workfn+0x63/0xf4 > [ 360.456852] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 > [ 360.456854] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 > [ 360.456856] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f > [ 360.456857] [<ffffffff8105a909>] ? kthread+0x81/0x89 > [ 360.456859] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c > [ 360.456860] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 > [ 360.456862] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c > [ 360.456881] INFO: task dpkg:5140 blocked for more than 120 seconds. > [ 360.459062] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables this message. > [ 360.461283] dpkg D ffff88042e0e2cc0 0 5140 5112 0x00000000 > [ 360.461287] ffff8804290d2180 0000000000000086 000000000000020c > ffff88042af38000 > [ 360.461289] 0000000000062cc0 ffff880429bf7fd8 0000000000062cc0 > ffff880429bf7fd8 > [ 360.461290] ffff880429bf78e8 ffff8804290d2180 ffff880429bf7a10 > ffff880429bf7a08 > [ 360.461292] Call Trace: > [ 360.461296] [<ffffffff813a10ef>] ? console_conditional_schedule+0xf/0xf > [ 360.461298] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c > [ 360.461299] [<ffffffff813a111b>] ? schedule_timeout+0x2c/0x123 > [ 360.461301] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 > [ 360.461303] [<ffffffff81065cfd>] ? migrate_enable+0x1cd/0x1dd > [ 360.461306] [<ffffffff810651ab>] ? get_parent_ip+0x9/0x1b > [ 360.461308] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 > [ 360.461310] [<ffffffff813a188b>] ? __wait_for_common+0x78/0xd6 > [ 360.461323] [<ffffffffa00c0032>] ? xfs_bmapi_allocate+0x92/0x9e [xfs] > [ 360.461333] [<ffffffffa00c035d>] ? xfs_bmapi_write+0x31f/0x558 [xfs] > [ 360.461336] [<ffffffff81109680>] ? kmem_cache_alloc+0x7c/0x17d > [ 360.461346] [<ffffffffa00bde6e>] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] > [ 360.461354] [<ffffffffa00a6899>] ? > xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] > [ 360.461362] [<ffffffffa0099dc5>] ? xfs_map_blocks+0x125/0x1f5 [xfs] > [ 360.461369] [<ffffffffa009ac87>] ? xfs_vm_writepage+0x266/0x48f [xfs] > [ 360.461371] [<ffffffff810d3d14>] ? __writepage+0xd/0x2a > [ 360.461372] [<ffffffff810d4790>] ? write_cache_pages+0x207/0x302 > [ 360.461374] [<ffffffff810d3d07>] ? page_index+0x14/0x14 > [ 360.461376] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 > [ 360.461378] [<ffffffff810cd303>] ? __filemap_fdatawrite_range+0x50/0x55 > [ 360.461380] [<ffffffff81138a63>] ? SyS_sync_file_range+0xe2/0x127 > [ 360.461382] [<ffffffff813a76a9>] ? system_call_fastpath+0x16/0x1b > > Austin Fun times... I rebooted the machine (had to power cycle it to get it to go down), repeated the same set of commands and it locked up again. I ran apt-get update; dpkg --configure -a; apt-get update; apt-get upgrade, and then it locked up during the upgrade. It was in the middle of unpacking a 348 MB package. [ 241.634377] INFO: task kworker/1:2:60 blocked for more than 120 seconds. [ 241.641284] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 241.648252] kworker/1:2 D ffff880429ed10c0 0 60 2 0x00000000 [ 241.648310] Workqueue: xfs-data/sda5 xfs_end_io [xfs] [ 241.648320] ffff880429ed10c0 0000000000000046 ffffffffffffffff ffff8804240053c0 [ 241.648327] 0000000000062cc0 ffff880429f4dfd8 0000000000062cc0 ffff880429f4dfd8 [ 241.648331] 0000000000000001 ffff880429ed10c0 ffff8803eb87dac0 0000000000000002 [ 241.648339] Call Trace: [ 241.648358] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 241.648365] [<ffffffff813a2438>] ? __rt_mutex_slowlock+0x7b/0xb4 [ 241.648371] [<ffffffff813a2577>] ? rt_mutex_slowlock+0xe5/0x150 [ 241.648380] [<ffffffff8100c02f>] ? load_TLS+0x7/0xa [ 241.648415] [<ffffffffa00a9adb>] ? xfs_setfilesize+0x48/0x120 [xfs] [ 241.648423] [<ffffffff81063d25>] ? finish_task_switch+0x80/0xc6 [ 241.648447] [<ffffffffa00aa62f>] ? xfs_end_io+0x7a/0x8e [xfs] [ 241.648455] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 [ 241.648462] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 [ 241.648468] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f [ 241.648473] [<ffffffff8105a909>] ? kthread+0x81/0x89 [ 241.648481] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 241.648487] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 [ 241.648492] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 241.648531] INFO: task dpkg:5181 blocked for more than 120 seconds. [ 241.655649] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 241.662711] dpkg D ffff88042e0e2cc0 0 5181 5153 0x00000000 [ 241.662727] ffff8804240053c0 0000000000000086 0000000000000018 ffff88042b0cece0 [ 241.662731] 0000000000062cc0 ffff88042989dfd8 0000000000062cc0 ffff88042989dfd8 [ 241.662735] ffff88042989d8e8 ffff8804240053c0 ffff88042989da10 ffff88042989da08 [ 241.662742] Call Trace: [ 241.662754] [<ffffffff813a10ef>] ? console_conditional_schedule+0xf/0xf [ 241.662760] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 241.662767] [<ffffffff813a111b>] ? schedule_timeout+0x2c/0x123 [ 241.662772] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 241.662777] [<ffffffff81065cfd>] ? migrate_enable+0x1cd/0x1dd [ 241.662786] [<ffffffff810651ab>] ? get_parent_ip+0x9/0x1b [ 241.662791] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 241.662797] [<ffffffff813a188b>] ? __wait_for_common+0x78/0xd6 [ 241.662845] [<ffffffffa00d0032>] ? xfs_bmapi_allocate+0x92/0x9e [xfs] [ 241.662878] [<ffffffffa00d035d>] ? xfs_bmapi_write+0x31f/0x558 [xfs] [ 241.662884] [<ffffffff81063d25>] ? finish_task_switch+0x80/0xc6 [ 241.662924] [<ffffffffa00cde6e>] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] [ 241.662950] [<ffffffffa00b6899>] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] [ 241.662977] [<ffffffffa00a9dc5>] ? xfs_map_blocks+0x125/0x1f5 [xfs] [ 241.663001] [<ffffffffa00aac87>] ? xfs_vm_writepage+0x266/0x48f [xfs] [ 241.663010] [<ffffffff810d3d14>] ? __writepage+0xd/0x2a [ 241.663014] [<ffffffff810d4790>] ? write_cache_pages+0x207/0x302 [ 241.663018] [<ffffffff810d3d07>] ? page_index+0x14/0x14 [ 241.663025] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 [ 241.663034] [<ffffffff810cd303>] ? __filemap_fdatawrite_range+0x50/0x55 [ 241.663039] [<ffffffff81138a63>] ? SyS_sync_file_range+0xe2/0x127 [ 241.663047] [<ffffffff813a76a9>] ? system_call_fastpath+0x16/0x1b From austin@peloton-tech.com Mon May 12 22:33:37 2014 Return-Path: <austin@peloton-tech.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 904EA7F47 for <xfs@oss.sgi.com>; Mon, 12 May 2014 22:33:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B9D48F8294 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:33:34 -0700 (PDT) X-ASG-Debug-ID: 1399952012-04bdf02b8d4c5080001-NocioJ Received: from mail-ig0-f177.google.com (mail-ig0-f177.google.com [209.85.213.177]) by cuda.sgi.com with ESMTP id yKEF96ZBsirpa6xx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:33:32 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.177 Received: by mail-ig0-f177.google.com with SMTP id l13so4705504iga.4 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:33:31 -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=HI2YqjY1fcLUGkpeNO4fGDcrfUOeRfIQCPXZ12p8XzA=; b=ZsKDKUT32mxfYvQ0IbPZH7Ituniz33J4pKr3wb4uWt9O2O2rJwCCsr80QIvkXyTNPi gqDqtssHgyMolve83EHX68orS2ua/41ITIU9ZKkURCvTWup8FiZ4d0z4lhecex1h+vh3 L1tIdupJRip3tIJ2UK6ak1H9bfJu43cMhYU8D3cFH+jlr3W9jmpHYEzHxCYbMVYg23F3 /ntAiYxGM303CXdyadPWNTRPrFyhiKNHr46sxSnsutiAByZobgvhiiGSLeuUXoh3tkbk SqQ3a1eg59ANN2d5DwX60nsmUDL/u9SXxyoy3HBjXfMB8TWX+AKK/vVLa2aNMFRlAPv8 z2ng== X-Gm-Message-State: ALoCoQmlWdacv/181pV75JHVeLA+xw4r/j5QkrpacINlu1zT71VjqXtIoXfM5+6LnjCh64rqdkbH MIME-Version: 1.0 X-Received: by 10.50.111.161 with SMTP id ij1mr21339777igb.12.1399952011816; Mon, 12 May 2014 20:33:31 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Mon, 12 May 2014 20:33:31 -0700 (PDT) In-Reply-To: <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> Date: Mon, 12 May 2014 20:33:31 -0700 Message-ID: <CANGgnMbdL+qOsQaWGHR2-joiHTHkez5DpzhSn5b2-EiDFveY9w@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f177.google.com[209.85.213.177] X-Barracuda-Start-Time: 1399952012 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.5765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 6:29 PM, Austin Schuh <austin@peloton-tech.com> wrote: > On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: >> Hi Dave, >> >> On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >>> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >>>> Howdy, >>>> >>>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >>>> and I'm seeing a couple lockups and crashes which I think are related >>>> to XFS. >>> >>> I think they ar emore likely related to RT issues.... >>> >> >> That very well may be true. >> >>> Your usb device has disconnected and gone down the device >>> removal/invalidate partition route. and it's trying to flush the >>> device, which is stuck on IO completion which is stuck waiting for >>> the device error handling to error them out. >>> >>> So, this is a block device problem error handling problem caused by >>> device unplug getting stuck because it's decided to ask the >>> filesystem to complete operations that can't be completed until the >>> device error handling progress far enough to error out the IOs that >>> the filesystem is waiting for completion on. >>> >>> Cheers, >>> >>> Dave. >>> -- >>> Dave Chinner >>> david@fromorbit.com > > I had the issue reproduce itself today with just the main SSD > installed. This was on a new machine that was built this morning. > There is a lot less going on in this trace than the previous one. Fun times... I rebooted the machine (had to power cycle it to get it to go down), repeated the same set of commands and it locked up again. I ran apt-get update; dpkg --configure -a; apt-get update; apt-get upgrade, and then it locked up during the upgrade. It was in the middle of unpacking a 348 MB package. [ 241.634377] INFO: task kworker/1:2:60 blocked for more than 120 seconds. [ 241.641284] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 241.648252] kworker/1:2 D ffff880429ed10c0 0 60 2 0x00000000 [ 241.648310] Workqueue: xfs-data/sda5 xfs_end_io [xfs] [ 241.648320] ffff880429ed10c0 0000000000000046 ffffffffffffffff ffff8804240053c0 [ 241.648327] 0000000000062cc0 ffff880429f4dfd8 0000000000062cc0 ffff880429f4dfd8 [ 241.648331] 0000000000000001 ffff880429ed10c0 ffff8803eb87dac0 0000000000000002 [ 241.648339] Call Trace: [ 241.648358] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 241.648365] [<ffffffff813a2438>] ? __rt_mutex_slowlock+0x7b/0xb4 [ 241.648371] [<ffffffff813a2577>] ? rt_mutex_slowlock+0xe5/0x150 [ 241.648380] [<ffffffff8100c02f>] ? load_TLS+0x7/0xa [ 241.648415] [<ffffffffa00a9adb>] ? xfs_setfilesize+0x48/0x120 [xfs] [ 241.648423] [<ffffffff81063d25>] ? finish_task_switch+0x80/0xc6 [ 241.648447] [<ffffffffa00aa62f>] ? xfs_end_io+0x7a/0x8e [xfs] [ 241.648455] [<ffffffff81055a49>] ? process_one_work+0x19b/0x2b2 [ 241.648462] [<ffffffff81055f41>] ? worker_thread+0x12b/0x1f6 [ 241.648468] [<ffffffff81055e16>] ? rescuer_thread+0x28f/0x28f [ 241.648473] [<ffffffff8105a909>] ? kthread+0x81/0x89 [ 241.648481] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 241.648487] [<ffffffff813a75fc>] ? ret_from_fork+0x7c/0xb0 [ 241.648492] [<ffffffff8105a888>] ? __kthread_parkme+0x5c/0x5c [ 241.648531] INFO: task dpkg:5181 blocked for more than 120 seconds. [ 241.655649] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 241.662711] dpkg D ffff88042e0e2cc0 0 5181 5153 0x00000000 [ 241.662727] ffff8804240053c0 0000000000000086 0000000000000018 ffff88042b0cece0 [ 241.662731] 0000000000062cc0 ffff88042989dfd8 0000000000062cc0 ffff88042989dfd8 [ 241.662735] ffff88042989d8e8 ffff8804240053c0 ffff88042989da10 ffff88042989da08 [ 241.662742] Call Trace: [ 241.662754] [<ffffffff813a10ef>] ? console_conditional_schedule+0xf/0xf [ 241.662760] [<ffffffff813a1f93>] ? schedule+0x6b/0x7c [ 241.662767] [<ffffffff813a111b>] ? schedule_timeout+0x2c/0x123 [ 241.662772] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 241.662777] [<ffffffff81065cfd>] ? migrate_enable+0x1cd/0x1dd [ 241.662786] [<ffffffff810651ab>] ? get_parent_ip+0x9/0x1b [ 241.662791] [<ffffffff813a5c20>] ? add_preempt_count+0xb7/0xe0 [ 241.662797] [<ffffffff813a188b>] ? __wait_for_common+0x78/0xd6 [ 241.662845] [<ffffffffa00d0032>] ? xfs_bmapi_allocate+0x92/0x9e [xfs] [ 241.662878] [<ffffffffa00d035d>] ? xfs_bmapi_write+0x31f/0x558 [xfs] [ 241.662884] [<ffffffff81063d25>] ? finish_task_switch+0x80/0xc6 [ 241.662924] [<ffffffffa00cde6e>] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] [ 241.662950] [<ffffffffa00b6899>] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] [ 241.662977] [<ffffffffa00a9dc5>] ? xfs_map_blocks+0x125/0x1f5 [xfs] [ 241.663001] [<ffffffffa00aac87>] ? xfs_vm_writepage+0x266/0x48f [xfs] [ 241.663010] [<ffffffff810d3d14>] ? __writepage+0xd/0x2a [ 241.663014] [<ffffffff810d4790>] ? write_cache_pages+0x207/0x302 [ 241.663018] [<ffffffff810d3d07>] ? page_index+0x14/0x14 [ 241.663025] [<ffffffff810d48c6>] ? generic_writepages+0x3b/0x57 [ 241.663034] [<ffffffff810cd303>] ? __filemap_fdatawrite_range+0x50/0x55 [ 241.663039] [<ffffffff81138a63>] ? SyS_sync_file_range+0xe2/0x127 [ 241.663047] [<ffffffff813a76a9>] ? system_call_fastpath+0x16/0x1b From david@fromorbit.com Mon May 12 22:46:54 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1354A7F50 for <xfs@oss.sgi.com>; Mon, 12 May 2014 22:46:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0BF2304135 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:46:53 -0700 (PDT) X-ASG-Debug-ID: 1399952811-04cb6c72914a88f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RkZVIBimGUDOHtn9 for <xfs@oss.sgi.com>; Mon, 12 May 2014 20:46:52 -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: Ap1LAFqUcVN5LL1sPGdsb2JhbABRCIMGiEekMgEBAQEBAQaaGwGBGBcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDQWRcWhUCIJlYHgyuBFQSZR5ZQKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 13:16:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk3fz-000838-J7; Tue, 13 May 2014 13:46:47 +1000 Date: Tue, 13 May 2014 13:46:47 +1000 From: Dave Chinner <david@fromorbit.com> To: Austin Schuh <austin@peloton-tech.com> Cc: xfs <xfs@oss.sgi.com> Subject: Re: XFS crash? Message-ID: <20140513034647.GA5421@dastard> X-ASG-Orig-Subj: Re: XFS crash? References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.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: 1399952811 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.5765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: > On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: > > Hi Dave, > > > > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: > >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: > >>> Howdy, > >>> > >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, > >>> and I'm seeing a couple lockups and crashes which I think are related > >>> to XFS. > >> > >> I think they ar emore likely related to RT issues.... > >> > > > > That very well may be true. > > > >> Your usb device has disconnected and gone down the device > >> removal/invalidate partition route. and it's trying to flush the > >> device, which is stuck on IO completion which is stuck waiting for > >> the device error handling to error them out. > >> > >> So, this is a block device problem error handling problem caused by > >> device unplug getting stuck because it's decided to ask the > >> filesystem to complete operations that can't be completed until the > >> device error handling progress far enough to error out the IOs that > >> the filesystem is waiting for completion on. > >> > >> Cheers, > >> > >> Dave. > >> -- > >> Dave Chinner > >> david@fromorbit.com > > I had the issue reproduce itself today with just the main SSD > installed. This was on a new machine that was built this morning. > There is a lot less going on in this trace than the previous one. The three blocked threads: 1. kworker running IO completion waiting on an inode lock, holding locked pages. 2. kworker running writeback flusher work waiting for a page lock 3. direct flush work waiting for allocation, holding page locks and the inode lock. What's the kworker thread running the allocation work doing? You might need to run `echo w > proc-sysrq-trigger` to get this information... Cheers, Dave. -- Dave Chinner david@fromorbit.com From austin@peloton-tech.com Mon May 12 23:03:53 2014 Return-Path: <austin@peloton-tech.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 22D737F3F for <xfs@oss.sgi.com>; Mon, 12 May 2014 23:03:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED2278F828A for <xfs@oss.sgi.com>; Mon, 12 May 2014 21:03:49 -0700 (PDT) X-ASG-Debug-ID: 1399953828-04cbb03cc648d540001-NocioJ Received: from mail-ie0-f176.google.com (mail-ie0-f176.google.com [209.85.223.176]) by cuda.sgi.com with ESMTP id 08pDCKGZ4pEVNnBm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 12 May 2014 21:03:48 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.223.176 Received: by mail-ie0-f176.google.com with SMTP id ar20so4621933iec.21 for <xfs@oss.sgi.com>; Mon, 12 May 2014 21:03:48 -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=JlIan6+8raWIo0qd9HIkUr8UtVIkbw8dMBJ+Nv2viQo=; b=OBft16WjESHTLDt0bzzhLkZLUo7WcesdoboAkN0O1foU8a8TxusRBiOkalWCyLiCJ2 LPYCY+RJUebU4qmKxPYDP5EXkTIm54nYapI4MrskPy/76xTSO0CLKRxtBF4dgGNK5T6h W6y5HqzqnYJEaVFOE0X4a0xBzVBmC96n2T7ULMMddXKkjY3IkWXTElI33ovgIbQ8NUx5 2pcs2HwFknFmvD1BMdxZP27cVfKUArNgSIOREDGxcWymBJWVrYWqotH8CgWXK4xAoWxI Gz+l5UkXSlprHOoROKWwofi0qvd/Yld11nNat+dY8nHW4al0bdzQCqV3Yc9bYLp3rX7d 4F2A== X-Gm-Message-State: ALoCoQl/ZlvxGYdAejXdQncqrqItU9MV46QJiOD/ohQ267pOZyGL4GGwBf84rPkrNf454VH3doSe MIME-Version: 1.0 X-Received: by 10.50.126.106 with SMTP id mx10mr51404019igb.27.1399953828470; Mon, 12 May 2014 21:03:48 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Mon, 12 May 2014 21:03:48 -0700 (PDT) In-Reply-To: <20140513034647.GA5421@dastard> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> <20140513034647.GA5421@dastard> Date: Mon, 12 May 2014 21:03:48 -0700 Message-ID: <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: multipart/mixed; boundary=047d7b3a9c0aa6111304f9402635 X-Barracuda-Connect: mail-ie0-f176.google.com[209.85.223.176] X-Barracuda-Start-Time: 1399953828 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.5765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --047d7b3a9c0aa6111304f9402635 Content-Type: text/plain; charset=UTF-8 On Mon, May 12, 2014 at 8:46 PM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: >> On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: >> > Hi Dave, >> > >> > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >> >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >> >>> Howdy, >> >>> >> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >> >>> and I'm seeing a couple lockups and crashes which I think are related >> >>> to XFS. >> >> >> >> I think they ar emore likely related to RT issues.... >> >> >> > >> > That very well may be true. >> > >> >> Your usb device has disconnected and gone down the device >> >> removal/invalidate partition route. and it's trying to flush the >> >> device, which is stuck on IO completion which is stuck waiting for >> >> the device error handling to error them out. >> >> >> >> So, this is a block device problem error handling problem caused by >> >> device unplug getting stuck because it's decided to ask the >> >> filesystem to complete operations that can't be completed until the >> >> device error handling progress far enough to error out the IOs that >> >> the filesystem is waiting for completion on. >> >> >> >> Cheers, >> >> >> >> Dave. >> >> -- >> >> Dave Chinner >> >> david@fromorbit.com >> >> I had the issue reproduce itself today with just the main SSD >> installed. This was on a new machine that was built this morning. >> There is a lot less going on in this trace than the previous one. > > The three blocked threads: > > 1. kworker running IO completion waiting on an inode lock, > holding locked pages. > 2. kworker running writeback flusher work waiting for a page lock > 3. direct flush work waiting for allocation, holding page > locks and the inode lock. > > What's the kworker thread running the allocation work doing? > > You might need to run `echo w > proc-sysrq-trigger` to get this > information... I was able to reproduce the lockup. I ran `echo w > /proc/sysrq-trigger` per your suggestion. I don't know how to figure out what the kworker thread is doing, but I'll happily do it if you can give me some guidance. --047d7b3a9c0aa6111304f9402635 Content-Type: application/octet-stream; name=dmesg Content-Disposition: attachment; filename=dmesg Content-Transfer-Encoding: base64 X-Attachment-Id: f_hv4o5rdp0 WyAxMjUwLjE5OTU2MF0gU3lzUnEgOiBTaG93IEJsb2NrZWQgU3RhdGUKWyAxMjUwLjE5OTc3Ml0g ICB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgUEMgc3RhY2sgICBwaWQgZmF0aGVyClsgMTI1 MC4xOTk3OThdIGt3b3JrZXIvMzoxICAgICBEIGZmZmY4ODA0MmRiZTFlNDAgICAgIDAgICAgOTEg ICAgICAyIDB4MDAwMDAwMDAKWyAxMjUwLjE5OTgyMF0gV29ya3F1ZXVlOiB4ZnMtZGF0YS9zZGE1 IHhmc19lbmRfaW8KWyAxMjUwLjE5OTgyNF0gIGZmZmY4ODA0MWE4ZDcwZjAgMDAwMDAwMDAwMDAw MDAwMiBmZmZmODgwNDFhZjk2ODQwIDAwMDAwMDAwMDAwMDAwMDAKWyAxMjUwLjE5OTgyN10gIDAw MDAwMDAwMDAwNjFlNDAgZmZmZjg4MDQxOTVkZGZkOCAwMDAwMDAwMDAwMDYxZTQwIGZmZmY4ODA0 MTk1ZGRmZDgKWyAxMjUwLjE5OTgzNl0gIDAwMDAwMDAwMDAwMDA0MDAgZmZmZjg4MDQxYThkNzBm MCBmZmZmODgwMzU3YmIyYjQwIDAwMDAwMDAwMDAwMDAwMDIKWyAxMjUwLjE5OTgzOV0gQ2FsbCBU cmFjZToKWyAxMjUwLjE5OTg0N10gIFs8ZmZmZmZmZmY4MTQ3YTIyZj5dID8gc2NoZWR1bGUrMHg3 MC8weDgxClsgMTI1MC4xOTk4NDhdICBbPGZmZmZmZmZmODE0N2E3Mzg+XSA/IF9fcnRfbXV0ZXhf c2xvd2xvY2srMHg4MC8weGI5ClsgMTI1MC4xOTk4NTBdICBbPGZmZmZmZmZmODE0N2E4ODY+XSA/ IHJ0X211dGV4X3Nsb3dsb2NrKzB4ZWEvMHgxNTUKWyAxMjUwLjE5OTg1Ml0gIFs8ZmZmZmZmZmY4 MTE5OTZkZD5dID8geGZzX3NldGZpbGVzaXplKzB4NGQvMHgxMjUKWyAxMjUwLjE5OTg1Nl0gIFs8 ZmZmZmZmZmY4MTA1YWIxZT5dID8gZmluaXNoX3Rhc2tfc3dpdGNoKzB4NjAvMHhhYwpbIDEyNTAu MTk5ODU3XSAgWzxmZmZmZmZmZjgxMTlhMzM4Pl0gPyB4ZnNfZW5kX2lvKzB4N2YvMHg5MwpbIDEy NTAuMTk5ODYwXSAgWzxmZmZmZmZmZjgxMDRiYjk2Pl0gPyBwcm9jZXNzX29uZV93b3JrKzB4MWEw LzB4MmI3ClsgMTI1MC4xOTk4NjJdICBbPGZmZmZmZmZmODEwNGMwOWI+XSA/IHdvcmtlcl90aHJl YWQrMHgxMzAvMHgxZmIKWyAxMjUwLjE5OTg2NF0gIFs8ZmZmZmZmZmY4MTA0YmY2Yj5dID8gcmVz Y3Vlcl90aHJlYWQrMHgyOTQvMHgyOTQKWyAxMjUwLjE5OTg2NV0gIFs8ZmZmZmZmZmY4MTA1MGU3 ND5dID8ga3RocmVhZCsweDg2LzB4OGUKWyAxMjUwLjE5OTg2N10gIFs8ZmZmZmZmZmY4MTA1MGRl ZT5dID8gX19rdGhyZWFkX3BhcmttZSsweDYwLzB4NjAKWyAxMjUwLjE5OTg3MF0gIFs8ZmZmZmZm ZmY4MTQ3ZmZkYz5dID8gcmV0X2Zyb21fZm9yaysweDdjLzB4YjAKWyAxMjUwLjE5OTg3Ml0gIFs8 ZmZmZmZmZmY4MTA1MGRlZT5dID8gX19rdGhyZWFkX3BhcmttZSsweDYwLzB4NjAKWyAxMjUwLjE5 OTg4MV0ga3dvcmtlci8yOjEgICAgIEQgZmZmZjg4MDQyZGI2MWU0MCAgICAgMCAgIDE5NiAgICAg IDIgMHgwMDAwMDAwMApbIDEyNTAuMTk5ODk0XSBXb3JrcXVldWU6IHhmcy1kYXRhL3NkYTUgeGZz X2VuZF9pbwpbIDEyNTAuMTk5ODk4XSAgZmZmZjg4MDQxODJjMDAwMCAwMDAwMDAwMDAwMDAwMDAy IGZmZmY4ODA0MWE5NjQ1ODAgZmZmZjg4MDM1N2JiMmFmOApbIDEyNTAuMTk5ODk5XSAgMDAwMDAw MDAwMDA2MWU0MCBmZmZmODgwNDE4MmM5ZmQ4IDAwMDAwMDAwMDAwNjFlNDAgZmZmZjg4MDQxODJj OWZkOApbIDEyNTAuMTk5OTA1XSAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmODgwNDE4MmMwMDAwIGZm ZmY4ODAzNTdiYjJiNDAgMDAwMDAwMDAwMDAwMDAwMgpbIDEyNTAuMTk5OTA3XSBDYWxsIFRyYWNl OgpbIDEyNTAuMTk5OTExXSAgWzxmZmZmZmZmZjgxNDdhMjJmPl0gPyBzY2hlZHVsZSsweDcwLzB4 ODEKWyAxMjUwLjE5OTkxM10gIFs8ZmZmZmZmZmY4MTQ3YTczOD5dID8gX19ydF9tdXRleF9zbG93 bG9jaysweDgwLzB4YjkKWyAxMjUwLjE5OTkxNF0gIFs8ZmZmZmZmZmY4MTQ3YTg4Nj5dID8gcnRf bXV0ZXhfc2xvd2xvY2srMHhlYS8weDE1NQpbIDEyNTAuMTk5OTE2XSAgWzxmZmZmZmZmZjgxMTk5 NmRkPl0gPyB4ZnNfc2V0ZmlsZXNpemUrMHg0ZC8weDEyNQpbIDEyNTAuMTk5OTE4XSAgWzxmZmZm ZmZmZjgxMDVhYjFlPl0gPyBmaW5pc2hfdGFza19zd2l0Y2grMHg2MC8weGFjClsgMTI1MC4xOTk5 MjBdICBbPGZmZmZmZmZmODExOWEzMzg+XSA/IHhmc19lbmRfaW8rMHg3Zi8weDkzClsgMTI1MC4x OTk5MjFdICBbPGZmZmZmZmZmODEwNGJiOTY+XSA/IHByb2Nlc3Nfb25lX3dvcmsrMHgxYTAvMHgy YjcKWyAxMjUwLjE5OTkyM10gIFs8ZmZmZmZmZmY4MTA0YzA5Yj5dID8gd29ya2VyX3RocmVhZCsw eDEzMC8weDFmYgpbIDEyNTAuMTk5OTI1XSAgWzxmZmZmZmZmZjgxMDRiZjZiPl0gPyByZXNjdWVy X3RocmVhZCsweDI5NC8weDI5NApbIDEyNTAuMTk5OTI3XSAgWzxmZmZmZmZmZjgxMDUwZTc0Pl0g PyBrdGhyZWFkKzB4ODYvMHg4ZQpbIDEyNTAuMTk5OTI4XSAgWzxmZmZmZmZmZjgxMDUwZGVlPl0g PyBfX2t0aHJlYWRfcGFya21lKzB4NjAvMHg2MApbIDEyNTAuMTk5OTMwXSAgWzxmZmZmZmZmZjgx NDdmZmRjPl0gPyByZXRfZnJvbV9mb3JrKzB4N2MvMHhiMApbIDEyNTAuMTk5OTMyXSAgWzxmZmZm ZmZmZjgxMDUwZGVlPl0gPyBfX2t0aHJlYWRfcGFya21lKzB4NjAvMHg2MApbIDEyNTAuMTk5OTM5 XSBrd29ya2VyL3UxNjo1ICAgRCBmZmZmODgwNDJkYjYxZTQwICAgICAwICAgMjQ3ICAgICAgMiAw eDAwMDAwMDAwClsgMTI1MC4xOTk5NzBdIFdvcmtxdWV1ZTogd3JpdGViYWNrIGJkaV93cml0ZWJh Y2tfd29ya2ZuIChmbHVzaC04OjApClsgMTI1MC4xOTk5NzldICBmZmZmODgwNDFhOTY0NTgwIDAw MDAwMDAwMDAwMDAwMDIgZmZmZjg4MDQxYWY5NWY5MCBmZmZmODgwNDE4MDNmNjI4ClsgMTI1MC4x OTk5ODBdICAwMDAwMDAwMDAwMDYxZTQwIGZmZmY4ODA0MTgwM2ZmZDggMDAwMDAwMDAwMDA2MWU0 MCBmZmZmODgwNDE4MDNmZmQ4ClsgMTI1MC4xOTk5ODJdICBmZmZmODgwNDE4MDNmNjM4IGZmZmY4 ODA0MWE5NjQ1ODAgZmZmZjg4MDQxODAzZjc2MCBmZmZmODgwNDE4MDNmNzU4ClsgMTI1MC4xOTk5 OTBdIENhbGwgVHJhY2U6ClsgMTI1MC4xOTk5OTNdICBbPGZmZmZmZmZmODE0NzkzMDI+XSA/IGNv bnNvbGVfY29uZGl0aW9uYWxfc2NoZWR1bGUrMHgxYS8weDFhClsgMTI1MC4xOTk5OTZdICBbPGZm ZmZmZmZmODE0N2EyMmY+XSA/IHNjaGVkdWxlKzB4NzAvMHg4MQpbIDEyNTAuMTk5OTk4XSAgWzxm ZmZmZmZmZjgxNDc5MzMzPl0gPyBzY2hlZHVsZV90aW1lb3V0KzB4MzEvMHgxMjgKWyAxMjUwLjIw MDAwMF0gIFs8ZmZmZmZmZmY4MTQ3ZTExNT5dID8gYWRkX3ByZWVtcHRfY291bnQrMHhiYy8weGU1 ClsgMTI1MC4yMDAwMDFdICBbPGZmZmZmZmZmODEwNWNiM2Y+XSA/IG1pZ3JhdGVfZW5hYmxlKzB4 MWQzLzB4MWUzClsgMTI1MC4yMDAwMDNdICBbPGZmZmZmZmZmODEwNWMyNDQ+XSA/IGdldF9wYXJl bnRfaXArMHg5LzB4MWIKWyAxMjUwLjIwMDAwNF0gIFs8ZmZmZmZmZmY4MTQ3ZTExNT5dID8gYWRk X3ByZWVtcHRfY291bnQrMHhiYy8weGU1ClsgMTI1MC4yMDAwMDZdICBbPGZmZmZmZmZmODE0Nzli MTE+XSA/IF9fd2FpdF9mb3JfY29tbW9uKzB4NzgvMHhkNgpbIDEyNTAuMjAwMDA5XSAgWzxmZmZm ZmZmZjgxMWMwNmNlPl0gPyB4ZnNfYm1hcGlfYWxsb2NhdGUrMHg5Ny8weGEzClsgMTI1MC4yMDAw MTFdICBbPGZmZmZmZmZmODExYzA5ZmU+XSA/IHhmc19ibWFwaV93cml0ZSsweDMyNC8weDU1ZApb IDEyNTAuMjAwMDEzXSAgWzxmZmZmZmZmZjgxMTAyYTdlPl0gPyBrbWVtX2NhY2hlX2FsbG9jKzB4 ODEvMHgxODIKWyAxMjUwLjIwMDAyMV0gIFs8ZmZmZmZmZmY4MTFiZTQ5MD5dID8gX194ZnNfYm1h cGlfYWxsb2NhdGUrMHgyMzAvMHgyMzAKWyAxMjUwLjIwMDAyM10gIFs8ZmZmZmZmZmY4MTFhNjk1 Nj5dID8geGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKzB4MWMxLzB4MmNkClsgMTI1MC4yMDAwMjZd ICBbPGZmZmZmZmZmODExOTk5ZDg+XSA/IHhmc19tYXBfYmxvY2tzKzB4MTJhLzB4MWZhClsgMTI1 MC4yMDAwMjddICBbPGZmZmZmZmZmODExOWE5YWY+XSA/IHhmc192bV93cml0ZXBhZ2UrMHgyNmIv MHg0OTQKWyAxMjUwLjIwMDAzMV0gIFs8ZmZmZmZmZmY4MTBjZTI1OT5dID8gX193cml0ZXBhZ2Ur MHgxMi8weDJmClsgMTI1MC4yMDAwMzRdICBbPGZmZmZmZmZmODEwY2VjZDQ+XSA/IHdyaXRlX2Nh Y2hlX3BhZ2VzKzB4MjBjLzB4MzA3ClsgMTI1MC4yMDAwMzZdICBbPGZmZmZmZmZmODEwY2UyNDc+ XSA/IHBhZ2VfaW5kZXgrMHgxNC8weDE0ClsgMTI1MC4yMDAwMzhdICBbPGZmZmZmZmZmODEwY2Vl MGY+XSA/IGdlbmVyaWNfd3JpdGVwYWdlcysweDQwLzB4NWMKWyAxMjUwLjIwMDA0MF0gIFs8ZmZm ZmZmZmY4MTEyZmViOT5dID8gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKzB4NzcvMHgyMmIKWyAx MjUwLjIwMDA0Ml0gIFs8ZmZmZmZmZmY4MTEzMTAzOT5dID8gd3JpdGViYWNrX3NiX2lub2Rlcysw eDIxYS8weDM3MgpbIDEyNTAuMjAwMDQ1XSAgWzxmZmZmZmZmZjgxMTMxMzZmPl0gPyB3Yl93cml0 ZWJhY2srMHgxMmUvMHgyYWMKWyAxMjUwLjIwMDA0N10gIFs8ZmZmZmZmZmY4MTEzMTZmOD5dID8g d2JfZG9fd3JpdGViYWNrKzB4N2UvMHgxZTEKWyAxMjUwLjIwMDA0OV0gIFs8ZmZmZmZmZmY4MTA0 ZDY5OT5dID8gc2V0X3dvcmtlcl9kZXNjKzB4NjYvMHg3MQpbIDEyNTAuMjAwMDUxXSAgWzxmZmZm ZmZmZjgxMTMxOGM0Pl0gPyBiZGlfd3JpdGViYWNrX3dvcmtmbisweDY5LzB4ZmEKWyAxMjUwLjIw MDA1M10gIFs8ZmZmZmZmZmY4MTA0YmI5Nj5dID8gcHJvY2Vzc19vbmVfd29yaysweDFhMC8weDJi NwpbIDEyNTAuMjAwMDU1XSAgWzxmZmZmZmZmZjgxMDRjMDliPl0gPyB3b3JrZXJfdGhyZWFkKzB4 MTMwLzB4MWZiClsgMTI1MC4yMDAwNTddICBbPGZmZmZmZmZmODEwNGJmNmI+XSA/IHJlc2N1ZXJf dGhyZWFkKzB4Mjk0LzB4Mjk0ClsgMTI1MC4yMDAwNThdICBbPGZmZmZmZmZmODEwNTBlNzQ+XSA/ IGt0aHJlYWQrMHg4Ni8weDhlClsgMTI1MC4yMDAwNjBdICBbPGZmZmZmZmZmODEwNTBkZWU+XSA/ IF9fa3RocmVhZF9wYXJrbWUrMHg2MC8weDYwClsgMTI1MC4yMDAwNjJdICBbPGZmZmZmZmZmODE0 N2ZmZGM+XSA/IHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwClsgMTI1MC4yMDAwNjNdICBbPGZmZmZm ZmZmODEwNTBkZWU+XSA/IF9fa3RocmVhZF9wYXJrbWUrMHg2MC8weDYwClsgMTI1MC4yMDAwNzBd IHhmc2FpbGQvc2RhNSAgICBEIGZmZmY4ODA0MmRhNjFlNDAgICAgIDAgICAzMDEgICAgICAyIDB4 MDAwMDAwMDAKWyAxMjUwLjIwMDExN10gIGZmZmY4ODA0MTk0ZmRmOTAgMDAwMDAwMDAwMDAwMDAw MiBmZmZmZmZmZjgxODEzNDAwIGZmZmY4ODA0MTk3YmZkYjAKWyAxMjUwLjIwMDExOF0gIDAwMDAw MDAwMDAwNjFlNDAgZmZmZjg4MDQxOTdiZmZkOCAwMDAwMDAwMDAwMDYxZTQwIGZmZmY4ODA0MTk3 YmZmZDgKWyAxMjUwLjIwMDExOV0gIGZmZmY4ODA0MTk3YmZlMDAgZmZmZjg4MDQxOTRmZGY5MCAw MDAwMDAwMDAwMDAwMDAxIGZmZmY4ODA0MTgyZWQxNDAKWyAxMjUwLjIwMDEyN10gQ2FsbCBUcmFj ZToKWyAxMjUwLjIwMDEzMF0gIFs8ZmZmZmZmZmY4MTQ3YTIyZj5dID8gc2NoZWR1bGUrMHg3MC8w eDgxClsgMTI1MC4yMDAxMzJdICBbPGZmZmZmZmZmODE0NzkzZjI+XSA/IHNjaGVkdWxlX3RpbWVv dXQrMHhmMC8weDEyOApbIDEyNTAuMjAwMTM1XSAgWzxmZmZmZmZmZjgxMDNmNmQzPl0gPyBmdHJh Y2VfcmF3X2V2ZW50X3RpbWVyX2NsYXNzKzB4OWQvMHg5ZApbIDEyNTAuMjAwMTM4XSAgWzxmZmZm ZmZmZjgxMWVjMDMyPl0gPyB4ZnNhaWxkKzB4Y2YvMHg1MWUKWyAxMjUwLjIwMDE0MF0gIFs8ZmZm ZmZmZmY4MTFlYmY2Mz5dID8geGZzX3RyYW5zX2FpbF9jdXJzb3JfZmlyc3QrMHg3ZC8weDdkClsg MTI1MC4yMDAxNDJdICBbPGZmZmZmZmZmODEwNTBlNzQ+XSA/IGt0aHJlYWQrMHg4Ni8weDhlClsg MTI1MC4yMDAxNDNdICBbPGZmZmZmZmZmODEwNTBkZWU+XSA/IF9fa3RocmVhZF9wYXJrbWUrMHg2 MC8weDYwClsgMTI1MC4yMDAxNDVdICBbPGZmZmZmZmZmODE0N2ZmZGM+XSA/IHJldF9mcm9tX2Zv cmsrMHg3Yy8weGIwClsgMTI1MC4yMDAxNDddICBbPGZmZmZmZmZmODEwNTBkZWU+XSA/IF9fa3Ro cmVhZF9wYXJrbWUrMHg2MC8weDYwClsgMTI1MC4yMDAxNzldIHNodXRkb3duICAgICAgICBEIGZm ZmY4ODA0MmRiZTFlNDAgICAgIDAgIDg2ODYgICA2NzI2IDB4MDAwMDAwMDAKWyAxMjUwLjIwMDE5 Nl0gIGZmZmY4ODA0MTk1YmM1ODAgMDAwMDAwMDAwMDAwMDAwMiBmZmZmODgwNDFhZjk2ODQwIDAw MDAwMDAwMDAwMDAwMDAKWyAxMjUwLjIwMDE5N10gIDAwMDAwMDAwMDAwNjFlNDAgZmZmZjg4MDNl ZjIzOWZkOCAwMDAwMDAwMDAwMDYxZTQwIGZmZmY4ODAzZWYyMzlmZDgKWyAxMjUwLjIwMDIwM10g IGZmZmY4ODA0MWE5NjRiYzggZmZmZjg4MDQxOTViYzU4MCBmZmZmODgwM2VmMjM5ZWIwIGZmZmY4 ODAzZWYyMzllYTgKWyAxMjUwLjIwMDIwNV0gQ2FsbCBUcmFjZToKWyAxMjUwLjIwMDIwOF0gIFs8 ZmZmZmZmZmY4MTQ3OTMwMj5dID8gY29uc29sZV9jb25kaXRpb25hbF9zY2hlZHVsZSsweDFhLzB4 MWEKWyAxMjUwLjIwMDIxMV0gIFs8ZmZmZmZmZmY4MTQ3YTIyZj5dID8gc2NoZWR1bGUrMHg3MC8w eDgxClsgMTI1MC4yMDAyMTNdICBbPGZmZmZmZmZmODE0NzkzMzM+XSA/IHNjaGVkdWxlX3RpbWVv dXQrMHgzMS8weDEyOApbIDEyNTAuMjAwMjE0XSAgWzxmZmZmZmZmZjgxMDVjMjQ0Pl0gPyBnZXRf cGFyZW50X2lwKzB4OS8weDFiClsgMTI1MC4yMDAyMTVdICBbPGZmZmZmZmZmODEwNWMyNDQ+XSA/ IGdldF9wYXJlbnRfaXArMHg5LzB4MWIKWyAxMjUwLjIwMDIxN10gIFs8ZmZmZmZmZmY4MTQ3ZTEx NT5dID8gYWRkX3ByZWVtcHRfY291bnQrMHhiYy8weGU1ClsgMTI1MC4yMDAyMTldICBbPGZmZmZm ZmZmODE0NzliMTE+XSA/IF9fd2FpdF9mb3JfY29tbW9uKzB4NzgvMHhkNgpbIDEyNTAuMjAwMjIx XSAgWzxmZmZmZmZmZjgxMTMwZDA5Pl0gPyBzeW5jX2lub2Rlc19zYisweGIyLzB4MWM4ClsgMTI1 MC4yMDAyMjRdICBbPGZmZmZmZmZmODExMzQzOGM+XSA/IGZkYXRhd3JpdGVfb25lX2JkZXYrMHgx NC8weDE0ClsgMTI1MC4yMDAyMjZdICBbPGZmZmZmZmZmODExMTJlYTA+XSA/IGl0ZXJhdGVfc3Vw ZXJzKzB4NzIvMHhjZApbIDEyNTAuMjAwMjI4XSAgWzxmZmZmZmZmZjgxMTM0NGYwPl0gPyBzeXNf c3luYysweDMzLzB4ODYKWyAxMjUwLjIwMDIzMF0gIFs8ZmZmZmZmZmY4MTQ4MDI3ZD5dID8gdHJh Y2VzeXMrMHhkZC8weGUyClsgMTI1MC4yMDAyNDRdIFNjaGVkIERlYnVnIFZlcnNpb246IHYwLjEw LCAzLjEwLjI0LXJ0MjJhYnMgIzEKWyAxMjUwLjIwMDI1N10ga3RpbWUgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogMTI0ODU2Ny44MDE5MzgKWyAxMjUwLjIwMDI1OV0gc2NoZWRf Y2xrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTI1MDIwMC4yNDM3ODEKWyAxMjUw LjIwMDI2MF0gY3B1X2NsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTI1MDIw MC4yNDM4MjgKWyAxMjUwLjIwMDI2N10gamlmZmllcyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDogNDI5NTkxNTg2NApbIDEyNTAuMjAwMjY5XSBzY2hlZF9jbG9ja19zdGFibGUgICAg ICAgICAgICAgICAgICAgICAgOiAxClsgMTI1MC4yMDAyNzBdIApbIDEyNTAuMjAwMjcxXSBzeXNj dGxfc2NoZWQKWyAxMjUwLjIwMDI3OF0gICAuc3lzY3RsX3NjaGVkX2xhdGVuY3kgICAgICAgICAg ICAgICAgICAgIDogMTguMDAwMDAwClsgMTI1MC4yMDAyNzldICAgLnN5c2N0bF9zY2hlZF9taW5f Z3JhbnVsYXJpdHkgICAgICAgICAgICA6IDIuMjUwMDAwClsgMTI1MC4yMDAyODBdICAgLnN5c2N0 bF9zY2hlZF93YWtldXBfZ3JhbnVsYXJpdHkgICAgICAgICA6IDMuMDAwMDAwClsgMTI1MC4yMDAy ODFdICAgLnN5c2N0bF9zY2hlZF9jaGlsZF9ydW5zX2ZpcnN0ICAgICAgICAgICA6IDAKWyAxMjUw LjIwMDI4OF0gICAuc3lzY3RsX3NjaGVkX2ZlYXR1cmVzICAgICAgICAgICAgICAgICAgIDogMjIx MzkKWyAxMjUwLjIwMDI5MF0gICAuc3lzY3RsX3NjaGVkX3R1bmFibGVfc2NhbGluZyAgICAgICAg ICAgIDogMSAobG9nYXJpdG1pYykKWyAxMjUwLjIwMDI5Ml0gClsgMTI1MC4yMDAzMDldIGNwdSMw LCAyMTk0Ljc5NSBNSHoKWyAxMjUwLjIwMDMxMF0gICAubnJfcnVubmluZyAgICAgICAgICAgICAg ICAgICAgOiAwClsgMTI1MC4yMDAzMTJdICAgLmxvYWQgICAgICAgICAgICAgICAgICAgICAgICAg IDogMApbIDEyNTAuMjAwMzEzXSAgIC5ucl9zd2l0Y2hlcyAgICAgICAgICAgICAgICAgICA6IDE2 ODMyNjc2ClsgMTI1MC4yMDAzMTVdICAgLm5yX2xvYWRfdXBkYXRlcyAgICAgICAgICAgICAgIDog MTI0ODU2OApbIDEyNTAuMjAwMzE3XSAgIC5ucl91bmludGVycnVwdGlibGUgICAgICAgICAgICA6 IDM3ClsgMTI1MC4yMDAzMThdICAgLm5leHRfYmFsYW5jZSAgICAgICAgICAgICAgICAgIDogNDI5 NS45MTU4NzIKWyAxMjUwLjIwMDMyNl0gICAuY3Vyci0+cGlkICAgICAgICAgICAgICAgICAgICAg OiAwClsgMTI1MC4yMDAzMjhdICAgLmNsb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDogMTI1 MDE5OS40NDk0MjAKWyAxMjUwLjIwMDMyOV0gICAuY3B1X2xvYWRbMF0gICAgICAgICAgICAgICAg ICAgOiAwClsgMTI1MC4yMDAzMzddICAgLmNwdV9sb2FkWzFdICAgICAgICAgICAgICAgICAgIDog MApbIDEyNTAuMjAwMzM4XSAgIC5jcHVfbG9hZFsyXSAgICAgICAgICAgICAgICAgICA6IDAKWyAx MjUwLjIwMDMzOV0gICAuY3B1X2xvYWRbM10gICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4y MDAzNDBdICAgLmNwdV9sb2FkWzRdICAgICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwMzQ5 XSAKWyAxMjUwLjIwMDM0OV0gY2ZzX3JxWzBdOi9hdXRvZ3JvdXAtMTg3ClsgMTI1MC4yMDAzNTBd ICAgLmV4ZWNfY2xvY2sgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMDM1 Ml0gICAuTUlOX3ZydW50aW1lICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMQpbIDEyNTAuMjAw MzU5XSAgIC5taW5fdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDE3LjY4MzUyMQpbIDEyNTAu MjAwMzYwXSAgIC5tYXhfdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAxClsgMTI1 MC4yMDAzNjJdICAgLnNwcmVhZCAgICAgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAx MjUwLjIwMDM4MF0gICAuc3ByZWFkMCAgICAgICAgICAgICAgICAgICAgICAgOiAtNDU1MjMuMjY2 NjkyClsgMTI1MC4yMDAzODFdICAgLm5yX3NwcmVhZF9vdmVyICAgICAgICAgICAgICAgIDogMApb IDEyNTAuMjAwMzgzXSAgIC5ucl9ydW5uaW5nICAgICAgICAgICAgICAgICAgICA6IDAKWyAxMjUw LjIwMDM4NF0gICAubG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDAz ODVdICAgLnJ1bm5hYmxlX2xvYWRfYXZnICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwMzg3XSAg IC5ibG9ja2VkX2xvYWRfYXZnICAgICAgICAgICAgICA6IDIKWyAxMjUwLjIwMDM5OV0gICAudGdf bG9hZF9hdmcgICAgICAgICAgICAgICAgICAgOiAyClsgMTI1MC4yMDA0MDBdICAgLnRnX2xvYWRf Y29udHJpYiAgICAgICAgICAgICAgIDogMgpbIDEyNTAuMjAwNDAxXSAgIC50Z19ydW5uYWJsZV9j b250cmliICAgICAgICAgICA6IDIKWyAxMjUwLjIwMDQwMl0gICAudGctPnJ1bm5hYmxlX2F2ZyAg ICAgICAgICAgICAgOiAyClsgMTI1MC4yMDA0MDNdICAgLnNlLT5leGVjX3N0YXJ0ICAgICAgICAg ICAgICAgIDogMTI1MDE5OS4zNjA4MTMKWyAxMjUwLjIwMDQwNV0gICAuc2UtPnZydW50aW1lICAg ICAgICAgICAgICAgICAgOiA0NTUzMi4xMTE4NDAKWyAxMjUwLjIwMDQxMl0gICAuc2UtPnN1bV9l eGVjX3J1bnRpbWUgICAgICAgICAgOiAxOC43MzIwOTcKWyAxMjUwLjIwMDQxM10gICAuc2UtPmxv YWQud2VpZ2h0ICAgICAgICAgICAgICAgOiAyClsgMTI1MC4yMDA0MTRdICAgLnNlLT5hdmcucnVu bmFibGVfYXZnX3N1bSAgICAgIDogMTA3ClsgMTI1MC4yMDA0MTVdICAgLnNlLT5hdmcucnVubmFi bGVfYXZnX3BlcmlvZCAgIDogNDcxNTAKWyAxMjUwLjIwMDQyMl0gICAuc2UtPmF2Zy5sb2FkX2F2 Z19jb250cmliICAgICAgOiAxClsgMTI1MC4yMDA0MjNdICAgLnNlLT5hdmcuZGVjYXlfY291bnQg ICAgICAgICAgIDogMTE5MjI4NApbIDEyNTAuMjAwNDI1XSAKWyAxMjUwLjIwMDQyNV0gY2ZzX3Jx WzBdOi9hdXRvZ3JvdXAtMjMKWyAxMjUwLjIwMDQzMl0gICAuZXhlY19jbG9jayAgICAgICAgICAg ICAgICAgICAgOiAwLjAwMDAwMApbIDEyNTAuMjAwNDM0XSAgIC5NSU5fdnJ1bnRpbWUgICAgICAg ICAgICAgICAgICA6IDAuMDAwMDAxClsgMTI1MC4yMDA0MzVdICAgLm1pbl92cnVudGltZSAgICAg ICAgICAgICAgICAgIDogNzkwOS42NzU4NjQKWyAxMjUwLjIwMDQzN10gICAubWF4X3ZydW50aW1l ICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMQpbIDEyNTAuMjAwNDY0XSAgIC5zcHJlYWQgICAg ICAgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAwClsgMTI1MC4yMDA0NjZdICAgLnNwcmVhZDAg ICAgICAgICAgICAgICAgICAgICAgIDogLTM3NjMxLjI3NDM0OQpbIDEyNTAuMjAwNDY4XSAgIC5u cl9zcHJlYWRfb3ZlciAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDQ2OV0gICAubnJfcnVu bmluZyAgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA0NzldICAgLmxvYWQgICAgICAg ICAgICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwNDkxXSAgIC5ydW5uYWJsZV9sb2FkX2F2 ZyAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDUwMV0gICAuYmxvY2tlZF9sb2FkX2F2ZyAgICAg ICAgICAgICAgOiAwClsgMTI1MC4yMDA1MTRdICAgLnRnX2xvYWRfYXZnICAgICAgICAgICAgICAg ICAgIDogMApbIDEyNTAuMjAwNTE2XSAgIC50Z19sb2FkX2NvbnRyaWIgICAgICAgICAgICAgICA6 IDAKWyAxMjUwLjIwMDUxN10gICAudGdfcnVubmFibGVfY29udHJpYiAgICAgICAgICAgOiAwClsg MTI1MC4yMDA1MThdICAgLnRnLT5ydW5uYWJsZV9hdmcgICAgICAgICAgICAgIDogMApbIDEyNTAu MjAwNTIwXSAgIC5zZS0+ZXhlY19zdGFydCAgICAgICAgICAgICAgICA6IDEyNTAxOTMuNzQ1MjMy ClsgMTI1MC4yMDA1MjFdICAgLnNlLT52cnVudGltZSAgICAgICAgICAgICAgICAgIDogNDU1MzQu MTY0NjYzClsgMTI1MC4yMDA1MjNdICAgLnNlLT5zdW1fZXhlY19ydW50aW1lICAgICAgICAgIDog NTM1Mi42NDg4ODEKWyAxMjUwLjIwMDUyNF0gICAuc2UtPmxvYWQud2VpZ2h0ICAgICAgICAgICAg ICAgOiAyClsgMTI1MC4yMDA1MjVdICAgLnNlLT5hdmcucnVubmFibGVfYXZnX3N1bSAgICAgIDog OApbIDEyNTAuMjAwNTI3XSAgIC5zZS0+YXZnLnJ1bm5hYmxlX2F2Z19wZXJpb2QgICA6IDQ3NjI0 ClsgMTI1MC4yMDA1NDFdICAgLnNlLT5hdmcubG9hZF9hdmdfY29udHJpYiAgICAgIDogMApbIDEy NTAuMjAwNTQzXSAgIC5zZS0+YXZnLmRlY2F5X2NvdW50ICAgICAgICAgICA6IDExOTIyNzgKWyAx MjUwLjIwMDU1MV0gClsgMTI1MC4yMDA1NTFdIGNmc19ycVswXTovClsgMTI1MC4yMDA1NTJdICAg LmV4ZWNfY2xvY2sgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMDU1M10g ICAuTUlOX3ZydW50aW1lICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMQpbIDEyNTAuMjAwNTU1 XSAgIC5taW5fdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDQ1NTQwLjk1MDIxMwpbIDEyNTAu MjAwNTYxXSAgIC5tYXhfdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAxClsgMTI1 MC4yMDA1NjJdICAgLnNwcmVhZCAgICAgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAx MjUwLjIwMDU2NF0gICAuc3ByZWFkMCAgICAgICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMApb IDEyNTAuMjAwNTY1XSAgIC5ucl9zcHJlYWRfb3ZlciAgICAgICAgICAgICAgICA6IDAKWyAxMjUw LjIwMDU2Nl0gICAubnJfcnVubmluZyAgICAgICAgICAgICAgICAgICAgOiAxClsgMTI1MC4yMDA1 NzVdICAgLmxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTAyNApbIDEyNTAuMjAwNTc3 XSAgIC5ydW5uYWJsZV9sb2FkX2F2ZyAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDU3OF0gICAu YmxvY2tlZF9sb2FkX2F2ZyAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA1OTldICAgLnRnX2xv YWRfYXZnICAgICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwNjAxXSAgIC50Z19sb2FkX2Nv bnRyaWIgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDYwMl0gICAudGdfcnVubmFibGVfY29u dHJpYiAgICAgICAgICAgOiAzMApbIDEyNTAuMjAwNjAzXSAgIC50Zy0+cnVubmFibGVfYXZnICAg ICAgICAgICAgICA6IDEyMzAKWyAxMjUwLjIwMDYwNF0gICAuYXZnLT5ydW5uYWJsZV9hdmdfc3Vt ICAgICAgICAgOiAxMzY3ClsgMTI1MC4yMDA2MDVdICAgLmF2Zy0+cnVubmFibGVfYXZnX3Blcmlv ZCAgICAgIDogNDYyNzMKWyAxMjUwLjIwMDYwN10gClsgMTI1MC4yMDA2MDddIHJ0X3JxWzBdOgpb IDEyNTAuMjAwNjE1XSAgIC5ydF9ucl9ydW5uaW5nICAgICAgICAgICAgICAgICA6IDAKWyAxMjUw LjIwMDYxNl0gICAucnRfdGhyb3R0bGVkICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA2 MThdICAgLnJ0X3RpbWUgICAgICAgICAgICAgICAgICAgICAgIDogOTYuOTE3NTAzClsgMTI1MC4y MDA2MjZdICAgLnJ0X3J1bnRpbWUgICAgICAgICAgICAgICAgICAgIDogOTUwLjAwMDAwMApbIDEy NTAuMjAwNjI3XSAgIC5ydF9ucl9taWdyYXRvcnkgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIw MDYyOV0gClsgMTI1MC4yMDA2MjldIHJ1bm5hYmxlIHRhc2tzOgpbIDEyNTAuMjAwNjI5XSAgICAg ICAgICAgICB0YXNrICAgUElEICAgICAgICAgdHJlZS1rZXkgIHN3aXRjaGVzICBwcmlvICAgICBl eGVjLXJ1bnRpbWUgICAgICAgICBzdW0tZXhlYyAgICAgICAgc3VtLXNsZWVwClsgMTI1MC4yMDA2 MjldIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KWyAx MjUwLjIwMDY3NV0gUiAgICAgICByc3lzbG9nZCAgNjM2OCAgICAgICAgMTguMjUzMzIyICAgICAg ICAxOSAgIDEyMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAg MC4wMDAwMDAgICAgICAgICAgICAgICAwLjAwMDAwMCAgICAgICAgICAgICAgIDAuMDAwMDAwIC9h dXRvZ3JvdXAtMTY3ClsgMTI1MC4yMDA2OThdIApbIDEyNTAuMjAwNjk5XSBjcHUjMSwgMjE5NC43 OTUgTUh6ClsgMTI1MC4yMDA3MDddICAgLm5yX3J1bm5pbmcgICAgICAgICAgICAgICAgICAgIDog MgpbIDEyNTAuMjAwNzA5XSAgIC5sb2FkICAgICAgICAgICAgICAgICAgICAgICAgICA6IDIwNDgK WyAxMjUwLjIwMDcxMF0gICAubnJfc3dpdGNoZXMgICAgICAgICAgICAgICAgICAgOiA0MDY1NTUy MgpbIDEyNTAuMjAwNzExXSAgIC5ucl9sb2FkX3VwZGF0ZXMgICAgICAgICAgICAgICA6IDEyMzEx NjgKWyAxMjUwLjIwMDcyMV0gICAubnJfdW5pbnRlcnJ1cHRpYmxlICAgICAgICAgICAgOiA0Ngpb IDEyNTAuMjAwNzIyXSAgIC5uZXh0X2JhbGFuY2UgICAgICAgICAgICAgICAgICA6IDQyOTUuOTE1 ODY2ClsgMTI1MC4yMDA3MjRdICAgLmN1cnItPnBpZCAgICAgICAgICAgICAgICAgICAgIDogMjAx NQpbIDEyNTAuMjAwNzI1XSAgIC5jbG9jayAgICAgICAgICAgICAgICAgICAgICAgICA6IDEyNTAy MDAuNzE1NjAyClsgMTI1MC4yMDA3MjZdICAgLmNwdV9sb2FkWzBdICAgICAgICAgICAgICAgICAg IDogMApbIDEyNTAuMjAwNzI3XSAgIC5jcHVfbG9hZFsxXSAgICAgICAgICAgICAgICAgICA6IDAK WyAxMjUwLjIwMDcyOV0gICAuY3B1X2xvYWRbMl0gICAgICAgICAgICAgICAgICAgOiAwClsgMTI1 MC4yMDA3MzBdICAgLmNwdV9sb2FkWzNdICAgICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAw NzMyXSAgIC5jcHVfbG9hZFs0XSAgICAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDc0M10g ClsgMTI1MC4yMDA3NDNdIGNmc19ycVsxXTovYXV0b2dyb3VwLTE4MwpbIDEyNTAuMjAwNzQ1XSAg IC5leGVjX2Nsb2NrICAgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAwClsgMTI1MC4yMDA3NTVd ICAgLk1JTl92cnVudGltZSAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDEKWyAxMjUwLjIwMDc1 Nl0gICAubWluX3ZydW50aW1lICAgICAgICAgICAgICAgICAgOiAwLjYxNjg2MgpbIDEyNTAuMjAw NzU4XSAgIC5tYXhfdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAxClsgMTI1MC4y MDA3NjVdICAgLnNwcmVhZCAgICAgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUw LjIwMDc2N10gICAuc3ByZWFkMCAgICAgICAgICAgICAgICAgICAgICAgOiAtNDU1NDAuMzMzMzUx ClsgMTI1MC4yMDA3NjhdICAgLm5yX3NwcmVhZF9vdmVyICAgICAgICAgICAgICAgIDogMApbIDEy NTAuMjAwNzcwXSAgIC5ucl9ydW5uaW5nICAgICAgICAgICAgICAgICAgICA6IDEKWyAxMjUwLjIw MDc3OF0gICAubG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMDI0ClsgMTI1MC4yMDA3 NzldICAgLnJ1bm5hYmxlX2xvYWRfYXZnICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwNzgwXSAg IC5ibG9ja2VkX2xvYWRfYXZnICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDc4OV0gICAudGdf bG9hZF9hdmcgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA3OTBdICAgLnRnX2xvYWRf Y29udHJpYiAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwNzkxXSAgIC50Z19ydW5uYWJsZV9j b250cmliICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDc5M10gICAudGctPnJ1bm5hYmxlX2F2ZyAg ICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA3OTRdICAgLnNlLT5leGVjX3N0YXJ0ICAgICAgICAg ICAgICAgIDogMTI1MDIwMC43Nzc3MjIKWyAxMjUwLjIwMDc5Nl0gICAuc2UtPnZydW50aW1lICAg ICAgICAgICAgICAgICAgOiAzNjE1OC45NTIxODYKWyAxMjUwLjIwMDc5N10gICAuc2UtPnN1bV9l eGVjX3J1bnRpbWUgICAgICAgICAgOiAxLjY5Njg4OApbIDEyNTAuMjAwNzk4XSAgIC5zZS0+bG9h ZC53ZWlnaHQgICAgICAgICAgICAgICA6IDIKWyAxMjUwLjIwMDc5OV0gICAuc2UtPmF2Zy5ydW5u YWJsZV9hdmdfc3VtICAgICAgOiA3MwpbIDEyNTAuMjAwODAxXSAgIC5zZS0+YXZnLnJ1bm5hYmxl X2F2Z19wZXJpb2QgICA6IDQ4NjMyClsgMTI1MC4yMDA4MDJdICAgLnNlLT5hdmcubG9hZF9hdmdf Y29udHJpYiAgICAgIDogMApbIDEyNTAuMjAwODA0XSAgIC5zZS0+YXZnLmRlY2F5X2NvdW50ICAg ICAgICAgICA6IDExOTIyODUKWyAxMjUwLjIwMDgxNF0gClsgMTI1MC4yMDA4MTRdIGNmc19ycVsx XTovYXV0b2dyb3VwLTE2NwpbIDEyNTAuMjAwODE2XSAgIC5leGVjX2Nsb2NrICAgICAgICAgICAg ICAgICAgICA6IDAuMDAwMDAwClsgMTI1MC4yMDA4MThdICAgLk1JTl92cnVudGltZSAgICAgICAg ICAgICAgICAgIDogNTguMjI4NjUwClsgMTI1MC4yMDA4MTldICAgLm1pbl92cnVudGltZSAgICAg ICAgICAgICAgICAgIDogNTguMjI4NjUwClsgMTI1MC4yMDA4MjddICAgLm1heF92cnVudGltZSAg ICAgICAgICAgICAgICAgIDogNTguMjI4NjUwClsgMTI1MC4yMDA4MjhdICAgLnNwcmVhZCAgICAg ICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMDgzMF0gICAuc3ByZWFkMCAg ICAgICAgICAgICAgICAgICAgICAgOiAtNDU0ODIuNzIxNTYzClsgMTI1MC4yMDA4MzFdICAgLm5y X3NwcmVhZF9vdmVyICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwODUwXSAgIC5ucl9ydW5u aW5nICAgICAgICAgICAgICAgICAgICA6IDEKWyAxMjUwLjIwMDg1Ml0gICAubG9hZCAgICAgICAg ICAgICAgICAgICAgICAgICAgOiAxMDI0ClsgMTI1MC4yMDA4NTRdICAgLnJ1bm5hYmxlX2xvYWRf YXZnICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwODU2XSAgIC5ibG9ja2VkX2xvYWRfYXZnICAg ICAgICAgICAgICA6IDAKWyAxMjUwLjIwMDg1N10gICAudGdfbG9hZF9hdmcgICAgICAgICAgICAg ICAgICAgOiAwClsgMTI1MC4yMDA4NzddICAgLnRnX2xvYWRfY29udHJpYiAgICAgICAgICAgICAg IDogMApbIDEyNTAuMjAwODc4XSAgIC50Z19ydW5uYWJsZV9jb250cmliICAgICAgICAgICA6IDAK WyAxMjUwLjIwMDg3OV0gICAudGctPnJ1bm5hYmxlX2F2ZyAgICAgICAgICAgICAgOiAwClsgMTI1 MC4yMDA4ODBdICAgLnNlLT5leGVjX3N0YXJ0ICAgICAgICAgICAgICAgIDogMTI1MDIwMC44NTM5 OTkKWyAxMjUwLjIwMDg4Ml0gICAuc2UtPnZydW50aW1lICAgICAgICAgICAgICAgICAgOiAzNjE1 OS4wNTQ1MDQKWyAxMjUwLjIwMDg4M10gICAuc2UtPnN1bV9leGVjX3J1bnRpbWUgICAgICAgICAg OiAxNy44NjIzNDgKWyAxMjUwLjIwMDkwMV0gICAuc2UtPmxvYWQud2VpZ2h0ICAgICAgICAgICAg ICAgOiAxMDI0ClsgMTI1MC4yMDA5MTJdICAgLnNlLT5hdmcucnVubmFibGVfYXZnX3N1bSAgICAg IDogMjc0ClsgMTI1MC4yMDA5MTNdICAgLnNlLT5hdmcucnVubmFibGVfYXZnX3BlcmlvZCAgIDog NDg3NDAKWyAxMjUwLjIwMDkxNF0gICAuc2UtPmF2Zy5sb2FkX2F2Z19jb250cmliICAgICAgOiAw ClsgMTI1MC4yMDA5MTZdICAgLnNlLT5hdmcuZGVjYXlfY291bnQgICAgICAgICAgIDogMTE5MjI4 NQpbIDEyNTAuMjAwOTI1XSAKWyAxMjUwLjIwMDkyNV0gY2ZzX3JxWzFdOi8KWyAxMjUwLjIwMDky N10gICAuZXhlY19jbG9jayAgICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMApbIDEyNTAuMjAw OTQ2XSAgIC5NSU5fdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDM2MTU5LjA4NzU2OQpbIDEy NTAuMjAwOTQ3XSAgIC5taW5fdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDM2MTY3LjkyMDcz NgpbIDEyNTAuMjAwOTQ5XSAgIC5tYXhfdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDM2MTU5 LjA4NzU2OQpbIDEyNTAuMjAwOTUwXSAgIC5zcHJlYWQgICAgICAgICAgICAgICAgICAgICAgICA6 IDAuMDAwMDAwClsgMTI1MC4yMDA5NTFdICAgLnNwcmVhZDAgICAgICAgICAgICAgICAgICAgICAg IDogLTkzNzMuMDI5NDc3ClsgMTI1MC4yMDA5NTldICAgLm5yX3NwcmVhZF9vdmVyICAgICAgICAg ICAgICAgIDogMApbIDEyNTAuMjAwOTYxXSAgIC5ucl9ydW5uaW5nICAgICAgICAgICAgICAgICAg ICA6IDEKWyAxMjUwLjIwMDk2Ml0gICAubG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAx MDI0ClsgMTI1MC4yMDA5NjNdICAgLnJ1bm5hYmxlX2xvYWRfYXZnICAgICAgICAgICAgIDogMApb IDEyNTAuMjAwOTcxXSAgIC5ibG9ja2VkX2xvYWRfYXZnICAgICAgICAgICAgICA6IDAKWyAxMjUw LjIwMDk3M10gICAudGdfbG9hZF9hdmcgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDA5 NzRdICAgLnRnX2xvYWRfY29udHJpYiAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAwOTgxXSAg IC50Z19ydW5uYWJsZV9jb250cmliICAgICAgICAgICA6IDQ0NQpbIDEyNTAuMjAwOTgzXSAgIC50 Zy0+cnVubmFibGVfYXZnICAgICAgICAgICAgICA6IDEyNDcKWyAxMjUwLjIwMDk4Nl0gICAuYXZn LT5ydW5uYWJsZV9hdmdfc3VtICAgICAgICAgOiAyMDE5MwpbIDEyNTAuMjAwOTkzXSAgIC5hdmct PnJ1bm5hYmxlX2F2Z19wZXJpb2QgICAgICA6IDQ2NDUyClsgMTI1MC4yMDA5OTVdIApbIDEyNTAu MjAwOTk1XSBydF9ycVsxXToKWyAxMjUwLjIwMDk5N10gICAucnRfbnJfcnVubmluZyAgICAgICAg ICAgICAgICAgOiAxClsgMTI1MC4yMDA5OTldICAgLnJ0X3Rocm90dGxlZCAgICAgICAgICAgICAg ICAgIDogMApbIDEyNTAuMjAxMDAwXSAgIC5ydF90aW1lICAgICAgICAgICAgICAgICAgICAgICA6 IDIwMS44NDk5MTkKWyAxMjUwLjIwMTAzMV0gICAucnRfcnVudGltZSAgICAgICAgICAgICAgICAg ICAgOiA5NTAuMDAwMDAwClsgMTI1MC4yMDEwMzJdICAgLnJ0X25yX21pZ3JhdG9yeSAgICAgICAg ICAgICAgIDogMQpbIDEyNTAuMjAxMDM0XSAKWyAxMjUwLjIwMTAzNF0gcnVubmFibGUgdGFza3M6 ClsgMTI1MC4yMDEwMzRdICAgICAgICAgICAgIHRhc2sgICBQSUQgICAgICAgICB0cmVlLWtleSAg c3dpdGNoZXMgIHByaW8gICAgIGV4ZWMtcnVudGltZSAgICAgICAgIHN1bS1leGVjICAgICAgICBz dW0tc2xlZXAKWyAxMjUwLjIwMTAzNF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQpbIDEyNTAuMjAxMDcxXSBSICAgIGlycS8xOC1jYW4xICAyMDE1ICAg ICAgICAgMC4wMDAwMDAgIDE3NDcyOTA1ICAgIDQ5ICAgICAgICAgICAgICAgMCAgICAgICAgICAg ICAgIDAgICAgICAgICAgICAgICAwLjAwMDAwMCAgICAgICAgICAgICAgIDAuMDAwMDAwICAgICAg ICAgICAgICAgMC4wMDAwMDAgLwpbIDEyNTAuMjAxMDgyXSAgICByczptYWluIFE6UmVnICA2MzY2 ICAgICAgICA1OC4zNDMzNjEgICAgICAgNzU3ICAgMTIwICAgICAgICAgICAgICAgMCAgICAgICAg ICAgICAgIDAgICAgICAgICAgICAgICAwLjAwMDAwMCAgICAgICAgICAgICAgIDAuMDAwMDAwICAg ICAgICAgICAgICAgMC4wMDAwMDAgL2F1dG9ncm91cC0xNjcKWyAxMjUwLjIwMTEwMF0gClsgMTI1 MC4yMDExMDhdIGNwdSMyLCAyMTk0Ljc5NSBNSHoKWyAxMjUwLjIwMTEwOV0gICAubnJfcnVubmlu ZyAgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDExMTFdICAgLmxvYWQgICAgICAgICAg ICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAxMTE5XSAgIC5ucl9zd2l0Y2hlcyAgICAgICAg ICAgICAgICAgICA6IDc0MzM5MzIyClsgMTI1MC4yMDExMjBdICAgLm5yX2xvYWRfdXBkYXRlcyAg ICAgICAgICAgICAgIDogMTI4OTI0OApbIDEyNTAuMjAxMTIyXSAgIC5ucl91bmludGVycnVwdGli bGUgICAgICAgICAgICA6IC0xMzkKWyAxMjUwLjIwMTEzMF0gICAubmV4dF9iYWxhbmNlICAgICAg ICAgICAgICAgICAgOiA0Mjk1LjkxNTg2NgpbIDEyNTAuMjAxMTMxXSAgIC5jdXJyLT5waWQgICAg ICAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTEzM10gICAuY2xvY2sgICAgICAgICAgICAg ICAgICAgICAgICAgOiAxMjUwMjAxLjA3OTk1NwpbIDEyNTAuMjAxMTQ4XSAgIC5jcHVfbG9hZFsw XSAgICAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTE0OV0gICAuY3B1X2xvYWRbMV0gICAg ICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDExNTBdICAgLmNwdV9sb2FkWzJdICAgICAgICAg ICAgICAgICAgIDogMApbIDEyNTAuMjAxMTUxXSAgIC5jcHVfbG9hZFszXSAgICAgICAgICAgICAg ICAgICA6IDAKWyAxMjUwLjIwMTE2Ml0gICAuY3B1X2xvYWRbNF0gICAgICAgICAgICAgICAgICAg OiAwClsgMTI1MC4yMDExNjRdIApbIDEyNTAuMjAxMTY0XSBjZnNfcnFbMl06L2F1dG9ncm91cC0y MwpbIDEyNTAuMjAxMTY2XSAgIC5leGVjX2Nsb2NrICAgICAgICAgICAgICAgICAgICA6IDAuMDAw MDAwClsgMTI1MC4yMDExNzRdICAgLk1JTl92cnVudGltZSAgICAgICAgICAgICAgICAgIDogMC4w MDAwMDEKWyAxMjUwLjIwMTE3Nl0gICAubWluX3ZydW50aW1lICAgICAgICAgICAgICAgICAgOiAz NjM2LjA4MzA0NgpbIDEyNTAuMjAxMTc3XSAgIC5tYXhfdnJ1bnRpbWUgICAgICAgICAgICAgICAg ICA6IDAuMDAwMDAxClsgMTI1MC4yMDExODZdICAgLnNwcmVhZCAgICAgICAgICAgICAgICAgICAg ICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMTE5MV0gICAuc3ByZWFkMCAgICAgICAgICAgICAgICAg ICAgICAgOiAtNDE5MDQuODY3MTY3ClsgMTI1MC4yMDEyMDBdICAgLm5yX3NwcmVhZF9vdmVyICAg ICAgICAgICAgICAgIDogMApbIDEyNTAuMjAxMjAyXSAgIC5ucl9ydW5uaW5nICAgICAgICAgICAg ICAgICAgICA6IDAKWyAxMjUwLjIwMTIwNF0gICAubG9hZCAgICAgICAgICAgICAgICAgICAgICAg ICAgOiAwClsgMTI1MC4yMDEyMzddICAgLnJ1bm5hYmxlX2xvYWRfYXZnICAgICAgICAgICAgIDog MApbIDEyNTAuMjAxMjM5XSAgIC5ibG9ja2VkX2xvYWRfYXZnICAgICAgICAgICAgICA6IDAKWyAx MjUwLjIwMTI0MV0gICAudGdfbG9hZF9hdmcgICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4y MDEyNDJdICAgLnRnX2xvYWRfY29udHJpYiAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAxMjQ0 XSAgIC50Z19ydW5uYWJsZV9jb250cmliICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTI0NV0gICAu dGctPnJ1bm5hYmxlX2F2ZyAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEyNDddICAgLnNlLT5l eGVjX3N0YXJ0ICAgICAgICAgICAgICAgIDogMTI1MDEyMy4yOTM2MDAKWyAxMjUwLjIwMTI0OF0g ICAuc2UtPnZydW50aW1lICAgICAgICAgICAgICAgICAgOiA0NDI2OS4zMDAxOTYKWyAxMjUwLjIw MTI1MF0gICAuc2UtPnN1bV9leGVjX3J1bnRpbWUgICAgICAgICAgOiAyMjkxLjUyNDQ3MQpbIDEy NTAuMjAxMjUyXSAgIC5zZS0+bG9hZC53ZWlnaHQgICAgICAgICAgICAgICA6IDIKWyAxMjUwLjIw MTI1NF0gICAuc2UtPmF2Zy5ydW5uYWJsZV9hdmdfc3VtICAgICAgOiAxNQpbIDEyNTAuMjAxMjU2 XSAgIC5zZS0+YXZnLnJ1bm5hYmxlX2F2Z19wZXJpb2QgICA6IDQ3NTE0ClsgMTI1MC4yMDEyNThd ICAgLnNlLT5hdmcubG9hZF9hdmdfY29udHJpYiAgICAgIDogMApbIDEyNTAuMjAxMjU5XSAgIC5z ZS0+YXZnLmRlY2F5X2NvdW50ICAgICAgICAgICA6IDExOTIyMTEKWyAxMjUwLjIwMTI2MF0gClsg MTI1MC4yMDEyNjBdIGNmc19ycVsyXTovClsgMTI1MC4yMDEyNjJdICAgLmV4ZWNfY2xvY2sgICAg ICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMTI2NF0gICAuTUlOX3ZydW50aW1l ICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMQpbIDEyNTAuMjAxMjY2XSAgIC5taW5fdnJ1bnRp bWUgICAgICAgICAgICAgICAgICA6IDQ0Mjc4LjA4MzEwMApbIDEyNTAuMjAxMjY4XSAgIC5tYXhf dnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAxClsgMTI1MC4yMDEyNjldICAgLnNw cmVhZCAgICAgICAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDAKWyAxMjUwLjIwMTI3MV0gICAu c3ByZWFkMCAgICAgICAgICAgICAgICAgICAgICAgOiAtMTI2Mi44NjcxMTMKWyAxMjUwLjIwMTI3 Ml0gICAubnJfc3ByZWFkX292ZXIgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEyNzRdICAg Lm5yX3J1bm5pbmcgICAgICAgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAxMjk1XSAgIC5sb2Fk ICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTI5Nl0gICAucnVubmFibGVf bG9hZF9hdmcgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEyOTddICAgLmJsb2NrZWRfbG9hZF9h dmcgICAgICAgICAgICAgIDogMApbIDEyNTAuMjAxMjk5XSAgIC50Z19sb2FkX2F2ZyAgICAgICAg ICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTMwMV0gICAudGdfbG9hZF9jb250cmliICAgICAgICAg ICAgICAgOiAwClsgMTI1MC4yMDEzMDJdICAgLnRnX3J1bm5hYmxlX2NvbnRyaWIgICAgICAgICAg IDogMzAyClsgMTI1MC4yMDEzMDNdICAgLnRnLT5ydW5uYWJsZV9hdmcgICAgICAgICAgICAgIDog MTI1MgpbIDEyNTAuMjAxMzA0XSAgIC5hdmctPnJ1bm5hYmxlX2F2Z19zdW0gICAgICAgICA6IDEz NjQ0ClsgMTI1MC4yMDEzMDZdICAgLmF2Zy0+cnVubmFibGVfYXZnX3BlcmlvZCAgICAgIDogNDY1 NTUKWyAxMjUwLjIwMTMwN10gClsgMTI1MC4yMDEzMDddIHJ0X3JxWzJdOgpbIDEyNTAuMjAxMzA4 XSAgIC5ydF9ucl9ydW5uaW5nICAgICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTMxMF0gICAu cnRfdGhyb3R0bGVkICAgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEzMTFdICAgLnJ0X3Rp bWUgICAgICAgICAgICAgICAgICAgICAgIDogMTczLjQwMjMxNgpbIDEyNTAuMjAxMzEzXSAgIC5y dF9ydW50aW1lICAgICAgICAgICAgICAgICAgICA6IDk1MC4wMDAwMDAKWyAxMjUwLjIwMTMxNV0g ICAucnRfbnJfbWlncmF0b3J5ICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEzMTZdIApbIDEy NTAuMjAxMzE2XSBydW5uYWJsZSB0YXNrczoKWyAxMjUwLjIwMTMxNl0gICAgICAgICAgICAgdGFz ayAgIFBJRCAgICAgICAgIHRyZWUta2V5ICBzd2l0Y2hlcyAgcHJpbyAgICAgZXhlYy1ydW50aW1l ICAgICAgICAgc3VtLWV4ZWMgICAgICAgIHN1bS1zbGVlcApbIDEyNTAuMjAxMzE2XSAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClsgMTI1MC4yMDEzMzdd IApbIDEyNTAuMjAxMzM5XSBjcHUjMywgMjE5NC43OTUgTUh6ClsgMTI1MC4yMDEzNDFdICAgLm5y X3J1bm5pbmcgICAgICAgICAgICAgICAgICAgIDogMQpbIDEyNTAuMjAxMzQyXSAgIC5sb2FkICAg ICAgICAgICAgICAgICAgICAgICAgICA6IDEwMjQKWyAxMjUwLjIwMTM0NF0gICAubnJfc3dpdGNo ZXMgICAgICAgICAgICAgICAgICAgOiAxMDI3NDkxOTQKWyAxMjUwLjIwMTM0NV0gICAubnJfbG9h ZF91cGRhdGVzICAgICAgICAgICAgICAgOiAxMjg3NDIxClsgMTI1MC4yMDEzNjNdICAgLm5yX3Vu aW50ZXJydXB0aWJsZSAgICAgICAgICAgIDogNjEKWyAxMjUwLjIwMTM2NV0gICAubmV4dF9iYWxh bmNlICAgICAgICAgICAgICAgICAgOiA0Mjk1LjkxNTg4NQpbIDEyNTAuMjAxMzY2XSAgIC5jdXJy LT5waWQgICAgICAgICAgICAgICAgICAgICA6IDg3MTgKWyAxMjUwLjIwMTM2N10gICAuY2xvY2sg ICAgICAgICAgICAgICAgICAgICAgICAgOiAxMjUwMjAxLjM2MTY5MApbIDEyNTAuMjAxMzY4XSAg IC5jcHVfbG9hZFswXSAgICAgICAgICAgICAgICAgICA6IDEwMjQKWyAxMjUwLjIwMTM2OV0gICAu Y3B1X2xvYWRbMV0gICAgICAgICAgICAgICAgICAgOiA3NjgKWyAxMjUwLjIwMTM3MV0gICAuY3B1 X2xvYWRbMl0gICAgICAgICAgICAgICAgICAgOiA0NDgKWyAxMjUwLjIwMTM3Ml0gICAuY3B1X2xv YWRbM10gICAgICAgICAgICAgICAgICAgOiAyNDAKWyAxMjUwLjIwMTM3NF0gICAuY3B1X2xvYWRb NF0gICAgICAgICAgICAgICAgICAgOiAxMjQKWyAxMjUwLjIwMTM3Nl0gClsgMTI1MC4yMDEzNzZd IGNmc19ycVszXTovYXV0b2dyb3VwLTE4OApbIDEyNTAuMjAxMzc4XSAgIC5leGVjX2Nsb2NrICAg ICAgICAgICAgICAgICAgICA6IDAuMDAwMDAwClsgMTI1MC4yMDEzNzldICAgLk1JTl92cnVudGlt ZSAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDEKWyAxMjUwLjIwMTM4MV0gICAubWluX3ZydW50 aW1lICAgICAgICAgICAgICAgICAgOiAzOTguNjIzNjM5ClsgMTI1MC4yMDEzODJdICAgLm1heF92 cnVudGltZSAgICAgICAgICAgICAgICAgIDogMC4wMDAwMDEKWyAxMjUwLjIwMTM4NF0gICAuc3By ZWFkICAgICAgICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMApbIDEyNTAuMjAxMzg1XSAgIC5z cHJlYWQwICAgICAgICAgICAgICAgICAgICAgICA6IC00NTE0Mi4zMjY1NzQKWyAxMjUwLjIwMTM4 Nl0gICAubnJfc3ByZWFkX292ZXIgICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEzODhdICAg Lm5yX3J1bm5pbmcgICAgICAgICAgICAgICAgICAgIDogMQpbIDEyNTAuMjAxMzkwXSAgIC5sb2Fk ICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEwMjQKWyAxMjUwLjIwMTM5MV0gICAucnVubmFi bGVfbG9hZF9hdmcgICAgICAgICAgICAgOiAyMgpbIDEyNTAuMjAxMzkyXSAgIC5ibG9ja2VkX2xv YWRfYXZnICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIwMTM5M10gICAudGdfbG9hZF9hdmcgICAg ICAgICAgICAgICAgICAgOiAwClsgMTI1MC4yMDEzOTVdICAgLnRnX2xvYWRfY29udHJpYiAgICAg ICAgICAgICAgIDogMApbIDEyNTAuMjAxMzk2XSAgIC50Z19ydW5uYWJsZV9jb250cmliICAgICAg ICAgICA6IDIzClsgMTI1MC4yMDEzOThdICAgLnRnLT5ydW5uYWJsZV9hdmcgICAgICAgICAgICAg IDogMjMKWyAxMjUwLjIwMTQwMF0gICAuc2UtPmV4ZWNfc3RhcnQgICAgICAgICAgICAgICAgOiAx MjUwMjAxLjM2MTY5MApbIDEyNTAuMjAxNDAxXSAgIC5zZS0+dnJ1bnRpbWUgICAgICAgICAgICAg ICAgICA6IDUzMzcwLjY5MzUxOQpbIDEyNTAuMjAxNDAyXSAgIC5zZS0+c3VtX2V4ZWNfcnVudGlt ZSAgICAgICAgICA6IDgzLjM3ODAyNgpbIDEyNTAuMjAxNDA0XSAgIC5zZS0+bG9hZC53ZWlnaHQg ICAgICAgICAgICAgICA6IDEwMjQKWyAxMjUwLjIwMTQwNV0gICAuc2UtPmF2Zy5ydW5uYWJsZV9h dmdfc3VtICAgICAgOiAxOTQwClsgMTI1MC4yMDE0MDZdICAgLnNlLT5hdmcucnVubmFibGVfYXZn X3BlcmlvZCAgIDogNDcwMTMKWyAxMjUwLjIwMTQwOF0gICAuc2UtPmF2Zy5sb2FkX2F2Z19jb250 cmliICAgICAgOiAwClsgMTI1MC4yMDE0MDldICAgLnNlLT5hdmcuZGVjYXlfY291bnQgICAgICAg ICAgIDogMApbIDEyNTAuMjAxNDExXSAKWyAxMjUwLjIwMTQxMV0gY2ZzX3JxWzNdOi8KWyAxMjUw LjIwMTQxM10gICAuZXhlY19jbG9jayAgICAgICAgICAgICAgICAgICAgOiAwLjAwMDAwMApbIDEy NTAuMjAxNDE0XSAgIC5NSU5fdnJ1bnRpbWUgICAgICAgICAgICAgICAgICA6IDAuMDAwMDAxClsg MTI1MC4yMDE0MTVdICAgLm1pbl92cnVudGltZSAgICAgICAgICAgICAgICAgIDogNTMzNzAuNjkz NTE5ClsgMTI1MC4yMDE0MzNdICAgLm1heF92cnVudGltZSAgICAgICAgICAgICAgICAgIDogMC4w MDAwMDEKWyAxMjUwLjIwMTQzNV0gICAuc3ByZWFkICAgICAgICAgICAgICAgICAgICAgICAgOiAw LjAwMDAwMApbIDEyNTAuMjAxNDM3XSAgIC5zcHJlYWQwICAgICAgICAgICAgICAgICAgICAgICA6 IDc4MjkuNzQzMzA2ClsgMTI1MC4yMDE0MzhdICAgLm5yX3NwcmVhZF9vdmVyICAgICAgICAgICAg ICAgIDogMApbIDEyNTAuMjAxNDM5XSAgIC5ucl9ydW5uaW5nICAgICAgICAgICAgICAgICAgICA6 IDEKWyAxMjUwLjIwMTQ0MF0gICAubG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMDI0 ClsgMTI1MC4yMDE0NDFdICAgLnJ1bm5hYmxlX2xvYWRfYXZnICAgICAgICAgICAgIDogMApbIDEy NTAuMjAxNDQyXSAgIC5ibG9ja2VkX2xvYWRfYXZnICAgICAgICAgICAgICA6IDAKWyAxMjUwLjIw MTQ1NV0gICAudGdfbG9hZF9hdmcgICAgICAgICAgICAgICAgICAgOiA0MgpbIDEyNTAuMjAxNDU3 XSAgIC50Z19sb2FkX2NvbnRyaWIgICAgICAgICAgICAgICA6IDQyClsgMTI1MC4yMDE0NTldICAg LnRnX3J1bm5hYmxlX2NvbnRyaWIgICAgICAgICAgIDogNDg4ClsgMTI1MC4yMDE0NjFdICAgLnRn LT5ydW5uYWJsZV9hdmcgICAgICAgICAgICAgIDogMTI4NQpbIDEyNTAuMjAxNDYyXSAgIC5hdmct PnJ1bm5hYmxlX2F2Z19zdW0gICAgICAgICA6IDIyMjAzClsgMTI1MC4yMDE0NjNdICAgLmF2Zy0+ cnVubmFibGVfYXZnX3BlcmlvZCAgICAgIDogNDY1ODEKWyAxMjUwLjIwMTQ2NF0gClsgMTI1MC4y MDE0NjRdIHJ0X3JxWzNdOgpbIDEyNTAuMjAxNDY2XSAgIC5ydF9ucl9ydW5uaW5nICAgICAgICAg ICAgICAgICA6IDAKWyAxMjUwLjIwMTQ2N10gICAucnRfdGhyb3R0bGVkICAgICAgICAgICAgICAg ICAgOiAwClsgMTI1MC4yMDE0NjhdICAgLnJ0X3RpbWUgICAgICAgICAgICAgICAgICAgICAgIDog MjIxLjMwMjgwNQpbIDEyNTAuMjAxNDcwXSAgIC5ydF9ydW50aW1lICAgICAgICAgICAgICAgICAg ICA6IDk1MC4wMDAwMDAKWyAxMjUwLjIwMTQ3MV0gICAucnRfbnJfbWlncmF0b3J5ICAgICAgICAg ICAgICAgOiAwClsgMTI1MC4yMDE0NzNdIApbIDEyNTAuMjAxNDczXSBydW5uYWJsZSB0YXNrczoK WyAxMjUwLjIwMTQ3M10gICAgICAgICAgICAgdGFzayAgIFBJRCAgICAgICAgIHRyZWUta2V5ICBz d2l0Y2hlcyAgcHJpbyAgICAgZXhlYy1ydW50aW1lICAgICAgICAgc3VtLWV4ZWMgICAgICAgIHN1 bS1zbGVlcApbIDEyNTAuMjAxNDczXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tClsgMTI1MC4yMDE1MTBdIFIgICAgICAgICAgIGJhc2ggIDg3MTggICAg ICAgMzk4LjcyODAwMSAgICAgIDYzNDIgICAxMjAgICAgICAgICAgICAgICAwICAgICAgICAgICAg ICAgMCAgICAgICAgICAgICAgIDAuMDAwMDAwICAgICAgICAgICAgICAgMC4wMDAwMDAgICAgICAg ICAgICAgICAwLjAwMDAwMCAvYXV0b2dyb3VwLTE4OApbIDEyNTAuMjAxNTE2XSAKWyAxMzIyLjM4 MTkwMl0gSU5GTzogdGFzayBrd29ya2VyLzM6MTo5MSBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIw IHNlY29uZHMuClsgMTMyMi4zODIwNzVdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdf dGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KWyAxMzIyLjM4MjIyMF0g a3dvcmtlci8zOjEgICAgIEQgZmZmZjg4MDQyZGJlMWU0MCAgICAgMCAgICA5MSAgICAgIDIgMHgw MDAwMDAwMApbIDEzMjIuMzgyMjM1XSBXb3JrcXVldWU6IHhmcy1kYXRhL3NkYTUgeGZzX2VuZF9p bwpbIDEzMjIuMzgyMjQ1XSAgZmZmZjg4MDQxYThkNzBmMCAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4 ODA0MWFmOTY4NDAgMDAwMDAwMDAwMDAwMDAwMApbIDEzMjIuMzgyMjQ5XSAgMDAwMDAwMDAwMDA2 MWU0MCBmZmZmODgwNDE5NWRkZmQ4IDAwMDAwMDAwMDAwNjFlNDAgZmZmZjg4MDQxOTVkZGZkOApb IDEzMjIuMzgyMjYyXSAgMDAwMDAwMDAwMDAwMDQwMCBmZmZmODgwNDFhOGQ3MGYwIGZmZmY4ODAz NTdiYjJiNDAgMDAwMDAwMDAwMDAwMDAwMgpbIDEzMjIuMzgyMjY1XSBDYWxsIFRyYWNlOgpbIDEz MjIuMzgyMjczXSAgWzxmZmZmZmZmZjgxNDdhMjJmPl0gPyBzY2hlZHVsZSsweDcwLzB4ODEKWyAx MzIyLjM4MjI3Nl0gIFs8ZmZmZmZmZmY4MTQ3YTczOD5dID8gX19ydF9tdXRleF9zbG93bG9jaysw eDgwLzB4YjkKWyAxMzIyLjM4MjI3N10gIFs8ZmZmZmZmZmY4MTQ3YTg4Nj5dID8gcnRfbXV0ZXhf c2xvd2xvY2srMHhlYS8weDE1NQpbIDEzMjIuMzgyMjgwXSAgWzxmZmZmZmZmZjgxMTk5NmRkPl0g PyB4ZnNfc2V0ZmlsZXNpemUrMHg0ZC8weDEyNQpbIDEzMjIuMzgyMjgzXSAgWzxmZmZmZmZmZjgx MDVhYjFlPl0gPyBmaW5pc2hfdGFza19zd2l0Y2grMHg2MC8weGFjClsgMTMyMi4zODIyODVdICBb PGZmZmZmZmZmODExOWEzMzg+XSA/IHhmc19lbmRfaW8rMHg3Zi8weDkzClsgMTMyMi4zODIyODhd ICBbPGZmZmZmZmZmODEwNGJiOTY+XSA/IHByb2Nlc3Nfb25lX3dvcmsrMHgxYTAvMHgyYjcKWyAx MzIyLjM4MjI5MF0gIFs8ZmZmZmZmZmY4MTA0YzA5Yj5dID8gd29ya2VyX3RocmVhZCsweDEzMC8w eDFmYgpbIDEzMjIuMzgyMjkxXSAgWzxmZmZmZmZmZjgxMDRiZjZiPl0gPyByZXNjdWVyX3RocmVh ZCsweDI5NC8weDI5NApbIDEzMjIuMzgyMjkzXSAgWzxmZmZmZmZmZjgxMDUwZTc0Pl0gPyBrdGhy ZWFkKzB4ODYvMHg4ZQpbIDEzMjIuMzgyMjk1XSAgWzxmZmZmZmZmZjgxMDUwZGVlPl0gPyBfX2t0 aHJlYWRfcGFya21lKzB4NjAvMHg2MApbIDEzMjIuMzgyMjk4XSAgWzxmZmZmZmZmZjgxNDdmZmRj Pl0gPyByZXRfZnJvbV9mb3JrKzB4N2MvMHhiMApbIDEzMjIuMzgyMjk5XSAgWzxmZmZmZmZmZjgx MDUwZGVlPl0gPyBfX2t0aHJlYWRfcGFya21lKzB4NjAvMHg2MApbIDEzMjIuMzgyMzA2XSBJTkZP OiB0YXNrIGt3b3JrZXIvMjoxOjE5NiBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMu ClsgMTMyMi4zODI1MDNdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1l b3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KWyAxMzIyLjM4MjY0OV0ga3dvcmtlci8y OjEgICAgIEQgZmZmZjg4MDQyZGI2MWU0MCAgICAgMCAgIDE5NiAgICAgIDIgMHgwMDAwMDAwMApb IDEzMjIuMzgyNjUzXSBXb3JrcXVldWU6IHhmcy1kYXRhL3NkYTUgeGZzX2VuZF9pbwpbIDEzMjIu MzgyNjYxXSAgZmZmZjg4MDQxODJjMDAwMCAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4ODA0MWE5NjQ1 ODAgZmZmZjg4MDM1N2JiMmFmOApbIDEzMjIuMzgyNjYzXSAgMDAwMDAwMDAwMDA2MWU0MCBmZmZm ODgwNDE4MmM5ZmQ4IDAwMDAwMDAwMDAwNjFlNDAgZmZmZjg4MDQxODJjOWZkOApbIDEzMjIuMzgy NjcyXSAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmODgwNDE4MmMwMDAwIGZmZmY4ODAzNTdiYjJiNDAg MDAwMDAwMDAwMDAwMDAwMgpbIDEzMjIuMzgyNjc4XSBDYWxsIFRyYWNlOgpbIDEzMjIuMzgyNjgy XSAgWzxmZmZmZmZmZjgxNDdhMjJmPl0gPyBzY2hlZHVsZSsweDcwLzB4ODEKWyAxMzIyLjM4MjY4 M10gIFs8ZmZmZmZmZmY4MTQ3YTczOD5dID8gX19ydF9tdXRleF9zbG93bG9jaysweDgwLzB4YjkK WyAxMzIyLjM4MjY4OV0gIFs8ZmZmZmZmZmY4MTQ3YTg4Nj5dID8gcnRfbXV0ZXhfc2xvd2xvY2sr MHhlYS8weDE1NQpbIDEzMjIuMzgyNjkxXSAgWzxmZmZmZmZmZjgxMTk5NmRkPl0gPyB4ZnNfc2V0 ZmlsZXNpemUrMHg0ZC8weDEyNQpbIDEzMjIuMzgyNjkzXSAgWzxmZmZmZmZmZjgxMDVhYjFlPl0g PyBmaW5pc2hfdGFza19zd2l0Y2grMHg2MC8weGFjClsgMTMyMi4zODI2OTRdICBbPGZmZmZmZmZm ODExOWEzMzg+XSA/IHhmc19lbmRfaW8rMHg3Zi8weDkzClsgMTMyMi4zODI2OTZdICBbPGZmZmZm ZmZmODEwNGJiOTY+XSA/IHByb2Nlc3Nfb25lX3dvcmsrMHgxYTAvMHgyYjcKWyAxMzIyLjM4MjY5 OF0gIFs8ZmZmZmZmZmY4MTA0YzA5Yj5dID8gd29ya2VyX3RocmVhZCsweDEzMC8weDFmYgpbIDEz MjIuMzgyNzAwXSAgWzxmZmZmZmZmZjgxMDRiZjZiPl0gPyByZXNjdWVyX3RocmVhZCsweDI5NC8w eDI5NApbIDEzMjIuMzgyNzAxXSAgWzxmZmZmZmZmZjgxMDUwZTc0Pl0gPyBrdGhyZWFkKzB4ODYv MHg4ZQpbIDEzMjIuMzgyNzAzXSAgWzxmZmZmZmZmZjgxMDUwZGVlPl0gPyBfX2t0aHJlYWRfcGFy a21lKzB4NjAvMHg2MApbIDEzMjIuMzgyNzA1XSAgWzxmZmZmZmZmZjgxNDdmZmRjPl0gPyByZXRf ZnJvbV9mb3JrKzB4N2MvMHhiMApbIDEzMjIuMzgyNzA3XSAgWzxmZmZmZmZmZjgxMDUwZGVlPl0g PyBfX2t0aHJlYWRfcGFya21lKzB4NjAvMHg2MApbIDEzMjIuMzgyNzE0XSBJTkZPOiB0YXNrIGt3 b3JrZXIvdTE2OjU6MjQ3IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KWyAxMzIy LjM4Mjg2NF0gImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vj cyIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLgpbIDEzMjIuMzgzMDM0XSBrd29ya2VyL3UxNjo1ICAg RCBmZmZmODgwNDJkYjYxZTQwICAgICAwICAgMjQ3ICAgICAgMiAweDAwMDAwMDAwClsgMTMyMi4z ODMwNTJdIFdvcmtxdWV1ZTogd3JpdGViYWNrIGJkaV93cml0ZWJhY2tfd29ya2ZuIChmbHVzaC04 OjApClsgMTMyMi4zODMwNjddICBmZmZmODgwNDFhOTY0NTgwIDAwMDAwMDAwMDAwMDAwMDIgZmZm Zjg4MDQxYWY5NWY5MCBmZmZmODgwNDE4MDNmNjI4ClsgMTMyMi4zODMwNzJdICAwMDAwMDAwMDAw MDYxZTQwIGZmZmY4ODA0MTgwM2ZmZDggMDAwMDAwMDAwMDA2MWU0MCBmZmZmODgwNDE4MDNmZmQ4 ClsgMTMyMi4zODM3MDJdICBmZmZmODgwNDE4MDNmNjM4IGZmZmY4ODA0MWE5NjQ1ODAgZmZmZjg4 MDQxODAzZjc2MCBmZmZmODgwNDE4MDNmNzU4ClsgMTMyMi4zODM3MDddIENhbGwgVHJhY2U6Clsg MTMyMi4zODM3MTVdICBbPGZmZmZmZmZmODE0NzkzMDI+XSA/IGNvbnNvbGVfY29uZGl0aW9uYWxf c2NoZWR1bGUrMHgxYS8weDFhClsgMTMyMi4zODM3MjhdICBbPGZmZmZmZmZmODE0N2EyMmY+XSA/ IHNjaGVkdWxlKzB4NzAvMHg4MQpbIDEzMjIuMzgzNzQzXSAgWzxmZmZmZmZmZjgxNDc5MzMzPl0g PyBzY2hlZHVsZV90aW1lb3V0KzB4MzEvMHgxMjgKWyAxMzIyLjM4Mzc0Nl0gIFs8ZmZmZmZmZmY4 MTQ3ZTExNT5dID8gYWRkX3ByZWVtcHRfY291bnQrMHhiYy8weGU1ClsgMTMyMi4zODM3NDhdICBb PGZmZmZmZmZmODEwNWNiM2Y+XSA/IG1pZ3JhdGVfZW5hYmxlKzB4MWQzLzB4MWUzClsgMTMyMi4z ODM3NTBdICBbPGZmZmZmZmZmODEwNWMyNDQ+XSA/IGdldF9wYXJlbnRfaXArMHg5LzB4MWIKWyAx MzIyLjM4Mzc1Ml0gIFs8ZmZmZmZmZmY4MTQ3ZTExNT5dID8gYWRkX3ByZWVtcHRfY291bnQrMHhi Yy8weGU1ClsgMTMyMi4zODM3NTVdICBbPGZmZmZmZmZmODE0NzliMTE+XSA/IF9fd2FpdF9mb3Jf Y29tbW9uKzB4NzgvMHhkNgpbIDEzMjIuMzgzNzU4XSAgWzxmZmZmZmZmZjgxMWMwNmNlPl0gPyB4 ZnNfYm1hcGlfYWxsb2NhdGUrMHg5Ny8weGEzClsgMTMyMi4zODM3NjBdICBbPGZmZmZmZmZmODEx YzA5ZmU+XSA/IHhmc19ibWFwaV93cml0ZSsweDMyNC8weDU1ZApbIDEzMjIuMzgzNzYzXSAgWzxm ZmZmZmZmZjgxMTAyYTdlPl0gPyBrbWVtX2NhY2hlX2FsbG9jKzB4ODEvMHgxODIKWyAxMzIyLjM4 Mzc2N10gIFs8ZmZmZmZmZmY4MTFiZTQ5MD5dID8gX194ZnNfYm1hcGlfYWxsb2NhdGUrMHgyMzAv MHgyMzAKWyAxMzIyLjM4Mzc2OV0gIFs8ZmZmZmZmZmY4MTFhNjk1Nj5dID8geGZzX2lvbWFwX3dy aXRlX2FsbG9jYXRlKzB4MWMxLzB4MmNkClsgMTMyMi4zODM3NzJdICBbPGZmZmZmZmZmODExOTk5 ZDg+XSA/IHhmc19tYXBfYmxvY2tzKzB4MTJhLzB4MWZhClsgMTMyMi4zODM3NzRdICBbPGZmZmZm ZmZmODExOWE5YWY+XSA/IHhmc192bV93cml0ZXBhZ2UrMHgyNmIvMHg0OTQKWyAxMzIyLjM4Mzc3 OF0gIFs8ZmZmZmZmZmY4MTBjZTI1OT5dID8gX193cml0ZXBhZ2UrMHgxMi8weDJmClsgMTMyMi4z ODM3ODBdICBbPGZmZmZmZmZmODEwY2VjZDQ+XSA/IHdyaXRlX2NhY2hlX3BhZ2VzKzB4MjBjLzB4 MzA3ClsgMTMyMi4zODM3ODFdICBbPGZmZmZmZmZmODEwY2UyNDc+XSA/IHBhZ2VfaW5kZXgrMHgx NC8weDE0ClsgMTMyMi4zODM3ODRdICBbPGZmZmZmZmZmODEwY2VlMGY+XSA/IGdlbmVyaWNfd3Jp dGVwYWdlcysweDQwLzB4NWMKWyAxMzIyLjM4Mzc4OF0gIFs8ZmZmZmZmZmY4MTEyZmViOT5dID8g X193cml0ZWJhY2tfc2luZ2xlX2lub2RlKzB4NzcvMHgyMmIKWyAxMzIyLjM4Mzc5MF0gIFs8ZmZm ZmZmZmY4MTEzMTAzOT5dID8gd3JpdGViYWNrX3NiX2lub2RlcysweDIxYS8weDM3MgpbIDEzMjIu MzgzNzkyXSAgWzxmZmZmZmZmZjgxMTMxMzZmPl0gPyB3Yl93cml0ZWJhY2srMHgxMmUvMHgyYWMK WyAxMzIyLjM4Mzc5NV0gIFs8ZmZmZmZmZmY4MTEzMTZmOD5dID8gd2JfZG9fd3JpdGViYWNrKzB4 N2UvMHgxZTEKWyAxMzIyLjM4Mzc5OF0gIFs8ZmZmZmZmZmY4MTA0ZDY5OT5dID8gc2V0X3dvcmtl cl9kZXNjKzB4NjYvMHg3MQpbIDEzMjIuMzgzODAxXSAgWzxmZmZmZmZmZjgxMTMxOGM0Pl0gPyBi ZGlfd3JpdGViYWNrX3dvcmtmbisweDY5LzB4ZmEKWyAxMzIyLjM4MzgwM10gIFs8ZmZmZmZmZmY4 MTA0YmI5Nj5dID8gcHJvY2Vzc19vbmVfd29yaysweDFhMC8weDJiNwpbIDEzMjIuMzgzODA1XSAg WzxmZmZmZmZmZjgxMDRjMDliPl0gPyB3b3JrZXJfdGhyZWFkKzB4MTMwLzB4MWZiClsgMTMyMi4z ODM4MDddICBbPGZmZmZmZmZmODEwNGJmNmI+XSA/IHJlc2N1ZXJfdGhyZWFkKzB4Mjk0LzB4Mjk0 ClsgMTMyMi4zODM4MDldICBbPGZmZmZmZmZmODEwNTBlNzQ+XSA/IGt0aHJlYWQrMHg4Ni8weDhl ClsgMTMyMi4zODM4MTFdICBbPGZmZmZmZmZmODEwNTBkZWU+XSA/IF9fa3RocmVhZF9wYXJrbWUr MHg2MC8weDYwClsgMTMyMi4zODM4MTRdICBbPGZmZmZmZmZmODE0N2ZmZGM+XSA/IHJldF9mcm9t X2ZvcmsrMHg3Yy8weGIwClsgMTMyMi4zODM4MTZdICBbPGZmZmZmZmZmODEwNTBkZWU+XSA/IF9f a3RocmVhZF9wYXJrbWUrMHg2MC8weDYwClsgMTMyMi4zODM4NTldIElORk86IHRhc2sgc2h1dGRv d246ODY4NiBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuClsgMTMyMi4zODQxODZd ICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2Fi bGVzIHRoaXMgbWVzc2FnZS4KWyAxMzIyLjM4NDM0Nl0gc2h1dGRvd24gICAgICAgIEQgZmZmZjg4 MDQyZGJlMWU0MCAgICAgMCAgODY4NiAgIDY3MjYgMHgwMDAwMDAwMApbIDEzMjIuMzg0Mzk0XSAg ZmZmZjg4MDQxOTViYzU4MCAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4ODA0MWFmOTY4NDAgMDAwMDAw MDAwMDAwMDAwMApbIDEzMjIuMzg0Mzk2XSAgMDAwMDAwMDAwMDA2MWU0MCBmZmZmODgwM2VmMjM5 ZmQ4IDAwMDAwMDAwMDAwNjFlNDAgZmZmZjg4MDNlZjIzOWZkOApbIDEzMjIuMzg0Mzk5XSAgZmZm Zjg4MDQxYTk2NGJjOCBmZmZmODgwNDE5NWJjNTgwIGZmZmY4ODAzZWYyMzllYjAgZmZmZjg4MDNl ZjIzOWVhOApbIDEzMjIuMzg0NDAzXSBDYWxsIFRyYWNlOgpbIDEzMjIuMzg0NDA5XSAgWzxmZmZm ZmZmZjgxNDc5MzAyPl0gPyBjb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKzB4MWEvMHgxYQpb IDEzMjIuMzg0NDExXSAgWzxmZmZmZmZmZjgxNDdhMjJmPl0gPyBzY2hlZHVsZSsweDcwLzB4ODEK WyAxMzIyLjM4NDQxNF0gIFs8ZmZmZmZmZmY4MTQ3OTMzMz5dID8gc2NoZWR1bGVfdGltZW91dCsw eDMxLzB4MTI4ClsgMTMyMi4zODQ0MTddICBbPGZmZmZmZmZmODEwNWMyNDQ+XSA/IGdldF9wYXJl bnRfaXArMHg5LzB4MWIKWyAxMzIyLjM4NDQyNV0gIFs8ZmZmZmZmZmY4MTA1YzI0ND5dID8gZ2V0 X3BhcmVudF9pcCsweDkvMHgxYgpbIDEzMjIuMzg0NDM1XSAgWzxmZmZmZmZmZjgxNDdlMTE1Pl0g PyBhZGRfcHJlZW1wdF9jb3VudCsweGJjLzB4ZTUKWyAxMzIyLjM4NDQzOF0gIFs8ZmZmZmZmZmY4 MTQ3OWIxMT5dID8gX193YWl0X2Zvcl9jb21tb24rMHg3OC8weGQ2ClsgMTMyMi4zODQ0NDFdICBb PGZmZmZmZmZmODExMzBkMDk+XSA/IHN5bmNfaW5vZGVzX3NiKzB4YjIvMHgxYzgKWyAxMzIyLjM4 NDQ0NF0gIFs8ZmZmZmZmZmY4MTEzNDM4Yz5dID8gZmRhdGF3cml0ZV9vbmVfYmRldisweDE0LzB4 MTQKWyAxMzIyLjM4NDQ0N10gIFs8ZmZmZmZmZmY4MTExMmVhMD5dID8gaXRlcmF0ZV9zdXBlcnMr MHg3Mi8weGNkClsgMTMyMi4zODQ0NDldICBbPGZmZmZmZmZmODExMzQ0ZjA+XSA/IHN5c19zeW5j KzB4MzMvMHg4NgpbIDEzMjIuMzg0NDUyXSAgWzxmZmZmZmZmZjgxNDgwMjdkPl0gPyB0cmFjZXN5 cysweGRkLzB4ZTIK --047d7b3a9c0aa6111304f9402635-- From david@fromorbit.com Tue May 13 01:30:27 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6CF207F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:30:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D956AAC003 for <xfs@oss.sgi.com>; Mon, 12 May 2014 23:30:23 -0700 (PDT) X-ASG-Debug-ID: 1399962621-04cbb03cc7491fd0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GoKr0qAee8e6Hx4w for <xfs@oss.sgi.com>; Mon, 12 May 2014 23:30:21 -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: AqhLAES7cVN5LL1sPGdsb2JhbABZgwYcM4d4pDABAQEBAQEGkmCHO4EaFwMBAQEBODWCZhwjGCQ0BSUDBy2IQNEHFoVAiHwdgh4PRCSBFQSZR5ZQKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 16:00:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk6EE-0008Mn-7Y; Tue, 13 May 2014 16:30:18 +1000 Date: Tue, 13 May 2014 16:30:18 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 10fd79a Message-ID: <20140513063018.GB5421@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 10fd79a MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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: 1399962621 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.5768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: 10fd79a locktest: add a F_GETLK vs. openmode test New Commits: Brian Foster (5): [2a52b8f] xfs/030: filter out extra repair noise for finobt enabled fs' [9d5cb63] common: add _require_xfs_[mkfs_]finobt() checks for finobt tests [01fbf44] repair: filter agno/ino repair output for finobt [d95ecb0] xfs/010: test repair for finobt corruption [c141570] xfs/013: stress the free inode btree Eryu Guan (1): [ec08236] common: new function to get real device path name and basename Jeff Layton (4): [2baab36] locktest: don't assume that F_OPEN should use O_RDWR [ece564a] locktest: set f_fd to INVALID_HANDLE on close [fe7056d] locktest: consolidate do_lock and do_unlock, and add ability to F_GETLK [10fd79a] locktest: add a F_GETLK vs. openmode test Josef Bacik (2): [0fd4705] common: fix flink check [b6689ad] config: fix selinux context handling Namjae Jeon (1): [995a459] fsstress: fix incorrect if condition check for collapse range mode Theodore Ts'o (1): [9f35155] check: add support for an external file containing tests to exclude Wang Shilong (1): [49398f8] btrfs: add regression test for inode cache vs tree log hch@infradead.org (1): [7f82a5f] common: use a relative path to fsstress Code Diffstat: check | 6 ++ common/config | 18 +++--- common/rc | 36 ++++++++++++ common/repair | 2 + ltp/fsstress.c | 2 +- src/locktest.c | 125 +++++++++++++++++++----------------------- tests/btrfs/049 | 109 ++++++++++++++++++++++++++++++++++++ tests/btrfs/049.out | 1 + tests/btrfs/group | 1 + tests/ext4/305 | 2 +- tests/generic/009 | 2 +- tests/generic/019 | 4 +- tests/generic/285 | 2 +- tests/generic/312 | 2 +- tests/xfs/010 | 133 ++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/010.out | 57 +++++++++++++++++++ tests/xfs/013 | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/013.out | 7 +++ tests/xfs/030 | 3 +- tests/xfs/group | 2 + 20 files changed, 582 insertions(+), 87 deletions(-) create mode 100644 tests/btrfs/049 create mode 100644 tests/btrfs/049.out create mode 100755 tests/xfs/010 create mode 100644 tests/xfs/010.out create mode 100755 tests/xfs/013 create mode 100644 tests/xfs/013.out -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 13 01:39:49 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 93D977F47 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:39:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6B7F13040D0 for <xfs@oss.sgi.com>; Mon, 12 May 2014 23:39:49 -0700 (PDT) X-ASG-Debug-ID: 1399963186-04cbb03cc7492540001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id mTlBLBhXRsfor3Ni for <xfs@oss.sgi.com>; Mon, 12 May 2014 23:39:47 -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: Ap1LAJO9cVN5LL1sPGdsb2JhbABRCIMGiEekLgEBAQEBAQaaGwGBGRcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDQcRcWhUCIJlYHhEAEmUeWUCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 16:09:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk6NL-0008OS-HT; Tue, 13 May 2014 16:39:43 +1000 Date: Tue, 13 May 2014 16:39:43 +1000 From: Dave Chinner <david@fromorbit.com> To: Austin Schuh <austin@peloton-tech.com> Cc: xfs <xfs@oss.sgi.com> Subject: Re: XFS crash? Message-ID: <20140513063943.GQ26353@dastard> X-ASG-Orig-Subj: Re: XFS crash? References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> <20140513034647.GA5421@dastard> <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.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: 1399963186 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.5768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 09:03:48PM -0700, Austin Schuh wrote: > On Mon, May 12, 2014 at 8:46 PM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: > >> On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: > >> > Hi Dave, > >> > > >> > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: > >> >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: > >> >>> Howdy, > >> >>> > >> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, > >> >>> and I'm seeing a couple lockups and crashes which I think are related > >> >>> to XFS. > >> >> > >> >> I think they ar emore likely related to RT issues.... > >> >> > >> > > >> > That very well may be true. > >> > > >> >> Your usb device has disconnected and gone down the device > >> >> removal/invalidate partition route. and it's trying to flush the > >> >> device, which is stuck on IO completion which is stuck waiting for > >> >> the device error handling to error them out. > >> >> > >> >> So, this is a block device problem error handling problem caused by > >> >> device unplug getting stuck because it's decided to ask the > >> >> filesystem to complete operations that can't be completed until the > >> >> device error handling progress far enough to error out the IOs that > >> >> the filesystem is waiting for completion on. > >> >> > >> >> Cheers, > >> >> > >> >> Dave. > >> >> -- > >> >> Dave Chinner > >> >> david@fromorbit.com > >> > >> I had the issue reproduce itself today with just the main SSD > >> installed. This was on a new machine that was built this morning. > >> There is a lot less going on in this trace than the previous one. > > > > The three blocked threads: > > > > 1. kworker running IO completion waiting on an inode lock, > > holding locked pages. > > 2. kworker running writeback flusher work waiting for a page lock > > 3. direct flush work waiting for allocation, holding page > > locks and the inode lock. > > > > What's the kworker thread running the allocation work doing? > > > > You might need to run `echo w > proc-sysrq-trigger` to get this > > information... > > I was able to reproduce the lockup. I ran `echo w > > /proc/sysrq-trigger` per your suggestion. I don't know how to figure > out what the kworker thread is doing, but I'll happily do it if you > can give me some guidance. There isn't a worker thread blocked doing an allocation in that dump, so it doesn't shed any light on the problem at all. try `echo l > /proc/sysrq-trigger`, followed by `echo t > /proc/sysrq-trigger` so we can see all the processes running on CPUs and all the processes in the system... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mneuer@web.de Tue May 13 02:00:58 2014 Return-Path: <mneuer@web.de> X-Spam-Checker-Version: SpamAssassin 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 63F6F7F50 for <xfs@oss.sgi.com>; Tue, 13 May 2014 02:00:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9B3BAC001 for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:00:57 -0700 (PDT) X-ASG-Debug-ID: 1399964455-04cb6c72914ae6a0001-NocioJ Received: from mout.web.de (mout.web.de [212.227.15.3]) by cuda.sgi.com with ESMTP id U30EyU4NzT0nxVkp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:00:56 -0700 (PDT) X-Barracuda-Envelope-From: mneuer@web.de X-Barracuda-Apparent-Source-IP: 212.227.15.3 Received: from [134.60.2.64] ([134.60.2.64]) by smtp.web.de (mrweb103) with ESMTPSA (Nemesis) id 0MORqb-1WgYL32o1V-005tP8; Tue, 13 May 2014 09:00:52 +0200 Message-ID: <5371C31F.20607@web.de> Date: Tue, 13 May 2014 09:00:47 +0200 From: Matthias Neuer <mneuer@web.de> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 MIME-Version: 1.0 To: Emmanuel Florac <eflorac@intellique.com> CC: xfs@oss.sgi.com Subject: Re: xfs spanning over ssd and hdd References: <5370C592.6080402@web.de> <20140512161340.272a8e21@galadriel.home> X-ASG-Orig-Subj: Re: xfs spanning over ssd and hdd In-Reply-To: <20140512161340.272a8e21@galadriel.home> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Provags-ID: V03:K0:PoZZEe6vFKey1JV5EO7wMWrBsHRC4IcNrzxxm37Oj3kgBCJyw4r rqpM5xNj00okDsjHLgRi6SW9PqwKHmGLtT+f6YeYf/xXWIiQQoRX3TWKyopsjI+PeXDLdTT zOIM2PS2cnB30J0A0XYRYAr6tGsJbcSaQNAM5uDDoRR17oVI1keJVdUjd41b683wZYjgexN /UhQNIFwVtBdrx+lT9tag== X-Barracuda-Connect: mout.web.de[212.227.15.3] X-Barracuda-Start-Time: 1399964455 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.5768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi. On 05/12/2014 04:13 PM, Emmanuel Florac wrote: > Le Mon, 12 May 2014 14:58:58 +0200 vous écriviez: > >> I have a slow and big hdd and a fast but small ssd and want to test >> the following setup but don't know if it's possible. > > This doesn't make much sense. If you want to speed up your HDD by > using the SSD as a cache, you can set up one of the numerous > block-cache systems available for Linux: bcache, enhance IO, > FlashCache... > I know these systems and tested them but I also wanted to try the above mentioned setup. That doesn't seem to work though. Matthias From austin@peloton-tech.com Tue May 13 02:02:24 2014 Return-Path: <austin@peloton-tech.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F1F287F53 for <xfs@oss.sgi.com>; Tue, 13 May 2014 02:02:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 476CDAC003 for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:02:20 -0700 (PDT) X-ASG-Debug-ID: 1399964538-04cb6c72904ae750001-NocioJ Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by cuda.sgi.com with ESMTP id g6cLPZf6b24sccuI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:02:18 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.180 Received: by mail-ie0-f180.google.com with SMTP id as1so7713513iec.25 for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:02: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:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=J1GNP3hdI5LdTPKZAHG4lam2clcctGCpzW36MLTYnPc=; b=MmZtVfKywUl6hVIcTTEMtaJlNUwNTz8zP+gtBkCNZIybSInddA82d6eWeEr1jduKdk P8B3nO/M7rDHTdlIspeuFJ6o2J21A8QCyJxNl3as2C8nYBiW6/stal0LjN0S+/P2wNA6 4yxFqd/Do253woeHle1JX+Mn4D39QMpIHS9gMIyf56OmSMUefyH5VHp+TMFTtbymrJ3L wrJWfz8+SAqLGBQDmynGadCdvbWVUbQzrfKorRi8LpQDA07CWXKDV4/3r6y2yuY7ZGkr fMBslqiO0DMwAFfnn7ir8JcGx0nm0fHUlgI+hTRAyeIM+MEjw1JV6m1EdveBlscJQMPN Q+Ig== X-Barracuda-BBL-IP: nil X-Gm-Message-State: ALoCoQktqfnBMN2fBT/6KnFMEQaWOfwOt5hPAr4NlpgEOQzeRIRBAFd3erHyXvCxvelo5mbCI9R3 MIME-Version: 1.0 X-Received: by 10.50.225.1 with SMTP id rg1mr31155864igc.0.1399964538253; Tue, 13 May 2014 00:02:18 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Tue, 13 May 2014 00:02:18 -0700 (PDT) In-Reply-To: <20140513063943.GQ26353@dastard> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> <20140513034647.GA5421@dastard> <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.com> <20140513063943.GQ26353@dastard> Date: Tue, 13 May 2014 00:02:18 -0700 Message-ID: <CANGgnMYn++1++UyX+D2d9GxPxtytpQJv0ThFwdxM-yX7xDWqiA@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: multipart/mixed; boundary=001a1132f15e0063a204f942a593 X-Barracuda-Connect: mail-ie0-f180.google.com[209.85.223.180] X-Barracuda-Start-Time: 1399964538 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.5768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --001a1132f15e0063a204f942a593 Content-Type: text/plain; charset=UTF-8 On Mon, May 12, 2014 at 11:39 PM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, May 12, 2014 at 09:03:48PM -0700, Austin Schuh wrote: >> On Mon, May 12, 2014 at 8:46 PM, Dave Chinner <david@fromorbit.com> wrote: >> > On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: >> >> On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: >> >> > Hi Dave, >> >> > >> >> > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >> >> >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >> >> >>> Howdy, >> >> >>> >> >> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >> >> >>> and I'm seeing a couple lockups and crashes which I think are related >> >> >>> to XFS. >> >> >> >> >> >> I think they ar emore likely related to RT issues.... >> >> >> >> >> > >> >> > That very well may be true. >> >> > >> >> >> Cheers, >> >> >> >> >> >> Dave. >> >> >> -- >> >> >> Dave Chinner >> >> >> >> I had the issue reproduce itself today with just the main SSD >> >> installed. This was on a new machine that was built this morning. >> >> There is a lot less going on in this trace than the previous one. >> > >> > The three blocked threads: >> > >> > 1. kworker running IO completion waiting on an inode lock, >> > holding locked pages. >> > 2. kworker running writeback flusher work waiting for a page lock >> > 3. direct flush work waiting for allocation, holding page >> > locks and the inode lock. >> > >> > What's the kworker thread running the allocation work doing? >> > >> > You might need to run `echo w > proc-sysrq-trigger` to get this >> > information... >> >> I was able to reproduce the lockup. I ran `echo w > >> /proc/sysrq-trigger` per your suggestion. I don't know how to figure >> out what the kworker thread is doing, but I'll happily do it if you >> can give me some guidance. > > There isn't a worker thread blocked doing an allocation in that > dump, so it doesn't shed any light on the problem at all. try > `echo l > /proc/sysrq-trigger`, followed by `echo t > > /proc/sysrq-trigger` so we can see all the processes running on CPUs > and all the processes in the system... > > Cheers, > > Dave. Attached is the output of the two commands you asked for. Thanks, Austin --001a1132f15e0063a204f942a593 Content-Type: application/x-bzip2; name="sysrq_dump.bz2" Content-Disposition: attachment; filename="sysrq_dump.bz2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hv4upnt40 QlpoOTFBWSZTWS43s7IBurb/gH///wrIb//1v+f/6r////Bgqb56e5QAAAUAB6AAAABQOJuceu+4 uwAC9hbdlS+uAAD6B7tUDKKqqJBQpn3YAa7rc+HcF2OlT3uvbbtvvrUttuz7Xld3d7x3U9cAx3wp SqCHp97yHW9d1znc+vu5ue+d5983313d9259rO+9wHe9VifYuPvp7b1a+3N7duirrH2evE907uAb dPZ73k33Zebvdruvd1zVi7bu2B5c3vbnL2nbns9uzXns+99dffd7e5r5APN7e3r73urYaBQe9g3s A6PPYOgyF7sB7vpffQ9ve8DQ+QFAoKCgpr7Zm2bgE6nY5uaTX3Kzc3L0btIBw94He3m3y9mG95vq 9zXazbV272Acye33c+j77b7d1rX3feNE7APa8++9qyDwJCFb5jYAAAAAABQAAAAAFjlSACe23XSK chKiywZjO3OoAy1hpWk525UdndqWVUMFG2IIydwOleAfZX3o0lUkUyGqFBa0JRJIqRUAQFUrYypB rQGghmkCJJKb1EQem1IADQZBoDAQAAGho0GqfkZCkiEIpG0Q9IAADBAAAAAAAAaGQQhIIQqH5T1T 1PSaaD0gAAAA02UAAaAEmkiCCCIkxJ6DTVPKAAGQaAAAAAAARJEBNCZDU0ZNBomKYIU3kmnqam0T woep6j1PUHqeRlP1TT0ESgQAQiaaaiaZR5UjQ09TT1A0aGR6gGgGgNDTDyEX9weAnyInzMSoiQiD cGCXQEUbUKfP8vl+CsYZOKgjASMICEgQkgkJAVEhBiiSYFrCEJaFJAoUVRKBIUhSQAiKRGKwEUYi EWIsVCC1ApAiD/P68NXn97f6p3z8BmQ+v3so9eb8v9n8FfrB/YlvPO+3L+o9CVD+lKtrWr6wT9Pp f93TsRdl2zdefHifX3sZ3mguF0Lsy6X+YrHWc7355HoebW9/i/MSus/hWx7G3VQv1bmPry164VE+ fboedUV8PXpfTL95HemycN9J/tctfrBmeL80HJQ2kS0jAwmLYGPjxiFSOz0xPQSh4RPTuiUJOCTz 2qSqqCWJJQk1VVVVSVVQSxJKEkEk9qqSqoVVVVVSVVCqqqqqSqoVVVVVSVVCq1nTEoSQSda1VJVU KqqqqpKqhVVVVVJVUKqqqqpKqhVVVVVJVUKqqqqpKqhVVVVVJVUKqqqqpKqhVVrRKEmCW1klCTBL EkoSQSTqqpKqpqmokoSQSTVVSVVCqqqqqSqoVVVVVSVVCqqqqqSiOUdcEyk3lYWIEQkWjEK8CISI GIWIEQkeSJnq7oOShxLzyy9i6R95JNbBKFZmZmRMJMiZmZEyk7ImSu6DkocS87su4ukTPhNbBKHZ JJIJQyJmZkTKSSJml3QclDiXndl3F0i8PEWWIukez+Q/VHlUlVXyq8z2qSqpyZ1o4QkuSSThCS5J JOEJLkkk4QkuSSThCTuq+s/aLVSVanOJ1o4QtLzM8IjCSs+GX+c8Mob49O68nc06U1Akhcl8SktI mcYhsOkeS8zE+HCElySScISXJJJwhJckknCElySScJ7iXlZP14/bTUJu1PWCTFjCGxc4JMWMISGJ JJMIbFzgkxYwhsXOCTFjCHlCmuYaEiZecRzhwhvLz7ZZi6R/4+H7VW/B579u971O94Oc5zg5znOc 4nDt9e63uLGENj5UWN/jkoXuSbG5clC9yTY3LkoXuSbG5clC9yTY3LkoXuSbG5clC93mZ3s4Q/2S h+i/fctp/w+tMeefTfWZbYjF8e0nsdfyLLFy1zZu093LXNm7T3ctc2btPdy1/GfXXvvXW9pVU5JJ OEJLkkk4QrKzD+YVbpi93xqymLpCx9pnmh8+D35n3OsnPPe4QkuT5WosYQ2LnH0TFjCGxc4nWjhC S5JJOEMhpzOc5MIYLlz/v0s4SaLmidHCElySScISXJJJwhJckx9LdJmXmZqjhCS5JJOEJLkkk4Qr KzD1hVumKu8Vo7ixhDYucEmLGEPlLR+VkZ+Cdolse8+b5P1zhtI1lXzoI9dxdW9EiqUcHO7zycz5 FvYQ2LnE/NnCElyc1mLGENi5xOcnCFZ+GeV4o99Hfdc1vTawMRbeMbtoa9V5+IBvF5lRoa3S6v5W tkGT9qqqqqFVXarXBzwazl6UkxoGPEA5crwz6296yNzmLHdNx+acufndtUdxZxa6dO/PPMSO7G+5 zlap5BM88aqlar2dEgyeVQ9t7jp7HkWzDrWBW2jxjNiXU4BLQWM2JdTgEtDNMWmXOwbqwjcrdo7B urOXbfdR6DuWEblbtHcCZaFusxadupxieZDE1VVVaG8jOc/WdZO9GLewhBB9L1v41P7zLH5jz1n9 uzjN06dr3o1lts0xaZdZw/Bnk861VK1T0KqapqqVqnoVU1TVUrVPQqpqmqpWqehVTVNVStU9Cqmq arQpOdSPeMoeu2N9+1eovO/OLwzuhzLcDY4jbZ7ze+962uzO6G8tsMNou2m83vvetrszuhvLbDDa LtpvN773znOYoezT+atlqcvi3tL7nmNLGs65bnNyMzT1y2TS1E7kcjqbAe1tWE26299nnDA7PX1q 2WqD2bc1is4udqtrTjWvLLvEboZjzvl7usO17bnK+Zmm5y+/ncd2O5WM9jAxZedHmKUdHTnnOxOB 3az1u4xa09mFboiio4Od3nkwPZw9atRwpjPsjseC7rt3PbOfkVy05z7bvfL/PfI3fweaV/Ux7HpV YW/nuXhR4PG1HPbL78ukLCxB56MV1dtlnE4flnsrNzfxvnLp3UecMez70jizruI+N8pVnD4uo8H1 7leHFLHuI8nFfPOyw0deAWt6oXnv1vaiw83odOOLsk2nE9sv1q6Q0ezo5Yd9H1zPmd5Oe97hCs9M 9od+b+WFl+Xq+8ErefBzlucifN9lho9Ad9qF33utKLDucry70K+TnTVyc5Oe+9whkemfKHng+do0 K9y/R7p/Pj5z8wM3r27T6TcgmTdiSbkEyVJJvKzHznnCDJBgvHzxuPzNMfMfPGde3dxm6d94PMeb u254bkEybsSTcgmSpJN5WY93z0g9pz2uz6/l21eczQozy7eeE3IJk3Ykm5BMlSSbysx5rzZBzTnB 3PG63L6wdWzzRsvnbpCx8mdejm+9sLL7er7wSt58HHTRw8+ZObChjU6+ekZz8YM+Z3LFRodvsda7 3znPdJ3cVDa8z85rnPe4QrPwz7Q95vthZfb1ecLK2jwbZxn4Yt8bHmRQxvGp9I+d2wZ82nagqNDt tjrXe+c57pO9iobXzPznO8G6+NvFw68xXMSpW0cHOW5yJ81mWHDrgFrOoXfPNaUWHdZHDja7JMjp jBG+LFC/nyE9n4wZzavh9dlHg8twdrHq+E/Q8xMe45nx773fy35e/qdXh/Jj+Sfc/vSzX59HX7kK KL+6IYV/l37JvdyKx+Cj5PzSnF81+zVIou2svlhpln6uLSz/xX+228wk0rXVBftbZWsAGERvx/MV TE3Vr2RHC9vL3W8eS8K2MIKXRwp8uLyz+X8XyayO68yr24DziosCSGpgrPVqpmPhiVanQOqZa+bX WZ8JRc4rIZRWhc+YFpZ/L+cbzUCtM+V0qrE6fasZcu8sFgPdwbHw4urYhAIJtLXk9NZVjDiGpsrm a7MxTW7ju8rBYCAmKCgQFgKBFQFfR9xe5RLINxRVAoQOfGg3xR7Yh1a/of5nXV9P9P644BfLMERk HscKNJJLVHWSrE+/oVf/SMfqgS35Q3mV9vtmut8Yze+mX0zNrO8zEwZJJJJJJJJJJJJJMzMzEQZm ZkkkkmZmZmdd3d73Zto3dtt1ludVV3J9u83Xd1dvLbzUxqg8/mw/hcO3oB4dv20ok/KTDxxHnueu u9V3g4s/c9p/h7j/cQPhD6/WKbX/ibH6Z7mHSAX1A+uvbz6fPxldeWWWWOOOOOOO/+mnjPvmm7nk fgD/oEA7NZ4YFPgkWLRzP9WUQ75Xfo+e9a4EPRrLSDaqN1jIG1ewLANP+vj1qfADq3xkkm3EIlhh zBgGobB8gE9wyCHIrRWVBtSH9ARA7dhiE3AwKBwSAEMrZCIJ598yU9U9Femgf6v9e8f9En99nCAd 3E3RO7uA7ZcDC1AHbzkDLkOpnbfk3z40NTg15/oEQT+1QUQIvXPHXfj3xdb+szM14nUBYCQVUYIg CpIMUUUQYkRGDPpPpxWIqoh6LKqiIFBvC0D9oxYfxQ3AgCpPQfknuFap+XeA8o3EQT8B9VRAPXRO P0TQ7LWbhDth5ouUTLMDrm0pblVGoEVAz/KsyqqqqrQojVtQTRpVVVVVVVVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVV VVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVec27NFhJaIJ+7Mr/JA86vtlgIcSxDzZNpmh6 yFf8lKhFJUkBYSKQEYKCwJWFSLISsXSEGhUkpOkwJsnm2CkUiBwm0kM4OIAyTFYJlkwD938t5e88 UM/q2tU2oxOo+OXqwwepAHnECECAaI1SGb2PyHA8MhLtNGnPVlfME4DEaBF4Ih4eMuH1l131+v0Q Of18GEH8Ko0Sqo0BRSRqsVRVVW/wyn88AkAA1O8D6TeqgPStPZ+CedAeXbIjGH/CDRBfiASAAdFm FShFYgH45w/UOffBAmotT2XfhH3Fm6dmTC4YAeK/kH7P9nVCMeC+e6BLDAqK77dV93ZWBpoXtv0t rKTUenVrHfVwwjxZRGFanf5+zjjjitPthRnl/cht+d+8sDK3OCkrLzma3oXrDjGcQpQD+C9Amvf0 CgAnaEDn8vALBkB/EKUBc7Owa3D0gQIFwO24ZhgH1BA3h0Cg8ufd49moS19vWZuP5Y+Z7/RnkH+0 Y/Wh9Swf1Y+3UJ73ArUyubwKXAsaY2Tpxfoi1CQ//ROr9pj6CB//sgJR4qKPzR3DCAoAGYAgCff4 zRxFVEkFZnQUP9j9qI2efR/jDm9x31/17fx/H5Zb/H35L+Ll8I6KB9QUlCoRIHudPje0vwtYsChW eND9R/r8Qo7r5GLlECn77vn2EX8Sj/MAEfXHH6ajnyPPB4EEwdaH0QSRAkF9UVqVAGiLICyYgVFF WVgVFkUUH+lVVxqtVeNGJFBRXTpXNXSuKPNKgurba6aHFcuN/tvKv8W7qovVqiiuUqCiwFiwBtJU FBSL01UXi100RE5tXzbw0VN0Kiii82wVVURFFBZIsgqijmGEMU4bu22qIiIjS0RFFNJzlgumurtw VYKKoiIi7t21goCw0yqgqv4tOrUVSCwU2LGo7vGUVVE6tVqQqLphVRXNlrrVrVDLVHTRzLVVV3aq qqugWAqxViqqqosRAenHBFXjiuecMyVgiO7Xi5zdCy27rai/WH5yaYsPdKLIrrxTMv7sqqiiiiii qRZIqiqqqmd0xRQWKqrIKKqu2rFFH5b6+fOtE6duIo9OnB9OfF0+mr4tdNeVsDyiwhmc3+R+aqSS RaulSVpJK0qSpKlAPAKTVFO26u1ty22u+JCHlCRZJBsCeNqUyH7GZvVF+m57zHLTnV0OlgcFLBFV HUABsRFGwh/mskFwmCK8ZA0iiihEZo1ul8PGSiKuyBwwBSKrEsJhwN982BAWQOUFAiwmjLCr1Csg CEoIzSY96/GdD+yAfqEFfmAowYBIgsiskQIIMJAyQFAAitKfAKqJJAACSEUkILAQFCAIIxCaBAll sJtgiFggFBAEoisGKsEYAgyFZYIIhQSUJABIhBZCAxAIQBin745NwuNvwh5BfebGAYugQKgDYIp7 ICgWYChpBDYAA60BRVpQuEAWXqlohSHAgJUAYk+jckdObt9pMC/jYD6uIvJDvp8vsPl1uLYDB+LA 4qrAsA/hDyQNKEKf6oSP9krBzA9GQb7g8NhDcD+NjytT1Qc3cAJcHx0dz+ARySohqUNmADlnpO1k 2ury+djQc24ZqOgNOXh/qBuibqOOd0L6IIZ3zjZ0pQwjoELBiW90AcVc0ow1UoCBQp+/dDR91Udl oI2AN/8hgqJ3cAqP9Oe5U0RKIdcK2NA/ttAqASXMOpmXS4wDfwO/nsLNLgqub/dWCmA5s+akTJRq CI5t5CnQcEK2VVuyCG4TEA+srIcm++Qajh7K7YEsqrTYG2ioFXbhDJHIByDuBoAqwBocFyeL1Yo5 JtT9XoQtqKHxA+c3J2MFNDFKA7AiW26C4VUfLk2yDM50AXe/ByuHp7/D6bfEPWH7gIehJBgn42AH oPAJQB/n9dfofZ+Ih8nfinyHYV9bhn81Vsm74+cL31C+LfbUOgJpahExtVXs/TfBOQtxbFrYKhxb e74yS+KIoCuUBRUNYAqDkIAQL1M/xahbXR+G25gyzNDKhvkGtw2l9JfauL0+AQ6YA+4EB8+9j8fp cAwBAQL4UCWAICDjBR7wuB8gtXsx9nf5vAe7yzPQWGC27DzugXA8/QBzLyQJJIMJJFM8oQQ8Hy+r BV+EyN/kPuIZhw0Q0oSRrlyDnlBdhzEFwlIhdUC+Rw5Owj87b4gMIl6bGkRTTRxZ1DYeCSKciHTT Tbd22UOtaJqGYO5nN3niSaAOoMwWOHiw8oxCMilKDDhRr0NAOHI3hEENM+KhZyDC9MtM96cQajGk Io64OgDN24eg1AddukyyFN8+saAFqr0EF1IVE4He83B6eds0dAsquhh3NYHOmw7Bk3BVaoHMBkkC QUkB2Reg0LugDzkLzArWTVOqu4U12A3LKbF3lCZ73atd6qhwzoqqKqkqqEZEkR4iciHHNBVbOjoW a6ySc0iuVENjd2QL74S4WTXqlKZgadKqwQ22QsHDoIdGCHlU7Az5DzA+ffi+Q6YoQFWKKsVSAqiq Kos9eyQMyZ189gF/Tf6fH6fT6D78AcNAF5lZlD0BkMLzLvKZnJtmJMREVVj1B3d0kZHTw7O+FrVa 1rW3HAFAXrhJI9fzff7Nfv1f2c3H7/ev72oov8zUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUXGov w1FF6aiiiiqtaiixeWv015a7aiqu2ta+movTXhrw18Nf2tfLV6ta1i9tf3NfDUXhrjUUX4aiiiii i6a+GqrWta1qLF5avVrprrq48tdNf3ta15axeWvlrF019Ne2vbV3a41Ve/nxmmLpr6a/HvlfXvy9 m963t9qqqq5xx12885vaqqrJyMd+Hv3svgLenkLmusXd4+3h7FdbqafGozxMlDRSqXxXHDvjmfXY iwD5SaQPTJr4pDrmnrmgZFlaFYLgBEf4EQugGIaRV4i7xUNobRExipIG+KbQF0X1+H9p3Bu57tNO V/PHeWK+LYpt4/u/xU95q/1AVB9C5wG9KCf7cRIqgHj9mofbAxh7/Zfz93TF/a9MuktTTTBED4WA GXd3EhwrHppz8PmpyxVVQc7yPokdd+/c+aw485l91ZmTyd0ueUvB2XnpdVzKfdc6aLs+mtTBZhdS 9RT6aq2dE5OjvLQr2te+jnG9NjLQYuam0ZmIte+XorgKpV42tsQcYkO85ra1uK3fG71ezi86qDsS 824RiIarcrGq5re6JJ5nk81mJXe4qYfWMavZVN98e2ioxzNNW6vW60RbK/vvzn/WXN/AD55tpE3h wa0JtW+2XOQfhsGAp3rnX3i8IeHPZ5YGk8J9p+OLJylTlNIHInjul/FPxqwOE5TlDwnlPCF6ob73 hPSdWlQ9Gu8ByFgCh43QOuqYzfHl86JZe9/Lx6DkOR2jlPSB5SeesdeKbDwh5E48Uz1SceDCmjo0 c4aeCiJyWHi50bLgmNs6gYYc5Wqt99MjUwbldTg0EqcFyl0GfAgQhTwH6eAxiA2TojvVb6667wM1 DgDolpaHaS74yFm56wKHVCe+qd8U44d8735ThDSedGHGjSGJT2Uz1KL2NQWA/m971spQ0YWwMSVE 5Ew+KGjhPjUGwQMIHIwO4BFKIcBgVYWDMuduEpQBSiHpFFFNooooooooop55ocIKKKKU8NHeU96J tO744341rXHe9r7+EXUPLSue8cMNVDPnd81s62V3jShNSrBVzt0w6popiqMWc0umprm6xUKXWLcz azrZt61neq1k5241RJJ1t41VLC6eHyr2zuonVxAyUvqmeb6tmLYbNlhbRyg4NP9/9dfEQJ8UIqjI M8wP9/Hx1yTFAUVf+4W6pfsHo9AwXmynaJcyDZVV9KiNQ8oVWie+wZAoEnL+lRr5px1anJTfIHCG 9ePh41CBB8vF8qVUNsAaQS2S0JepBKBzplZLbbZ8aEl5eXh9oZYCHYlobsQ1HofX7DSGh7RjWIHT 5E9PJs46N0+eLFddEBad2ELIQCMvvkHfWEQRqplN4c9bVdob34K8OGY56mlTcN6rlWz3rH9gB7Xc iqNzhLqIOx+wAbAbscOYJZgKYlIfSIIdUEAoVUHuhISMiive3nvDttOMGRbMH29rl2YmlaXv7JWH FGQQCwYk1wXQCZ398i2dDBBzGvzV1VhDO8odfUvDXTuviuwjkm7co7wd5V2+jxMJJeHC2LLi7Nic D6lxVhlBHQAAAWgAoQNwVvtigfhYeF7gCBBgkxZBBETjxhWiHDpxQmiMANpN7PQysRtLvDMoyniP UbQmILaYSaWZCPD4QBfAoejEfpDzzXqUW3b8pAAWOPCHBlyJwzdMBQhxepggJxkfQjTGHZncEK7m 3VXhAYMPoJvHUgO5z5x8A7cMknzPLxaeuheS47XduxIk5lgDwLja2Dp9FGXLUjrqKSwHouznYDgx JsJxEtgTMGAyOzjMAABkFVdANQqyqgBlLVabzyvDblY5P15+vJnd87V1rMr35lNoyA1uhEGZIicT YXdQAOpIlAEDooCiywnTTAMMDEFBB1vjO90VALQwhM77YzxhRQJtt3+4A8Iy5QPQE6D+l2e9e55+ QsywGCLlvgIN+nCDQHjHgNfO3jWmrl4jLyw7yCXOTjTwZ3vkkIaGEMcnNmHJA2O5rr39W4hSYoGH GWu22YiqcZFBc8r2sRlc61RkRIRy756573ywDRZSA9NhHvnOeNnXNTIAYuA0vRYxMppLjnra1PfW t0UY3FHiihUHMmxiyLmnwTqMZgwAGx7OAGgBmHOVpeb7Dje9IKEjNL6yswQTzM9U71sXhzcNjQi0 i1GKAViqQPdqpJnqKyKLMABAd7l8/NHmLO2bKPhhV05N+8rz3bwK1raHgHIUeFcBntnmVtSnGl5u p1vTiOsLoGsoMQ344yB1N8OQHGhozjQ3XOb390ofJA1vBgyokkmJhFdDaPi24d1rU4NGrZVQh8go cWUECEVF5hQ/iIgWheFqcO4XBzGtsUUbUv4ifux+C6HteByvbAsSyfktkgmAeRVEgSQSZKtJGyxa Y9KZBBJPrrE2PSNo9kv2Wqvl/qAbeexVWVZt92H7Bfqp3rb7aNvWc76ffh/GFcKJaJbcOZ4Izvnq a1J1tltA8KmGLQALqqt4LzYaE7wBBD+TbkdZmCsdZ333IAmt8KaADQX4dZrvid98ZsBYiEqE0RSs 1Ioh5h4o34B7d9KaHi5EDZh4HOukHetQbFWdQtK8UMzBvhssO4d4A7ARAh+aQMXQ8O7oGYngB8g5 eCylQrSjx9ALH/0DnN+vZJEfBvQc+4PxbhEXqqV3ifWqFyZNtSzNcNXrM6Wjgj8OTFsHZNeXHnOw ialrZRutqaqWY1k7nT66d3JpsrxHsw53Azo02MePdHeOrnajtCnyVNd2VjGZOBrVBVbaGaOBwd1q qFdghHcNy6jxvLsWrfULOpl3fh0cLu0xpIWy1tUHRwOqyt5Te8dEQLaRqr23wZscFnWx1dVm65K+ HbUnK76Awh43YVVsrHMqC6dlW2qrNOAlJhbQncRs4MWfQO8sEkeCMCPfAG9XcDMwa6GMC++RsQt4 8E29stg7NsKZTLKta12TSPkQnhCAmx1Qvah0hoGxRKwbAqsNBM7txlxVb5vV7TCE2TnxYsEYipFm 2pyCbJ9B1Z/nB88BNVRHsP3wgDAIxWQjGDAYiJFGAMVGIkZCCEgMWRIhGIwUiMCKEECAwAgEBAIj BEICpJEgxFijIEFIggkJEYEYJAQQRgshGQQSCoQYkWAMUYDEYBBCKDESIsBYrIkEiKEFQkiRghGC EFkYjEFBggRkBkiEBhIRFgJFWCMIKIRBkAIoSEWKMCAQQigQSKwYMVjCAxkAEhEYMQBGRgosIgQF VgoARQCCEEgRBiEGMYxAjJISIQUFgxAQEYDBJCKqxjFIqkCQisFUYDBIpASIIEFVjGIqRIixCABE CKEiwWLFCEQikEkQgEQEIpECChASRWJAIyCRkkUgMiCsFBjBQgEgpEQYAweJ/D+H6Wjw59fr+Kfb j+WHSLJFUUiKrjpCtQrVYTtX2w6QNIT6+8xVWCwhznjJMzMDLYfrlpbS2ltKWltKWlLClsioqofr uhm6HjUJRAJJJIBERDE2ggXaHCPRTpEzAEK26yGKrFVTwlVWbS7t4c41MMrdJdaMmW3Mx1da1nfv 4PH9J1jStaiImUYZ2cNlRLZzcX+zAMy/cfo/FvsFwda2z/Wt4x+lfvXlN/6dq1bSvdX+gR99eA+r 86Z/dxJjGfVxK1QFAAgABm+PTW95vOShxGu4QqA6Be7vyZNhCjmB6j9Po8fCjWME8auEAO16g6WA sEH2HX0GoOvf/Nt349mQkZShSPGX49VvS5W9sEJJYk7prawvBiC31EkCaY1proBnkGRoqgEipYLV rSutqAFn3L2riBYTM000uKjnshioCA6dSgNCCNIbAEFcyhARnGuskJKJCSTOaAHpgPFltKMUA8QM aZ1EOMUQJBWFJTfXJdTxtlJJ+Ks9d2YXdysMCQQCQCEy3UqPtDiBL5X28dTknk2DM6PKp1rVudQS o09SR4wGmC5IJChpjRlpfPHtmmTk9WuY6kCqABRsizwwMiAB5ZISGkDyMXe6SsIckpL0GkP2AALn nDeyAoq0ELgPFA1V568XX6ib5JZhIHJ73w5H4zW5+3efxYqkxBpKZEVAeQjoMz5zml4w9miAHt75 ZpjR6rIKYBM16makAUHZh8gfZgJ9XNYFuovrjfKdm6r52qtLhZTboiapYIFigKDkIVYI/ouIDQwB Dc6btZKsehzArhn5sOaAoAH42zQEqwOTZ0DqbF5ZtYNquYWtrSxzI3dfssy3ZwFNvvnOiE6QJ9HB v568GjkUdx61fGvHiAF5m6qnffeuCQybMJI3KvnQBa/gDp24DM956D+/muttW6mpHMdPaXu9daXn yGj9CwCkIghDqj4OgRXzwNCIAqpkgbM7GQVKqytLNIQC74CxYodfF9GQwbaZoJi+skZqU4uU3msh Waa0LJBv1aHplkETOePyeEQeA1cv6Av8+ZoLtCvbHg/QGtyULCnFXZ+c58nLll2ph8+AEC6haVVH 1ZAU85s3QD1xSftgcCHuu4plE8mZY1wc85dAACGlXLvq7N+RvBVaWvR1maS8cutddZJJISScCKQV 6bbQGcdZVfC2V30W1sAJWOJZABd5+ikEdt2RCZXjjoOCMPwB9W+ZU1niehBkiKB2p3lQKPeQ8wK1 GnnNZ6DAJwwd2alnxHrBTBp03NSQE61nNwPzqJVB+EYJMQGWHRlCrZhzIDAOqmWxPXfkMj2vjhJ8 pffUbHeCkuIrpQ/QGweeAf1/E93vck+Jlyyn6QvnN2e8yccW9F9aB5R+rjGEhGEsIWa6mVnS208f GPk5DXWBaFEEQVRFFSKB6J2MOxkL7wyT4QFgstbDXq6vGEJiEdrSQuCb1o4gLoFgJIIgkC7zEOiB 8Ga0bA8o9FvQ6B2GWlGDMavEDlfXXWsquFqyyPtKQsX07Xg15QkQtc1lDQybzRcLJ05m4ZIBwGZv HQrKlbFnpSX58rdeeYaQE120sAl8I0VvePjXtONUKkGcOW9aNggeENbWlq8c6/DQD0Q+4rCfV+v7 yq4dnc7YXjIRJIP9RK5Nd9gBra3F1fWzgEi+91j5Jm1es0cVITVawxZ3c3ZyCHegAJASwsVHnPAs Imk/cAyNDKE795518J2mspKnxAhehczKbIh04kxniDMwsDlEMQAahhejiYJzbuIEJ4MOSSSVTdsE nwkXiokwEFSZYfjKFSgw0SKIhy698Heft4xOWe91XTT2s9Fv3WaL0xiueM885XZsFhNUTKLiIOhF 1Oue9uNXR4vCwKmU19iUP/01M4QHCDsHLktDgGMLAhSHRFtGQ30rnnW6Acp0qjvVXWJ4NPi7KAsj ziH8qF164AOlRAWK7U323gaQHnopFAZdY/BKuezL/MWPRJa6NMUs547553vbvsu+et7azoQ5pD0A yQwSESAMAhGPcFBzDUfAshiOrrro72jwSBm8HgDZ+2Ad36f8wOHye1cnhjDLzQT9mupoZQpbQIxz pCzhPZLmsrKBvZ2YyLi0Xei+ERzVmad6SpWx3W7zBq4r66xR9eZyDVDW0Kt7kqdvC+EFUKV4smaY iaItUFnV1bq1iIvTlVbl4Zb7cVfzmjdw1paXsoOOr26EvrJh3VMsY9ogvJtSMbrj9eral57L31nS s13VwHPVWsIVHuZfuqutWF521cx9K09eB9iSuWMhy1jMzhY63W860abzz0L5D8whjPJ8CqqKnE7n rXG9dUr+NbYvilqS+L3tCmJcxo8cCGRTZNgEaIkVWmICpeJDBEJGRkBbQFTCW+alcyGbhEslaJRg EfJBTiLUgjoTCwFJpQcS10+cLiGJxcFQzDpQGcVTvQDbTRvn+tYTDcNPGWTAB5rJFYQBBBkWREUi grBVRgqREiyMVEVBVBVQRIjFUFQVGIjFAREUVJIQl/JxLMwKqA/tUq6rkAS41GFK0AMBmMxg49ec hC8EIZ24zpbAhgQxtgNoiWeNdM9ucby2W+O9l9xU+X7j6Z3eTNVEYxkWFZEWO9zYSo9/Hz51zaZo SliVKa63DbPlWafLj+VVVVVZq3Sqqq4h8PTUWRYYnfqkU4SdO2V5QrWfHmjxZmUcs5SeX59x01gu udsnMYxA+/3VR+eOj2NZOr+Tsa/nf10ZNFbm31v4KK6uVYwugKABbHlllJ20gFRUE9Xw20sG6uAa dxsLcX0ZtBuEIqtkKOVw909XTJjZE199PfLpBMA9NjyOy5hVOvnTfvL2+wD/PgeHcPU8+/lCk8XG gQQ5cZhxVfZx6d/BsqX4/D5RIZf77/R7gARrvutHZzDZJ/qJfFF7i0umTAkPvcIpw/GAN9aOVaUo IYjeE9mpWHTpY76xaJ2GAIdmyw/zjS2tkPqmtcXLDp16tFd76zw+svCojbrjmb0JaVxPLDIL+sxC 0CUJlS5Qwki/DJ8sescBgh1ofixHR3XUwOGoKJ66lDKUSCaN09Gr2rWxqkVAoDAAETH1/LsGd3rv bADQnQVQqNwnpUDkMqU/jAE2+M4ESHq2bydOEJm3hXkT16GiOyxiiChZFGKNQ18CoXD1dIwGCjEt S2A4/dV6X6duks9c5XYx68tA/qsfcOOlDumRJUFQP7qDlWX5+ENXL4W/1dVcMLNECIgKyvKGobHy CI1QOfeQ794n266yUM6Vuexqe2/8v4sfv/PYe2Q+D90gBYbPrYMvPdnkIL39m9LCutF4whPl4kyn VroDjABmAAAydzR4J5y6fcYhF3zKnNUbjMNXDgZ42hpyEOh99txm1kJ425k6TUAA4eggNvRxyzuS bxmWepc2Kr9e8wXVd3AX3Os474/QJNHJZIB1oo0SAXtbkfd3RdPF43gFTId/AH3d9ckLB89ZIJGM /K/VoD9j3wz9ubVnjTy/rjlZxzjBtzje3fGxC8EJ5g+Pv3gE8ie+zxW2W0ik03vNrimIomKUUSkA RypOKWjYUgoSDaASsgTq0gZbJCKQKwCVAhbZITfO3JA2whBYSR3SBLTeSSpJAjxvjewkNpILCA2w hKiJxBpeFs62BW0ESQFJEQkSuK88XjiEKwAnSBBQJ3daefV4kmt0J4UWsASQACsRCchlrim22Kba GptnjQpadVDoE05M2Q4VemAloce+0wWrgetdDy23DAmcBGQVJFQkEOo72OKb82uAGUhNpCVhCoEu UAzLAIXxvx74766hJ0yBFgOrJCLIFtkkrIBeOddccud0OpAxJIdWwJG+MCBUhjIRYFNct9xFvhSD gQqA2iiSAsgC5Ntb5V0dJkIqasUAmc0tiFxVWplnS+lMwyTJVxBREte+eKDCXAQMOMqWkaUk8QKW 2hPPmw87rHr35HT5voNrtOSgpLvK+W6o2AZAiECSWxnTjH6ICirMA33fHfbj2EREdAH+U5d2yPbx 1ToXAgJOSDXsU7iRMGYQdzDizL2olRxSA4HsmFCxbn7b98y7fEua94mrsKoszV61qrwWemdttIDB h9OgfqTBxnGhFJehGQYEK+tNKycmT1c15x+ps4/idPds8pqrS5iG9db2KwrjDUsQ3mdaQJDehzBQ dGWZl9GrpF8buzX3hRm+e+eAqnZ+J5hGLu6wXwaZ1jn0LJCFi/Pmfgg7V585PE85meDvk0o8uZVR 47gE0wh869knFF5ti8r4yY962617tVV8c9ezYa2dTIkN9zNu8yg5WxOnmF2bnjqyyQkTMblxp8q0 Tg9sYJT9w3CB9Jmh7jzkbgeHdmxX9w/H1er9XvaL/WRl4GN+sva42lfWuOYh0gitbb3S7GVYtyby gqGPRhHUpdaq6rXaKe8kqPO6hFSlRWp/xvGQPOIYPveoCtVVbwb2hXQIlGpK5Zu7XUUQawUeiXXP JHnWabCUc3RnO8E5SUj0R7bHCXWPWZRaimWM4XWBRbNqYdzOrSq4GkmaBk6vLyUd3c7U7ZN6hL2R p7tOrLETWg5QdWqvRpW8L40g8lUFkp1sWNDHoXPqF5pagydZqjJOEnFGnqavgH5/DMGsBwGbGg3H coZHq6GOCC/HdslbQ4wGCzz8+cdzW9auWZumtqJD4ED7YnPR+vuKsRFFCEkkCRHdOoiZEE7DCFDT WtIoGSERFrq0ZewdwqCgFoPZGCRuUF1I9JhEcCLVVu45Qq18AqOzeGgIjLOkJyHGDrhXsO91VXry WAfxl+h+X6Tj4pUXT98e8Na0qqq4bT1aVq75tuGeCiUjqocfMpCu6h0Xh37lpSg7ukrpnSMeHuB0 +4i3K+w2vxuN8m/Zw+9fV259EYH0GNwF3UtvTPq2frc9ftrncdDW0UO0PLhVH2AHjHkxdfAB2XU8 BZB8Y3Z3P02y4NMzFrfa8k6uX08/h7wzMK5ADN7FsA1XouPuHF0vQjIRhwu9lN7sA7EZVT+jQ1jA Ppw4k/G0C7PhTBKIYM++ufYFSMjY79Bfq73qFkvj5XPz7PNk3FV5hWxFog1MuWwbCyF3hYV+BbJA FELrzTAT5U5xHSlCSZHOAqG81cqUvg3LWJJehjlWT5MoJzQPj8/G9ct+BbvWToP9Jh8U1sdr1/lg eWky7tztRwTWtqvTXKnlzMIwdy0lzShYQ3d0iaG23gl8ghNZM+6t5lOobb09imPw86AqiK8+QuR4 duKvRbdda5Ya3bjcofEzeS5LG2Uqd3aq4axxRATxeCySL8I0+Lw0c+QTxlu15nfSx092JsMXho4o td3ZzElZhYi0+DSUAQCEA2qcLAEDBHfGHNQOggIdd8MhxbzRsBDpljMA8cd4cCuS0071Ya73hm30 58jVy8+PhkC8aWly8Ys2WiIh6WpUuYtN1xMW2gjac+rABJgQ5fEqvv6sPGtue/HJ8frcMvnODJZT N6xYRhFJDbB5D22QSSSbiloE/l3ibIILp4DuAoHJRd2iapbZmkL1rKcRZ9QjrBWxoOs9vLLbLkSY wvq3U10H488A96Ifn4/PHcd9NKZxNMt9X84CZQExWiNIrHGKF5J9jmte/yAAbCuWz5ep5LD3vM+I GWKceLiwnuZI8M6pryzeLqNDQnFSh4KvQtABmafP18ng8Id80MEeQl6z04oJ5b65piB1Ag7CBDCH ltuBhEPTmMMeRLzzHDrDIJIMACxGY3qiSpPSDNJTrXt3TMdzcdImxrK0WAKA7Zg1su72JYSNgNeQ WJymffW7h0+DjcQUuhfXQgJJB83ESPyAbDp/DDVwRt6ExGRzZy7kruau5odWpL6L6Nd3brvSd85v jq6768HyCE0h38PazaonkJTsOmooevFwd0su9vPjzzygmbue7eOXLlBLx1r63UV88XzzmE2ipevO 9cqiIUdVmMBAH2AA0LXqXoHudhSZab3lvm6m0NVvlTFMsW6cKW/T+5uI32YSS+Xim3jYwzPklId1 S/HkM+A16811fwznhC/xTcGYnlDrrzxol25cavtAZwb2pxjm6QjJaafU++tOdWsuS52BYd1idHSd Ml2r3pozAN8rw+YCAR/SBQgQ/NKoCgAcX22fb4LR3xZ23UMxyA5+YGQOo89PGWFDqe5O9uLlBRTr HsxGaImkI+juHRIdG4NvfMutEEuu7ZRxWuJYO6hU6ai3lCzXRS82js11xwk9WNZlTLG8XRLgpyZJ W4nMgzXNjtp1zWPtj8TWjnlIHCzCNM7K0Xx4jKrNTlnSZFbPVpZqNPmyGVu3HQykbet6avYpFrCE UVxzmRNsxOt2QW77aObT7Z1br7BIRChnvJDzg4BOBaxMyww5xFAWA+UBUAj76AKWDfaEHLDpRAGH O7gFNog2LxIYo6S4AGj7H6VSelv+rScVWYxdRItIGyfEPz5+1jgatTBwBOCYkypzSPKrxxZ0hzmX yyAq7mxIpcine+Rg5duzVdVU35411yte2lr6XL4t+bs27IhoveHMkrgKZenmZGshf6Oc2y6IEVEE 8sshtCVgX15zM1DHurNLrnOlPKHTPFA0z47l0XOryq9zrK1p1I/P6tyt5/IWYNOB/Hj5oCThAiyJ d8XTnyln2m8/S7+O1ARdoPfN2sAAAhgK2iepUB1xRE3xU2AalAqJhrx1mH6/cyynxtasDUHfT7zw KuIIgfniqVmhEDjCVAFAigEUCKAiKSB+w5sCTBkkRAUCKQOBqQUYgsAWSIhY21D9Q2t4ROOil4oY RPH85f7H3P5e/n9QP+sfzM3yUfCT+o2/HVVQLBRgSBJmfJrSm+KZy/0Jiukq/vPXjNb8A3rxZu+L vSx4PP1dFkjllId4b/E4+x4t30mw0LZ1rDFVzNYKy6l8d5+D0X57/P8gMMDoSD/BFn6nbjCjiMBp Vvh1vziNJxoBRCgyGSJQMoBfjJA0yEFCSOWKAW2VgFuLhIIVgASBCstzkXBtBEId652BWxEUSQEJ Ameelj9SCicudLm2med9OJvpatzp6w1ETVU5clXrHuGDMwAD/f8iU3w/4fLa+93SKKisRVYLJ6ff XzDXr5c0OhVVz4y/pHUxSr8iAAUVj+173zvp3DRlONEnxp/zuiC1lBGiAjdy3+QBmbV4V++annMB u4UG6uTMQ8F7KlkNuwDMAE3iEDfLzvtVA0Kprxn3zapKXL3xMG2aJnedkxi2m3XlsBXYu20DQRLG XRIMkK+rCGNs+dlBfX56WEe7cxzBRqnq4kqj2b2kk/v/Av5uB7IDNfyd89MJYNH29/XLkOB43IUw d9EBSIYYSkrboWSTap3QB/bxKoobCjZb+EXtv5OIvvgYC9pcB5Y0t0RAB0AJ47C2p1JvS4mWqIYN bGHhnZb3VZtc2VPocS5AHwUeG+lX3fx0QJCSTe7CW1965zarrfxnJhsxm8ww+NugwfCAC5VGkKMa r8h1/SUz+OxP8+FkkVwX7/mv2H8ySMeuoTTrxCo5I0EsQJ4JSbjhV7lFVW7bXjbD0oCgAb1Gm81q YaX0pxvkmBFXy5jLHJp9XNKjYy3sTqUTFH5HY9OR+8sAe1Nt/brABsG+OitAI095acnRnXDlqRdz jp3bJRZO5v2IT/amg1N6PZ5Vu87gu+giezsW5PLN0FSvgoOT+XbnHVEXh61MywlpaJ1BN1BKuqTN HkVenf7vXpvFLv34O0vBtb9HU45ibqJvbBu9KGWVircsyogFmKuWS1eOd+Pinhlhx558b8eZTpQc 5rrDsANCTyfB4EQPKfXr8AgH7L2kOyF3lxcFho4Or6MqWKWaXmctRUV0iiGt5JhCqqvPuXmd9/d9 4PxIbOj5PB31sIE5Za6t1nrRqKvI1HryE8gXeWpaYVqEDKnJg8eHB1nrRMqInl3XRB8zNym/P0kS dUpFzF8VK/m/By4JqzxrZyznuLphHeLKNP+Px55o/JC88EsCt9J1li9XkAcUVe96DNKs9cWeQTU1 HltpaUQYUfDGfbr6riXeYK1Pp25WG9qjDLTHELFQk9gZhQpz3kcwdVQK2AO5XcrvFVho8wMwwoMw HoEtm8OwL2mp/sAd+30VpdV9Ytd+N/ndOqN+WdI/a+mSQI5tpOUmVV9HmXzBx51ZXdFpljkUpru+ V5oFZdTpjsHBSzq3MFzcXXezoLcIdRVQOB2smta8rjkT7l0Odd8xQ48f4j20O9o7766mDNFXrtU5 7ZqUYuMur6DSLLklzRrvF1WsyaN7Hr3BUs9SBB1Tr1rGuzsWZxrKZwra1XWVvGyjGb68OU12Ypjx 7mmn24OpndeKZizNsXKgPuYffXj9rdNcr5ladZAel+rDbvLFcetp6OkDP9qNu3PZplRR9sHioA0K 1r0SlbPj46DCJ5lwDyQHwIUc3M1B2zxEDxwNN4deY7g4YS1EqxqBpJHr7Rv4gIJFXgqEQZQIVS0U z2wjQYj4bFVoWmeRqngIm3eEDmNQOUGivAhCdnu4txJvl78ep648gT6xJmLcE4tLxtKcQmdIYhJB DGbVJEkkkkyjEK5XmXeIRXSSjtlHndL6SPKqWHCDKSVxgVVFiSaMO4Xd5fe5eXd8Fy9QF9BP6bqd dVvckX+j9NJ0F/lbHdWuJVhnV93gC3z9FA1daflABPUhMoHsr4V0R5cw24xhgRm2M/x8ndfg0qGS Awkk+Q2+qHdFE3ffz8ZOstUUUgze+Owm0RRAgzXsZH7X5QDkY/IXUQ8vTVDpnx4L/HNJmrIVhWLC 1zz5719v110OINpLUiHaOoyLT83vLiEsdWS+JSNw4tFCsx1jA0sIqmlfkWed+XXsInMDalHWCU13 5vtjIZOUFhnOvGoSjFILoenrXWVoyVkUBPju5B1QKZVjac8XkzvepwgsWQdfGtBpnSSq71z1vnff HIbZK1ik1vU0akCsc1xvvfZDmBpFgoYweOuudXj4/cHDNU3ywjsEy880rPLGQL4pRmIupSYs4nLO tUJ7n5wevrycbDTFlIgwZUiynPXe+MuzgrYIUYCMDhmr4364vAk3mDbkiXM5rTUDVhSGqFxnSa6r dhs0H01JpFKhUWGu+ue+JxDlIVmkUCoCgiD3YdaofSbPiy21ga48Z444yE8j4YsxjbDrb5w2m0iy KR1jrz1z2BTVULq5zc6FDWGsT0FomrxvAG77YgtwW4KdANYqw83xhoGEPVsLvfj1o41667nx6PM6 RZzhLCHx6855YcoCizVvOZhhaRtgW0L549b3tCI22LbYLC8Fuc4GMBy2xoXWXnnU2aRVBPfFxGFs pWFHm3rRxgVhpOWoplKLFhWK9eDweMeMjwGLwAolIVUOiNC8z7G5V7ZxdrzdoNyowxiBOLDFnRAM DSbPLSCKkLWittIloKS19cazve/E3Js1Y2kGWhRgVBQWGuOe9G1SpWLN3jrfxxPniwWHDFtrWgXv u5gHJYYu7EQUtooKCiHeXSaEGYkrG23XF488nPIILwQGjBQWKmX4tmMFgiQSCRqeh0/PB/YPgCPk vvqz0kvkp66cWejFimmdaEph9wdBoQYaDzsQSHWnVnjdyKSNtooNoeXjOn1o486wMQrClbaUUuk9 +NBm6dpUy0ULSkFjx1mRg6s2isxgsqKsbaIsG70N1pEa1VW0k/WXMUiqqLS2FTXGEzUEZIoin60o qirBBUVFWKLvnDAYo21Vd2xWVmJU8+euNpu3hgPwAZ1nGw0wUFRmIViIJrXWg0iIIzdoMSPXdMIc brOfWt9d65wua5Z4MOzUxS6sowRfscA+BURETvmWmwQDCdUU/CKsUxnyvxrDOqFGFTdKYhNfFhis RxKwFtqyIhWUrLOzM1ooxYsRgLIKAsH4zXnknAHCCk0kPCN8gSGHAKgzrB8N1TVcACHZhG+DEzJ2 Z3DaiGaTBRQYDYHtaIjDlyVOXp4hYqub3EyaOuFLzzz0+fza88G/v+1N3JJ4BCIY4chWEqVkwTz5 +/qF5QUfil9NPnzvJFhpBZFDe8wF0hbYFGLmbzdobQFBSbNdOvwbIVBZzhZ98VpQk55650KAp01q N3rX0BN3aNsjaDRs3xZNCKQU3xxoNOglli4AcffOeBuuOuvb3s02vkCibKIMB8NMSXWJdDAoe2Cv 7pZkdv188ew9h9qgqrBRVEYIkPs+PEn0iKhPq0k++z7641xwAoKoOvfO/O+JjBtttSjKhrrXGzYq qRQWZeeHDQsUNMLb9M3vnfGt4ZZKlRruO972zTKysKg2gZvmb0KsUB1XW9OoVkR88BJCisuD+Yty +zJrHe5HmoWdqI5w2ZcB49219BeAbR/V+BeSLwI+BEJE+8rFkrIsFjbJbiYGoDdWW2BX6uu66vrn 1oOmO6Sst+rXl1HKFa1ihOm+ykDR0744U2LIorl0hlzvNAsA1bCsda3s2CyO7J+rMTLbXh552b1a 1rEfEQUsPg1K7q7zL/Hy717Ug49eUhxW7u5lSh6KhkgKABalRDzQUIX0lzCj8nGUI+UkIutZEa21 xnZK2W97I2CVl2Z8TBVQtLW4RoqVZOFdVXt7EHKxK0S8rW70W6GFab1I8bXl8H3G7QsIhtur5721 t7iM7sWXhW7OZQzR2VZxDObU3t0ysCtCxGkehRoSiVxrXS7MpDEQRWd3N9DUmtCq28QsTHi3GOhD 7u5UCcIyLkspCq4GPbKoGjgkg7plh1WbhqMrA+pXSUvWbMFtZg61kc4dbN3aqzS25rWHdGJ8GqrM m7zLe6mpMkWi8lrMe7ewMAAYGDEKHW1AOdszoLF3NYZ1NgBTVqPGWwZtGbeFWGkl6IQTcUQxTg5k HVEyBRtqqB00MlGyA+oC8Z4JQnXIbDsIV1hyeWzXo2IcG4QNoWRIDjcpp47HccANGG0NLhJuIJy1 ByL/AHTKyctaWHG272u6mmYau9tgVhXgCc/fx79+PnXWvHGN+nT7xWmsFm13mYlpVWWqistfG9oA GVECLh0Vq69HJz3zA03t9OQuqqKvzSsnlDaYqKArq4zEWVRdN74uCLvea20m+PCq5MiivVq+Lctr VRYqoq6so9byXOc6tnpDSvPFwtKrnGs0W1XTRw7uzjsC3FQ66giJ8BqY+PMnrKmX7r8GvgmJhhkX 1aUR9V55VvuiAT+DjZA/DxpCrnQxYpIDgCzcQ6FV6fcBHEFCQVJATmDUEJASZ9KvvgUCVvp3wDsi HZoKAGeTCn4Hm5Vpnn38WW2RZRa0HxnOpUUWSY/N+sIIJOEzWZAWE3p4dOgn3vWc8pA857Z0zhDE MS21hmd/JoNasjbAts7eiDphyJKysLdb3zvvk3jRRZ4tgsOdZnv2xsxkDvfbr10LsvnszrndwefP e+96dbua4vTA7D4kJtkWEFiwONJ33YQqusWTWKRg5TTSt7JCEm/jfic0pTe+LK2854zl2b3CsxKy LFKhe/GfGvrJw4wqEt5zrvXxxsMZPpCsB58ZnVnmPDZyJQ2gPg4xfz8goi+vRo76oNsmonq61qQU FJPXemEyoON0jbINoPgIql4FmL7zLxnEQqBVHxYtvRv5qdsqZSe+FY5z2a4t7WjXMKt0Wfr6BJB0 fkkfRoNKwgkRSLEERARRFgxGKIqIKqv9sJCAskkj+dCx9n4J7/KQ+fikWVlSK236suWEPyn2a3sw 1IGkFGar4fhTIGh4ZKkF2OJalJaD86w1OWZvUyYwcsltC+biH1nenjjOIDbI1SzrfOaYsFFOKlqX jL3+P2Gt8ViwfBQqds1dd3ncOEFFAUAh+ejz9/P4R95Kh90cGG7QjdfAWc4SPYcA32pkIfocnnD7 Dr7ZQ4957YsUh8fFq9S31j7poA4M5oYDxSNoXcKTGFgy5qYc+vjejvvvvUN2rUK1AUuawNMHfwK4 QnG7m73umCO+ujtNgjIiIjGJPlLRFsaJC8951opDQ3OvHqeZxJOWA2Fnjm+dFBji7pV4nfjWuD1O fz5l898+qL6+cPZt/BA3vEZmrepaAEfGfUggQBnhGeD5//Q+ewnjzZKgPukzHp6ze4VB1agLI+/O eU0wWbSFtAqM1mTPy0Fk31x09psOEOkgy4YAYnO/dLTIaR3w7611xUFgHCRV65KYIaW2VqeNSmap K20FgLwb555hwccpIsHn4vyAanW80jtqRL01YKyquEvLkycWc8uzvwpDh+0CPe/rrt4Bh7Y+KFSo D/ZZWB69c5DhILMLZvz8YaYYJD45593UODq1CsqFZbZLee+Nw0m2RYVlZavW9BmrBtC0s5tHmNDV oIiweDXv4U2Btm0KwCsLxcth4ECoGIVOs560G0hEgY5g/7/4F61o7n8+gxGyhJ7avTbsVTYW6eud 8dXz0frE0EfamHKvRL9v5k8H4iG0FgpPC1+MDMsKyoW2SsvpzAa2VBYVhUIoKRYloWuYGJByg2ih JUiyJzZMSCwC/GYRZqrSoDaXzLKwWOa26DSAoAsOfWuvfQV6600NBOq/xV9qm5THFkDyikAKPgs+ SLIO9ZxV8NphDaQUDfFAxIehII+d671AqKTMsNFsxA0khrzYEmF9qqJe+d7FIKyCSCy2MsYwBIhi lBrCKSiGmExgpB486487CzvOOeud3esURKQIoRN6JusqBixacZR4PG0G27MCwH1tYpTZ0Muph8+M SlTxtmFdIrSK+JSCHiANPFyRSCgRSRQ+/reAatINpSrp29aLOPvn9nwR+D751CoiY6usJIodWeXj iMWt8xviRgcPgyPZQPJ4hHIZPMKJ1K4/EaWCd1ZOIPZrCTkvWGuUniXiMub0YHGF1ggGtL+Ku4ft 5vztISQwVo1JJnxrua5YcZlx3z1evkO9Tvfx412L+QtXd8eLpVEXrz1iYO9j0xLO1ZtBNYsAe97S f3ybEVyTJJc1L7qaWGqwuYTF3epFv6Atvn2Z9h/0gWOqaGBj2GrNxDnkwTvrlqFeMZqdGzbUMOWe +UrGv0mya+qU+rv7oWxUz29TnFsVWHW1g49jvpiaSfCix3XV1fWFeveXV13sO3IZvVwxXlVFe4tj dPfGKEVObpQvZd1ryqq4ZZ7WQXlVhs6otqtvampVrpb2zRt5tZKGdWTrWDMrAW4OwnEFz2o+2rs3 by27ilcjbL61UvMebK67qLKMG3sEGNeHolTWce6rLaPc7hWhni2b1LeFjs3gkparLwIs7166vA+a 6k7nZjvkTnWN2JaZUNJ2bRaK054wA7hsDmHPZUNKoP8aGFC8JSgpuh0ghYNAHhzejI1cUakKeTmQ mwDwKiIqKMUWIoyELh01oHMNNWmzA6juMUN1eGvFCdV521Anf4Tt2dqinWujxr7ATWjWtcKq4tfn MxrluZmInmlWKoc8nGE0ta1qqIonK+XIfUsaIuVPkjoe9Of0ZmarSPJj8WOqi+uxMjBQvW8/PqwX tqgKKu9LFczokhqG3eWWQO6ZeAHpL4NQCg5aba0lvH3qoZQkSRTVUR9s9OszaO5pzaobzkkkNL6V kqTwN3lgMHwVSq0AfMLFFfg6B5eOHPLPhiACI8PjVe9nbi7kxOkDsTVllHj29b7v5SzMI987LuHL z9ZUp1JBRl4IoegGHOhfv7R51jUePmwfnDxJNm6W8WZzdj/PhxMLd/esV4pkB+00ojw6xoU4jRVd 5vxY+us1oqvmNo3mnjyXa8i2Ehj7/PloD8H3AfCX1569a3QS7vrNTPeU4atC3jnXpIbnLvy8mREV dW79lwfYnCYXd6cGat1p4md5uK/KU7RWiUHFfzHlKbRybFyrhfeeCHz68JHX9r2xm0QSdR0VQIIJ r53vJwk4IspcUB1kycNRdtM53AWADKzaDBC3FPWPh8IZJ/gDn9H9fe7pPT3sdzmvqP7MVEuqg3Wo LssMGCjwbyFb8kengHu9ldCbLtXTI3eo9C25u23q/H0bh4THImR5u+ec5+tZyKKpwdZcKii87zkg mkR8Xjm65+ySSc68a3q+HqzXu1JUNWJFlNsXxd2WFhmpAEq3ngMXGarSA3zxwKoq8etmaRH+m0V3 571pFXuW762gBVPKjJJAU99bJ4eAFEEgSc9/PuaCSCQRtfi14AfIfPncd2joK9ODJrG3Q2/FAd7Y wWdrzIWh44Ct6BVtkZxIyqqBvLlqAlOzSt9a7VAcxbmwm1kNL1Q10hv3cal1zclB9kQ4D6FFgXdx JmzPFQZK/nNdXSqVvVby17thcussvJnPY6WbR8unoA8imdx4D6fsD45PXHfV15iCxbXV187xUUXj zcYo8Vp43qGIZlDFVfe7v3ucP9jJnHPXRtQkEhn2DxR8rnxu3m6jYd2CccE32j/P8UecTmhKewa6 77l8cQIeHbnxnwhY1DuEhvzi/bEJIJBIPGkwLSyNzEjRFHzJUbz3xeBgHdM+N2R4TjVEESn0zMAi WV1MsXY8A1KRWKyngsb+GbOB7u+VSA8ng54fCLBOzW+e953ubbdb8kNQN8BGyAhU5yXEBzZOyr+A KmdYgDELCGIGO7w9CuFMGDii8x+Dwudep3+wQACt9Mm9H9VtHYcg7aesMIVRytRrLhLTAIezfxAP cAddNoDsCgsALMG4BxgfgNgxu6EdjvKEvh8MVCnLuBb5PzjkVjYbFKxNxC+FJ7dLb8Wvs6sd0t69 NvNyyeoi+vpeDJ15YlzBsyHd3uu+WVkd2tW06V3xOK4dJnUg9nck7q604jko1S5G6RB6q21KZQjb rZXddyN314drBQlTRo0rT3O2112xyxhTMHSkYJ0wW1aK69zLsqJQkEk2OGVZkxO123cFxyz1EOE1 NzTc3Hd8eUt1GUTxiqkOTlYsZpCcOUq0Kqli7ZiUH0AfPPB554fAMIq3pXBEO20A2ZVUsGxno6ZS EuGWoBAADjXLPTQhMO5AeTBYETicPGgSxMjWIpYbgJgvj4TQdQzM+Q2Nw3Ib8FMQyYtftQhEOgdD GmnF6HFu+caTanffVJi/Exubtd3F7qr4h7zV61qjW7yrygHABSBkRERL+gHrvr5vn9HX1Z8vCp7Y VVVrVVVVVayoqq+7NptlSsqVhOk28IFQWe2bVVVXb1aAsm0hWdttJ+HMoL95RT53VVVVVDWrjVVV VI2m/dNaulVrfxdZRXxa4hxxdOkNXMqqnNqqsVVDW/GfG+c8ZTnm8a4zjLImbIRXzd/avR+W7pPl Ywt/CfKIeb/RN7JLnXtb1VSIW3wUfAB89sGDBoViheRIDv48dsm+je5o8ezi91M8M61q/PdzsNoq 51c+EPkvyUK0lftyfidbYpToNdsPTAyx6q5lkPABbR6XvO1s5HzR+21BSx6KeDgomhY8lTB72OhD 2GCwZDsXAzsNAdgPeq9prKG7hoiHHYwLODczDqf03jicBH+8CeEX31v8/P7TijyqqsnVqW/JL3AK SAiVWud9DWnB7BEIPbnWF1Q3DLRQBE/UVQKgQNdNNdNNA+bPO/H7vz148c4dRRue9TSK6Lu3BF1e sKmk476llN/yRtfeGeS1U2Xo93xvpzqThh8neCugqjzt3Fhx7EDfARQkA0sUqohaAIjMaAAogKEi o7F7WBTaAsKkAIoCgR4saUiyB59DYAcaYnWBk43euNgEwQhuwIUzGwGtIb59OBNsm6itIEKkIQC1 3rk53Db2nBrrfRsnPN7TTJ0dd84Y7gQ2gCyJJBIEksg+cblbopq+37Wi1L4R5m7FnVmmMzSZZ21M kTrYhE/SYy5jbqaK9JwBmB7831QS0CJdg7j2tFCor1GFSnZ3emJAe6GlmYpFUjYcr7xTHuNYv2nG nzW6GiK+HebBm7FVedXkhvc9ind0eVmqMzMQHgCBHnn6qN9vUpNTVlwyJmnEXn7/mky0xRxWOTsp Z10qVW+34PcYdjQCD4K92tSA/jFMishKzp0cI7m8UWkthWDm5GGa6D8ueKPoKPEAZdp7vz6rkSHz o7sKsGKCqD8FlEU8jJJWQ3kfb2Gz2YvrKNCqqaPvEJwSUUAlJu7cEC3t2i/gyqNogNwCUbwRr43v a0JTvoxlOriViVDRZiowxMJXQgF684JD50r0qUrWYB3QLDxxPk35MZkooJFxct5mC8wCnWZQ6JnM 1Uxtnh2Dq0W1BW8K2r7DmnOzQdb/I9VvA7uvfz/G97EcuERETAbV8Dtt8uMKL9ti7dyTYGjqlgZm Ntkdox2He1V44tlH9opkh2EpHOAXu8cFtYIo8eN3W6UaZ31WlNZFpL4YBgFA35rzn0vfMPSbsyZV pNNUZ1DW9qGBe943zJhVSaaC28sgaFDJjAxm4wsqmMYX4n2FVu8PvhKs12LPgmx0ifk2KTMbg3z+ B+1YCq6tquM99RDABgzBkOuuV1AuTUGtBKBKMqZour9AqfeaIf3AR81d6OoBnaleMUht5051lynr KFUT1iONZnQtazDC7I94cRXqPiVBG6U0OG8V2ej4IZ4nhHx758a+N8QPdoa4V0PMG+eLTe4KwWqp W37FDC/wmoGbbN3UWoTerHEwwMgpgFcXgK2JQC/VXAgD8CEHEMg4c8ioBrpgRmoS/kKC8iFb5Hfg Lc6H7H6X269X3dA/qpnxRDhBMPUt4TX3KPaIiVG6HVQq1lX0ze3OCvHq8YrcsyEOlxtZbbhemwqv Hu9JubVS1ex5FmbV3RSeEPosbq+EWXKJ3HtLadVlTe4s5Zs0u7LrtsyhtWcrFM07W4uvDnC76rR6 3ZS3r7i3vW7OWnL0Yld2Fk4SZd7U6qVcraddrzZeGfvfuMvkdntZMNZ75Tv1skLtGZHDhpPMhW7V XkRVZm6HREMoPe3rzZY1Na1qfmBqz7PPAS5+YdegViKsViooRkVRV+/wj92N+8DbyQd73o1Na1oA sQPNGht4yq6O93Z6zAS1C41LqdIAHhNhq+OTYEwGRkVEggETAjm5lQz6+z+FA9pEVRVfka/Qoooo okqooCu7UUaHAYW0+FRV4arfUlxIiX+CXC7Vd7AlRIS/Lu8VdHNHYUTIgW3sWS2+vjLPTPSgHKGX 8q3Dt3B8qgcR8PAaRCrbxOKZGQBbTSp22oB7AmEkV1gJ3A809fpUT1PXi/fFz89fJqGmjC5rNRK7 46m7qHqZppey8/GCKqeDmREA7vnsBKI2Jfq6eKkW6eeYbszDwZqqPIMZD+Doe1+gBYs99illeMzP 99scBhymQdy2bTAgLdDcuHJNmgV9sEe5LE0MzK321WA8u+xHbV79psDuwcF7nZ+oZY6F166rJp7v RSynCSg95VxnfjuwIfgFjYWMGRgcfWjnjh5bj3rD7MdECTosKlFjfoF/cP8R3lbK+6Xzp6e03Bkp u+Tj7JJTwYm5XiMpwXEvrtsAWQs9yldNZYLIy2+Rl2VI0zAOHdKS7b48QMVxglIrMeW8sWn8oXjr Ap9yjVYOi2PUzHBNP4EEVYsA/CZhx4cKopNm1E1FNoCQiSGjlVtwaAGIZh2R3Hb8F90mHt3cvd4Q 9wBlRDB6idKMr4pcXvBx32byGNZM+t9Gs2vYrGXxQd7ZYL4gCkALaeVfz7hq7rL6axKyKdvYjxme AFkIgQQqbbSxKFhUwdOSY4Cwa1NtkwyeqTIAmqlquGy4e8ZnAAeMxQAQDlGl1cOr3FqRIRpAZBJG S9+L4eaX11tbvRJ8G2PcXvr9dm85QLXhV7imXQAA0EebIu3JIVVR12ptrddKa1Dau1W7U3zqQCJO UJuJDCxNO+tTORQ1zeENnXPORxsTzS6YFw7sAwLGs3kmWByBGN1RWCMHVdXDMRi03hqlyJNxCwLC QjffoSMZcAC+poA/NFCAK71/ADArqDF48byxnkFpeCOKvDePMnuIA7adWiL/CJD3XYhVb9n32htb 2FttUbqHocsPOph4yPQCAwCNBfipYKfoADGqtcKcKBilgwLSXh3L25DsFBjlJjyGqUi/RyIFyPfW MDN4/gr2m7GMM11cjXXtp7VrF9Z15wfWB5o+vABjahvwAL0e++zLoWhfJlo/ryra+TsF6f5A0PCQ GsKoPAGzoh5gSUfTTiYQzSALZ/fJPBE3qKdLJ5ZysUGbRHiNvQGgN9B9gT6YCWbvsBCUA5gdfiSQ mTYA78y9AF0+t70pfh+My96xFkG6/Eyl9VJFt6Li1YZkvzY87jVg300J3rrAUXryynBtZnK3eMIa 5klvSq7xNN1At3Dth32ZNx5ssiWt19xW1cWaVioK5wvVXY6y8lt1zB6hrW7Ag5tVAeR0xrNdLcKh d4sGUOvb3uxOo8fKMciI29PRMity9gLC3KB6LcceraFDo13KZXU7o12LxZI2zeLb2XUubsakVTRZ 0ocYCt1h13IRdOyFzaV5daNOHLJn6GOvVqcVK0rqFdKLqRLdhqA6gQBtqhBPR4QbIfU+eAwhUbKM 7hgj1FJ9+TwZGYdhQ5d2UDkhDQ7CDVs4CDRHjhunYS4VRgKERFXNgxm+EsEYaBWaPmur61u89v0Y t2OPe1ZFsXtfBMYuxeruTl15znIoC+NhW/J+XaSSQBR/wtJJJ/kB8f+0gEnu/P7Kr9v7/lh7ca9d x+//rrWv1/rYYlzU3u7u7u7u7u63uLT3dqeRq413x1vb3nevHHjPHV73/yT/7wIef+xV+bVVVVVk 5AeJA8g/H4B7g9Xpw9wfs0krMLe0L5GmdWwxr78zO+8Nr1/LhVWh/cHMOTk5A/r/7fs/nf5/3LcQ 8fX57+qM8I99aLP4TxT/1P/f8LFpPd7cdPL7Pdtd5/3ZNQ5fHPoBz+TURH00CUklzSnobyOm7x0Q PfoYv57uzh2lg9p3F/fFUB4fEYvVNjmwIa2hD8h+TZ9/xQq0rjlR1hA4BxP8UBQAP+tj8p7Pp9/t puFoW+BavKc9H9Wr9QPbh8N+76A+QABhjjjJVpLWtVXQFFX6KQFAAn7jAMzMkJ9Z2Af4giAJjzk0 1/GT67bvs5fiAshfkOKGIBkIfiBufYHUznhZ/sbOTowumwKrvdnZfsAMsQwFLu6GEoFngSw1E4Dg UKhuhLx1MvdCghYs0FXqULlVMQu5oXSw7OxkAaD0hmDXg0bAZvXTxQouwdANhz3johQQ0DTZUDbY wdHVhGw4UMV54scA8ulslW21FaHGB0DkuAAVupXizfGpTWrXoXVVLQ2NzMCoDyFyobbHSqO4UG2a DvTfmkwNwFO5RzL5A2DRyAYAcXZR3olKq1gmWgVfMER3omoO9Q3eMA5DyUQQ341V25C/OQNum9us 77bFXHDsA4UxoAZgiZvIhy6ORmJ1tewZaKrxw65AHRuIb23s9CFgijkZaAUyMicNWbhUI9NTYo3c JlyZadZZf8ICnsCgAn8w/wCggHpQoVoPOUqC9A+76/zXt83+8vHBxDMMgWBE/OQP8wgfyD4hQczx JJKD+iH9p1EhPvOYFwf5hvD9ZwP0hqH9A/aFB96f8Qf70BQALJ2gwO0oNmByCv1+kDAH+MeyhCP1 Pr6oBcPgKAMCgQIECBAKBdwQCwfsK/CecNC0Pzaa29cP8k9kVoWru0P32j/BhuDc1iGOzp5efsXJ wLWtISRMo7A5hsSpU/3IqIHrlhO+08Nd5uUjSYsHe7SCaPi5ocevev5eFZbygiAiDYuplnet2N67 w6g7g6w+8H+p0A3n8kBIKKHkMAz+GfhLFqtVVVq9J+EP4hkgKABQUECBAgQKEPCIqAshIgqMgCMB A/nf1P3f1fzP1Ef06RP9Z7urI/of0XoZknSrUukkETBujdhtUO03tnDwvbvrb7qu+qdIY72+tiXv TNlN1eqchvccJut0uVtXzedSIwyGR8qZquNW6hk4XZ51q7RZxs2yJvmaWl0NkZjlud3cr3ht7JVV Bz3D10jrRl7FlRn+nrPub76e7Mx5dJvas+ncuTljBHb2Zmw+Th3M9uVfFiC44Xfd2E8DtWcpdbyd xm1cGub0zmsNR5HW8cthFTa0TPO7quOswssjagWCsKcl2dpl5ZuqN1NRvr2s7JBUD6pBr2HXET3Q QX1dFhqLn1XM2+iQ4slyAK7LtWTJaDWkboN8ll27Oh8a66ncxIuorFTVhKsreyhCXe9dZtC5Up3m KsjIsWTtrVbTvLqlRJtXcyt6rUx3twju0c6W7w/972e73evoPXVqtp0VRVC7ieBb5lbDqWsTdNa4 98YNHZuvkkzpGoF2IVqFV1x31tG83eU3L7IrvuF3OuVyt60l2Wxl0HLot3l2amznptmoXryLezTf B6TkxHlka6S9PQb0DNPN7bFFCstZjVt3LyW9lWKIW5LzVtylpVioVZ262kzOy+fbVpq85oqrPFdZ U6uttrKOaGlpXZN3JoiUhPLMO3L7J1DllSn1WtGy8O1eLKxDHnExbszJPlXcij1L19jg303N7Y3t 9nbxxyss0S6u05eKVMhzZl8K5bd9xuxztMVm5mvX3HYsblNYXhqbt3h7OsXnPDXbykqpSRzu4Xyv eTqrdknok3kSd7HyB41mEpZm08mEu3Ys5nbZqbmvJM0mq8q8EqxfX2HrVZtx9WBZDoyVkqqFiZm3 e51HKKoatrdFDaedm6XlTtyktFSi2bFaiuzqnFvVTLnmw2szhsi0bxXA7vLLtxYs6Xzx1uXXYpm7 gm4XlS6NbFQpF7Rusovq0YsuJqYXV2bTe8N4PrXJYkw5Hhnbm2RjDp5tZliPps9zSJnvpzksoXlN V2x+1WZcJczcgWYMzLzrwtKTqDN5OrbuzJtqr3MWuU+B6UTEqxUa3qrOpKhW2N865kEXCua3RLbi SguDJBnV3c6jPmIbfPszaVts5j4Z0ms7UrdfQ75pWYpTNVXZ1WKL2tCbZruq07bIJL7I+vadjqZy jM1+F7w7k1OBedvTRNfDlgm2JV3nFpWGZWdJ4hKrtydVG9JV0u6ulNknLNUZwMk4GCuo43x03ctI 9XMlLqR3HTrVie7De5a0Uxdcc4PoJNZ4X2t1svtwDIGboS9ziI8VXim5uUJnedgWO+8qs3sqil1P oZQOo91bTdkqTK4uogdG69k10beYXxgMqFdkN51pdszq6XSg5bg1oYpery3vWtOpkkmRKSSSytK7 yIlWrQS0Tb3KIKdh11Y5TTrIVzysL5WqPJTmrMy0iK8eVksqqzRRLd7dgir7ni3JK3ZdPOButGzc 2WK3nYRutcG3x53bb7j3S7WntVbm8sN0atYjO6gbqXWZtSqzPlGtzF7Xt4oDRIXq73bNxN5FeCBl 5xzw1taDTwiZubhFzZN3Ee6bOG4+oYYicWLMKxCkJebkOdLWRA0bd2apKsvpVLQ+WGsjg2mKu7y+ 2TRzJPbFm7bMpbmdhU09C6D3FNGksVovDy1PsCvxVFoqStW7D1q11rh3duzLvO8ekuzUWu5V887q NGY1grWL7Vqp1d0sURryzdArlIeYlOa6xdddWI6VrPbEOj6W7oh3iwK7W5fd3YdpWgRcN4OG1MRq Hd3bOe+yp7m+yeteun1zb4OqtuwdlaEjdKpNvuG9r5kETphgy2sPbbo7x2TauquGnZC3ZSm7e8Hg 7rbFq31sbl8bYN8856nT2jfGm5mpbm6jWzMy5ZVArKm6JJXbsw3L221xtXO3oMGO+sZy1tOQ2+Ix 3GusFE3ndCDqt1NqqTuPMp7zvbvYr7zVdZp43S7dWXTq+mGnSIbwqdVaR0rrCSyiVgIM65y5HsYj b67V1mE8pcJwwdMgziTuzhQZGo32CTc40KV5BDDnbNVpPptd3IEXuS3c8uVxm+Tqvt6sfLl14sPE Oq7TgebVQRCHdyxawimJgrcq7lRl1ebaGrrtPuHZVWMXaefR7q56DXcVnY4Equp49kwbL1prIdBr sbnYxU075dS6nVm4u7QjDL9A88AAHgnp2TX777klBCto2XYm7Bjl7l0HMxZby16vMLmVdPFcBdnz BSvHta2TmDbyyDPL2DOnAhb4SbvzE9ViVdZdVdwYSYYXBnTZ17OdVTcXcJulTNvT2RXnzl3AqsS6 vY6Ch73Ycr2lJczlQkyu147nPsGiagxbdutxvXyXZncrErdlcpWoHe+A9zOLvfQ1LZsS4PReUmfM F1nprbu+70Vu71VWq+bXZeD25SB9t9NgpWjQphbIaEGHpFW5wqOrN2+nEKJ71GqvazL1WsOc+x1e ZW2dfdVb1zbqHk+5UVuUsPXlEVluw+vMfGrVjs7wszXsVuu2+60d0amNUopEku8Agn+r/wb8AP3Y b/oPgMGDMP9/+L8IDMv5VD7lP/GjYMQj/L7qH+4IH6QIGx4PA2BoW8GRkiEAYA/lybhpe9/8w2B/ pM8P1CZLpTur4v8HLZmfMHXVAP14XrFC6GQEBuDmBoCI4PPnw7Aeg00MwzFRMnylz/Jeszo8vO99 sxcPT/ZcOPcQpgAYo7BQXtfiBgPR2clOgEEPiWMgzTAlOuIq6vcHl+HLVAt4c1BzQ1VVzdQzDozb 4VVvxQ3IaHaDdTkuvbnsbx5hp00QDnq9LPVArMRrROXXvNwaugb1QKc1CCQN5xUSr7JdDp2AdwVX wm2j2CaA1B+AbBAew6Colg8mPPgL8zxdA4dQ0qVfPrTRCg9DmPg9PgByDw/Tvm6gfnkBZyYgaPkO gag5FmGbKpyFFQLgqvGfleAchxoBdDydoQ79utxQq56GIA0QIxAI/QelSAGwdtgwJsAV7Gom3AB7 3+OvqhydcEdj+zV5fCoZIIctgGkZGRkcjwkfIPsCZagZBklVJjTf28xXZEzWiDkingQ9CGT24B0U dcj4qghZ0b61EfoCj+FE7Bv2BQQ7DtuVTWmYZI+AbUALhxp4VuKbpswQ+61Q+lcxQJmHd3W7wHMG lYAHaGYdYRVLPMK8yJc1HI26OamwPDgFKhqiSNguQP6+4f7f6qqqqqq8krUK3meIFgfgHiwsA+Qa /dC6BQB3xnzR21D7PKQyUc3sDLY0fMamI2DpXDMgdA8wUHu9/vlTh7vg6f4wn9v9ZQnxxT80N7/u cy4ycOnWYq4zEv7kQYeJMO4SO4QUJQkhFW1Wn8/sfwMPzYH8xgOOfRDzPYf0MhPwBpk+zkD8Cqqq qtTxj8k3qHBshSmer4/fqolYN6b2/4i7eyCUDRsPkgZ5YoiLBQRVQPP6wh4PM4zZShCE/UsM2fid /H1y5c1zPY0p6NHc3vauTg0fCunO9dx2dAc7gZb8JRLjPNDMM3+9RTtiAHLfIgcWDINA2OIYhxpl oagcHK0oSnjc4jMB0Q73NeCblugueLbbmAc3NeSyosAlIiMBFhOykk+DyFPMDoJviTolOQDc4EMC rpXde8Y2RNenm5lH1zkHUFoRR4IJ4T/oCeFueMpp3wEtC9zROUbGZNvaHiLAUfIGfgE1TgSJnz31 RueY+CAGYQQ+Kq44gd49cBASHwr7eIwIJ/g1OfcH9QCCKhAPqgPz3sXBNGArcVUIEO5oKFFPg9vw Sld6jEtqqOx7Ox6AFOPFg6gOBiDlqBeqHzARKwBE+gHMKAwBiJgPwpQRzY8YmkahPQA+0EOj09iU 9j9AO4bvwwDBTQPnBR8/v9YJi9yUdUQMe/6FFGXHWHFFT+QbBmEu+UuHIBgEMCEA6R3EV8XEs7kf vCg7Lu6lQNQ+Oxq3BVfAEIg8j4QohYJEEILBioXfQRIUPvkeA3qnUcMDkcrTkCJA3pA8CrgK1K1D Z95QN112wBl9rDf+xTfIH3CAj+kD8QAUAGoqZHAOYP60BQAOL9gJ/iQ/vfw/l95IS1VX+u0My4qq r/VvcV/fVrFBQf5mqVvHGQxzCrNuprWQYB6wA8jznwp9+JDLeFju9tBvB0OKvzM3/NR6/gNvQ4FX kdQPNvCanK7oDSCeIpICUi5QAkKwc4FCEROodQFtjrI2NgHn1TvYBwXUhA3EOhXMHJCj2s0lxLFX /jUwZbBSg7m4A+LmW847rclbW1vqPJuB0EOeNmqtmFhKgD1cApqb0TZvTmcG9e4+LEYIMRVRj7ax TfQJvD59GGqa8Ft+lDq4qcob9h/Qe8EDkSJHZgcOoA1LHYcDAgDlweQb6o4Im2xq+36zp2gPytL9 fAh18TmbDv5nHreeMnWBonqDIgVIP55vbzR3Nu10DgKF2x0wm/pJomCj0y4mskKNZNQfXHe2eRP/ s8VrJgzHd5tuitQ+efammJJLhvwXNTZu6HnWmrueWSXso6sVNZhe+eZ5Gsk59OtF6H3cCKTxK3m5 2dvzqc65kBNVE5b+Nd4ZAoHd5A3APYDcTqtSSuNczlv6sPrP1Sdju/OQ4S/nWjHnONaDTCnGs0rD 8t4tLbXgzaebp6Xr+HsP09HHOfrnf5OYn93f8ElLB6OTpgjoOocNXvgKqdKq/QoeGmZV/j+T8YAX u1m0Yfks5yx/Qanq02XyeyxWSTmUgUh+PGNcvxYyyK1TUPDAqJhTm9KySSdN/wekBQAKBo6CHZTo zLTUnQnZvUhJL5OSgOIvee51Lb2zzIr+g23DYOoOX/Vt4ydQwHBpQmdKXJSvBU7QMgjlgI+uS06A wEVXsOBbwX/DgMBjOT7aFaVqeLm2RYjiFbBDKhq1hIh6IGVg9+W7nnEfEDs28GOpuZdQ1dwudODX wF0MeTg0MkKtAub7AGGHiFDA2dlVebA6IIZaCHSjkqfHy/ik/AUGFgCqe/jd40wehDH0rz4TeFmH xJW8HMDA0AGwDqd+9S/Pz5lgXZ7BRDVynzhT0TnGRSEUiZhFHHkSMD4KJt9ifYKjP41MzGvP1J8a TY3AzPbz1FplKGzjM747XK6bmnfchIT9wJ69z+0A1eANzp+yoWBB2VDtuen24wT6R2e58n1gE4o2 SyZSC/O2cnwP90FEHEC/oTxfTp4PYAUSRVkVCBApiJ6mUwLSSEBIOTfH7cy574D7wgIeZTfReIcW IRDBoAM2whQqfao+gESx1BvGgbIEgs5CCBYgyQDwFoIw1Aa4qHYjAQ0VWGmC9goQAYA4ugQVEzCO KPhXo9hJ7fSW9QDA8fYcbewk5CcJA3ugW3kfpnTFih/YnKLP9Jh/JTOnSqHjc3QkS0Ja/f1z0h3+ PZ6M/nnsOVqwyrM+v9ZzP1D+iDvuGA+AXMDrXX+PfP7wPmpUr7t7O19wJ6uzsFWwhJ2xEdQGCRWA oNokJ2qOHOwnt+ZB2EPI6g9CCECWld7bxcIagienR4abZdUBqKZRKTaJfq1D+PJMG7Z3LvtRG/7F mxpqlQ6QvqVPtDV8vlVDkeh+bQ1wHCztoIQPpqZc6ALE+Fv6/WFqLbYDz9GgmFN5G87EXg9+UXgl QCJ0M9xQHgDM+X8Zg3wSEhtJCSPV7y7L58B9BxLDz0OYTgN0MmyGprgzChlPPQImQhscAnRFB82T Ssig0tI+QSwCAYChQD0AKUwCwXCAvXsdvI5pY84lAoQOaD4HT58jndUf4oH5UTw+g/APXzAfgC00 Hqe57bIjKKIEDlS0ivLj3SV2Xnnp0307Kq2ePZgIllcBtRuXQHU2nrrElrW/lA6cy2pdDz+4GXFw VXu78fzzCowh+U/h/py/MIa8nfXft7dl/tcPYX4U+D4hrTyQlJDQSGj5zn3y8dRTl/uvz8TmY8Gp qrwPlxjh5zVr0H+vwcDp2AdPdiL6m6GvtWokIxGQcdAXFiKRjPWnfUv7iwdAQU94fNjy8HsgC9cZ FCfLCH7UIoLJ+keNzi8ZrWXGjuN4LCm4PkIC/cICUidzXH49+cfloHYTUQ/QfINgoHRuhfmEL2VT NS4XTCkuiRMx//y6VXMEAKFxRH88tbg4C8KZse0Lt2YXSzuAQwC+Do3wt2er1hkdHzetR6GCr5g3 vc1iC+pgBeYQyN2qFCPnj4EVHOJqHvz8UKzM36gbH827w0EOrgfTtQOtMBOQIaJhzFTvifZDZOeO FFc9ojhhGEYIqCqoxFUQWCKjBWDISRJJCQ3PAIPbfBJguBv0Nih9PoIHaEZ7nKooiLFBYxRiMSMh IFgeGKGrnCQlMlQE5IKByMgQOhJCHzpOeUVYfIdj9mtK09dICRK2hNs4FSpDwdYfNaa8mdSsNCnh 7fJQ33J0uXQa625wkwKrZBvv2QdCgUHHhDtCIeOmx13p4m1azmStiozhBDBu9lhIdeEAOuBzqqjS hOlFHg+Ah+bjoFVyE0eY9ercAiq6hvDHcIdOi+A0BQIeNBT6EAgpvLCroWTi2CjBoyCs1LghQQPA AgZsRyQIZ5vpQLA66hzTEvAHFj5BYLKPightVCFijehApVLe1Eps4hwErc24dH0h2e/p3efDv7tA D8oeH8mACCWi+Fi04MzPBmX/tngDf9Dt9J5/zbB7WBfcYp7OsvNXX134vmU1BdDeBD0hgeKHQQ5Q UOiPdc53C2AXATS2jv/V5uWDknpBnoAYm5R5lAgpwA7Hf59Q3EkZzC1FkZ+KVRiIrEBFabCSScww gbH5AORZAdwFj8VGHwHqgwAojsbBu3YkljP7iHb7xD5Pr9n4kOQooAGJA2T4irovgAvZ5jRHMO1w cwu8cwCswB4ZvtfU2AGBbSyrLLB9yQG4G80QVe3JAjY1AE1FdQKg4qI4A93RR4etxNuIDBGhrgQ/ IOxqUS8CRJFvyFIAGIIXSqJ/AA4rq48prdAyEVAA4HIa6B/nzr97h46D1AoIdBzA7gUKiKdIFjdT wqGegDhVDKNgQdt5oVdVXURCxZBCgZFIaw6GA4YDzVOQapyGGBshQQFLKZh+UPoBsB9gEEMlzF6w RFQPm8p6S3lXth772CGMMMLLbLf5f2Xhk4/q/d/kDvKuzrjWjUtXEmzZ/JV5LmlpyIznBeetY225 +Q8gfq/Hw2keEtarXn03pzgntfjfHcIZ6OABY4Dsw4nVetA5Q3SxupGpIHu5cAqxhBdnhgZGpwKC /wnGjVu69qm6qq9KqirKu7AbgHygwBrVO8A+qAYz2b6lDs1UN96Epy7OFMUMjLSkhxnN78Ba5XWj 1XTYA26bUM+iZaFv6zV3UeA8DvYj1Vm9HaJcgVELHmupMKPVLkoTyDbUGdZkpd68FBZBnLREyN0O Q2Hmyk4yRI5vO2biSatCNi9Gc0eY2HdCCrQc7FDchjkymVm8KE3IUIFlwlRG+/keTxOCsirFRRFg sEREIfJ3J3E6SKRNqKq1hHSzWEC5DV6QwBsHPSqXNgG6DgHoER1V0AeBKQoFfy+PlVIY1Kr9j2HZ t5mRgftIcAk3CFAwG1wHBB7LdB7XC535NawinZPODGPXH91z+/1mZmZmZmZmZmZmVVV5mYqNVI23 lwXd1LtNhZUlyk3VCkMUw5WOyyMuR+JijAsYoTE3eYrkuo/GLcwmSovKlOmMuqu3Sgo5eQVd0nWC 6SRRxpIX/ll0XhWYxqZq2jWOrNS1WOwRELy9vHcIrXm5VJqqd2pZprMu3beZiDabUN3mGg6vI8NS JEYzdVlXUQTqVJVN1Qq3hJhBwUyFFZcxtty4Lu6l2apnFjmZmZmZmZERERERDu7pEQFdcgSgFBAP PUqERERNi4vkpeCPsWDMCrwGeenq+6BD1gERUCwMA/nwgZhwb6b6hnGqjHzXGoUyxlxn640zFfK9 xpxMvr4++fOZ3vsR0MtPi+Ijm9cPOXvMZqnXUx1nemvHOfJZVXbMFRUDetrBP7weAT80FFRJAUkA EhAVkQWEVQsP8uAVRFVVYADJIRAZAhEkIQBYCxVCRVILBZBSRACQQkCBBVZBSRVIRkVWRQFJBZFU kESEJAGRBVIRGQCEFQCAoQmAP41n2FXb82gmGPtIiUJAX/7QXsoygpCAMAEPngAB8fSqlgCOoMEK ItvbWKHsCPLMQoI8AFnGYIQIDADBP5wKh+gXi/YBhZegbgJcO+WoFgHDQGgMB0MUOGgfCIasKaQC kN6fBGgeJYBCKkHIToHEUEst3+VCooGtMKcscuHjBLsIATiZDLBQNDZbCQJuAzAoEDbB5m5kJljJ UUfVNKgZTtyAD+slxUQMCBmIPaENC5TPP1+5oBUDADgHI2wAcA3nWgFg/BdtCBH54PFfMB8uAq/O Th+T6tdgN8GnghioJwFA8ycmAPeyJ1o0CIIBYOxUTKKJAbIH3jgPYO/kE6gReMLfCgQHYfajuH2p c0CHgIa2K4Us0DvagFQomoSIcVVA4oaZhQhZUND64quQWE4BkgbL4dE8p5tuAsijBH3Ae0QNWA76 odVeFl0p2rmkHVAz/xEPRr6wEVkDBQNahQsbGBAtCSyySSUmWkAQwKDBBtlFIySJZQoAIziNvuEK DZVNksgKABAsHyFRLtygwFVgtpRqEUcBlYDJgqsAYQFVitx9xKImV0VGMBPhIj8x/NSqAoAHQZWs 2xIvaxCyDGoUUsD9gG6ZmruSmZJfOhVrIcFZg81SyEVSCIt6dhdtFqCFXZCgNALIBHvhSWB1sUDM WqLqpZvkKuoXUeIC3cDih80N84gUJIio7ARgpAiDCIQB+AD+4ByCtAIAdgOEDwJET4DapUGoUAPU AMBY8I2YGH9KvaYEosGgFnk+3kax901U9qg5+HzUD5DVGgKLAAGWBujiHoD7E09xAu7tA7rPMG7Q PlBDz7RnwDRs89npADOBAPoFViHpqh5CCh73Eu6BZEQ7oIBVNgfpPAVLFFKBxup7vNQCA6GK4iA0 CoVq+X3SMT6q6t0OPk8a0gfexAZk0AKi+mBglCF1USEDFswaqhrAbewaADAVz7XnF1QoyQNA2EMw +0TYNHDhkIz7oYGBQO4GAFJYdATshFAAslkDAL6HYEasgGQITTYBgUUCJ7hBQDADUYEINxD7bjWM c9gHJVcgdQwAgIdlaOEd4JYDeDcLEFTKhUTo2QUpUCyQIFBTBCh/YBZaGwK0uAAQcim459JTRGIs SIpQpBoZ4Ao05AUDsQHwA0VCionQREiQUuLb++EU47wGHRIoaqR4PvwphCgAG6ABuG4fIMDa4XSk InIopDBC35ICUqm4TP6BzTwBHC/QdRDhsNAGlR/ZiCGoh9N1VYgv+hijtsJgNgOn3HvAFBC9P8Ab oHoHrAsTAWV15RULK/u7e4AmdAHMHN6wOjnkGxAMwHqcwYKWEOpUClMFO4KWPiFR4G563MDANsAp yzYFw1IEQ+QiUCBIoAn0YKWGfc8A9n6ICgAQ0cge0MKbLmvW4j8NWQMixuLaPCIG9ryCutVYqjso kQ+Ahnn64K3QZvAvVkNXYzBC4iXUkASfLjfSmmZCiqYqH61wgqQIqjmfm8A5VVsHx/B7qq7KMC6Q cwyAaBu3aoEB94j7hEWhdoC1hUqG9UkSQZEboSIQR2AiwAIqQIKBA7Tsf9CijEEfwGoIUGgAGIBY VMgHrRoOAi2sBAQYHQHvVwIiSADAkBSCKEAIMKBoUYDBVX89A9luj5CoQcADs53Q1AOxUSqoEC/2 8iGFQwoP7jQFCiIBkGeoAQY5pQH7ICWe52yAgEgIwFVgrdNzBFQANAHJBN6AByH5lWPQ08JsrxyH YoeiCGwhEBogu9BU3o4ESn3XC793IS6ctIJYQwsED1AQIDYMN4Ikp7t6OTkPpAMwCBYGgYCWCQMg oD1ApA5jxKSbBoo9n8enfiL6E8AoQyYlKNKUHeHJ28QDPuaBE1HuicAN+wZmJu0ckctAJSNgglwu 4CWUNwDEC91G4hYmQUpaHcL1KUuQUZXaySNlQnWRpiAUCIyIBEihEGMUYg2WwA4/nF3eYdgePQAC gLXb6ijqWelWRS6hX6va6iHij6APGgy7Q07WBYTpAuIfYBtmqhUJ3hPV1NwMzUQHSKJoaUTkOgMh Cwj5d5QDo70BzwhQbtwzQ4ep+vKmFE8gMBum4ct1Q52UumlwpRol+8UAc8ooGkXQMi6qGzYKRHBA f8Qf7IfQF218B0UagkCEINgQaUUZ9Mdh5CwHrMyfegHj8gMgPAVQv2dFCwMR0yot1qHYmTSDlgAW wDIxwLtxDPAhVKAGooXDLMdVpkDtoKtwfIM7YihQqJhTlWVXc4o2sC0KtIWVV1qAJpdAhYRCtroF kAsohcDK8SoOHAjA0rDQzR1B0DQBgZOSkEKCtRufSFPreQU3QCk/MHIKAggRvAs4i4DPkAoMAulD TcohYFQZEEBEEEEgB8sskijJqgb9430C7VgLFgeqy1BuGgDoiOZzAGFwOCInYgASAMGEBGKqsC+M kklAOwbC7nUFbhlAc+wQspEKqpyIEYIMDRTYcBwh8hovoDf9A1wbHYa9b8CllP28qodBX8nFnwOR 4bAg0Nw7w5gBZsLTTdEppTkFneMakIJBJ27+HxBgd0aBAGa1FFPMIzxIlZV5NlpUgDAJ6pQoHg8A xR3u2tcFTMAfWqe01A6+ZvdlfMCCmw2dlXhPOOvQdp6aLCABQwApFViXRUICvYD4bolgc33C0CrD ILganZoOeToCqeOa5iGnyl4p/FwU1YxWIBEej0IeEII1DUHl7OPTxS4Ot3HmwSwBBOrj4sD989BD MFW+QWElkBQAGBP6hRiqiBSAwOjo+ep1BkEsWuijsnuGaVh+QFPVwHAGZGyv2RJkiQANYA0GARVo kV6O4U+0RUBCeEgEDANBGooiRSoUUFCgIQEcKYCIr4sg+xmBoHmwaiCgAb3cDUph/kgJGoFiy4Eo UCQEjZEyvaciWgIORER/whyob/6RdyRThQkC43s7IA== --001a1132f15e0063a204f942a593-- From mneuer@web.de Tue May 13 02:07:55 2014 Return-Path: <mneuer@web.de> X-Spam-Checker-Version: SpamAssassin 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 07EA87F47 for <xfs@oss.sgi.com>; Tue, 13 May 2014 02:07:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D21638F80DE for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:07:51 -0700 (PDT) X-ASG-Debug-ID: 1399964869-04cbb03cc74934d0001-NocioJ Received: from mout.web.de (mout.web.de [212.227.15.14]) by cuda.sgi.com with ESMTP id Vd3PdUr7cgTjyjXR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 00:07:50 -0700 (PDT) X-Barracuda-Envelope-From: mneuer@web.de X-Barracuda-Apparent-Source-IP: 212.227.15.14 Received: from [134.60.2.64] ([134.60.2.64]) by smtp.web.de (mrweb102) with ESMTPSA (Nemesis) id 0Mf0pJ-1WPzdQ3ia9-00Obmi; Tue, 13 May 2014 09:07:45 +0200 Message-ID: <5371C4BC.2010902@web.de> Date: Tue, 13 May 2014 09:07:40 +0200 From: Matthias Neuer <mneuer@web.de> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.4.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@sandeen.net> CC: xfs@oss.sgi.com Subject: Re: xfs spanning over ssd and hdd References: <5370C592.6080402@web.de> <5370D8AA.2010003@sandeen.net> X-ASG-Orig-Subj: Re: xfs spanning over ssd and hdd In-Reply-To: <5370D8AA.2010003@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:g1kaOpa1aIjv0NY7e5V/UwcLt/6GN9ba7A2SHdj66x8EMmLTNpX tCcY+VLx3+VlvDUV+o2K6wK5Qojo0FzVXR5ynUeklwMLOu3RLkkSFwJpD7IkRAgNILLFIy/ LGU+25KLOUBFzsZAroWZEtZZFlcXY0si9tJ6fvbzAj6CWKijSOcOZEDRnb2gUMj/lU/OqY2 efuP8j0SXFs7vj7Lly8Hg== X-Barracuda-Connect: mout.web.de[212.227.15.14] X-Barracuda-Start-Time: 1399964870 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.5768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi. On 05/12/2014 04:20 PM, Eric Sandeen wrote: > On 5/12/14, 7:58 AM, Matthias Neuer wrote: >> Hi. >> >> I have a slow and big hdd and a fast but small ssd and want to test the following setup but don't know if it's possible. >> >> Use LVM to concatenate the ssd and the hdd linearly. Create a xfs filesystem on this device such that the sdd is filled first, i.e. data is written to the ssd as long as there is free space, otherwise the data is written to the hdd. >> >> I have applications which may benefit from this setup but I am not sure so I need to do some benchmarks. > > XFS doesn't fill from the front, so you can't configure things to fill the HDD first. > > Files in new directories rotor around the allocation groups on the filesystem, so all regions of the fs are filled more or less evenly. > Ok, thanks for the info. I fear that xfs is too intelligent because filling the device from front to rear seems to be a simple policy. Maybe I should try FAT16 :) Thanks Matthias From dave@fromorbit.com Tue May 13 03:56:24 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 91A727F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19F72AC003 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:24 -0700 (PDT) X-ASG-Debug-ID: 1399971380-04bdf02b8c4d01e0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id f5ri6hn62OTetTcP for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:22 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoBLAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDRJYVWiDJnhCoEpEyLSyuBMg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000JZ-Uw for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001km-UE for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 4/9] xfs: correct error sign on COLLAPSE_RANGE errors Date: Tue, 13 May 2014 18:56:08 +1000 X-ASG-Orig-Subj: [PATCH 4/9] xfs: correct error sign on COLLAPSE_RANGE errors Message-Id: <1399971373-6242-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971381 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 37f98c6..830c1c9 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -837,7 +837,7 @@ xfs_file_fallocate( unsigned blksize_mask = (1 << inode->i_blkbits) - 1; if (offset & blksize_mask || len & blksize_mask) { - error = -EINVAL; + error = EINVAL; goto out_unlock; } @@ -846,7 +846,7 @@ xfs_file_fallocate( * in which case it is effectively a truncate operation */ if (offset + len >= i_size_read(inode)) { - error = -EINVAL; + error = EINVAL; goto out_unlock; } -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:25 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9A5947F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C2703040DA for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:25 -0700 (PDT) X-ASG-Debug-ID: 1399971380-04bdf02b8c4d01e0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NIABCzuBTWqV2glT for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:23 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AotLAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBgWbMxcDAQEBATg1gwI7gQIDB4htnRq0C4VWiRmEKgSuEIIHKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000JV-TV for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kU-SG for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 Date: Tue, 13 May 2014 18:56:04 +1000 X-ASG-Orig-Subj: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 Message-Id: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971383 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, I've been working through the mess that is the error sign impedance mismatch between the core XFS code and the rest of the kernel. I'm about half way through the codebase, and I've found a bunch of incorrect error signs throughout the VFS interface layers. These were effectively all found by inspection, and is further evidence that we need to convert all of XFS to negative errors as quickly as possible. It is clear that we are missing these on review, and changes made by developers adding functionality to the VFS and hence just touching the outer layers of XFS are simply not aware of these issues in the first place. This patchset is based on v3.15-rc5 because some of the problems that need to be fixed have merged into mainline via the ext4 tree (COLLAPSE_RANGE changes). Hence I'll need to update the master branch of the XFS tree to v3.15-rc5 before I merge these and push them to Linus. I'm considering them as important fixes as things like xfs_dir_fsync() and xfs_commit_metadata() returning incorrect errnos mean data integrity operation failures may not be detected correctly by applications..... Comments, thoughts, testing all welcome! Cheers, Dave. From dave@fromorbit.com Tue May 13 03:56:26 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 249EA7F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAABF304077 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:25 -0700 (PDT) X-ASG-Debug-ID: 1399971383-04bdf02b8a4d01e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TGhmbmH5pqZ8fEsP for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An9LAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBVYzCBgxOQMHFBmIQNElhVaIGIEBhCoEpEyLSyuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000JY-Ua for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kh-Ts for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 3/9] xfs: xfs_commit_metadata returns wrong errno Date: Tue, 13 May 2014 18:56:07 +1000 X-ASG-Orig-Subj: [PATCH 3/9] xfs: xfs_commit_metadata returns wrong errno Message-Id: <1399971373-6242-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971383 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Invert it. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_export.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 1399e18..753e467 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -237,7 +237,7 @@ xfs_fs_nfs_commit_metadata( if (!lsn) return 0; - return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); + return -_xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); } const struct export_operations xfs_export_operations = { -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:26 2014 Return-Path: <dave@fromorbit.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 8409D7F50 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 633558F8035 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:23 -0700 (PDT) X-ASG-Debug-ID: 1399971380-04bdf02b8c4d01e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TY1LidxFHPKRKZpn for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:21 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An9LAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBVYzCBgxOQMHFBmIQNEOF4VWiDJnhCoEpEyLSyuBMg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000Jb-W8 for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kw-VK for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfs: fix wrong err sign on xfs_set_acl() Date: Tue, 13 May 2014 18:56:10 +1000 X-ASG-Orig-Subj: [PATCH 6/9] xfs: fix wrong err sign on xfs_set_acl() Message-Id: <1399971373-6242-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971380 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_iops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index adfb18e..36d6303 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -173,12 +173,12 @@ xfs_generic_create( #ifdef CONFIG_XFS_POSIX_ACL if (default_acl) { - error = xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); + error = -xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); if (error) goto out_cleanup_inode; } if (acl) { - error = xfs_set_acl(inode, acl, ACL_TYPE_ACCESS); + error = -xfs_set_acl(inode, acl, ACL_TYPE_ACCESS); if (error) goto out_cleanup_inode; } -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:26 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CA8FE7F50 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BA62304077 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:26 -0700 (PDT) X-ASG-Debug-ID: 1399971380-04bdf02b8c4d01e0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ozZAbqAfvoxylEuC for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An9LAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBVYzCBgxOQMHFBmIQNEOF4VWiBiBAYQqBKRMi0srgTA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VW-0000Jd-0g for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001l6-WA for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfs: negate xfs_icsb_init_counters error value Date: Tue, 13 May 2014 18:56:12 +1000 X-ASG-Orig-Subj: [PATCH 8/9] xfs: negate xfs_icsb_init_counters error value Message-Id: <1399971373-6242-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971384 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index e1597f2..3494eff 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1437,7 +1437,7 @@ xfs_fs_fill_super( if (error) goto out_close_devices; - error = xfs_icsb_init_counters(mp); + error = -xfs_icsb_init_counters(mp); if (error) goto out_destroy_workqueues; -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:26 2014 Return-Path: <dave@fromorbit.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 92F227F53 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B4A68F804C for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:26 -0700 (PDT) X-ASG-Debug-ID: 1399971382-04cbb03cc7497460002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pcO9yLd06b4axRiM for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoBLAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDRJYVWiRmEKgSkTItLKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000Ja-Vf for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kr-Ud for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 5/9] xfs: fix wrong errno from xfs_initxattrs Date: Tue, 13 May 2014 18:56:09 +1000 X-ASG-Orig-Subj: [PATCH 5/9] xfs: fix wrong errno from xfs_initxattrs Message-Id: <1399971373-6242-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971384 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_iops.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 301ecbf..adfb18e 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -72,8 +72,8 @@ xfs_initxattrs( int error = 0; for (xattr = xattr_array; xattr->name != NULL; xattr++) { - error = xfs_attr_set(ip, xattr->name, xattr->value, - xattr->value_len, ATTR_SECURE); + error = -xfs_attr_set(ip, xattr->name, xattr->value, + xattr->value_len, ATTR_SECURE); if (error < 0) break; } @@ -93,8 +93,8 @@ xfs_init_security( struct inode *dir, const struct qstr *qstr) { - return security_inode_init_security(inode, dir, qstr, - &xfs_initxattrs, NULL); + return -security_inode_init_security(inode, dir, qstr, + &xfs_initxattrs, NULL); } static void -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:27 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5DFE97F50 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DB0C6AC003 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:26 -0700 (PDT) X-ASG-Debug-ID: 1399971383-04bdf02b8a4d01e0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id k8P05FVIykWhKfIt for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:25 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoBLAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDRDheFVokZhCoEpEyLSys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VW-0000Je-15 for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VW-0001lB-0K for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfs: list_lru_init returns a negative error Date: Tue, 13 May 2014 18:56:13 +1000 X-ASG-Orig-Subj: [PATCH 9/9] xfs: list_lru_init returns a negative error Message-Id: <1399971373-6242-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971384 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> And we don't invert it properly when initialising the dquot lru list. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_qm.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 348e4d2..dc977b6 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -843,22 +843,17 @@ xfs_qm_init_quotainfo( qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP); - if ((error = list_lru_init(&qinf->qi_lru))) { - kmem_free(qinf); - mp->m_quotainfo = NULL; - return error; - } + error = -list_lru_init(&qinf->qi_lru); + if (error) + goto out_free_qinf; /* * See if quotainodes are setup, and if not, allocate them, * and change the superblock accordingly. */ - if ((error = xfs_qm_init_quotainos(mp))) { - list_lru_destroy(&qinf->qi_lru); - kmem_free(qinf); - mp->m_quotainfo = NULL; - return error; - } + error = xfs_qm_init_quotainos(mp); + if (error) + goto out_free_lru; INIT_RADIX_TREE(&qinf->qi_uquota_tree, GFP_NOFS); INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS); @@ -918,7 +913,7 @@ xfs_qm_init_quotainfo( qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit); qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit); qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit); - + xfs_qm_dqdestroy(dqp); } else { qinf->qi_btimelimit = XFS_QM_BTIMELIMIT; @@ -935,6 +930,13 @@ xfs_qm_init_quotainfo( qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE; register_shrinker(&qinf->qi_shrinker); return 0; + +out_free_lru: + list_lru_destroy(&qinf->qi_lru); +out_free_qinf: + kmem_free(qinf); + mp->m_quotainfo = NULL; + return error; } -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:27 2014 Return-Path: <dave@fromorbit.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 EBFE07F50 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA15B8F8033 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:27 -0700 (PDT) X-ASG-Debug-ID: 1399971380-04bdf02b8c4d01e0005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id yijHyChk50TpypH8 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:25 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao9HAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEHmhuBHRcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0SWFVoVtgisaPyiEKgSkTItLK4EwAh4 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000JX-UB for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kc-TP for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 2/9] xfs: fix incorrect error sign in xfs_file_aio_read Date: Tue, 13 May 2014 18:56:06 +1000 X-ASG-Orig-Subj: [PATCH 2/9] xfs: fix incorrect error sign in xfs_file_aio_read Message-Id: <1399971373-6242-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971385 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f499e47..37f98c6 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -295,7 +295,7 @@ xfs_file_aio_read( xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); if (inode->i_mapping->nrpages) { - ret = -filemap_write_and_wait_range( + ret = filemap_write_and_wait_range( VFS_I(ip)->i_mapping, pos, -1); if (ret) { -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:28 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CBA57F53 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D1E98304077 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:24 -0700 (PDT) X-ASG-Debug-ID: 1399971382-04cbb03cc7497460001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kYONtYrhsAIYdqzz for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:23 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An9LAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBVYzCBgxOQMHFBmIQNElhVaIGIEBhCoEpEyLSyuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VV-0000JW-To for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001kX-T1 for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfs: xfs_dir_fsync() returns positive errno Date: Tue, 13 May 2014 18:56:05 +1000 X-ASG-Orig-Subj: [PATCH 1/9] xfs: xfs_dir_fsync() returns positive errno Message-Id: <1399971373-6242-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971382 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> And it should be negative. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 951a232..f499e47 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -155,7 +155,7 @@ xfs_dir_fsync( if (!lsn) return 0; - return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); + return -_xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); } STATIC int -- 1.9.0 From dave@fromorbit.com Tue May 13 03:56:29 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 06F257F60 for <xfs@oss.sgi.com>; Tue, 13 May 2014 03:56:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 711F6AC003 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:28 -0700 (PDT) X-ASG-Debug-ID: 1399971382-04cbb03cc7497460003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id xKMFvEEe1SRfbUo6 for <xfs@oss.sgi.com>; Tue, 13 May 2014 01:56:26 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An9LAHXdcVN5LL1sPGdsb2JhbABZgwaIR6QrAQEBAQEBBps4FwMBAQEBODWCJQEBBVYzCBgxOQMHFBmIQNEOF4VWiBiBAYQqBLAXK4Ew Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:26:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wk8VW-0000Jc-0I for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:18 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wk8VV-0001l1-Vm for xfs@oss.sgi.com; Tue, 13 May 2014 18:56:17 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfs: negate mount workqueue init error value Date: Tue, 13 May 2014 18:56:11 +1000 X-ASG-Orig-Subj: [PATCH 7/9] xfs: negate mount workqueue init error value Message-Id: <1399971373-6242-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1399971385 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 2053767..e1597f2 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1433,7 +1433,7 @@ xfs_fs_fill_super( if (error) goto out_free_fsname; - error = xfs_init_mount_workqueues(mp); + error = -xfs_init_mount_workqueues(mp); if (error) goto out_close_devices; -- 1.9.0 From david@fromorbit.com Tue May 13 04:03:29 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37D987F4E for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:03:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 978ACAC001 for <xfs@oss.sgi.com>; Tue, 13 May 2014 02:03:25 -0700 (PDT) X-ASG-Debug-ID: 1399971802-04cbb03cc7497980001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iTwKgjk4ZWc9mq42 for <xfs@oss.sgi.com>; Tue, 13 May 2014 02:03:23 -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: Ap1LAG3ecVN5LL1sPGdsb2JhbABRCIMGiEekKwEBAQEBAQaaGwGBHBcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTiEDRDxcWhUCIJlYHhEAEmUeWUCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 13 May 2014 18:33:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wk8cL-0000Mg-B7; Tue, 13 May 2014 19:03:21 +1000 Date: Tue, 13 May 2014 19:03:21 +1000 From: Dave Chinner <david@fromorbit.com> To: Austin Schuh <austin@peloton-tech.com> Cc: xfs <xfs@oss.sgi.com> Subject: Re: XFS crash? Message-ID: <20140513090321.GR26353@dastard> X-ASG-Orig-Subj: Re: XFS crash? References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> <20140513034647.GA5421@dastard> <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.com> <20140513063943.GQ26353@dastard> <CANGgnMYn++1++UyX+D2d9GxPxtytpQJv0ThFwdxM-yX7xDWqiA@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CANGgnMYn++1++UyX+D2d9GxPxtytpQJv0ThFwdxM-yX7xDWqiA@mail.gmail.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: 1399971802 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.5770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 13, 2014 at 12:02:18AM -0700, Austin Schuh wrote: > On Mon, May 12, 2014 at 11:39 PM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, May 12, 2014 at 09:03:48PM -0700, Austin Schuh wrote: > >> On Mon, May 12, 2014 at 8:46 PM, Dave Chinner <david@fromorbit.com> wrote: > >> > On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: > >> >> On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: > >> >> > Hi Dave, > >> >> > > >> >> > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: > >> >> >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: > >> >> >>> Howdy, > >> >> >>> > >> >> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, > >> >> >>> and I'm seeing a couple lockups and crashes which I think are related > >> >> >>> to XFS. > >> >> >> > >> >> >> I think they ar emore likely related to RT issues.... > >> >> >> > >> >> > > >> >> > That very well may be true. > >> >> > > >> >> >> Cheers, > >> >> >> > >> >> >> Dave. > >> >> >> -- > >> >> >> Dave Chinner > >> >> > >> >> I had the issue reproduce itself today with just the main SSD > >> >> installed. This was on a new machine that was built this morning. > >> >> There is a lot less going on in this trace than the previous one. > >> > > >> > The three blocked threads: > >> > > >> > 1. kworker running IO completion waiting on an inode lock, > >> > holding locked pages. > >> > 2. kworker running writeback flusher work waiting for a page lock > >> > 3. direct flush work waiting for allocation, holding page > >> > locks and the inode lock. > >> > > >> > What's the kworker thread running the allocation work doing? > >> > > >> > You might need to run `echo w > proc-sysrq-trigger` to get this > >> > information... > >> > >> I was able to reproduce the lockup. I ran `echo w > > >> /proc/sysrq-trigger` per your suggestion. I don't know how to figure > >> out what the kworker thread is doing, but I'll happily do it if you > >> can give me some guidance. > > > > There isn't a worker thread blocked doing an allocation in that > > dump, so it doesn't shed any light on the problem at all. try > > `echo l > /proc/sysrq-trigger`, followed by `echo t > > > /proc/sysrq-trigger` so we can see all the processes running on CPUs > > and all the processes in the system... > > > > Cheers, > > > > Dave. > > Attached is the output of the two commands you asked for. Nothing there. There's lots of processes waiting for allocation to run, and no kworkers running allocation work. This looks more like a rt-kernel workqueue issue, not an XFS problem. FWIW, it woul dbe really helpful if you compiled your kernels with frame pointers enabled - the stack traces are much more precise and readable (i.e. gets rid of all the false/stale entrys) and that helps understanding where things are stuck immensely. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue May 13 06:29:44 2014 Return-Path: <bfoster@redhat.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 D0BC87F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 06:29:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80F4E8F8035 for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:29:41 -0700 (PDT) X-ASG-Debug-ID: 1399980580-04cb6c1fcc3662f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YypcDINslDgpvIN2 for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:29:40 -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 (8.14.4/8.14.4) with ESMTP id s4DBTWCE008274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 13 May 2014 07:29:32 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4DBTVQG006551; Tue, 13 May 2014 07:29:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 23A1C1248A9; Tue, 13 May 2014 07:29:31 -0400 (EDT) Date: Tue, 13 May 2014 07:29:31 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: remove XFS_TRANS_RESERVE in collapse range Message-ID: <20140513112930.GA53546@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: remove XFS_TRANS_RESERVE in collapse range References: <000f01cf6e3e$d4a0a800$7de1f800$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <000f01cf6e3e$d4a0a800$7de1f800$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1399980580 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, May 13, 2014 at 09:03:55AM +0900, Namjae Jeon wrote: > There is no need to dip into reserve pool. Reserve pool is used for much > more important things. And xfs_trans_reserve will never return ENOSPC > because punch hole is already done. If we get ENOSPC, collapse range > will be simply failed. > > Cc: Brian Foster <bfoster@redhat.com> > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > --- Looks good, thanks Namjae! Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_bmap_util.c | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 296160b..057f671 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1519,7 +1519,6 @@ xfs_collapse_file_space( > > while (!error && !done) { > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > - tp->t_flags |= XFS_TRANS_RESERVE; > /* > * We would need to reserve permanent block for transaction. > * This will come into picture when after shifting extent into > @@ -1529,7 +1528,6 @@ xfs_collapse_file_space( > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > if (error) { > - ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); > xfs_trans_cancel(tp, 0); > break; > } > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jlayton@poochiereds.net Tue May 13 06:54:13 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9E8057F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 06:54:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5D7F18F8033 for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:54:13 -0700 (PDT) X-ASG-Debug-ID: 1399982051-04cb6c728f4b9520001-NocioJ Received: from mail-qg0-f43.google.com (mail-qg0-f43.google.com [209.85.192.43]) by cuda.sgi.com with ESMTP id sLsChxuvOF70RLba (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:54:11 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.192.43 Received: by mail-qg0-f43.google.com with SMTP id 63so227839qgz.2 for <xfs@oss.sgi.com>; Tue, 13 May 2014 04:54:11 -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:in-reply-to :references; bh=chkfpEPyKeEOTsFfCFaH6cbZJjF5nMse/nvOWrfUELc=; b=MuTgZI00cOI3IRtkYzLZ3NewsCswnTUhAfncEzXPshHJkQ4aYIezfrzShFV0obX3lV K3/X09Ae72srIJ6UUj4mEREJA2K7avSEZnA5Pm9njgtGdZBoNw7iFEpPJy1BA+LwPFw8 iGd9Ul0bclXg1WYPeu70x1xUCX8rbvxSn+Lx3RIeCP2F8pDns9atikgEGgMBfRBR3DDj b2fXHmzH3/uBPEXlQi+Ade00x1agzKjw3X9Fm6Dz8FefnEOv6qIogRvx0MhL+btDyOKG TJaCjlPPK8/lxXMLlXmk72TOpLX7A7CBmG1wdSaqdjSAGWdvIcguYOU7F0AYNMOpLWwI OYWw== X-Gm-Message-State: ALoCoQl0g4Tetov4iun3o3yLwtdPiPHUKEExA1QJj2rPVZeIeXnNS//9o6SNkKUgAHNyHAFN1oDu X-Received: by 10.140.37.135 with SMTP id r7mr44616084qgr.61.1399982050989; Tue, 13 May 2014 04:54:10 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id h78sm11835361qgd.10.2014.05.13.04.54.09 for <multiple recipients> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 May 2014 04:54:09 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Cc: Dave Chinner <david@fromorbit.com> Subject: [PATCH] loggen: fix build vs. newer xfsprogs headers Date: Tue, 13 May 2014 07:54:03 -0400 X-ASG-Orig-Subj: [PATCH] loggen: fix build vs. newer xfsprogs headers Message-Id: <1399982043-8693-1-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <20140512230049.GO26353@dastard> References: <20140512230049.GO26353@dastard> X-Barracuda-Connect: mail-qg0-f43.google.com[209.85.192.43] X-Barracuda-Start-Time: 1399982051 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.5773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- commit cc085d770adb in xfsprogs removed some header files that are included by loggen.c. Add an autoconf test that checks to see whether xfs_log_format.h is present. If it is, include that instead of the deprecated headers and add an alias for XFS_TRANS_MAGIC since that value no longer exists. W.ith this patch, xfstests builds on both f20 and rawhide (f21) boxes. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- configure.ac | 9 ++++++--- src/loggen.c | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 43e6029193a6..e4680544ac82 100644 --- a/configure.ac +++ b/configure.ac @@ -26,14 +26,17 @@ AC_HEADER_STDC sys/types.h \ strings.h \ err.h \ - linux/falloc.h - ]) - AC_CHECK_HEADERS([ sys/fs/xfs_fsops.h \ + linux/falloc.h \ + sys/fs/xfs_fsops.h \ sys/fs/xfs_itable.h \ xfs/platform_defs.h \ btrfs/ioctl.h \ ]) +AC_CHECK_HEADERS([xfs/xfs_log_format.h],,,[#include <xfs/platform_defs.h> +#include <xfs/xfs_types.h> +#include <xfs/xfs_fs.h>]) + AC_PACKAGE_NEED_UUIDCOMPARE case $pkg_platform diff --git a/src/loggen.c b/src/loggen.c index 522c9178ee26..a3d99f8c915f 100644 --- a/src/loggen.c +++ b/src/loggen.c @@ -25,9 +25,16 @@ * - dxm 29/09/00 */ +#include <config.h> + #include <xfs/libxfs.h> +#ifdef HAVE_XFS_XFS_LOG_FORMAT_H +#include <xfs/xfs_log_format.h> +#define XFS_TRANS_MAGIC XFS_TRANS_HEADER_MAGIC +#else /* HAVE_XFS_XFS_LOG_FORMAT_H */ #include <xfs/xfs_log.h> #include <xfs/xfs_log_priv.h> +#endif /* HAVE_XFS_XFS_LOG_FORMAT_H */ #ifndef ASSIGN_ANY_LSN_DISK #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ -- 1.9.0 From jlayton@poochiereds.net Tue May 13 07:00:45 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 6F04F7F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:00:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 357338F8035 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:00:44 -0700 (PDT) X-ASG-Debug-ID: 1399982443-04cbb03cc449e0b0001-NocioJ Received: from mail-qc0-f172.google.com (mail-qc0-f172.google.com [209.85.216.172]) by cuda.sgi.com with ESMTP id 5RZKx8SGE8ajtks2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:00:43 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.172 Received: by mail-qc0-f172.google.com with SMTP id l6so239046qcy.31 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:00: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:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=Gsy3S6UROKWNa/ZDIrDrpX4EHMoLDCNOiez5KgTQOFw=; b=Rn/zVl6iUilOKyoiNj7zDB0WB3SNKMsp/+dQ9BIR9SZHW44GlYJHEJP3+hkMm+4vW9 0cI0kaepz9o0aS45T8eqgza1tDcDoAmectsr6SNfBQwwlkeBRiFCNic6ogMCYJpLv2R+ djvuP83AKrvwJ5aUGM8nmPYoVHoNxekRZfcVq/BKxCyuiuI9RMnc8y7E0hi6OwUf75fP EoNRkNuLRNC8FC3DbcLNX8F718nDsTOJ0LMvInIEIlUvYJu7K8+oUXSIEn15GYqtSigl w72pdNRqBmSKmQ8L/Hvc/9pg3cYItxHMKuPPr3BxQCJ44Bu3jmJ4iKs9nyEjKaQUyxE9 9w+Q== X-Gm-Message-State: ALoCoQmayfrbNNKdkBfZMHVyfMgFe2OWDSOTnBliakbpefx4okcDmkv4h31a/GatOlYSsov5fudg X-Received: by 10.224.47.8 with SMTP id l8mr46825425qaf.24.1399982442808; Tue, 13 May 2014 05:00:42 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id m18sm26369287qax.47.2014.05.13.05.00.42 for <multiple recipients> (version=SSLv3 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 13 May 2014 05:00:42 -0700 (PDT) Date: Tue, 13 May 2014 08:00:39 -0400 From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Cc: Dave Chinner <david@fromorbit.com> Subject: Re: [PATCH] loggen: fix build vs. newer xfsprogs headers Message-ID: <20140513080039.239b0ad9@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [PATCH] loggen: fix build vs. newer xfsprogs headers In-Reply-To: <1399982043-8693-1-git-send-email-jlayton@poochiereds.net> References: <20140512230049.GO26353@dastard> <1399982043-8693-1-git-send-email-jlayton@poochiereds.net> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f172.google.com[209.85.216.172] X-Barracuda-Start-Time: 1399982443 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.5773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 13 May 2014 07:54:03 -0400 Jeff Layton <jlayton@poochiereds.net> wrote: > commit cc085d770adb in xfsprogs removed some header files that are > included by loggen.c. Add an autoconf test that checks to see whether > xfs_log_format.h is present. If it is, include that instead of the > deprecated headers and add an alias for XFS_TRANS_MAGIC since that > value no longer exists. > > W.ith this patch, xfstests builds on both f20 and rawhide (f21) boxes. > > Signed-off-by: Jeff Layton <jlayton@poochiereds.net> > --- > configure.ac | 9 ++++++--- > src/loggen.c | 7 +++++++ > 2 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/configure.ac b/configure.ac > index 43e6029193a6..e4680544ac82 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -26,14 +26,17 @@ AC_HEADER_STDC > sys/types.h \ > strings.h \ > err.h \ > - linux/falloc.h > - ]) > - AC_CHECK_HEADERS([ sys/fs/xfs_fsops.h \ > + linux/falloc.h \ > + sys/fs/xfs_fsops.h \ > sys/fs/xfs_itable.h \ > xfs/platform_defs.h \ > btrfs/ioctl.h \ > ]) > > +AC_CHECK_HEADERS([xfs/xfs_log_format.h],,,[#include <xfs/platform_defs.h> > +#include <xfs/xfs_types.h> > +#include <xfs/xfs_fs.h>]) > + Hmm now that I look closer, loggen.c just includes xfs/libxfs.h in order to pull in all of the necessary includes. I guess we should do that here instead of including these headers individually... I'll respin and resend. > AC_PACKAGE_NEED_UUIDCOMPARE > > case $pkg_platform > diff --git a/src/loggen.c b/src/loggen.c > index 522c9178ee26..a3d99f8c915f 100644 > --- a/src/loggen.c > +++ b/src/loggen.c > @@ -25,9 +25,16 @@ > * - dxm 29/09/00 > */ > > +#include <config.h> > + > #include <xfs/libxfs.h> > +#ifdef HAVE_XFS_XFS_LOG_FORMAT_H > +#include <xfs/xfs_log_format.h> > +#define XFS_TRANS_MAGIC XFS_TRANS_HEADER_MAGIC > +#else /* HAVE_XFS_XFS_LOG_FORMAT_H */ > #include <xfs/xfs_log.h> > #include <xfs/xfs_log_priv.h> > +#endif /* HAVE_XFS_XFS_LOG_FORMAT_H */ > > #ifndef ASSIGN_ANY_LSN_DISK > #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ -- Jeff Layton <jlayton@poochiereds.net> From jlayton@poochiereds.net Tue May 13 07:04:51 2014 Return-Path: <jlayton@poochiereds.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 07C097F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:04:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A99FAC006 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:04:47 -0700 (PDT) X-ASG-Debug-ID: 1399982685-04bdf02b8d4d7b40001-NocioJ Received: from mail-qa0-f47.google.com (mail-qa0-f47.google.com [209.85.216.47]) by cuda.sgi.com with ESMTP id igBrOaL2TcGS6jUv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:04:45 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.47 Received: by mail-qa0-f47.google.com with SMTP id s7so221689qap.34 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:04:45 -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:in-reply-to :references; bh=wZbzMiTl7DDV8YFvFjuhW0au4+2e2Kz1U9H7WpD8kLE=; b=hojvQUBzeDKrmN5QTiyhs9BCqltaCEw2GFGGutm9gWgn3LB+l/PxtD+LpvRuLPF7fW JrDQ3YzFIR6VM0rn2axOWQ65KUXsD2ObJTBYJGoY391hf+FtAWZoOLULBMl33baVGYFK QifehylzPX2SjglSql0rKhKyRTyUIIOjNmpjyKf1gDtP/n/7EQO64AU/yQ6vVajcvi+p 5b40RZFl45OHXlsEl40XOrTzFxfZYFkx4gMUmfTC1OC1C+7Giv3fJifHpZsfUBqmSOsL uSbUIhvZ0CfmMs8XjkV+ekCvykK2vpjBJh0R45NeVBbiJeEqLtLtri+tTrdvcl8lRWdE cKBw== X-Gm-Message-State: ALoCoQlRxV42+Arka4NDexAEJqpJOKTC6nR3b6kFYp+deE3oCEq7R9KhowjxakiWJRdqWxUFqUux X-Received: by 10.140.92.200 with SMTP id b66mr43469219qge.41.1399982685066; Tue, 13 May 2014 05:04:45 -0700 (PDT) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id 5sm9178497qgi.45.2014.05.13.05.04.43 for <multiple recipients> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 May 2014 05:04:43 -0700 (PDT) From: Jeff Layton <jlayton@poochiereds.net> To: xfs@oss.sgi.com Cc: Dave Chinner <david@fromorbit.com> Subject: [xfstests PATCH v2] loggen: fix build vs. newer xfsprogs headers Date: Tue, 13 May 2014 08:04:39 -0400 X-ASG-Orig-Subj: [xfstests PATCH v2] loggen: fix build vs. newer xfsprogs headers Message-Id: <1399982679-15544-1-git-send-email-jlayton@poochiereds.net> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1399982043-8693-1-git-send-email-jlayton@poochiereds.net> References: <1399982043-8693-1-git-send-email-jlayton@poochiereds.net> X-Barracuda-Connect: mail-qa0-f47.google.com[209.85.216.47] X-Barracuda-Start-Time: 1399982685 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.5773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- v2: just include xfs/libxfs.h for the conftest prerequisites commit cc085d770adb in xfsprogs removed some header files that are included by loggen.c. Add an autoconf test that checks to see whether xfs_log_format.h is present. If it is, include that instead of the deprecated headers and add an alias for XFS_TRANS_MAGIC since that value no longer exists. With this patch, xfstests builds on both f20 and rawhide (f21) boxes. Signed-off-by: Jeff Layton <jlayton@poochiereds.net> --- configure.ac | 7 ++++--- src/loggen.c | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 43e6029193a6..53459d87f930 100644 --- a/configure.ac +++ b/configure.ac @@ -26,14 +26,15 @@ AC_HEADER_STDC sys/types.h \ strings.h \ err.h \ - linux/falloc.h - ]) - AC_CHECK_HEADERS([ sys/fs/xfs_fsops.h \ + linux/falloc.h \ + sys/fs/xfs_fsops.h \ sys/fs/xfs_itable.h \ xfs/platform_defs.h \ btrfs/ioctl.h \ ]) +AC_CHECK_HEADERS([xfs/xfs_log_format.h],,,[#include <xfs/libxfs.h>]) + AC_PACKAGE_NEED_UUIDCOMPARE case $pkg_platform diff --git a/src/loggen.c b/src/loggen.c index 522c9178ee26..a3d99f8c915f 100644 --- a/src/loggen.c +++ b/src/loggen.c @@ -25,9 +25,16 @@ * - dxm 29/09/00 */ +#include <config.h> + #include <xfs/libxfs.h> +#ifdef HAVE_XFS_XFS_LOG_FORMAT_H +#include <xfs/xfs_log_format.h> +#define XFS_TRANS_MAGIC XFS_TRANS_HEADER_MAGIC +#else /* HAVE_XFS_XFS_LOG_FORMAT_H */ #include <xfs/xfs_log.h> #include <xfs/xfs_log_priv.h> +#endif /* HAVE_XFS_XFS_LOG_FORMAT_H */ #ifndef ASSIGN_ANY_LSN_DISK #define ASSIGN_ANY_LSN_DISK(lsn,cycle,block) \ -- 1.9.0 From bfoster@redhat.com Tue May 13 07:24:40 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 739787F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:24:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3AC0A3042B2 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:24:37 -0700 (PDT) X-ASG-Debug-ID: 1399983875-04bdf02b8c4d9000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pXTcMeFAIAFlXPUQ for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:24: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 (8.14.4/8.14.4) with ESMTP id s4DCOZmu012349 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Tue, 13 May 2014 08:24:35 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4DCOZ5G012714 for <xfs@oss.sgi.com>; Tue, 13 May 2014 08:24:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A3B531248A9; Tue, 13 May 2014 08:24:34 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH] xfstests: use killall -9 and wait in _cleanup() in xfs/013 Date: Tue, 13 May 2014 08:24:34 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: use killall -9 and wait in _cleanup() in xfs/013 Message-Id: <1399983874-58985-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: 1399983876 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 Kill any lingering fsstress processes and wait properly should we abort the test. This prevents the workload from inadvertently affecting subsequent tests. Signed-off-by: Brian Foster <bfoster@redhat.com> --- Dave, Sorry, this probably should have been posted sooner. I was half expecting to have more changes to the test. Looks like you fixed up the groups already (thanks), so here's a small one to fix up the exit path... Obviously it's not the end of the world if this waits for the next natural xfstests update. :) Brian tests/xfs/013 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/xfs/013 b/tests/xfs/013 index 049f0dc..e95d027 100755 --- a/tests/xfs/013 +++ b/tests/xfs/013 @@ -40,7 +40,8 @@ status=1 # failure is the default! _cleanup() { - killall fsstress 2>/dev/null + killall -9 fsstress 2>/dev/null + wait cd / umount $SCRATCH_MNT 2>/dev/null rm -f $tmp.* -- 1.8.3.1 From jeff.liu@oracle.com Tue May 13 07:46:38 2014 Return-Path: <jeff.liu@oracle.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 589B97F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:46:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B8F38F8033 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:46:34 -0700 (PDT) X-ASG-Debug-ID: 1399985193-04cb6c728f4bc570001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id zmPpG3XGsx5zH0lV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:46:33 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCkPMx010975 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:46:26 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4DCkNVA026275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:46:25 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCkNIQ021774; Tue, 13 May 2014 12:46:23 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:46:23 -0700 Message-ID: <53721410.30806@oracle.com> Date: Tue, 13 May 2014 20:46:08 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 1/9] xfs: xfs_dir_fsync() returns positive errno References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: xfs_dir_fsync() returns positive errno In-Reply-To: <1399971373-6242-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985193 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > And it should be negative. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_file.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 951a232..f499e47 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -155,7 +155,7 @@ xfs_dir_fsync( > > if (!lsn) > return 0; > - return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); > + return -_xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); > } > > STATIC int > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:46:54 2014 Return-Path: <jeff.liu@oracle.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 90A967F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:46:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12E59AC009 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:46:54 -0700 (PDT) X-ASG-Debug-ID: 1399985212-04cbb03cc44a0900001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id HykHtXDFk0kQsjUz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:46:52 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCkooL011323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:46:51 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCkoPq027607 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:46:50 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCkob6027589; Tue, 13 May 2014 12:46:50 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:46:49 -0700 Message-ID: <53721435.7090604@oracle.com> Date: Tue, 13 May 2014 20:46:45 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: fix incorrect error sign in xfs_file_aio_read References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: fix incorrect error sign in xfs_file_aio_read In-Reply-To: <1399971373-6242-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985212 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_file.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index f499e47..37f98c6 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,7 @@ xfs_file_aio_read( > xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); > > if (inode->i_mapping->nrpages) { > - ret = -filemap_write_and_wait_range( > + ret = filemap_write_and_wait_range( > VFS_I(ip)->i_mapping, > pos, -1); > if (ret) { > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:48:26 2014 Return-Path: <jeff.liu@oracle.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 84CB47F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:48:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04781AC003 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:48:25 -0700 (PDT) X-ASG-Debug-ID: 1399985303-04bdf02b8c4da6e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id yPTDSxKSwyYvDlH1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:48:24 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCmGvm025302 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:48:17 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCmFpi005563 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:48:16 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCmFfD001524; Tue, 13 May 2014 12:48:15 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:48:15 -0700 Message-ID: <5372148A.4080407@oracle.com> Date: Tue, 13 May 2014 20:48:10 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 3/9] xfs: xfs_commit_metadata returns wrong errno References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-4-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 3/9] xfs: xfs_commit_metadata returns wrong errno In-Reply-To: <1399971373-6242-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399985304 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Invert it. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_export.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c > index 1399e18..753e467 100644 > --- a/fs/xfs/xfs_export.c > +++ b/fs/xfs/xfs_export.c > @@ -237,7 +237,7 @@ xfs_fs_nfs_commit_metadata( > > if (!lsn) > return 0; > - return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); > + return -_xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL); > } > > const struct export_operations xfs_export_operations = { > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:49:46 2014 Return-Path: <jeff.liu@oracle.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 F04FE7F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:49:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D188C8F8033 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:49:45 -0700 (PDT) X-ASG-Debug-ID: 1399985384-04cb6c1fcc36a8a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2HxmHGZl4vCFCu3a (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:49:44 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCnhxk027116 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:49:44 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCngfU009934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:49:43 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s4DCnfmS004888; Tue, 13 May 2014 12:49:42 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:49:41 -0700 Message-ID: <537214D7.3010305@oracle.com> Date: Tue, 13 May 2014 20:49:27 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 4/9] xfs: correct error sign on COLLAPSE_RANGE errors References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-5-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 4/9] xfs: correct error sign on COLLAPSE_RANGE errors In-Reply-To: <1399971373-6242-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1399985384 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_file.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 37f98c6..830c1c9 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -837,7 +837,7 @@ xfs_file_fallocate( > unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > > if (offset & blksize_mask || len & blksize_mask) { > - error = -EINVAL; > + error = EINVAL; > goto out_unlock; > } > > @@ -846,7 +846,7 @@ xfs_file_fallocate( > * in which case it is effectively a truncate operation > */ > if (offset + len >= i_size_read(inode)) { > - error = -EINVAL; > + error = EINVAL; > goto out_unlock; > } > > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:51:16 2014 Return-Path: <jeff.liu@oracle.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 480007F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:51:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 189DF8F8033 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:51:15 -0700 (PDT) X-ASG-Debug-ID: 1399985473-04bdf02b8d4dac50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 0UpbqZhVLNTDqOA0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:51:13 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCpBVe016880 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:51:12 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCpBhL009698 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:51:11 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCpBAM009690; Tue, 13 May 2014 12:51:11 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:51:11 -0700 Message-ID: <53721538.6020702@oracle.com> Date: Tue, 13 May 2014 20:51:04 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 5/9] xfs: fix wrong errno from xfs_initxattrs References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-6-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: fix wrong errno from xfs_initxattrs In-Reply-To: <1399971373-6242-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985473 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_iops.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 301ecbf..adfb18e 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -72,8 +72,8 @@ xfs_initxattrs( > int error = 0; > > for (xattr = xattr_array; xattr->name != NULL; xattr++) { > - error = xfs_attr_set(ip, xattr->name, xattr->value, > - xattr->value_len, ATTR_SECURE); > + error = -xfs_attr_set(ip, xattr->name, xattr->value, > + xattr->value_len, ATTR_SECURE); > if (error < 0) > break; > } > @@ -93,8 +93,8 @@ xfs_init_security( > struct inode *dir, > const struct qstr *qstr) > { > - return security_inode_init_security(inode, dir, qstr, > - &xfs_initxattrs, NULL); > + return -security_inode_init_security(inode, dir, qstr, > + &xfs_initxattrs, NULL); > } > > static void > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:52:29 2014 Return-Path: <jeff.liu@oracle.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A0127F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:52:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 482A7304136 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:52:29 -0700 (PDT) X-ASG-Debug-ID: 1399985548-04cb6c72904bcbe0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id EUo9HxQBxLFxfP1B (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:52:28 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCqQmR018265 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:52:27 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCqPLm017746 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:52:26 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCqPBl007008; Tue, 13 May 2014 12:52:25 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:52:25 -0700 Message-ID: <53721565.1030104@oracle.com> Date: Tue, 13 May 2014 20:51:49 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 6/9] xfs: fix wrong err sign on xfs_set_acl() References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-7-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 6/9] xfs: fix wrong err sign on xfs_set_acl() In-Reply-To: <1399971373-6242-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985548 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_iops.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index adfb18e..36d6303 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -173,12 +173,12 @@ xfs_generic_create( > > #ifdef CONFIG_XFS_POSIX_ACL > if (default_acl) { > - error = xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); > + error = -xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); > if (error) > goto out_cleanup_inode; > } > if (acl) { > - error = xfs_set_acl(inode, acl, ACL_TYPE_ACCESS); > + error = -xfs_set_acl(inode, acl, ACL_TYPE_ACCESS); > if (error) > goto out_cleanup_inode; > } > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:56:20 2014 Return-Path: <jeff.liu@oracle.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 B9DF67F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:56:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A0E68F8039 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:56:20 -0700 (PDT) X-ASG-Debug-ID: 1399985779-04cbb03cc64a1470001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4i0A9U2av7a9TdmI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:56:19 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCuH8H022928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:56:18 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCuHH2000554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:56:17 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s4DCuGFF022732; Tue, 13 May 2014 12:56:16 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:56:16 -0700 Message-ID: <53721660.70007@oracle.com> Date: Tue, 13 May 2014 20:56:00 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 7/9] xfs: negate mount workqueue init error value References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-8-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 7/9] xfs: negate mount workqueue init error value In-Reply-To: <1399971373-6242-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985779 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_super.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 2053767..e1597f2 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1433,7 +1433,7 @@ xfs_fs_fill_super( > if (error) > goto out_free_fsname; > > - error = xfs_init_mount_workqueues(mp); > + error = -xfs_init_mount_workqueues(mp); > if (error) > goto out_close_devices; > > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 07:58:45 2014 Return-Path: <jeff.liu@oracle.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C0B787F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 07:58:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23B44AC001 for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:58:45 -0700 (PDT) X-ASG-Debug-ID: 1399985923-04cbb03cc74a15d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 7DHC9hAegyZChM9v (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 05:58:43 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DCwflV025666 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 12:58:42 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4DCwfDa028692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 13 May 2014 12:58:41 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DCweXN029696; Tue, 13 May 2014 12:58:40 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 05:58:40 -0700 Message-ID: <537216FA.90103@oracle.com> Date: Tue, 13 May 2014 20:58:34 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: negate xfs_icsb_init_counters error value References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-9-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: negate xfs_icsb_init_counters error value In-Reply-To: <1399971373-6242-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399985923 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_super.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index e1597f2..3494eff 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1437,7 +1437,7 @@ xfs_fs_fill_super( > if (error) > goto out_close_devices; > > - error = xfs_icsb_init_counters(mp); > + error = -xfs_icsb_init_counters(mp); > if (error) > goto out_destroy_workqueues; > > Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From jeff.liu@oracle.com Tue May 13 08:06:29 2014 Return-Path: <jeff.liu@oracle.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 0FA9B7F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 08:06:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D465A8F8054 for <xfs@oss.sgi.com>; Tue, 13 May 2014 06:06:25 -0700 (PDT) X-ASG-Debug-ID: 1399986381-04bdf02b8a4db970001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id V38csoWbJtt7fNrk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 06:06:21 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4DD6IqS003386 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 13 May 2014 13:06:19 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DD6Hqe019942 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 13 May 2014 13:06:18 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4DD6GLL004380; Tue, 13 May 2014 13:06:17 GMT Received: from [192.168.1.101] (/27.194.223.221) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 13 May 2014 06:06:16 -0700 Message-ID: <53721882.50005@oracle.com> Date: Tue, 13 May 2014 21:05:06 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfs: list_lru_init returns a negative error References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <1399971373-6242-10-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 9/9] xfs: list_lru_init returns a negative error In-Reply-To: <1399971373-6242-10-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1399986381 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.5774 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/13 2014 16:56 PM, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > And we don't invert it properly when initialising the dquot lru > list. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Cheers, -Jeff From austin@peloton-tech.com Tue May 13 12:11:20 2014 Return-Path: <austin@peloton-tech.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 207897F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 12: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 004F3304064 for <xfs@oss.sgi.com>; Tue, 13 May 2014 10:11:16 -0700 (PDT) X-ASG-Debug-ID: 1400001071-04cb6c72904ca610001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id vEXh2SZaqabKGBp8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 10:11:12 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.179 Received: by mail-ig0-f179.google.com with SMTP id hn18so662376igb.12 for <xfs@oss.sgi.com>; Tue, 13 May 2014 10:11:12 -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=qFW5xlGsBNZaEzfGCMdX8yt1vPqgdHOTSenDqXjnt6U=; b=XBbIk/ZDX2BciNm4CWGlsEfrPLlYnxLTc3BqrQw1A5gYEhfFm4vu+Y0U0wP0+V0NmW 6golKewsukk2UVSzVFJHPe0S9RnF6BAtSLB328Z4o7Fn1KyKFP8qf481uXpXdC/9p7JT asEk2Ybexkpev/6de2FUKKsWcrHhc1CXd7GrcAwVoJ+NEKl9P6ha34QwzjeSMAmwmKPK /NcqZseesNprV7afinMdGFCOQ1vExdwlpiQu7KrTvtXvrJSKCRJnuR0yBkiNSGSogfe+ rULmKjuPDElX3vB8YHIlm9dgBZbLDA8bmhIquE1yjnYxpY7CkF9bQDIqWlSZQc12ALcb uuqQ== X-Gm-Message-State: ALoCoQnMnA3+cqoLUb3bc5AQR40AAFZWpeL6/7tdtH1Cqrxu3Nje8yzEkBjcYaZdraZ9YlQjSXSZ MIME-Version: 1.0 X-Received: by 10.42.206.211 with SMTP id fv19mr564845icb.14.1400001071859; Tue, 13 May 2014 10:11:11 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Tue, 13 May 2014 10:11:11 -0700 (PDT) In-Reply-To: <20140513090321.GR26353@dastard> References: <CANGgnMYPLF+8616Rs9eQOXUc9He2NSgFnNrvHvepV-x+pWS6oQ@mail.gmail.com> <20140305233551.GK6851@dastard> <CANGgnMb=2dYGQO4K36pQ9LEb8E4rT6S_VskLF+n=ndd0_kJr_g@mail.gmail.com> <CANGgnMa80WwQ8zSkL52yYegmQURVQeZiBFv41=FQXMZJ_NaEDw@mail.gmail.com> <20140513034647.GA5421@dastard> <CANGgnMZ0q9uE3NHj2i0SBK1d0vdKLx7QBJeFNb+YwP-5EAmejQ@mail.gmail.com> <20140513063943.GQ26353@dastard> <CANGgnMYn++1++UyX+D2d9GxPxtytpQJv0ThFwdxM-yX7xDWqiA@mail.gmail.com> <20140513090321.GR26353@dastard> Date: Tue, 13 May 2014 10:11:11 -0700 Message-ID: <CANGgnMZqQc_NeaDpO_aX+bndmHrQ9VWo9mkfxhPBkRD-J=N6sQ@mail.gmail.com> Subject: Re: XFS crash? From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner <david@fromorbit.com> Cc: xfs <xfs@oss.sgi.com> Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1400001072 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.5779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 13, 2014 at 2:03 AM, Dave Chinner <david@fromorbit.com> wrote: > On Tue, May 13, 2014 at 12:02:18AM -0700, Austin Schuh wrote: >> On Mon, May 12, 2014 at 11:39 PM, Dave Chinner <david@fromorbit.com> wrote: >> > On Mon, May 12, 2014 at 09:03:48PM -0700, Austin Schuh wrote: >> >> On Mon, May 12, 2014 at 8:46 PM, Dave Chinner <david@fromorbit.com> wrote: >> >> > On Mon, May 12, 2014 at 06:29:28PM -0700, Austin Schuh wrote: >> >> >> On Wed, Mar 5, 2014 at 4:53 PM, Austin Schuh <austin@peloton-tech.com> wrote: >> >> >> > Hi Dave, >> >> >> > >> >> >> > On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner <david@fromorbit.com> wrote: >> >> >> >> On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >> >> >> >>> Howdy, >> >> >> >>> >> >> >> >>> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >> >> >> >>> and I'm seeing a couple lockups and crashes which I think are related >> >> >> >>> to XFS. >> >> >> >> >> >> >> >> I think they ar emore likely related to RT issues.... >> >> >> >> >> >> >> > >> >> >> > That very well may be true. >> >> >> > >> >> >> >> Cheers, >> >> >> >> >> >> >> >> Dave. >> >> >> >> -- >> >> >> >> Dave Chinner >> >> >> >> >> >> I had the issue reproduce itself today with just the main SSD >> >> >> installed. This was on a new machine that was built this morning. >> >> >> There is a lot less going on in this trace than the previous one. >> >> > >> >> > The three blocked threads: >> >> > >> >> > 1. kworker running IO completion waiting on an inode lock, >> >> > holding locked pages. >> >> > 2. kworker running writeback flusher work waiting for a page lock >> >> > 3. direct flush work waiting for allocation, holding page >> >> > locks and the inode lock. >> >> > >> >> > What's the kworker thread running the allocation work doing? >> >> > >> >> > You might need to run `echo w > proc-sysrq-trigger` to get this >> >> > information... >> >> >> >> I was able to reproduce the lockup. I ran `echo w > >> >> /proc/sysrq-trigger` per your suggestion. I don't know how to figure >> >> out what the kworker thread is doing, but I'll happily do it if you >> >> can give me some guidance. >> > >> > There isn't a worker thread blocked doing an allocation in that >> > dump, so it doesn't shed any light on the problem at all. try >> > `echo l > /proc/sysrq-trigger`, followed by `echo t > >> > /proc/sysrq-trigger` so we can see all the processes running on CPUs >> > and all the processes in the system... >> > >> > Cheers, >> > >> > Dave. >> >> Attached is the output of the two commands you asked for. > > Nothing there. There's lots of processes waiting for allocation to > run, and no kworkers running allocation work. This looks more > like a rt-kernel workqueue issue, not an XFS problem. > > FWIW, it woul dbe really helpful if you compiled your kernels with > frame pointers enabled - the stack traces are much more precise and > readable (i.e. gets rid of all the false/stale entrys) and that > helps understanding where things are stuck immensely. > > Cheers, > > Dave. Thanks Dave. I'll go check with the rt-kernel guys and take it from there. Thanks for the frame pointers suggestion. I'll make that change the next time I build a kernel. Austin From amyrhodes@mixmail.com Tue May 13 13:32:52 2014 Return-Path: <amyrhodes@mixmail.com> 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 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 AB8EF7F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 13:32:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7AD5B8F8037 for <xfs@oss.sgi.com>; Tue, 13 May 2014 11:32:49 -0700 (PDT) X-ASG-Debug-ID: 1400005963-04bdf02b8a4eb770001-NocioJ Received: from mailer.nle1.net (mailer.nle1.net [199.15.249.125]) by cuda.sgi.com with ESMTP id LOOGhnJSIKpqncIq for <xfs@oss.sgi.com>; Tue, 13 May 2014 11:32:44 -0700 (PDT) X-Barracuda-Envelope-From: amyrhodes@mixmail.com X-Barracuda-Apparent-Source-IP: 199.15.249.125 Received: from web2.nlenet.net (web2.nlenet.net [199.15.249.117]) by mailer.nle1.net (Postfix) with ESMTP id AC27C217BD; Tue, 13 May 2014 14:32:41 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by web2.nlenet.net (Postfix) with ESMTP id 7D3FD2679CA; Tue, 13 May 2014 15:50:09 -0400 (EDT) Received: from web2.nlenet.net ([127.0.0.1]) by localhost (web2.nlenet.net [127.0.0.1]) (amavisd-new, port 10025) with LMTP id 17128-01-42; Tue, 13 May 2014 15:50:09 -0400 (EDT) Received: from web2.nlenet.net (localhost [127.0.0.1]) by web2.nlenet.net (Postfix) with ESMTP id 2DB272679C4; Tue, 13 May 2014 15:50:07 -0400 (EDT) From: "Amy" <amyrhodes@mixmail.com> Reply-To: sgt.rhodes@aim.com Subject: CAN WE WORK TOGETHER ? Date: Tue, 13 May 2014 15:50:07 -0400 X-ASG-Orig-Subj: CAN WE WORK TOGETHER ? Message-Id: <20140513194955.M88805@mixmail.com> X-Mailer: OpenWebMail 2.52 20060618 X-OriginatingIP: 176.3.11.6 (accounts) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 To: undisclosed-recipients: ; X-Virus-Scanned: by amavisd-new at web2.nlenet.net X-Barracuda-Connect: mailer.nle1.net[199.15.249.125] X-Barracuda-Start-Time: 1400005963 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.33 X-Barracuda-Spam-Status: No, SCORE=2.33 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, BSF_SC7_SA298e, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.20 BSF_SC7_SA298e Custom Rule SA298e 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 Hi, Can we work together for benefit ? . If interested reply through my private email: ( sgt.rhodes@aim.com ) please view website below to know more Rgds, S.Rhodes From fdmanana@gmail.com Tue May 13 15:05:14 2014 Return-Path: <fdmanana@gmail.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,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 07B337F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 15:05:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D9D4AC006 for <xfs@oss.sgi.com>; Tue, 13 May 2014 13:05:10 -0700 (PDT) X-ASG-Debug-ID: 1400011502-04bdf02b8c4ee620001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id p0b9Z87MzXOZXjPB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 13:05:03 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id u56so930022wes.28 for <xfs@oss.sgi.com>; Tue, 13 May 2014 13:05:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=VdfB3OCE3LaSnlbjhX4AmgI38V1FRcq94FeJJ0nGpGo=; b=jQqifnkhYJmSP5PRaIJ66Wcx30ZGSAP1u73GNPZwCKDN1slqakhnu3Rb1++Vt7D1X1 +HX44kA0ZUaa9Alk1+hkxfMdfGCbZ4kJ3vD2+8lBP0xGBVhVGrD6ymN85ArtfNnrOmFI eE13OGwFEliWkLOuJak2TxV3U+QdJy7fIYZnD7gdiIIzg5n9rBFkjFepJyq/ttZgfBCv KKaamYfJJKG/2vvZfwtruEV2P1OiEb8vAI4ys+ntvT9+lQncA36Qu5pFJX3v/KmrouCs 21C4BALe853cGjFJSCvvZYnLJ38o071EK+1Hi8HcC3Zicw/4UKyz/XTUEi5ku7JJ6ayu ae9Q== X-Received: by 10.180.99.40 with SMTP id en8mr7614wib.24.1400011502215; Tue, 13 May 2014 13:05:02 -0700 (PDT) Received: from debian-vm3.lan (bl14-139-83.dsl.telepac.pt. [85.247.139.83]) by mx.google.com with ESMTPSA id nb8sm23620716wic.18.2014.05.13.13.05.00 for <multiple recipients> (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 13 May 2014 13:05:01 -0700 (PDT) From: Filipe David Borba Manana <fdmanana@gmail.com> To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, Filipe David Borba Manana <fdmanana@gmail.com>, Josef Bacik <jbacik@fb.com> Subject: [PATCH] xfstests: btrfs, add regression test for send with extrefs Date: Tue, 13 May 2014 22:04:41 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs, add regression test for send with extrefs Message-Id: <1400015081-2192-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1400011503 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.5782 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 Regression for btrfs send when an inode only has extended references associated to it (no regular references present). This used to cause incorrect access to a b+tree leaf, where an extended reference item was accessed as if it were a regular reference item, causing unexpected and unpredictable behaviour such as producing a random/weird path string or a crash. This issue is fixed by the following linux kernel btrfs patch: Btrfs: send, fix incorrect ref access when using extrefs Cc: Josef Bacik <jbacik@fb.com> Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> --- tests/btrfs/050 | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/050.out | 1 + tests/btrfs/group | 1 + 3 files changed, 111 insertions(+) create mode 100755 tests/btrfs/050 create mode 100644 tests/btrfs/050.out diff --git a/tests/btrfs/050 b/tests/btrfs/050 new file mode 100755 index 0000000..6e4bd13 --- /dev/null +++ b/tests/btrfs/050 @@ -0,0 +1,109 @@ +#! /bin/bash +# FS QA Test No. btrfs/050 +# +# Regression for btrfs send when an inode only has extended references +# associated to it (no regular references present). This used to cause +# incorrect access to a b+tree leaf, where an extended reference item +# was accessed as if it were a regular reference item, causing unexpected +# and unpredictable behaviour such as producing a random/weird path string +# or a crash. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: send, fix incorrect ref access when using extrefs +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs "-O extref" >/dev/null 2>&1 +_scratch_mount + +# 2550 hard links is enough to cause creation of extended references +# even if the leaf/node size is 64Kb (largest possible). +NUM_LINKS=2550 +TEST_PATH=$SCRATCH_MNT/home/john/files/series/qwerty + +mkdir -p $TEST_PATH +touch $TEST_PATH/foobar + +# Create a bunch of hard links for the file, such that at least one +# inode extended reference item is created. +for i in `seq 1 $NUM_LINKS`; do + ln $TEST_PATH/foobar $TEST_PATH/foobar_link_`printf "%04d" $i` +done + +# The only link we'll have alive at the end. +ln $TEST_PATH/foobar $TEST_PATH/final_foobar_name + +# Now delete all previous hard links (except the last one). This will +# remove the regular inode reference item from the b+tree, and will +# leave only an inode extended reference item, which is the condition +# necessary to trigger the bug. +rm -f $TEST_PATH/foobar +for i in `seq 1 $NUM_LINKS`; do + rm -f $TEST_PATH/foobar_link_`printf "%04d" $i` +done + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +run_check $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/050.out b/tests/btrfs/050.out new file mode 100644 index 0000000..37f2cbc --- /dev/null +++ b/tests/btrfs/050.out @@ -0,0 +1 @@ +QA output created by 050 diff --git a/tests/btrfs/group b/tests/btrfs/group index 59b0c98..69a80e0 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -52,3 +52,4 @@ 047 auto quick 048 auto quick 049 auto quick +050 auto -- 1.9.1 From selyanin@aticon-invest.ru Tue May 13 17:27:32 2014 Return-Path: <selyanin@aticon-invest.ru> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=FS_LARGE_PERCENT2 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 3D4117F3F for <xfs@oss.sgi.com>; Tue, 13 May 2014 17:27:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F15E8F8035 for <xfs@oss.sgi.com>; Tue, 13 May 2014 15:27:28 -0700 (PDT) X-ASG-Debug-ID: 1400020042-04bdf02b8a4f29b0001-NocioJ Received: from scp18.hosting.reg.ru (scp18.hosting.reg.ru [37.140.192.127]) by cuda.sgi.com with ESMTP id qpDsZGEUUFiargNj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 15:27:25 -0700 (PDT) X-Barracuda-Envelope-From: selyanin@aticon-invest.ru X-Barracuda-Apparent-Source-IP: 37.140.192.127 Received: from 220-136-165-181.dynamic.hinet.net ([220.136.165.181]:28557 helo=aticon-invest.ru) by scp18.hosting.reg.ru with esmtpa (Exim 4.80.1) (envelope-from <selyanin@aticon-invest.ru>) id 1WkLA9-0003ir-3B; Wed, 14 May 2014 02:27:05 +0400 Message-ID: <8B651593.AD1A6AEA@aticon-invest.ru> Date: Wed, 14 May 2014 00:27:01 +0200 Reply-To: "Osasse" <selyanin@aticon-invest.ru> From: "Osasse" <selyanin@aticon-invest.ru> User-Agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.4) Gecko/20070622 Thunderbird/2.0.0.4 MIME-Version: 1.0 To: <osasse@orthoshop.be> Subject: Re: 1000000% New - 10000% Easy Content-Type: text/plain; charset="iso-8859-1" X-ASG-Orig-Subj: Re: 1000000% New - 10000% Easy Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - scp18.hosting.reg.ru X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - aticon-invest.ru X-Get-Message-Sender-Via: scp18.hosting.reg.ru: authenticated_id: selyanin@aticon-invest.ru X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: scp18.hosting.reg.ru[37.140.192.127] X-Barracuda-Start-Time: 1400020045 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: 1.04 X-Barracuda-Spam-Status: No, SCORE=1.04 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FS_LARGE_PERCENT2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.04 FS_LARGE_PERCENT2 Larger than 100% in subj. 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header You probably have never even heard about this before (its that GOOD) It's a new website that's already got over 5,000 people making $70 Every 60 Seconds Watch THIS! http://mollux.dk/bxgdjxc.php After you go to the link above, you will be able to tap into something that is FREE until Tomorrow. Here's the link again: http://www.akos.tv/ogajmsk.php Just make sure you visit and grandfather yourself in before tomorrow. From dave@fromorbit.com Tue May 13 20:46:54 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E440B29DF8 for <xfs@oss.sgi.com>; Tue, 13 May 2014 20:46:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A380F304032 for <xfs@oss.sgi.com>; Tue, 13 May 2014 18:46:50 -0700 (PDT) X-ASG-Debug-ID: 1400032007-04bdf02b8a4f8b80001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id St1tpm15koWHi5xi for <xfs@oss.sgi.com>; Tue, 13 May 2014 18:46:47 -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: Al5OAHnKclN5LL1sPGdsb2JhbABZgwaISKQsAQEBAQEGm0EXAwEBAQE4NYIlAS0vOxgYUgMHLYhAnFe0K4VUiDVWhDYEriGCBys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 14 May 2014 11:16:22 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WkOGx-0003B4-ES for xfs@oss.sgi.com; Wed, 14 May 2014 11:46:19 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WkOGx-0003fr-DM for xfs@oss.sgi.com; Wed, 14 May 2014 11:46:19 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH] xfs: log vector rounding leaks log space Date: Wed, 14 May 2014 11:46:19 +1000 X-ASG-Orig-Subj: [PATCH] xfs: log vector rounding leaks log space Message-Id: <1400031979-14089-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1400032007 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.5790 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The addition of direct formatting of log items into the CIL linear buffer added alignment restrictions that the start of each vector needed to be 64 bit aligned. Hence padding was added in xlog_finish_iovec() to round up the vector length to ensure the next vector started with the correct alignment. This adds a small number of bytes to the size of the linear buffer that is otherwise unused. The issue is that we then use the linear buffer size to determine the log space used by the log item, and this includes the unused space. Hence when we account for space used by the log item, it's more than is actually written into the iclogs, and hence we slowly leak this space. This results on log hangs when reserving space, with threads getting stuck with these stack traces: Call Trace: [<ffffffff81d15989>] schedule+0x29/0x70 [<ffffffff8150d3a2>] xlog_grant_head_wait+0xa2/0x1a0 [<ffffffff8150d55d>] xlog_grant_head_check+0xbd/0x140 [<ffffffff8150ee33>] xfs_log_reserve+0x103/0x220 [<ffffffff814b7f05>] xfs_trans_reserve+0x2f5/0x310 ..... The 4 bytes is significant. Brain Foster did all the hard work in tracking down a reproducable leak to inode chunk allocation (it went away with the ikeep mount option). His rough numbers were that creating 50,000 inodes leaked 11 log blocks. This turns out to be roughly 800 inode chunks or 1600 inode cluster buffers. That works out at roughly 4 bytes per cluster buffer logged, and at that I started looking for a 4 byte leak in the buffer logging code. What I found was that a struct xfs_buf_log_format structure for an inode cluster buffer is 28 bytes in length. This gets rounded up to 32 bytes, but the vector length remains 28 bytes. Hence the CIL ticket reservation is decremented by 32 bytes (via lv->lv_buf_len) for that vector rather than 28 bytes which are written into the log. The fix for this problem is to separately track the bytes used by the log vectors in the item and use that instead of the buffer length when accounting for the log space that will be used by the formatted log item. Again, thanks to Brian Foster for doing all the hard work and long hours to isolate this leak and make finding the bug relatively simple. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_log.h | 19 +++++++++++++------ fs/xfs/xfs_log_cil.c | 7 ++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 2c40044..84e0deb 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -24,7 +24,8 @@ struct xfs_log_vec { struct xfs_log_iovec *lv_iovecp; /* iovec array */ struct xfs_log_item *lv_item; /* owner */ char *lv_buf; /* formatted buffer */ - int lv_buf_len; /* size of formatted buffer */ + int lv_bytes; /* accounted space in buffer */ + int lv_buf_len; /* aligned size of buffer */ int lv_size; /* size of allocated lv */ }; @@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, return vec->i_addr; } +/* + * We need to make sure the next buffer is naturally aligned for the biggest + * basic data type we put into it. We already accounted for this padding when + * sizing the buffer. + * + * However, this padding does not get written into the log, and hence we have to + * track the space used by the log vectors separately to prevent log space hangs + * due to inaccurate accounting (i.e. a leak) of the used log space through the + * CIL context ticket. + */ static inline void xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len) { - /* - * We need to make sure the next buffer is naturally aligned for the - * biggest basic data type we put into it. We already accounted for - * this when sizing the buffer. - */ lv->lv_buf_len += round_up(len, sizeof(uint64_t)); + lv->lv_bytes += len; vec->i_len = len; } diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 039c873..b3425b3 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -97,7 +97,7 @@ xfs_cil_prepare_item( { /* Account for the new LV being passed in */ if (lv->lv_buf_len != XFS_LOG_VEC_ORDERED) { - *diff_len += lv->lv_buf_len; + *diff_len += lv->lv_bytes; *diff_iovecs += lv->lv_niovecs; } @@ -111,7 +111,7 @@ xfs_cil_prepare_item( else if (old_lv != lv) { ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED); - *diff_len -= old_lv->lv_buf_len; + *diff_len -= old_lv->lv_bytes; *diff_iovecs -= old_lv->lv_niovecs; kmem_free(old_lv); } @@ -239,7 +239,7 @@ xlog_cil_insert_format_items( * that the space reservation accounting is correct. */ *diff_iovecs -= lv->lv_niovecs; - *diff_len -= lv->lv_buf_len; + *diff_len -= lv->lv_bytes; } else { /* allocate new data chunk */ lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); @@ -259,6 +259,7 @@ xlog_cil_insert_format_items( /* 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))); -- 1.9.0 From austin@peloton-tech.com Tue May 13 21:29:18 2014 Return-Path: <austin@peloton-tech.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D502029DF8 for <xfs@oss.sgi.com>; Tue, 13 May 2014 21:29:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C041730404E for <xfs@oss.sgi.com>; Tue, 13 May 2014 19:29:14 -0700 (PDT) X-ASG-Debug-ID: 1400034552-04cb6c72914dc120001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id XMiCPGWjagGxxvkE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 13 May 2014 19:29:13 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 Received: by mail-ie0-f179.google.com with SMTP id rd18so1250976iec.10 for <xfs@oss.sgi.com>; Tue, 13 May 2014 19:29:13 -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:cc :content-type; bh=cLW/IAcXsj+xhKbgHcTGiGEP3MgeUGDDviRwk8L0Zb0=; b=F7Cy0I/wenY2uDDIk3AgVolzqOcHs1EH1kk1rnl8zCGsR2uI1o2e5mevx5GOUjN3E1 ODB5KItqzE2exlPFrSXKlJnU8QLf6uIN94kXHG7pIwOAq+0Iuf6dHhR8/VyHw/hwkC5a QwW/S8AgIR3w2vpRbR/BjTcyxGGSucqHY3ELvgCPJplF77o8DzBbIvImJ2e7yD1wW30a wkSuPH7e+5eiBeT/BMTUx+B5tnkIKX1cAcJqHbxHvc9W+CxH0+q31LxRaUOEXIVTPPiG 3NHzphrhCIIu6GjxV2qMuzqJcKl86T7qI37vl57oSjpMWyGtDq9HYb9xQo8xTPlIAVji ncIA== X-Gm-Message-State: ALoCoQnmBElNTbr6ubKPsx97qQnb0MbbXQwp91gX+9bYrWxrXduZFbHDwyu5uM1pWa6/JPvAiIIP MIME-Version: 1.0 X-Received: by 10.50.126.106 with SMTP id mx10mr1547076igb.27.1400034552797; Tue, 13 May 2014 19:29:12 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Tue, 13 May 2014 19:29:12 -0700 (PDT) Date: Tue, 13 May 2014 19:29:12 -0700 Message-ID: <CANGgnMbHckBQdKGN_N5Q6qEKc9n1CenxvMpeXog1NbSdL8UrTw@mail.gmail.com> Subject: Filesystem lockup with CONFIG_PREEMPT_RT From: Austin Schuh <austin@peloton-tech.com> X-ASG-Orig-Subj: Filesystem lockup with CONFIG_PREEMPT_RT To: linux-kernel@vger.kernel.org Cc: xfs <xfs@oss.sgi.com> Content-Type: multipart/mixed; boundary=047d7b3a9c0a31cbcb04f952f28d X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1400034553 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=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5791 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --047d7b3a9c0a31cbcb04f952f28d Content-Type: text/plain; charset=UTF-8 Hi, I am observing a filesystem lockup with XFS on a CONFIG_PREEMPT_RT patched kernel. I have currently only triggered it using dpkg. Dave Chinner on the XFS mailing list suggested that it was a rt-kernel workqueue issue as opposed to a XFS problem after looking at the kernel messages. $ uname -a Linux vpc5 3.10.24-rt22abs #15 SMP PREEMPT RT Tue May 13 14:42:22 PDT 2014 x86_64 GNU/Linux The only modification to the kernel besides the RT patch is that I have applied tglx's "genirq: Sanitize spurious interrupt detection of threaded irqs" patch. Any ideas on what could be wrong? Is there any information that I can pull before I reboot the machine that would be useful? I have the output of triggering sysrq with l and t if that would be useful. Attached is the kernel blocked task message output. Thanks, Austin --047d7b3a9c0a31cbcb04f952f28d Content-Type: application/octet-stream; name=vpc5_xfs_lockup_locks Content-Disposition: attachment; filename=vpc5_xfs_lockup_locks Content-Transfer-Encoding: base64 X-Attachment-Id: f_hv605zdi0 TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY2ODQ5XSBJTkZPOiB0YXNrIGt3 b3JrZXIvMjoxOjgyIGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4 OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY2OTE3XSAiZWNobyAwID4gL3Byb2Mvc3lzL2tl cm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAx MyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2Njk3Ml0ga3dvcmtlci8yOjEgICAgIEQg MDAwMDAwMDAwMDAwMDAwMCAgICAgMCAgICA4MiAgICAgIDIgMHgwMDAwMDAwMApNYXkgMTMgMTg6 NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjY5ODFdIFdvcmtxdWV1ZTogeGZzLWRhdGEvc2Rh NSB4ZnNfZW5kX2lvCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2Njk4NV0g IGZmZmY4ODAzZjY0YjliNTggMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAwMDAwIGZmZmY4 ODAzZjY1OWM2MDAKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY2OTg3XSAg ZmZmZjg4MDM2NjE1M2E0MCBmZmZmODgwM2Y2NGI5ZmQ4IDAwMDAwMDAwMDAwNjM4MDAgZmZmZjg4 MDNmNjRiOWZkOApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjY5ODhdICAw MDAwMDAwMDAwMDYzODAwIGZmZmY4ODAzZjY0YjExODAgZmZmZjg4MDNmNjRiOWI3OCBmZmZmODgw M2Y2NGIxMTgwCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2Njk5MV0gQ2Fs bCBUcmFjZToKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY2OTk3XSAgWzxm ZmZmZmZmZjgxNGI3NzExPl0gc2NoZWR1bGUrMHg3NS8weDg3Ck1heSAxMyAxODo0NToxOCB2cGM1 IGtlcm5lbDogWyAgOTU5Ljk2Njk5OV0gIFs8ZmZmZmZmZmY4MTRiN2M3ND5dIF9fcnRfbXV0ZXhf c2xvd2xvY2srMHg4ZS8weGM3Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2 NzAwMV0gIFs8ZmZmZmZmZmY4MTRiN2RiNj5dIHJ0X211dGV4X3Nsb3dsb2NrKzB4MTA5LzB4MThh Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAwNV0gIFs8ZmZmZmZmZmY4 MTA3YTYyOT5dID8gX19sb2NrX2FjcXVpcmUuaXNyYS4yNysweDFjZS8weDU0MQpNYXkgMTMgMTg6 NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwMDhdICBbPGZmZmZmZmZmODExYjFmMWY+XSA/ IHhmc19zZXRmaWxlc2l6ZSsweDgwLzB4MTQ4Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDog WyAgOTU5Ljk2NzAwOV0gIFs8ZmZmZmZmZmY4MTRiN2U0ZT5dIHJ0X211dGV4X2xvY2srMHgxNy8w eDE5Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAxMV0gIFs8ZmZmZmZm ZmY4MTA3ZmRiZD5dIHJ0X2Rvd25fd3JpdGVfbmVzdGVkKzB4M2EvMHg0MQpNYXkgMTMgMTg6NDU6 MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwMTRdICBbPGZmZmZmZmZmODExZjE4ZDA+XSA/IHhm c19pbG9jaysweDk5LzB4ZDYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 MDE1XSAgWzxmZmZmZmZmZjgxMWYxOGQwPl0geGZzX2lsb2NrKzB4OTkvMHhkNgpNYXkgMTMgMTg6 NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwMTddICBbPGZmZmZmZmZmODExYjFmMWY+XSB4 ZnNfc2V0ZmlsZXNpemUrMHg4MC8weDE0OApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsg IDk1OS45NjcwMTldICBbPGZmZmZmZmZmODExYjFlYTQ+XSA/IHhmc19zZXRmaWxlc2l6ZSsweDUv MHgxNDgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MDIxXSAgWzxmZmZm ZmZmZjgxMDRmMmUwPl0gPyBwcm9jZXNzX29uZV93b3JrKzB4MTZmLzB4Mzk3Ck1heSAxMyAxODo0 NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAyM10gIFs8ZmZmZmZmZmY4MTFiMmJiYT5dIHhm c19lbmRfaW8rMHg4My8weDk5Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2 NzAyNV0gIFs8ZmZmZmZmZmY4MTA0ZjM4ND5dIHByb2Nlc3Nfb25lX3dvcmsrMHgyMTMvMHgzOTcK TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MDI2XSAgWzxmZmZmZmZmZjgx MDRmMmUwPl0gPyBwcm9jZXNzX29uZV93b3JrKzB4MTZmLzB4Mzk3Ck1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAyOF0gIFs8ZmZmZmZmZmY4MTA0ZjkyNT5dIHdvcmtlcl90 aHJlYWQrMHgxNDkvMHgyMjQKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 MDMwXSAgWzxmZmZmZmZmZjgxMDRmN2RjPl0gPyByZXNjdWVyX3RocmVhZCsweDJhNS8weDJhNQpN YXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwMzJdICBbPGZmZmZmZmZmODEw NTUwYjI+XSBrdGhyZWFkKzB4YTIvMHhhYQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsg IDk1OS45NjcwMzVdICBbPGZmZmZmZmZmODEwNTUwMTA+XSA/IF9fa3RocmVhZF9wYXJrbWUrMHg2 NS8weDY1Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAzN10gIFs8ZmZm ZmZmZmY4MTRiZTFkYz5dIHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwCk1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzAzOF0gIFs8ZmZmZmZmZmY4MTA1NTAxMD5dID8gX19rdGhy ZWFkX3BhcmttZSsweDY1LzB4NjUKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3MDQwXSA0IGxvY2tzIGhlbGQgYnkga3dvcmtlci8yOjEvODI6Ck1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzA1MV0gICMwOiAgKHhmcy1kYXRhLyVzKXsuLi4uLi59LCBh dDogWzxmZmZmZmZmZjgxMDRmMmUwPl0gcHJvY2Vzc19vbmVfd29yaysweDE2Zi8weDM5NwpNYXkg MTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwNTZdICAjMTogICgoJmlvZW5kLT5p b193b3JrKSl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTA0ZjJlMD5dIHByb2Nlc3Nfb25lX3dv cmsrMHgxNmYvMHgzOTcKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MDYx XSAgIzI6ICAoc2JfaW50ZXJuYWwpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODExYjFlYTQ+XSB4 ZnNfc2V0ZmlsZXNpemUrMHg1LzB4MTQ4Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAg OTU5Ljk2NzA2Nl0gICMzOiAgKCYoJmlwLT5pX2xvY2spLT5tcl9sb2NrKXsuLi4uLi59LCBhdDog WzxmZmZmZmZmZjgxMWYxOGQwPl0geGZzX2lsb2NrKzB4OTkvMHhkNgpNYXkgMTMgMTg6NDU6MTgg dnBjNSBrZXJuZWw6IFsgIDk1OS45NjcwNzNdIElORk86IHRhc2sga3dvcmtlci91MTY6NToyNDEg YmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRzLgpNYXkgMTMgMTg6NDU6MTggdnBjNSBr ZXJuZWw6IFsgIDk1OS45NjcxMjddICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFz a190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KTWF5IDEzIDE4OjQ1OjE4IHZw YzUga2VybmVsOiBbICA5NTkuOTY3MTgxXSBrd29ya2VyL3UxNjo1ICAgRCAwMDAwMDAwMDAwMDAw MDAyICAgICAwICAgMjQxICAgICAgMiAweDAwMDAwMDAwCk1heSAxMyAxODo0NToxOCB2cGM1IGtl cm5lbDogWyAgOTU5Ljk2NzE4N10gV29ya3F1ZXVlOiB3cml0ZWJhY2sgYmRpX3dyaXRlYmFja193 b3JrZm4gKGZsdXNoLTg6MCkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 MTkwXSAgZmZmZjg4MDNmNTcyYjNjOCAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4ODA0MmRiNjJiODAg ZmZmZjg4MDNmOGY5YzYwMApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njcx OTJdICBmZmZmODgwM2Y2M2I2OTAwIGZmZmY4ODAzZjU3MmJmZDggMDAwMDAwMDAwMDA2MzgwMCBm ZmZmODgwM2Y1NzJiZmQ4Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzE5 M10gIDAwMDAwMDAwMDAwNjM4MDAgZmZmZjg4MDNmNjNiNjkwMCBmZmZmODgwMzAwMDAwMDAxIGZm ZmY4ODAzZjYzYjY5MDAKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MTk1 XSBDYWxsIFRyYWNlOgpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcxOThd ICBbPGZmZmZmZmZmODE0Yjc3MTE+XSBzY2hlZHVsZSsweDc1LzB4ODcKTWF5IDEzIDE4OjQ1OjE4 IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjAwXSAgWzxmZmZmZmZmZjgxNGI2NzkwPl0gc2NoZWR1 bGVfdGltZW91dCsweDM3LzB4ZjkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3MjAxXSAgWzxmZmZmZmZmZjgxNGI2ZjI1Pl0gPyBfX3dhaXRfZm9yX2NvbW1vbisweDJhLzB4 ZGEKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjAzXSAgWzxmZmZmZmZm ZjgxNGI2Zjc4Pl0gX193YWl0X2Zvcl9jb21tb24rMHg3ZC8weGRhCk1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzIwNV0gIFs8ZmZmZmZmZmY4MTRiNjc1OT5dID8gY29uc29s ZV9jb25kaXRpb25hbF9zY2hlZHVsZSsweDE5LzB4MTkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2Vy bmVsOiBbICA5NTkuOTY3MjA3XSAgWzxmZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxl dGlvbisweDI0LzB4MjYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjA5 XSAgWzxmZmZmZmZmZjgxMWRhMGZlPl0geGZzX2JtYXBpX2FsbG9jYXRlKzB4ZDgvMHhlYQpNYXkg MTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcyMTFdICBbPGZmZmZmZmZmODExZGE0 NTM+XSB4ZnNfYm1hcGlfd3JpdGUrMHgzNDMvMHg1OWIKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2Vy bmVsOiBbICA5NTkuOTY3MjEzXSAgWzxmZmZmZmZmZjgxMWQ3ZDc1Pl0gPyBfX3hmc19ibWFwaV9h bGxvY2F0ZSsweDIzYy8weDIzYwpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45 NjcyMTZdICBbPGZmZmZmZmZmODExYmZiOTQ+XSB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUrMHgx YjkvMHgyYzIKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjE4XSAgWzxm ZmZmZmZmZjgxMWIyMjE4Pl0geGZzX21hcF9ibG9ja3MrMHgxMmIvMHgyMDMKTWF5IDEzIDE4OjQ1 OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjIxXSAgWzxmZmZmZmZmZjgxMGQ0NTFjPl0gPyBy Y3VfcmVhZF91bmxvY2srMHgyMy8weDIzCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAg OTU5Ljk2NzIyM10gIFs8ZmZmZmZmZmY4MTFiMzI2YT5dIHhmc192bV93cml0ZXBhZ2UrMHgyODAv MHg0YjgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjI2XSAgWzxmZmZm ZmZmZjgxMGRjMjdjPl0gX193cml0ZXBhZ2UrMHgxOC8weDM3Ck1heSAxMyAxODo0NToxOCB2cGM1 IGtlcm5lbDogWyAgOTU5Ljk2NzIyOF0gIFs8ZmZmZmZmZmY4MTBkY2RkMD5dIHdyaXRlX2NhY2hl X3BhZ2VzKzB4MjVhLzB4MzdlCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2 NzIzMF0gIFs8ZmZmZmZmZmY4MTBkYzI2ND5dID8gcGFnZV9pbmRleCsweDFhLzB4MWEKTWF5IDEz IDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjMyXSAgWzxmZmZmZmZmZjgxNGI4MWQ4 Pl0gPyBydF9zcGluX2xvY2tfc2xvd3VubG9jaysweDE0LzB4MjAKTWF5IDEzIDE4OjQ1OjE4IHZw YzUga2VybmVsOiBbICA5NTkuOTY3MjM0XSAgWzxmZmZmZmZmZjgxMGRjZjM1Pl0gZ2VuZXJpY193 cml0ZXBhZ2VzKzB4NDEvMHg1YgpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45 NjcyMzZdICBbPGZmZmZmZmZmODExYjFlMjk+XSB4ZnNfdm1fd3JpdGVwYWdlcysweDUxLzB4NWMK TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjM4XSAgWzxmZmZmZmZmZjgx MGRlMDViPl0gZG9fd3JpdGVwYWdlcysweDIxLzB4MmYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2Vy bmVsOiBbICA5NTkuOTY3MjM5XSAgWzxmZmZmZmZmZjgxMTQyYzFjPl0gX193cml0ZWJhY2tfc2lu Z2xlX2lub2RlKzB4N2IvMHgyMzgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3MjQwXSAgWzxmZmZmZmZmZjgxMTQzZTc0Pl0gd3JpdGViYWNrX3NiX2lub2RlcysweDIyMC8w eDM3YQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcyNDJdICBbPGZmZmZm ZmZmODExNDQwNDI+XSBfX3dyaXRlYmFja19pbm9kZXNfd2IrMHg3NC8weGI5Ck1heSAxMyAxODo0 NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzI0NF0gIFs8ZmZmZmZmZmY4MTE0NDFjNT5dIHdi X3dyaXRlYmFjaysweDEzZS8weDJhMwpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1 OS45NjcyNDVdICBbPGZmZmZmZmZmODExNDQ2M2I+XSB3Yl9kb193cml0ZWJhY2srMHgxNjMvMHgx ZDkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjQ3XSAgWzxmZmZmZmZm ZjgxMTQ0NzFkPl0gYmRpX3dyaXRlYmFja193b3JrZm4rMHg2Yy8weGZlCk1heSAxMyAxODo0NTox OCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzI0OV0gIFs8ZmZmZmZmZmY4MTA0ZjM4ND5dIHByb2Nl c3Nfb25lX3dvcmsrMHgyMTMvMHgzOTcKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5 NTkuOTY3MjUwXSAgWzxmZmZmZmZmZjgxMDRmMmUwPl0gPyBwcm9jZXNzX29uZV93b3JrKzB4MTZm LzB4Mzk3Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzI1Ml0gIFs8ZmZm ZmZmZmY4MTA0ZjkyNT5dIHdvcmtlcl90aHJlYWQrMHgxNDkvMHgyMjQKTWF5IDEzIDE4OjQ1OjE4 IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjU0XSAgWzxmZmZmZmZmZjgxMDRmN2RjPl0gPyByZXNj dWVyX3RocmVhZCsweDJhNS8weDJhNQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1 OS45NjcyNTVdICBbPGZmZmZmZmZmODEwNTUwYjI+XSBrdGhyZWFkKzB4YTIvMHhhYQpNYXkgMTMg MTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcyNThdICBbPGZmZmZmZmZmODEwNTUwMTA+ XSA/IF9fa3RocmVhZF9wYXJrbWUrMHg2NS8weDY1Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5l bDogWyAgOTU5Ljk2NzI1OV0gIFs8ZmZmZmZmZmY4MTRiZTFkYz5dIHJldF9mcm9tX2ZvcmsrMHg3 Yy8weGIwCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzI2MV0gIFs8ZmZm ZmZmZmY4MTA1NTAxMD5dID8gX19rdGhyZWFkX3BhcmttZSsweDY1LzB4NjUKTWF5IDEzIDE4OjQ1 OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3MjYyXSA1IGxvY2tzIGhlbGQgYnkga3dvcmtlci91 MTY6NS8yNDE6Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzI3OF0gICMw OiAgKHdyaXRlYmFjayl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTA0ZjJlMD5dIHByb2Nlc3Nf b25lX3dvcmsrMHgxNmYvMHgzOTcKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3MjgzXSAgIzE6ICAoKCYoJndiLT5kd29yayktPndvcmspKXsuLi4uLi59LCBhdDogWzxmZmZm ZmZmZjgxMDRmMmUwPl0gcHJvY2Vzc19vbmVfd29yaysweDE2Zi8weDM5NwpNYXkgMTMgMTg6NDU6 MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcyODhdICAjMjogICgmdHlwZS0+c191bW91bnRfa2V5 IzE4KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMTIzZDRmPl0gZ3JhYl9zdXBlcl9wYXNzaXZl KzB4NjAvMHg4YQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45NjcyOTRdICAj MzogIChzYl9pbnRlcm5hbCl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTFmZjYzOD5dIHhmc190 cmFuc19hbGxvYysweDI0LzB4M2QKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3Mjk5XSAgIzQ6ICAoJigmaXAtPmlfbG9jayktPm1yX2xvY2spey4uLi4uLn0sIGF0OiBbPGZm ZmZmZmZmODExZjE4ZDA+XSB4ZnNfaWxvY2srMHg5OS8weGQ2Ck1heSAxMyAxODo0NToxOCB2cGM1 IGtlcm5lbDogWyAgOTU5Ljk2NzMxNV0gSU5GTzogdGFzayBkcGtnOjU4MjUgYmxvY2tlZCBmb3Ig bW9yZSB0aGFuIDEyMCBzZWNvbmRzLgpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1 OS45NjczNjddICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3Nl Y3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBb ICA5NTkuOTY3NDIyXSBkcGtnICAgICAgICAgICAgRCAwMDAwMDAwMDAwMDAwMDAyICAgICAwICA1 ODI1ICAgNTc4OSAweDAwMDAwMDAwCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5 Ljk2NzQyNV0gIGZmZmY4ODAzZjU3Y2Q3NzggMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAw MDAxIGZmZmY4ODAzZjhmOWM2MDAKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTku OTY3NDI3XSAgZmZmZjg4MDNmNTdjZDc3OCBmZmZmODgwM2Y1N2NkZmQ4IDAwMDAwMDAwMDAwNjM4 MDAgZmZmZjg4MDNmNTdjZGZkOApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45 Njc0MjhdICAwMDAwMDAwMDAwMDYzODAwIGZmZmY4ODAzZjY1OWM2MDAgZmZmZjg4MDMwMDAwMDAw MSBmZmZmODgwM2Y2NTljNjAwCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2 NzQzMF0gQ2FsbCBUcmFjZToKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 NDMzXSAgWzxmZmZmZmZmZjgxNGI3NzExPl0gc2NoZWR1bGUrMHg3NS8weDg3Ck1heSAxMyAxODo0 NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQzNV0gIFs8ZmZmZmZmZmY4MTRiNjc5MD5dIHNj aGVkdWxlX3RpbWVvdXQrMHgzNy8weGY5Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAg OTU5Ljk2NzQzNl0gIFs8ZmZmZmZmZmY4MTRiNmYyNT5dID8gX193YWl0X2Zvcl9jb21tb24rMHgy YS8weGRhCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQzOF0gIFs8ZmZm ZmZmZmY4MTRiNmY3OD5dIF9fd2FpdF9mb3JfY29tbW9uKzB4N2QvMHhkYQpNYXkgMTMgMTg6NDU6 MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc0NDBdICBbPGZmZmZmZmZmODE0YjY3NTk+XSA/IGNv bnNvbGVfY29uZGl0aW9uYWxfc2NoZWR1bGUrMHgxOS8weDE5Ck1heSAxMyAxODo0NToxOCB2cGM1 IGtlcm5lbDogWyAgOTU5Ljk2NzQ0MV0gIFs8ZmZmZmZmZmY4MTRiNmZmOT5dIHdhaXRfZm9yX2Nv bXBsZXRpb24rMHgyNC8weDI2Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2 NzQ0M10gIFs8ZmZmZmZmZmY4MTFkYTBmZT5dIHhmc19ibWFwaV9hbGxvY2F0ZSsweGQ4LzB4ZWEK TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NDQ0XSAgWzxmZmZmZmZmZjgx MWRhNDUzPl0geGZzX2JtYXBpX3dyaXRlKzB4MzQzLzB4NTliCk1heSAxMyAxODo0NToxOCB2cGM1 IGtlcm5lbDogWyAgOTU5Ljk2NzQ0N10gIFs8ZmZmZmZmZmY4MTFkN2Q3NT5dID8gX194ZnNfYm1h cGlfYWxsb2NhdGUrMHgyM2MvMHgyM2MKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5 NTkuOTY3NDQ5XSAgWzxmZmZmZmZmZjgxMWJmYjk0Pl0geGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRl KzB4MWI5LzB4MmMyCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ1MV0g IFs8ZmZmZmZmZmY4MTFiMjIxOD5dIHhmc19tYXBfYmxvY2tzKzB4MTJiLzB4MjAzCk1heSAxMyAx ODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ1M10gIFs8ZmZmZmZmZmY4MTFiMzI2YT5d IHhmc192bV93cml0ZXBhZ2UrMHgyODAvMHg0YjgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVs OiBbICA5NTkuOTY3NDU2XSAgWzxmZmZmZmZmZjgxMGRjMjdjPl0gX193cml0ZXBhZ2UrMHgxOC8w eDM3Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ1OF0gIFs8ZmZmZmZm ZmY4MTBkY2RkMD5dIHdyaXRlX2NhY2hlX3BhZ2VzKzB4MjVhLzB4MzdlCk1heSAxMyAxODo0NTox OCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ2MF0gIFs8ZmZmZmZmZmY4MTBkYzI2ND5dID8gcGFn ZV9pbmRleCsweDFhLzB4MWEKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 NDYyXSAgWzxmZmZmZmZmZjgxMGRjZjM1Pl0gZ2VuZXJpY193cml0ZXBhZ2VzKzB4NDEvMHg1YgpN YXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc0NjRdICBbPGZmZmZmZmZmODEx YjFlMjk+XSB4ZnNfdm1fd3JpdGVwYWdlcysweDUxLzB4NWMKTWF5IDEzIDE4OjQ1OjE4IHZwYzUg a2VybmVsOiBbICA5NTkuOTY3NDY2XSAgWzxmZmZmZmZmZjgxMGRlMDViPl0gZG9fd3JpdGVwYWdl cysweDIxLzB4MmYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NDY3XSAg WzxmZmZmZmZmZjgxMGQ1NGI2Pl0gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UrMHg1My8weDU1 Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ2OV0gIFs8ZmZmZmZmZmY4 MTBkNWY1Nz5dIGZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZSsweDEzLzB4MTUKTWF5IDEzIDE4OjQ1 OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NDcxXSAgWzxmZmZmZmZmZjgxMTQ3OWM2Pl0gU3lT X3N5bmNfZmlsZV9yYW5nZSsweGU5LzB4MTJkCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDog WyAgOTU5Ljk2NzQ3M10gIFs8ZmZmZmZmZmY4MTRiZTQ4Mj5dIHRyYWNlc3lzKzB4ZGQvMHhlMgpN YXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc0NzRdIDIgbG9ja3MgaGVsZCBi eSBkcGtnLzU4MjU6Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzQ4NV0g ICMwOiAgKHNiX2ludGVybmFsKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWZmNjM4Pl0geGZz X3RyYW5zX2FsbG9jKzB4MjQvMHgzZApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1 OS45Njc0OTBdICAjMTogICgmKCZpcC0+aV9sb2NrKS0+bXJfbG9jayl7Li4uLi4ufSwgYXQ6IFs8 ZmZmZmZmZmY4MTFmMThkMD5dIHhmc19pbG9jaysweDk5LzB4ZDYKTWF5IDEzIDE4OjQ1OjE4IHZw YzUga2VybmVsOiBbICA5NTkuOTY3NDk2XSBJTkZPOiB0YXNrIHNodXRkb3duX3dhdGNoZTo1OTY0 IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4OjQ1OjE4IHZwYzUg a2VybmVsOiBbICA5NTkuOTY3NTQ5XSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rh c2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzYwNF0gc2h1dGRvd25fd2F0Y2hlIEQgMDAwMDAwMDAwMDAw MDAwMiAgICAgMCAgNTk2NCAgIDI2MDQgMHgwMDAwMDAwMApNYXkgMTMgMTg6NDU6MTggdnBjNSBr ZXJuZWw6IFsgIDk1OS45Njc2MDddICBmZmZmODgwM2MxNTYxY2U4IDAwMDAwMDAwMDAwMDAwMDIg ZmZmZjg4MDNjMTU2MWNlOCBmZmZmZmZmZjgxYTFhNDAwCk1heSAxMyAxODo0NToxOCB2cGM1IGtl cm5lbDogWyAgOTU5Ljk2NzYwOV0gIGZmZmY4ODAzZjYzYjIzMDAgZmZmZjg4MDNjMTU2MWZkOCAw MDAwMDAwMDAwMDYzODAwIGZmZmY4ODAzYzE1NjFmZDgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2Vy bmVsOiBbICA5NTkuOTY3NjEwXSAgMDAwMDAwMDAwMDA2MzgwMCBmZmZmODgwM2Y2M2IyMzAwIGZm ZmY4ODAzMDAwMDAwMDEgZmZmZjg4MDNmNjNiMjMwMApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJu ZWw6IFsgIDk1OS45Njc2MTJdIENhbGwgVHJhY2U6Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5l bDogWyAgOTU5Ljk2NzYxNV0gIFs8ZmZmZmZmZmY4MTRiNzcxMT5dIHNjaGVkdWxlKzB4NzUvMHg4 NwpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc2MTZdICBbPGZmZmZmZmZm ODE0YjY3OTA+XSBzY2hlZHVsZV90aW1lb3V0KzB4MzcvMHhmOQpNYXkgMTMgMTg6NDU6MTggdnBj NSBrZXJuZWw6IFsgIDk1OS45Njc2MThdICBbPGZmZmZmZmZmODE0YjZmMjU+XSA/IF9fd2FpdF9m b3JfY29tbW9uKzB4MmEvMHhkYQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45 Njc2MjBdICBbPGZmZmZmZmZmODE0YjZmNzg+XSBfX3dhaXRfZm9yX2NvbW1vbisweDdkLzB4ZGEK TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjIxXSAgWzxmZmZmZmZmZjgx NGI2NzU5Pl0gPyBjb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKzB4MTkvMHgxOQpNYXkgMTMg MTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc2MjNdICBbPGZmZmZmZmZmODEwNGRjZTQ+ XSA/IGZsdXNoX3dvcmsrMHgxOTgvMHgyMDkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBb ICA5NTkuOTY3NjI1XSAgWzxmZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxldGlvbisw eDI0LzB4MjYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjI2XSAgWzxm ZmZmZmZmZjgxMDRkZDJkPl0gZmx1c2hfd29yaysweDFlMS8weDIwOQpNYXkgMTMgMTg6NDU6MTgg dnBjNSBrZXJuZWw6IFsgIDk1OS45Njc2MjddICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNo X3dvcmsrMHgxOTgvMHgyMDkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 NjI5XSAgWzxmZmZmZmZmZjgxMDRjNGI0Pl0gPyBjcmVhdGVfYW5kX3N0YXJ0X3dvcmtlcisweDZl LzB4NmUKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjMxXSAgWzxmZmZm ZmZmZjgxMGRmZTY4Pl0gPyBfX3BhZ2V2ZWNfcmVsZWFzZSsweDJjLzB4MmMKTWF5IDEzIDE4OjQ1 OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjMzXSAgWzxmZmZmZmZmZjgxMDRmZjY3Pl0gc2No ZWR1bGVfb25fZWFjaF9jcHUrMHhjYS8weDEwNApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6 IFsgIDk1OS45Njc2MzVdICBbPGZmZmZmZmZmODEwZGZlOGQ+XSBscnVfYWRkX2RyYWluX2FsbCsw eDE1LzB4MTgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjM3XSAgWzxm ZmZmZmZmZjgxMGY3YWE5Pl0gU3lTX21sb2NrYWxsKzB4NDgvMHgxMWQKTWF5IDEzIDE4OjQ1OjE4 IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NjM4XSAgWzxmZmZmZmZmZjgxNGJlNDgyPl0gdHJhY2Vz eXMrMHhkZC8weGUyCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2NzYzOV0g bm8gbG9ja3MgaGVsZCBieSBzaHV0ZG93bl93YXRjaGUvNTk2NC4KTWF5IDEzIDE4OjQ1OjE4IHZw YzUga2VybmVsOiBbICA5NTkuOTY3NjQ4XSBJTkZPOiB0YXNrIGoxOTM5X3ZlaGljbGVfbTo1OTY1 IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4OjQ1OjE4IHZwYzUg a2VybmVsOiBbICA5NTkuOTY3NzAyXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rh c2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAxMyAxODo0NToxOCB2 cGM1IGtlcm5lbDogWyAgOTU5Ljk2Nzc1N10gajE5MzlfdmVoaWNsZV9tIEQgMDAwMDAwMDAwMDAw MDAwMiAgICAgMCAgNTk2NSAgIDI2MDQgMHgwMDAwMDAwMApNYXkgMTMgMTg6NDU6MTggdnBjNSBr ZXJuZWw6IFsgIDk1OS45Njc3NjBdICBmZmZmODgwM2MxNGY5Y2U4IDAwMDAwMDAwMDAwMDAwMDIg ZmZmZjg4MDNjMTRmOWNlOCBmZmZmODgwM2Y4ZjlkNzgwCk1heSAxMyAxODo0NToxOCB2cGM1IGtl cm5lbDogWyAgOTU5Ljk2Nzc2MV0gIGZmZmY4ODAzZjYzYjQ2MDAgZmZmZjg4MDNjMTRmOWZkOCAw MDAwMDAwMDAwMDYzODAwIGZmZmY4ODAzYzE0ZjlmZDgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2Vy bmVsOiBbICA5NTkuOTY3NzYzXSAgMDAwMDAwMDAwMDA2MzgwMCBmZmZmODgwM2Y2M2I0NjAwIGZm ZmY4ODAzMDAwMDAwMDEgZmZmZjg4MDNmNjNiNDYwMApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJu ZWw6IFsgIDk1OS45Njc3NjVdIENhbGwgVHJhY2U6Ck1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5l bDogWyAgOTU5Ljk2Nzc2OF0gIFs8ZmZmZmZmZmY4MTRiNzcxMT5dIHNjaGVkdWxlKzB4NzUvMHg4 NwpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc3NjldICBbPGZmZmZmZmZm ODE0YjY3OTA+XSBzY2hlZHVsZV90aW1lb3V0KzB4MzcvMHhmOQpNYXkgMTMgMTg6NDU6MTggdnBj NSBrZXJuZWw6IFsgIDk1OS45Njc3NzBdICBbPGZmZmZmZmZmODE0YjZmMjU+XSA/IF9fd2FpdF9m b3JfY29tbW9uKzB4MmEvMHhkYQpNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45 Njc3NzJdICBbPGZmZmZmZmZmODE0YjZmNzg+XSBfX3dhaXRfZm9yX2NvbW1vbisweDdkLzB4ZGEK TWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3Nzc0XSAgWzxmZmZmZmZmZjgx NGI2NzU5Pl0gPyBjb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKzB4MTkvMHgxOQpNYXkgMTMg MTg6NDU6MTggdnBjNSBrZXJuZWw6IFsgIDk1OS45Njc3NzVdICBbPGZmZmZmZmZmODEwNGRjZTQ+ XSA/IGZsdXNoX3dvcmsrMHgxOTgvMHgyMDkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBb ICA5NTkuOTY3Nzc3XSAgWzxmZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxldGlvbisw eDI0LzB4MjYKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3Nzc5XSAgWzxm ZmZmZmZmZjgxMDRkZDJkPl0gZmx1c2hfd29yaysweDFlMS8weDIwOQpNYXkgMTMgMTg6NDU6MTgg dnBjNSBrZXJuZWw6IFsgIDk1OS45Njc3ODBdICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNo X3dvcmsrMHgxOTgvMHgyMDkKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3 NzgzXSAgWzxmZmZmZmZmZjgxMDRjNGI0Pl0gPyBjcmVhdGVfYW5kX3N0YXJ0X3dvcmtlcisweDZl LzB4NmUKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3Nzg1XSAgWzxmZmZm ZmZmZjgxMGRmZTY4Pl0gPyBfX3BhZ2V2ZWNfcmVsZWFzZSsweDJjLzB4MmMKTWF5IDEzIDE4OjQ1 OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3Nzg2XSAgWzxmZmZmZmZmZjgxMDRmZjY3Pl0gc2No ZWR1bGVfb25fZWFjaF9jcHUrMHhjYS8weDEwNApNYXkgMTMgMTg6NDU6MTggdnBjNSBrZXJuZWw6 IFsgIDk1OS45Njc3ODhdICBbPGZmZmZmZmZmODEwZGZlOGQ+XSBscnVfYWRkX2RyYWluX2FsbCsw eDE1LzB4MTgKTWF5IDEzIDE4OjQ1OjE4IHZwYzUga2VybmVsOiBbICA5NTkuOTY3Nzg5XSAgWzxm ZmZmZmZmZjgxMGY3YWE5Pl0gU3lTX21sb2NrYWxsKzB4NDgvMHgxMWQKTWF5IDEzIDE4OjQ1OjE4 IHZwYzUga2VybmVsOiBbICA5NTkuOTY3NzkxXSAgWzxmZmZmZmZmZjgxNGJlNDgyPl0gdHJhY2Vz eXMrMHhkZC8weGUyCk1heSAxMyAxODo0NToxOCB2cGM1IGtlcm5lbDogWyAgOTU5Ljk2Nzc5Ml0g bm8gbG9ja3MgaGVsZCBieSBqMTkzOV92ZWhpY2xlX20vNTk2NS4KTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM1MzEyXSBJTkZPOiB0YXNrIGt3b3JrZXIvMjoxOjgyIGJsb2Nr ZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVs OiBbIDEwNzkuODM1MzY5XSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGlt ZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAxMyAxODo0NzoxOCB2cGM1IGtl cm5lbDogWyAxMDc5LjgzNTQyNl0ga3dvcmtlci8yOjEgICAgIEQgMDAwMDAwMDAwMDAwMDAwMCAg ICAgMCAgICA4MiAgICAgIDIgMHgwMDAwMDAwMApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6 IFsgMTA3OS44MzU0MzRdIFdvcmtxdWV1ZTogeGZzLWRhdGEvc2RhNSB4ZnNfZW5kX2lvCk1heSAx MyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQzOF0gIGZmZmY4ODAzZjY0YjliNTgg MDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAwMDAwIGZmZmY4ODAzZjY1OWM2MDAKTWF5IDEz IDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDM5XSAgZmZmZjg4MDM2NjE1M2E0MCBm ZmZmODgwM2Y2NGI5ZmQ4IDAwMDAwMDAwMDAwNjM4MDAgZmZmZjg4MDNmNjRiOWZkOApNYXkgMTMg MTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU0NDFdICAwMDAwMDAwMDAwMDYzODAwIGZm ZmY4ODAzZjY0YjExODAgZmZmZjg4MDNmNjRiOWI3OCBmZmZmODgwM2Y2NGIxMTgwCk1heSAxMyAx ODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ0NF0gQ2FsbCBUcmFjZToKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDQ5XSAgWzxmZmZmZmZmZjgxNGI3NzExPl0g c2NoZWR1bGUrMHg3NS8weDg3Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5Ljgz NTQ1MV0gIFs8ZmZmZmZmZmY4MTRiN2M3ND5dIF9fcnRfbXV0ZXhfc2xvd2xvY2srMHg4ZS8weGM3 Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ1M10gIFs8ZmZmZmZmZmY4 MTRiN2RiNj5dIHJ0X211dGV4X3Nsb3dsb2NrKzB4MTA5LzB4MThhCk1heSAxMyAxODo0NzoxOCB2 cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ1Nl0gIFs8ZmZmZmZmZmY4MTA3YTYyOT5dID8gX19sb2Nr X2FjcXVpcmUuaXNyYS4yNysweDFjZS8weDU0MQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6 IFsgMTA3OS44MzU0NTldICBbPGZmZmZmZmZmODExYjFmMWY+XSA/IHhmc19zZXRmaWxlc2l6ZSsw eDgwLzB4MTQ4Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ2MV0gIFs8 ZmZmZmZmZmY4MTRiN2U0ZT5dIHJ0X211dGV4X2xvY2srMHgxNy8weDE5Ck1heSAxMyAxODo0Nzox OCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ2Ml0gIFs8ZmZmZmZmZmY4MTA3ZmRiZD5dIHJ0X2Rv d25fd3JpdGVfbmVzdGVkKzB4M2EvMHg0MQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsg MTA3OS44MzU0NjVdICBbPGZmZmZmZmZmODExZjE4ZDA+XSA/IHhmc19pbG9jaysweDk5LzB4ZDYK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDY2XSAgWzxmZmZmZmZmZjgx MWYxOGQwPl0geGZzX2lsb2NrKzB4OTkvMHhkNgpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6 IFsgMTA3OS44MzU0NjhdICBbPGZmZmZmZmZmODExYjFmMWY+XSB4ZnNfc2V0ZmlsZXNpemUrMHg4 MC8weDE0OApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU0NzBdICBbPGZm ZmZmZmZmODExYjFlYTQ+XSA/IHhmc19zZXRmaWxlc2l6ZSsweDUvMHgxNDgKTWF5IDEzIDE4OjQ3 OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDczXSAgWzxmZmZmZmZmZjgxMDRmMmUwPl0gPyBw cm9jZXNzX29uZV93b3JrKzB4MTZmLzB4Mzk3Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDog WyAxMDc5LjgzNTQ3NV0gIFs8ZmZmZmZmZmY4MTFiMmJiYT5dIHhmc19lbmRfaW8rMHg4My8weDk5 Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ3Nl0gIFs8ZmZmZmZmZmY4 MTA0ZjM4ND5dIHByb2Nlc3Nfb25lX3dvcmsrMHgyMTMvMHgzOTcKTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM1NDc4XSAgWzxmZmZmZmZmZjgxMDRmMmUwPl0gPyBwcm9jZXNz X29uZV93b3JrKzB4MTZmLzB4Mzk3Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNTQ4MF0gIFs8ZmZmZmZmZmY4MTA0ZjkyNT5dIHdvcmtlcl90aHJlYWQrMHgxNDkvMHgyMjQK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDgyXSAgWzxmZmZmZmZmZjgx MDRmN2RjPl0gPyByZXNjdWVyX3RocmVhZCsweDJhNS8weDJhNQpNYXkgMTMgMTg6NDc6MTggdnBj NSBrZXJuZWw6IFsgMTA3OS44MzU0ODRdICBbPGZmZmZmZmZmODEwNTUwYjI+XSBrdGhyZWFkKzB4 YTIvMHhhYQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU0ODddICBbPGZm ZmZmZmZmODEwNTUwMTA+XSA/IF9fa3RocmVhZF9wYXJrbWUrMHg2NS8weDY1Ck1heSAxMyAxODo0 NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTQ4OV0gIFs8ZmZmZmZmZmY4MTRiZTFkYz5dIHJl dF9mcm9tX2ZvcmsrMHg3Yy8weGIwCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNTQ5MF0gIFs8ZmZmZmZmZmY4MTA1NTAxMD5dID8gX19rdGhyZWFkX3BhcmttZSsweDY1LzB4 NjUKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NDkyXSA0IGxvY2tzIGhl bGQgYnkga3dvcmtlci8yOjEvODI6Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNTUwM10gICMwOiAgKHhmcy1kYXRhLyVzKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMDRm MmUwPl0gcHJvY2Vzc19vbmVfd29yaysweDE2Zi8weDM5NwpNYXkgMTMgMTg6NDc6MTggdnBjNSBr ZXJuZWw6IFsgMTA3OS44MzU1MDldICAjMTogICgoJmlvZW5kLT5pb193b3JrKSl7Li4uLi4ufSwg YXQ6IFs8ZmZmZmZmZmY4MTA0ZjJlMD5dIHByb2Nlc3Nfb25lX3dvcmsrMHgxNmYvMHgzOTcKTWF5 IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NTE0XSAgIzI6ICAoc2JfaW50ZXJu YWwpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODExYjFlYTQ+XSB4ZnNfc2V0ZmlsZXNpemUrMHg1 LzB4MTQ4Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTUxOV0gICMzOiAg KCYoJmlwLT5pX2xvY2spLT5tcl9sb2NrKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWYxOGQw Pl0geGZzX2lsb2NrKzB4OTkvMHhkNgpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3 OS44MzU1MjZdIElORk86IHRhc2sga3dvcmtlci91MTY6NToyNDEgYmxvY2tlZCBmb3IgbW9yZSB0 aGFuIDEyMCBzZWNvbmRzLgpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU1 OTBdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRp c2FibGVzIHRoaXMgbWVzc2FnZS4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzku ODM1NjY1XSBrd29ya2VyL3UxNjo1ICAgRCAwMDAwMDAwMDAwMDAwMDAyICAgICAwICAgMjQxICAg ICAgMiAweDAwMDAwMDAwCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTY3 MF0gV29ya3F1ZXVlOiB3cml0ZWJhY2sgYmRpX3dyaXRlYmFja193b3JrZm4gKGZsdXNoLTg6MCkK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njc0XSAgZmZmZjg4MDNmNTcy YjNjOCAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4ODA0MmRiNjJiODAgZmZmZjg4MDNmOGY5YzYwMApN YXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU2NzVdICBmZmZmODgwM2Y2M2I2 OTAwIGZmZmY4ODAzZjU3MmJmZDggMDAwMDAwMDAwMDA2MzgwMCBmZmZmODgwM2Y1NzJiZmQ4Ck1h eSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTY3N10gIDAwMDAwMDAwMDAwNjM4 MDAgZmZmZjg4MDNmNjNiNjkwMCBmZmZmODgwMzAwMDAwMDAxIGZmZmY4ODAzZjYzYjY5MDAKTWF5 IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njc5XSBDYWxsIFRyYWNlOgpNYXkg MTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU2ODJdICBbPGZmZmZmZmZmODE0Yjc3 MTE+XSBzY2hlZHVsZSsweDc1LzB4ODcKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEw NzkuODM1Njg0XSAgWzxmZmZmZmZmZjgxNGI2NzkwPl0gc2NoZWR1bGVfdGltZW91dCsweDM3LzB4 ZjkKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njg2XSAgWzxmZmZmZmZm ZjgxNGI2ZjI1Pl0gPyBfX3dhaXRfZm9yX2NvbW1vbisweDJhLzB4ZGEKTWF5IDEzIDE4OjQ3OjE4 IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njg4XSAgWzxmZmZmZmZmZjgxNGI2Zjc4Pl0gX193YWl0 X2Zvcl9jb21tb24rMHg3ZC8weGRhCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNTY5MF0gIFs8ZmZmZmZmZmY4MTRiNjc1OT5dID8gY29uc29sZV9jb25kaXRpb25hbF9zY2hl ZHVsZSsweDE5LzB4MTkKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njky XSAgWzxmZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxldGlvbisweDI0LzB4MjYKTWF5 IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NjkzXSAgWzxmZmZmZmZmZjgxMWRh MGZlPl0geGZzX2JtYXBpX2FsbG9jYXRlKzB4ZDgvMHhlYQpNYXkgMTMgMTg6NDc6MTggdnBjNSBr ZXJuZWw6IFsgMTA3OS44MzU2OTVdICBbPGZmZmZmZmZmODExZGE0NTM+XSB4ZnNfYm1hcGlfd3Jp dGUrMHgzNDMvMHg1OWIKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Njk4 XSAgWzxmZmZmZmZmZjgxMWQ3ZDc1Pl0gPyBfX3hmc19ibWFwaV9hbGxvY2F0ZSsweDIzYy8weDIz YwpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3MDFdICBbPGZmZmZmZmZm ODExYmZiOTQ+XSB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUrMHgxYjkvMHgyYzIKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzAzXSAgWzxmZmZmZmZmZjgxMWIyMjE4Pl0g eGZzX21hcF9ibG9ja3MrMHgxMmIvMHgyMDMKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBb IDEwNzkuODM1NzA1XSAgWzxmZmZmZmZmZjgxMGQ0NTFjPl0gPyByY3VfcmVhZF91bmxvY2srMHgy My8weDIzCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTcwN10gIFs8ZmZm ZmZmZmY4MTFiMzI2YT5dIHhmc192bV93cml0ZXBhZ2UrMHgyODAvMHg0YjgKTWF5IDEzIDE4OjQ3 OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzEwXSAgWzxmZmZmZmZmZjgxMGRjMjdjPl0gX193 cml0ZXBhZ2UrMHgxOC8weDM3Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5Ljgz NTcxM10gIFs8ZmZmZmZmZmY4MTBkY2RkMD5dIHdyaXRlX2NhY2hlX3BhZ2VzKzB4MjVhLzB4Mzdl Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTcxNV0gIFs8ZmZmZmZmZmY4 MTBkYzI2ND5dID8gcGFnZV9pbmRleCsweDFhLzB4MWEKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2Vy bmVsOiBbIDEwNzkuODM1NzE3XSAgWzxmZmZmZmZmZjgxNGI4MWQ4Pl0gPyBydF9zcGluX2xvY2tf c2xvd3VubG9jaysweDE0LzB4MjAKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzku ODM1NzE5XSAgWzxmZmZmZmZmZjgxMGRjZjM1Pl0gZ2VuZXJpY193cml0ZXBhZ2VzKzB4NDEvMHg1 YgpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3MjFdICBbPGZmZmZmZmZm ODExYjFlMjk+XSB4ZnNfdm1fd3JpdGVwYWdlcysweDUxLzB4NWMKTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM1NzIzXSAgWzxmZmZmZmZmZjgxMGRlMDViPl0gZG9fd3JpdGVw YWdlcysweDIxLzB4MmYKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzI0 XSAgWzxmZmZmZmZmZjgxMTQyYzFjPl0gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKzB4N2IvMHgy MzgKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzI2XSAgWzxmZmZmZmZm ZjgxMTQzZTc0Pl0gd3JpdGViYWNrX3NiX2lub2RlcysweDIyMC8weDM3YQpNYXkgMTMgMTg6NDc6 MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3MjhdICBbPGZmZmZmZmZmODExNDQwNDI+XSBfX3dy aXRlYmFja19pbm9kZXNfd2IrMHg3NC8weGI5Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDog WyAxMDc5LjgzNTcyOV0gIFs8ZmZmZmZmZmY4MTE0NDFjNT5dIHdiX3dyaXRlYmFjaysweDEzZS8w eDJhMwpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3MzFdICBbPGZmZmZm ZmZmODExNDQ2M2I+XSB3Yl9kb193cml0ZWJhY2srMHgxNjMvMHgxZDkKTWF5IDEzIDE4OjQ3OjE4 IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzMzXSAgWzxmZmZmZmZmZjgxMTQ0NzFkPl0gYmRpX3dy aXRlYmFja193b3JrZm4rMHg2Yy8weGZlCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAx MDc5LjgzNTczNV0gIFs8ZmZmZmZmZmY4MTA0ZjM4ND5dIHByb2Nlc3Nfb25lX3dvcmsrMHgyMTMv MHgzOTcKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzM3XSAgWzxmZmZm ZmZmZjgxMDRmMmUwPl0gPyBwcm9jZXNzX29uZV93b3JrKzB4MTZmLzB4Mzk3Ck1heSAxMyAxODo0 NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTczOV0gIFs8ZmZmZmZmZmY4MTA0ZjkyNT5dIHdv cmtlcl90aHJlYWQrMHgxNDkvMHgyMjQKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEw NzkuODM1NzQxXSAgWzxmZmZmZmZmZjgxMDRmN2RjPl0gPyByZXNjdWVyX3RocmVhZCsweDJhNS8w eDJhNQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3NDJdICBbPGZmZmZm ZmZmODEwNTUwYjI+XSBrdGhyZWFkKzB4YTIvMHhhYQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJu ZWw6IFsgMTA3OS44MzU3NDRdICBbPGZmZmZmZmZmODEwNTUwMTA+XSA/IF9fa3RocmVhZF9wYXJr bWUrMHg2NS8weDY1Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTc0Nl0g IFs8ZmZmZmZmZmY4MTRiZTFkYz5dIHJldF9mcm9tX2ZvcmsrMHg3Yy8weGIwCk1heSAxMyAxODo0 NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTc0OF0gIFs8ZmZmZmZmZmY4MTA1NTAxMD5dID8g X19rdGhyZWFkX3BhcmttZSsweDY1LzB4NjUKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBb IDEwNzkuODM1NzQ5XSA1IGxvY2tzIGhlbGQgYnkga3dvcmtlci91MTY6NS8yNDE6Ck1heSAxMyAx ODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTc2N10gICMwOiAgKHdyaXRlYmFjayl7Li4u Li4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTA0ZjJlMD5dIHByb2Nlc3Nfb25lX3dvcmsrMHgxNmYvMHgz OTcKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1NzcyXSAgIzE6ICAoKCYo JndiLT5kd29yayktPndvcmspKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMDRmMmUwPl0gcHJv Y2Vzc19vbmVfd29yaysweDE2Zi8weDM5NwpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsg MTA3OS44MzU3NzZdICAjMjogICgmdHlwZS0+c191bW91bnRfa2V5IzE4KXsuLi4uLi59LCBhdDog WzxmZmZmZmZmZjgxMTIzZDRmPl0gZ3JhYl9zdXBlcl9wYXNzaXZlKzB4NjAvMHg4YQpNYXkgMTMg MTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU3ODJdICAjMzogIChzYl9pbnRlcm5hbCl7 Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTFmZjYzOD5dIHhmc190cmFuc19hbGxvYysweDI0LzB4 M2QKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1Nzg4XSAgIzQ6ICAoJigm aXAtPmlfbG9jayktPm1yX2xvY2spey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODExZjE4ZDA+XSB4 ZnNfaWxvY2srMHg5OS8weGQ2Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5Ljgz NTgwMl0gSU5GTzogdGFzayBkcGtnOjU4MjUgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNv bmRzLgpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU4NjNdICJlY2hvIDAg PiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMg bWVzc2FnZS4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTM4XSBkcGtn ICAgICAgICAgICAgRCAwMDAwMDAwMDAwMDAwMDAyICAgICAwICA1ODI1ICAgNTc4OSAweDAwMDAw MDAwCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk0Ml0gIGZmZmY4ODAz ZjU3Y2Q3NzggMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAwMDAxIGZmZmY4ODAzZjhmOWM2 MDAKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTQ0XSAgZmZmZjg4MDNm NTdjZDc3OCBmZmZmODgwM2Y1N2NkZmQ4IDAwMDAwMDAwMDAwNjM4MDAgZmZmZjg4MDNmNTdjZGZk OApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzU5NDVdICAwMDAwMDAwMDAw MDYzODAwIGZmZmY4ODAzZjY1OWM2MDAgZmZmZjg4MDMwMDAwMDAwMSBmZmZmODgwM2Y2NTljNjAw Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk0N10gQ2FsbCBUcmFjZToK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTUwXSAgWzxmZmZmZmZmZjgx NGI3NzExPl0gc2NoZWR1bGUrMHg3NS8weDg3Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDog WyAxMDc5LjgzNTk1Ml0gIFs8ZmZmZmZmZmY4MTRiNjc5MD5dIHNjaGVkdWxlX3RpbWVvdXQrMHgz Ny8weGY5Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk1M10gIFs8ZmZm ZmZmZmY4MTRiNmYyNT5dID8gX193YWl0X2Zvcl9jb21tb24rMHgyYS8weGRhCk1heSAxMyAxODo0 NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk1NV0gIFs8ZmZmZmZmZmY4MTRiNmY3OD5dIF9f d2FpdF9mb3JfY29tbW9uKzB4N2QvMHhkYQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsg MTA3OS44MzU5NTddICBbPGZmZmZmZmZmODE0YjY3NTk+XSA/IGNvbnNvbGVfY29uZGl0aW9uYWxf c2NoZWR1bGUrMHgxOS8weDE5Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5Ljgz NTk1OV0gIFs8ZmZmZmZmZmY4MTRiNmZmOT5dIHdhaXRfZm9yX2NvbXBsZXRpb24rMHgyNC8weDI2 Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk2MF0gIFs8ZmZmZmZmZmY4 MTFkYTBmZT5dIHhmc19ibWFwaV9hbGxvY2F0ZSsweGQ4LzB4ZWEKTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM1OTYyXSAgWzxmZmZmZmZmZjgxMWRhNDUzPl0geGZzX2JtYXBp X3dyaXRlKzB4MzQzLzB4NTliCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5Ljgz NTk2NV0gIFs8ZmZmZmZmZmY4MTFkN2Q3NT5dID8gX194ZnNfYm1hcGlfYWxsb2NhdGUrMHgyM2Mv MHgyM2MKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTY3XSAgWzxmZmZm ZmZmZjgxMWJmYjk0Pl0geGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKzB4MWI5LzB4MmMyCk1heSAx MyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk3MF0gIFs8ZmZmZmZmZmY4MTFiMjIx OD5dIHhmc19tYXBfYmxvY2tzKzB4MTJiLzB4MjAzCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5l bDogWyAxMDc5LjgzNTk3Ml0gIFs8ZmZmZmZmZmY4MTFiMzI2YT5dIHhmc192bV93cml0ZXBhZ2Ur MHgyODAvMHg0YjgKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTc1XSAg WzxmZmZmZmZmZjgxMGRjMjdjPl0gX193cml0ZXBhZ2UrMHgxOC8weDM3Ck1heSAxMyAxODo0Nzox OCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk3N10gIFs8ZmZmZmZmZmY4MTBkY2RkMD5dIHdyaXRl X2NhY2hlX3BhZ2VzKzB4MjVhLzB4MzdlCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAx MDc5LjgzNTk3OF0gIFs8ZmZmZmZmZmY4MTBkYzI2ND5dID8gcGFnZV9pbmRleCsweDFhLzB4MWEK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTgxXSAgWzxmZmZmZmZmZjgx MGRjZjM1Pl0gZ2VuZXJpY193cml0ZXBhZ2VzKzB4NDEvMHg1YgpNYXkgMTMgMTg6NDc6MTggdnBj NSBrZXJuZWw6IFsgMTA3OS44MzU5ODNdICBbPGZmZmZmZmZmODExYjFlMjk+XSB4ZnNfdm1fd3Jp dGVwYWdlcysweDUxLzB4NWMKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1 OTg1XSAgWzxmZmZmZmZmZjgxMGRlMDViPl0gZG9fd3JpdGVwYWdlcysweDIxLzB4MmYKTWF5IDEz IDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM1OTg3XSAgWzxmZmZmZmZmZjgxMGQ1NGI2 Pl0gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UrMHg1My8weDU1Ck1heSAxMyAxODo0NzoxOCB2 cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk4OV0gIFs8ZmZmZmZmZmY4MTBkNWY1Nz5dIGZpbGVtYXBf ZmRhdGF3cml0ZV9yYW5nZSsweDEzLzB4MTUKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBb IDEwNzkuODM1OTkxXSAgWzxmZmZmZmZmZjgxMTQ3OWM2Pl0gU3lTX3N5bmNfZmlsZV9yYW5nZSsw eGU5LzB4MTJkCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNTk5M10gIFs8 ZmZmZmZmZmY4MTRiZTQ4Mj5dIHRyYWNlc3lzKzB4ZGQvMHhlMgpNYXkgMTMgMTg6NDc6MTggdnBj NSBrZXJuZWw6IFsgMTA3OS44MzU5OTRdIDIgbG9ja3MgaGVsZCBieSBkcGtnLzU4MjU6Ck1heSAx MyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjAwNl0gICMwOiAgKHNiX2ludGVybmFs KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWZmNjM4Pl0geGZzX3RyYW5zX2FsbG9jKzB4MjQv MHgzZApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYwMTFdICAjMTogICgm KCZpcC0+aV9sb2NrKS0+bXJfbG9jayl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTFmMThkMD5d IHhmc19pbG9jaysweDk5LzB4ZDYKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzku ODM2MDE3XSBJTkZPOiB0YXNrIHNodXRkb3duX3dhdGNoZTo1OTY0IGJsb2NrZWQgZm9yIG1vcmUg dGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2 MDkxXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBk aXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNjE2NV0gc2h1dGRvd25fd2F0Y2hlIEQgMDAwMDAwMDAwMDAwMDAwMiAgICAgMCAgNTk2NCAg IDI2MDQgMHgwMDAwMDAwMApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYx NjldICBmZmZmODgwM2MxNTYxY2U4IDAwMDAwMDAwMDAwMDAwMDIgZmZmZjg4MDNjMTU2MWNlOCBm ZmZmZmZmZjgxYTFhNDAwCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjE3 MV0gIGZmZmY4ODAzZjYzYjIzMDAgZmZmZjg4MDNjMTU2MWZkOCAwMDAwMDAwMDAwMDYzODAwIGZm ZmY4ODAzYzE1NjFmZDgKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MTcy XSAgMDAwMDAwMDAwMDA2MzgwMCBmZmZmODgwM2Y2M2IyMzAwIGZmZmY4ODAzMDAwMDAwMDEgZmZm Zjg4MDNmNjNiMjMwMApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYxNzRd IENhbGwgVHJhY2U6Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjE3N10g IFs8ZmZmZmZmZmY4MTRiNzcxMT5dIHNjaGVkdWxlKzB4NzUvMHg4NwpNYXkgMTMgMTg6NDc6MTgg dnBjNSBrZXJuZWw6IFsgMTA3OS44MzYxNzldICBbPGZmZmZmZmZmODE0YjY3OTA+XSBzY2hlZHVs ZV90aW1lb3V0KzB4MzcvMHhmOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44 MzYxODBdICBbPGZmZmZmZmZmODE0YjZmMjU+XSA/IF9fd2FpdF9mb3JfY29tbW9uKzB4MmEvMHhk YQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYxODNdICBbPGZmZmZmZmZm ODE0YjZmNzg+XSBfX3dhaXRfZm9yX2NvbW1vbisweDdkLzB4ZGEKTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM2MTg0XSAgWzxmZmZmZmZmZjgxNGI2NzU5Pl0gPyBjb25zb2xl X2NvbmRpdGlvbmFsX3NjaGVkdWxlKzB4MTkvMHgxOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJu ZWw6IFsgMTA3OS44MzYxODZdICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNoX3dvcmsrMHgx OTgvMHgyMDkKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MTg4XSAgWzxm ZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxldGlvbisweDI0LzB4MjYKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MTg5XSAgWzxmZmZmZmZmZjgxMDRkZDJkPl0g Zmx1c2hfd29yaysweDFlMS8weDIwOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3 OS44MzYxOTFdICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNoX3dvcmsrMHgxOTgvMHgyMDkK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MTkzXSAgWzxmZmZmZmZmZjgx MDRjNGI0Pl0gPyBjcmVhdGVfYW5kX3N0YXJ0X3dvcmtlcisweDZlLzB4NmUKTWF5IDEzIDE4OjQ3 OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MTk1XSAgWzxmZmZmZmZmZjgxMGRmZTY4Pl0gPyBf X3BhZ2V2ZWNfcmVsZWFzZSsweDJjLzB4MmMKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBb IDEwNzkuODM2MTk3XSAgWzxmZmZmZmZmZjgxMDRmZjY3Pl0gc2NoZWR1bGVfb25fZWFjaF9jcHUr MHhjYS8weDEwNApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYxOThdICBb PGZmZmZmZmZmODEwZGZlOGQ+XSBscnVfYWRkX2RyYWluX2FsbCsweDE1LzB4MTgKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2MjAwXSAgWzxmZmZmZmZmZjgxMGY3YWE5Pl0g U3lTX21sb2NrYWxsKzB4NDgvMHgxMWQKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEw NzkuODM2MjAyXSAgWzxmZmZmZmZmZjgxNGJlNDgyPl0gdHJhY2VzeXMrMHhkZC8weGUyCk1heSAx MyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjIwM10gbm8gbG9ja3MgaGVsZCBieSBz aHV0ZG93bl93YXRjaGUvNTk2NC4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzku ODM2MjEyXSBJTkZPOiB0YXNrIGoxOTM5X3ZlaGljbGVfbTo1OTY1IGJsb2NrZWQgZm9yIG1vcmUg dGhhbiAxMjAgc2Vjb25kcy4KTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2 MzEyXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzIiBk aXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5 LjgzNjM4OF0gajE5MzlfdmVoaWNsZV9tIEQgMDAwMDAwMDAwMDAwMDAwMiAgICAgMCAgNTk2NSAg IDI2MDQgMHgwMDAwMDAwMApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzYz OTRdICBmZmZmODgwM2MxNGY5Y2U4IDAwMDAwMDAwMDAwMDAwMDIgZmZmZjg4MDNjMTRmOWNlOCBm ZmZmODgwM2Y4ZjlkNzgwCk1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjM5 Nl0gIGZmZmY4ODAzZjYzYjQ2MDAgZmZmZjg4MDNjMTRmOWZkOCAwMDAwMDAwMDAwMDYzODAwIGZm ZmY4ODAzYzE0ZjlmZDgKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2Mzk4 XSAgMDAwMDAwMDAwMDA2MzgwMCBmZmZmODgwM2Y2M2I0NjAwIGZmZmY4ODAzMDAwMDAwMDEgZmZm Zjg4MDNmNjNiNDYwMApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzY0MDJd IENhbGwgVHJhY2U6Ck1heSAxMyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjQwN10g IFs8ZmZmZmZmZmY4MTRiNzcxMT5dIHNjaGVkdWxlKzB4NzUvMHg4NwpNYXkgMTMgMTg6NDc6MTgg dnBjNSBrZXJuZWw6IFsgMTA3OS44MzY0MTBdICBbPGZmZmZmZmZmODE0YjY3OTA+XSBzY2hlZHVs ZV90aW1lb3V0KzB4MzcvMHhmOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44 MzY0MTJdICBbPGZmZmZmZmZmODE0YjZmMjU+XSA/IF9fd2FpdF9mb3JfY29tbW9uKzB4MmEvMHhk YQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzY0MTVdICBbPGZmZmZmZmZm ODE0YjZmNzg+XSBfX3dhaXRfZm9yX2NvbW1vbisweDdkLzB4ZGEKTWF5IDEzIDE4OjQ3OjE4IHZw YzUga2VybmVsOiBbIDEwNzkuODM2NDE3XSAgWzxmZmZmZmZmZjgxNGI2NzU5Pl0gPyBjb25zb2xl X2NvbmRpdGlvbmFsX3NjaGVkdWxlKzB4MTkvMHgxOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJu ZWw6IFsgMTA3OS44MzY0MjBdICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNoX3dvcmsrMHgx OTgvMHgyMDkKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2NDIzXSAgWzxm ZmZmZmZmZjgxNGI2ZmY5Pl0gd2FpdF9mb3JfY29tcGxldGlvbisweDI0LzB4MjYKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2NDI1XSAgWzxmZmZmZmZmZjgxMDRkZDJkPl0g Zmx1c2hfd29yaysweDFlMS8weDIwOQpNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3 OS44MzY0MjddICBbPGZmZmZmZmZmODEwNGRjZTQ+XSA/IGZsdXNoX3dvcmsrMHgxOTgvMHgyMDkK TWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2NDMxXSAgWzxmZmZmZmZmZjgx MDRjNGI0Pl0gPyBjcmVhdGVfYW5kX3N0YXJ0X3dvcmtlcisweDZlLzB4NmUKTWF5IDEzIDE4OjQ3 OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2NDM0XSAgWzxmZmZmZmZmZjgxMGRmZTY4Pl0gPyBf X3BhZ2V2ZWNfcmVsZWFzZSsweDJjLzB4MmMKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBb IDEwNzkuODM2NDM3XSAgWzxmZmZmZmZmZjgxMDRmZjY3Pl0gc2NoZWR1bGVfb25fZWFjaF9jcHUr MHhjYS8weDEwNApNYXkgMTMgMTg6NDc6MTggdnBjNSBrZXJuZWw6IFsgMTA3OS44MzY0MzldICBb PGZmZmZmZmZmODEwZGZlOGQ+XSBscnVfYWRkX2RyYWluX2FsbCsweDE1LzB4MTgKTWF5IDEzIDE4 OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEwNzkuODM2NDQxXSAgWzxmZmZmZmZmZjgxMGY3YWE5Pl0g U3lTX21sb2NrYWxsKzB4NDgvMHgxMWQKTWF5IDEzIDE4OjQ3OjE4IHZwYzUga2VybmVsOiBbIDEw NzkuODM2NDQ0XSAgWzxmZmZmZmZmZjgxNGJlNDgyPl0gdHJhY2VzeXMrMHhkZC8weGUyCk1heSAx MyAxODo0NzoxOCB2cGM1IGtlcm5lbDogWyAxMDc5LjgzNjQ0Nl0gbm8gbG9ja3MgaGVsZCBieSBq MTkzOV92ZWhpY2xlX20vNTk2NS4K --047d7b3a9c0a31cbcb04f952f28d-- From jeff.liu@oracle.com Wed May 14 02:24:49 2014 Return-Path: <jeff.liu@oracle.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 B8FBF7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 02:24:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EF418F804C for <xfs@oss.sgi.com>; Wed, 14 May 2014 00:24:46 -0700 (PDT) X-ASG-Debug-ID: 1400052284-04cb6c72904e4db0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id iP7bdK7qlLlLWFi2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 14 May 2014 00:24:45 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4E7OgWt020600 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 14 May 2014 07:24:43 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4E7Ofdv011688 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 14 May 2014 07:24:41 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s4E7Oekd011635; Wed, 14 May 2014 07:24:40 GMT Received: from [192.168.1.102] (/60.215.177.58) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 14 May 2014 00:24:40 -0700 Message-ID: <53731B07.9040606@oracle.com> Date: Wed, 14 May 2014 15:28:07 +0800 From: Jeff Liu <jeff.liu@oracle.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 References: <1399971373-6242-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 In-Reply-To: <1399971373-6242-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1400052284 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.5796 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On 05/13/2014 04:56 PM, Dave Chinner wrote: > Hi folks, > > I've been working through the mess that is the > error sign impedance mismatch between the core XFS code and the rest > of the kernel. I'm about half way through the codebase, and I've > found a bunch of incorrect error signs throughout the VFS interface > layers. > > These were effectively all found by inspection, and is > further evidence that we need to convert all of XFS to negative > errors as quickly as possible. Would you like to find a volunteer to deal with that? I have a colleague is trying to study XFS these days, looks this is a good task to him. BTW, before doing negative errors converting, should we have libxfs infrastructure support at first? Cheers, -Jeff From entreamigos@redguarani.com.py Wed May 14 05:28:00 2014 Return-Path: <entreamigos@redguarani.com.py> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C78AA7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 05:28:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85832304032 for <xfs@oss.sgi.com>; Wed, 14 May 2014 03:27:57 -0700 (PDT) X-ASG-Debug-ID: 1400063274-04bdf02b8b507ca0001-NocioJ Received: from dns.dnsfull.net ([192.254.162.17]) by cuda.sgi.com with ESMTP id AzYUoCw5O8Dt2oZS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 14 May 2014 03:27:54 -0700 (PDT) X-Barracuda-Envelope-From: entreamigos@redguarani.com.py X-Barracuda-Apparent-Source-IP: 192.254.162.17 Received: from bzq-79-183-18-235.red.bezeqint.net ([79.183.18.235]:62695 helo=redguarani.com.py) by dns.dnsfull.net with esmtpa (Exim 4.80.1) (envelope-from <entreamigos@redguarani.com.py>) id 1WkWPB-00085B-Lu; Wed, 14 May 2014 05:27:21 -0500 Message-ID: <B0A054D4.FE2D1E11@redguarani.com.py> Date: Wed, 14 May 2014 12:27:17 +0200 From: "Online" <entreamigos@redguarani.com.py> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.14) Gecko/20071210 Thunderbird/1.5.0.14 MIME-Version: 1.0 To: <online@onlinemarine.com.sg>, <godwin.bencini@onvol.net>, <sportdienst@oostende.be>, <dirk.laleman@oostendenaar.be>, <yvonne.olofsson@oostergotland.hsb.se>, <personeel@oostkamp.be>, <limburg@opendoek-vzw.be>, <marit.wixell@operahogskolan.se>, <kd.service@opi-corp.com>, <lise.koxvig.berger@oppland.org>, <xavier@optimalconsult.be>, <info@opwegnaarspanje.be>, <thomas.berchtold@orbnet.ch>, <ulf.nordstrom@orebroll.se>, <ulrika.karlgren@orebroll.se>, <ordforande@orebrostudentsangare.se>, <shop@oresundgolf.se>, <ulf.mansson@ornskoldsvik.se>, <barbier@ose.be>, <sabato@ose.be>, <antonella.bernasconi@ospedale.varese.it>, <xfs@oss.sgi.com>, <ulf.svensson@ostermalm.stockholm.se>, <frank.benedict@otema.de>, <romina.vanhooren@oudenburg.be> Subject: Conspiracy: Why Wallstreet brokers make 2 Million a day Content-Type: text/plain; charset="iso-8859-1" X-ASG-Orig-Subj: Conspiracy: Why Wallstreet brokers make 2 Million a day Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - dns.dnsfull.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - redguarani.com.py X-Get-Message-Sender-Via: dns.dnsfull.net: authenticated_id: entreamigos@redguarani.com.py X-Barracuda-Connect: UNKNOWN[192.254.162.17] X-Barracuda-Start-Time: 1400063274 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=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5799 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 You probably have never even heard about this before (its that GOOD) It's a new website that's already got over 5,000 people making $70 Every 60 Seconds Watch THIS! http://procuradortenerife.com/gysammq.php After you go to the link above, you will be able to tap into something that is FREE until Tomorrow. Here's the link again: http://sklep-oki.home.pl/hcrutwq.php Just make sure you visit and grandfather yourself in before tomorrow. From weber@zbfmail.de Wed May 14 07:47:23 2014 Return-Path: <weber@zbfmail.de> X-Spam-Checker-Version: SpamAssassin 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 440CA7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:47:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CCAB9AC00A for <xfs@oss.sgi.com>; Wed, 14 May 2014 05:47:19 -0700 (PDT) X-ASG-Debug-ID: 1400071636-04cbb03cc44cf540001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id FXFSPWL4XsKFMmc5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 14 May 2014 05:47:17 -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 184CD30502 for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:47:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de 184CD30502 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1400071636; bh=q7cOnz6zQFEzH4+l3O0DlCTFglj0l2Zo55L2lqg/76w=; h=Date:From:To:Subject:Reply-To; b=0wOGv45B8SNqQX1GmaWg7BIcdqxgl94pZaap/r5JWIcpHhCbV+SFplCFrjWNsC+lA oPVibx2tgMD8Sr0LAftqEPAMZLXm2rOOtZ9CTX9LXOEeuUlEuIjz/ZNDGsxiifTrJo Lk3cbZ94g8ZZpCK5YpVXX0Q94T8L0DXTO2vJbUws= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 14 May 2014 14:47:16 +0200 From: Marko Weber|8000 <weber@zbfmail.de> To: Xfs <xfs@oss.sgi.com> Subject: =?UTF-8?Q?xfs=5Fdb=20dont=20work=20on=20blocksize=20=34=30=39=36?= =?UTF-8?Q?=3F?= Organization: zbf mail X-ASG-Orig-Subj: =?UTF-8?Q?xfs=5Fdb=20dont=20work=20on=20blocksize=20=34=30=39=36?= =?UTF-8?Q?=3F?= Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <e6b0d925a9409122a92d4e14922a26fd@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-INFN-TO-Metrics: mailserver 1233; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1400071637 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.5801 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, does xfs_db not work on blocksize 4096 ? i get this: bunka distfiles # xfs_db -r /dev/sda4 xfs_db: error - read only 0 of 512 bytes cache_node_purge: refcount was 1, not zero (node=0x686530) xfs_db: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x688810) xfs_db: cannot read realtime bitmap inode (117) xfs_db: error - read only 0 of 512 bytes xfs_db> quit any hints, ideas tipps? thank you marko -- zbfmail - Mittendrin statt nur Datei! OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver From lczerner@redhat.com Wed May 14 08:20:46 2014 Return-Path: <lczerner@redhat.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 B046B7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 08:20:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 74DD18F8050 for <xfs@oss.sgi.com>; Wed, 14 May 2014 06:20:43 -0700 (PDT) X-ASG-Debug-ID: 1400073638-04bdf02b8c50e3c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EfxtJwFdGVsCEIgq for <xfs@oss.sgi.com>; Wed, 14 May 2014 06:20:42 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@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 (8.14.4/8.14.4) with ESMTP id s4EDKcHZ021427 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 14 May 2014 09:20:38 -0400 Received: from [10.34.251.100] ([10.34.251.100]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4EDKO3U016219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 14 May 2014 09:20:36 -0400 Date: Wed, 14 May 2014 15:20:24 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= <lczerner@redhat.com> X-X-Sender: lczerner@localhost.localdomain To: dchinner@redhat.com cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Separate mailing list for xfstests Message-ID: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> X-ASG-Orig-Subj: Separate mailing list for xfstests User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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: 1400073638 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 Hi Dave, I am wondering whether you're open to the idea of creating separate mailing list for xfstests. It is no longer xfs specific project and even though you're still a maintainer of the project, other fs folks are definitely interested in the development process, but not everyone might be interested in receiving everything from the xfs@oss.sgi.com list. To speak for myself I would like to help with review of xfstests patches as well, but I rarely go through my xfs folder unfortunately. linux-fsdevel might seem as a good candidate for it, but still I think that it deserves a separate ML to point people to. What do you think ? Thanks! -Lukas From sandeen@sandeen.net Wed May 14 09:06:22 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DEFEA7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:06:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F46CAC00A for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:06:19 -0700 (PDT) X-ASG-Debug-ID: 1400076377-04cbb03cc74d27d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id i7v5GDgXm0wHB55E for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:06: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 59C1A63C6058; Wed, 14 May 2014 09:06:17 -0500 (CDT) Message-ID: <5373785D.6000907@sandeen.net> Date: Wed, 14 May 2014 09:06:21 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: weber@zbfmail.de, Xfs <xfs@oss.sgi.com> Subject: Re: xfs_db dont work on blocksize 4096? References: <e6b0d925a9409122a92d4e14922a26fd@zbfmail.de> X-ASG-Orig-Subj: Re: xfs_db dont work on blocksize 4096? In-Reply-To: <e6b0d925a9409122a92d4e14922a26fd@zbfmail.de> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1400076377 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.5802 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/14/14, 7:47 AM, Marko Weber|8000 wrote: > > hello, > does xfs_db not work on blocksize 4096 ? > > i get this: > > bunka distfiles # xfs_db -r /dev/sda4 > xfs_db: error - read only 0 of 512 bytes > cache_node_purge: refcount was 1, not zero (node=0x686530) > xfs_db: cannot read root inode (117) > cache_node_purge: refcount was 1, not zero (node=0x688810) > xfs_db: cannot read realtime bitmap inode (117) > xfs_db: error - read only 0 of 512 bytes > xfs_db> quit > > any hints, ideas tipps? > > thank you > > marko > What version of xfsprogs? Works here: # insmod drivers/scsi/scsi_debug.ko dev_size_mb=32 sector_size=4096 # blockdev --getpbsz --getss /dev/sdd 4096 4096 # mkfs.xfs /dev/sdd meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 data = bsize=4096 blocks=8192, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=1605, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # xfs_db /dev/sdd xfs_db> sb 0 xfs_db> p magicnum magicnum = 0x58465342 xfs_db> From bfoster@redhat.com Wed May 14 09:11:34 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 313007F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:11:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F19D5304032 for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:11:30 -0700 (PDT) X-ASG-Debug-ID: 1400076689-04bdf02b8b510de0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id a1fPPEGchD60nG4h for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:11: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4EEBM3X005840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 14 May 2014 10:11:23 -0400 Received: from laptop.bfoster (vpn-55-75.rdu2.redhat.com [10.10.55.75]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4EEBMsk022731; Wed, 14 May 2014 10:11:22 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 25DED120AC2; Wed, 14 May 2014 10:11:22 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4EEBLAe007901; Wed, 14 May 2014 10:11:21 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 14 May 2014 10:11:20 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: log vector rounding leaks log space Message-ID: <20140514141120.GA7260@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: log vector rounding leaks log space References: <1400031979-14089-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400031979-14089-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400076689 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, May 14, 2014 at 11:46:19AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > The addition of direct formatting of log items into the CIL > linear buffer added alignment restrictions that the start of each > vector needed to be 64 bit aligned. Hence padding was added in > xlog_finish_iovec() to round up the vector length to ensure the next > vector started with the correct alignment. > > This adds a small number of bytes to the size of > the linear buffer that is otherwise unused. The issue is that we > then use the linear buffer size to determine the log space used by > the log item, and this includes the unused space. Hence when we > account for space used by the log item, it's more than is actually > written into the iclogs, and hence we slowly leak this space. > > This results on log hangs when reserving space, with threads getting > stuck with these stack traces: > > Call Trace: > [<ffffffff81d15989>] schedule+0x29/0x70 > [<ffffffff8150d3a2>] xlog_grant_head_wait+0xa2/0x1a0 > [<ffffffff8150d55d>] xlog_grant_head_check+0xbd/0x140 > [<ffffffff8150ee33>] xfs_log_reserve+0x103/0x220 > [<ffffffff814b7f05>] xfs_trans_reserve+0x2f5/0x310 > ..... > > > The 4 bytes is significant. Brain Foster did all the hard work in > tracking down a reproducable leak to inode chunk allocation (it went > away with the ikeep mount option). His rough numbers were that > creating 50,000 inodes leaked 11 log blocks. This turns out to be > roughly 800 inode chunks or 1600 inode cluster buffers. That > works out at roughly 4 bytes per cluster buffer logged, and at that > I started looking for a 4 byte leak in the buffer logging code. > > What I found was that a struct xfs_buf_log_format structure for an > inode cluster buffer is 28 bytes in length. This gets rounded up to > 32 bytes, but the vector length remains 28 bytes. Hence the CIL > ticket reservation is decremented by 32 bytes (via lv->lv_buf_len) > for that vector rather than 28 bytes which are written into the log. > > The fix for this problem is to separately track the bytes used by > the log vectors in the item and use that instead of the buffer > length when accounting for the log space that will be used by the > formatted log item. > > Again, thanks to Brian Foster for doing all the hard work and long > hours to isolate this leak and make finding the bug relatively > simple. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_log.h | 19 +++++++++++++------ > fs/xfs/xfs_log_cil.c | 7 ++++--- > 2 files changed, 17 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h > index 2c40044..84e0deb 100644 > --- a/fs/xfs/xfs_log.h > +++ b/fs/xfs/xfs_log.h > @@ -24,7 +24,8 @@ struct xfs_log_vec { > struct xfs_log_iovec *lv_iovecp; /* iovec array */ > struct xfs_log_item *lv_item; /* owner */ > char *lv_buf; /* formatted buffer */ > - int lv_buf_len; /* size of formatted buffer */ > + int lv_bytes; /* accounted space in buffer */ > + int lv_buf_len; /* aligned size of buffer */ > int lv_size; /* size of allocated lv */ > }; > > @@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, > return vec->i_addr; > } > > +/* > + * We need to make sure the next buffer is naturally aligned for the biggest > + * basic data type we put into it. We already accounted for this padding when > + * sizing the buffer. > + * > + * However, this padding does not get written into the log, and hence we have to > + * track the space used by the log vectors separately to prevent log space hangs > + * due to inaccurate accounting (i.e. a leak) of the used log space through the > + * CIL context ticket. > + */ > static inline void > xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len) > { > - /* > - * We need to make sure the next buffer is naturally aligned for the > - * biggest basic data type we put into it. We already accounted for > - * this when sizing the buffer. > - */ > lv->lv_buf_len += round_up(len, sizeof(uint64_t)); > + lv->lv_bytes += len; > vec->i_len = len; > } > Ok, so we basically keep separate tracking for the memory buffer vs. used log space. The former is now only used simply to align the start of the next buffer. The latter is aggregated and accounted against the transaction as used log space. This now ensures that the reserve grant head will be restored to the point that the tail will eventually hit when the associated log items are cycled through the AIL. In other words, all unused log space that the transaction has reserved is returned to the reserve head. This passes my isolated inode creation/removal and fsstress tests. After running some operations and issuing a freeze, the reserve grant head matches up exactly with the current log head (i.e., no lingering reservations). I'm going to run a bit more testing, including the longer test that originally reproduced this problem (over several days). But otherwise this looks pretty good to me. Thanks for tracking this down. Reviewed-by: Brian Foster <bfoster@redhat.com> I'm also going to look into exporting some of the data that was used to identify this problem. To provide more background, this originally manifested as an fs instance severely choking after several days of a high stress (fsstress) workload, and even then, was not straightforward to diagnose. While somewhat prominent, the smallish nature of the leak is difficult to detect under a normal workload, and may cause performance degradation long before an actual hang. Dumping some of the internal log state for debugging purposes actually made this problem obvious. For example, sampling the current log head and reserve grant head after some number of fsstress ops (with the fs quiesced) shows a clear trend of leaking the reserve grant head. I think exporting some of this internal data (e.g., through /sysfs) is generally beneficial and also should facilitate the addition of an xfstests test to explicitly detect such leaks in the future. Brian > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index 039c873..b3425b3 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -97,7 +97,7 @@ xfs_cil_prepare_item( > { > /* Account for the new LV being passed in */ > if (lv->lv_buf_len != XFS_LOG_VEC_ORDERED) { > - *diff_len += lv->lv_buf_len; > + *diff_len += lv->lv_bytes; > *diff_iovecs += lv->lv_niovecs; > } > > @@ -111,7 +111,7 @@ xfs_cil_prepare_item( > else if (old_lv != lv) { > ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED); > > - *diff_len -= old_lv->lv_buf_len; > + *diff_len -= old_lv->lv_bytes; > *diff_iovecs -= old_lv->lv_niovecs; > kmem_free(old_lv); > } > @@ -239,7 +239,7 @@ xlog_cil_insert_format_items( > * that the space reservation accounting is correct. > */ > *diff_iovecs -= lv->lv_niovecs; > - *diff_len -= lv->lv_buf_len; > + *diff_len -= lv->lv_bytes; > } else { > /* allocate new data chunk */ > lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); > @@ -259,6 +259,7 @@ xlog_cil_insert_format_items( > > /* 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))); > > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Wed May 14 09:52:05 2014 Return-Path: <sandeen@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E51D7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:52:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02239AC00B for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:52:04 -0700 (PDT) X-ASG-Debug-ID: 1400079123-04cb6c72904f3e20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aXeccDcihpBpwMDW for <xfs@oss.sgi.com>; Wed, 14 May 2014 07:52:04 -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 (8.14.4/8.14.4) with ESMTP id s4EEq3xR024909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 14 May 2014 10:52:03 -0400 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 s4EEq1Hr005150 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 14 May 2014 10:52:02 -0400 Message-ID: <53738316.20601@redhat.com> Date: Wed, 14 May 2014 09:52:06 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: =?windows-1252?Q?Luk=E1=9A_Czerner?= <lczerner@redhat.com>, dchinner@redhat.com CC: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests In-Reply-To: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit 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: 1400079124 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 5/14/14, 8:20 AM, Lukáš Czerner wrote: > Hi Dave, > > I am wondering whether you're open to the idea of creating separate > mailing list for xfstests. It is no longer xfs specific project and > even though you're still a maintainer of the project, other fs folks > are definitely interested in the development process, but not > everyone might be interested in receiving everything from the > xfs@oss.sgi.com list. > > To speak for myself I would like to help with review of xfstests > patches as well, but I rarely go through my xfs folder > unfortunately. > > linux-fsdevel might seem as a good candidate for it, but still I > think that it deserves a separate ML to point people to. > > What do you think ? That sounds pretty reasonable to me. We've always encouraged submissions to cc: the other relevant lists (i.e. linux-ext4 if it's an ext4-specific patch) and would probably still encourage that, but even from the other angle (keeping i.e. ext4-specific and btrfs-specific patches off the xfs list) this sounds like a good idea. -Eric > Thanks! > -Lukas From prvs=0211dc5819=clm@fb.com Wed May 14 10:01:15 2014 Return-Path: <prvs=0211dc5819=clm@fb.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=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 745BC7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 10:01:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B9E28F8035 for <xfs@oss.sgi.com>; Wed, 14 May 2014 08:01:15 -0700 (PDT) X-ASG-Debug-ID: 1400079670-04cbb03cc64d4c40001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id gCgKeQCCdIV7BwDT for <xfs@oss.sgi.com>; Wed, 14 May 2014 08:01:11 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0211dc5819=clm@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004003 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s4EEx6Cj025977; Wed, 14 May 2014 08:01:10 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=zAMPwDo5uXRfRqLMKgWgg3TWix71ihOuTx24gRPRNqM=; b=D7UlYU7LIspL91WVWI39Znz+FnRjXYnMwcdAvXhIbsyY1SfycozXouXTeyKOD8BltxtH DTm5gP+WH5XqTB0NSjciXXGrj1rUVCkyER76z8txJ8M9pe295a8nEO4jnS5w/FUSvQau wPh4ugdhhs2i0GsVvixOcyAPMUAqKGnFHOw= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1kuxgg9rq1-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Wed, 14 May 2014 08:01:09 -0700 Received: from [172.23.2.36] (192.168.16.4) by mail.thefacebook.com (192.168.16.14) with Microsoft SMTP Server (TLS) id 14.3.174.1; Wed, 14 May 2014 08:00:54 -0700 Message-ID: <53738597.70305@fb.com> Date: Wed, 14 May 2014 11:02:47 -0400 From: Chris Mason <clm@fb.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com>, =?windows-1252?Q?Luk=E1=9A_Czern?= =?windows-1252?Q?er?= <lczerner@redhat.com>, <dchinner@redhat.com> CC: <xfs@oss.sgi.com>, <linux-fsdevel@vger.kernel.org>, <linux-ext4@vger.kernel.org> Subject: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <53738316.20601@redhat.com> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests In-Reply-To: <53738316.20601@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 8bit X-Originating-IP: [192.168.16.4] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-14_04:2014-05-14,2014-05-14,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.00747796771827e-08 kscore.compositescore=0 circleOfTrustscore=83.9826349892117 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1405140175 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1400079671 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 05/14/2014 10:52 AM, Eric Sandeen wrote: > On 5/14/14, 8:20 AM, Lukáš Czerner wrote: >> Hi Dave, >> >> I am wondering whether you're open to the idea of creating separate >> mailing list for xfstests. It is no longer xfs specific project and >> even though you're still a maintainer of the project, other fs folks >> are definitely interested in the development process, but not >> everyone might be interested in receiving everything from the >> xfs@oss.sgi.com list. >> >> To speak for myself I would like to help with review of xfstests >> patches as well, but I rarely go through my xfs folder >> unfortunately. >> >> linux-fsdevel might seem as a good candidate for it, but still I >> think that it deserves a separate ML to point people to. >> >> What do you think ? > > That sounds pretty reasonable to me. We've always encouraged submissions > to cc: the other relevant lists (i.e. linux-ext4 if it's an ext4-specific > patch) and would probably still encourage that, but even from the other > angle (keeping i.e. ext4-specific and btrfs-specific patches off the > xfs list) this sounds like a good idea. +1 here. -chris From tytso@thunk.org Wed May 14 11:05:00 2014 Return-Path: <tytso@thunk.org> X-Spam-Checker-Version: SpamAssassin 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 5EADD7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 11:05:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A9E130404E for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:04:57 -0700 (PDT) X-ASG-Debug-ID: 1400083492-04cbb03cc74d8100001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id TMZ4dOsISpoq2CBY (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:04:52 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=vJUALiJcWuXedFh44+UHNQu0AII7CHrO5vTF9Ez8CIw=; b=VIV98JRqKXB+DtqMJqmGayeMRkiWorOSQRPMEiUy57IaTOipdXVKGyclWVKv4TOJXtbxSXxnpZd5em4x9XxNSnbTgNo0YAddH57/oI54RcAYaJ63X5NAtVgp+NEf7gZP7SGBhX0ry0wJG5FiT6UGf6KImX8xrng/vEUxeD4/ngo=; Received: from tytso by imap.thunk.org with local (Exim 4.80) (envelope-from <tytso@thunk.org>) id 1Wkbfj-0005Gi-Tj; Wed, 14 May 2014 16:04:47 +0000 Date: Wed, 14 May 2014 16:04:47 +0000 From: tytso@mit.edu To: Chris Mason <clm@fb.com> Cc: Eric Sandeen <sandeen@redhat.com>, =?utf-8?B?THVrw6HFoQ==?= Czerner <lczerner@redhat.com>, dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests Message-ID: <20140514160447.GA3974@thunk.org> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <53738316.20601@redhat.com> <53738597.70305@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53738597.70305@fb.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: <locally generated> X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1400083492 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=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5804 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 On Wed, May 14, 2014 at 11:02:47AM -0400, Chris Mason wrote: > >> linux-fsdevel might seem as a good candidate for it, but still I > >> think that it deserves a separate ML to point people to. I'm personally in favor of using linux-fsdevel since it might encourage more fs developers who aren't using xfstests yet to start using it. For example, we started investigating using xfstests to test unionfs, and pretty quickly found problems. (I suspect the same problem exists in AUFS, BTW, but I've been focusing on unionfs because it's simpler and less scary.) The patches to enable the use of xfstests to test unionfs are still pretty rough, but hopefully we'll get those sent to Dave once they are cleaned up a bit. - Ted From tyhicks@canonical.com Wed May 14 11:51:04 2014 Return-Path: <tyhicks@canonical.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2D5677F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 11:51:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B869AC00C for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:51:00 -0700 (PDT) X-ASG-Debug-ID: 1400086258-04cb6c72914f9d70001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id GdQskcmekTo2UkTY for <xfs@oss.sgi.com>; Wed, 14 May 2014 09:50:58 -0700 (PDT) X-Barracuda-Envelope-From: tyhicks@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from 23-123-229-184.lightspeed.rcsntx.sbcglobal.net ([23.123.229.184] helo=boyd) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from <tyhicks@canonical.com>) id 1WkcOL-0006AN-AI; Wed, 14 May 2014 16:50:53 +0000 Date: Wed, 14 May 2014 11:50:49 -0500 From: Tyler Hicks <tyhicks@canonical.com> To: tytso@mit.edu Cc: Chris Mason <clm@fb.com>, Eric Sandeen <sandeen@redhat.com>, =?utf-8?B?THVrw6HFoQ==?= Czerner <lczerner@redhat.com>, dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests Message-ID: <20140514165048.GA20454@boyd> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <53738316.20601@redhat.com> <53738597.70305@fb.com> <20140514160447.GA3974@thunk.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="fUYQa+Pmc3FrFX/N" Content-Disposition: inline In-Reply-To: <20140514160447.GA3974@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1400086258 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.5806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2014-05-14 16:04:47, tytso@mit.edu wrote: > On Wed, May 14, 2014 at 11:02:47AM -0400, Chris Mason wrote: > > >> linux-fsdevel might seem as a good candidate for it, but still I > > >> think that it deserves a separate ML to point people to. >=20 > I'm personally in favor of using linux-fsdevel since it might > encourage more fs developers who aren't using xfstests yet to start > using it. >=20 > For example, we started investigating using xfstests to test unionfs, > and pretty quickly found problems. (I suspect the same problem exists > in AUFS, BTW, but I've been focusing on unionfs because it's simpler > and less scary.) The patches to enable the use of xfstests to test > unionfs are still pretty rough, but hopefully we'll get those sent to > Dave once they are cleaned up a bit. Oh, that sounds interesting. I haven't seen these patches, but I expect they would be pretty easy for me to extend for testing eCryptfs. That has been on my todo list for a long time but I haven't spent much time working on eCryptfs lately. BTW, you can use this email as a supporting data point for your first paragraph. :) Tyler --fUYQa+Pmc3FrFX/N Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBCgAGBQJTc57oAAoJENaSAD2qAscKHiQP/jMiLT4iqu2Fovh9zqIInjpe tlw+SIdM5e9/s/mG9Gys706Ktvy/LyDAkYcBCNVePu5VlV6BTrXIlkkJwaW2F4wB zzLm02xzPzq5Z+xnWRpNcscmEz68rzA2ciFVd1PuOqw1TscTNVmfoUUAsMXXUZgv SD7M43OBHql0mTdPX65xmT2HhyYhnaL2KU1qqRvWcNT1MIuVIJ9GbkrD8sH2GzVn cM9yvgEIopbijtuLlCTxXIwzPTFZq3oVcX9awEr0Tx1tVB7qM7Bw0OK+jt/wRpDH NO0KCxGYqs7R223W1E9/pvzFs+A50n9rQihtoZEoieb6u4S/zMhmaSXTT2spOyoJ t9AkeUJLITrFyzE9V7z3KIumC9de7s1VwhYCx/CjLM+ASVPx19kCH0CnmRapiO6v zEMTabX23QV6noOI0C8CHpQ8ludLsUwbTKWpLYL6Z0qLCJeBwsVxXOlelDeKO0/6 yD998a6K9ziuJOGg4KjpGuur0QavFApt33D0c7tlRngFv/zT9pUxRSiSD0hjv2yl vKm7uz60I4OOa6b31OYZrg9S4/0vTOyr1R6PEuBd7Jp8aQ/teUOz1mC7n/nnWlew 2BY8jZZRM3AVRI/Uq+K1axMjwgNUW9Zght1Px4Bd/zszE5yONro8MX18rkTf9HNL uOmxQlf/VmP0cMFUXd+D =+lOS -----END PGP SIGNATURE----- --fUYQa+Pmc3FrFX/N-- From bfoster@redhat.com Wed May 14 12:29:46 2014 Return-Path: <bfoster@redhat.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 1DB627F47 for <xfs@oss.sgi.com>; Wed, 14 May 2014 12:29:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB8F28F804C for <xfs@oss.sgi.com>; Wed, 14 May 2014 10:29:45 -0700 (PDT) X-ASG-Debug-ID: 1400088584-04bdf02b8d51a770001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q4ZgVQWDQaS0FGAL for <xfs@oss.sgi.com>; Wed, 14 May 2014 10:29: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4EHTi8j031422 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Wed, 14 May 2014 13:29:44 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4EHTiVS015210 for <xfs@oss.sgi.com>; Wed, 14 May 2014 13:29:44 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D7F391248A9; Wed, 14 May 2014 13:29:42 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH] xfstests: make sure tests check for loop device support Date: Wed, 14 May 2014 13:29:42 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: make sure tests check for loop device support Message-Id: <1400088582-16916-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: 1400088584 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 Several tests happen to make use of loop device support without the requisite pre-test checks. This results in spurious failures for systems that might not have loop device support. Add _require_loop checks to shared/298, xfs/206 and xfs/259. Signed-off-by: Brian Foster <bfoster@redhat.com> --- tests/shared/298 | 1 + tests/xfs/206 | 1 + tests/xfs/259 | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/shared/298 b/tests/shared/298 index f13c14b..8211da3 100755 --- a/tests/shared/298 +++ b/tests/shared/298 @@ -32,6 +32,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 _supported_fs ext4 xfs _supported_os Linux +_require_loop _require_fstrim _require_xfs_io_command "fiemap" _require_fs_space $TEST_DIR 307200 diff --git a/tests/xfs/206 b/tests/xfs/206 index 0bbd595..f739597 100755 --- a/tests/xfs/206 +++ b/tests/xfs/206 @@ -53,6 +53,7 @@ _cleanup() # Modify as appropriate. _supported_fs xfs _supported_os IRIX Linux +_require_loop bitsperlong=`src/feature -w` if [ "$bitsperlong" -ne 64 ]; then diff --git a/tests/xfs/259 b/tests/xfs/259 index b8bd69a..8241d94 100755 --- a/tests/xfs/259 +++ b/tests/xfs/259 @@ -41,7 +41,7 @@ trap "_cleanup ; exit \$status" 0 1 2 3 15 # real QA test starts here _supported_fs xfs _supported_os Linux - +_require_loop _require_math testfile=$TEST_DIR/259.image -- 1.8.3.1 From david@fromorbit.com Wed May 14 16:28:28 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D57B7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 16:28:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7986AC00D for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:28:27 -0700 (PDT) X-ASG-Debug-ID: 1400102904-04cbb03cc44e5a00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MR6iSP25DpUH35kl for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:28:25 -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: AgtIAATfc1N5LL1sPGdsb2JhbABZgwaDPoUKpCQBAQEBAQEGmh0BgSYXAwEBAQE4NYIlAQEEATocIwULCAMYCSUPBSUDBxoTiDkH0VoXFoU+iHoHhEAEmVCWXSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 15 May 2014 06:58:23 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wkgis-00060R-NX; Thu, 15 May 2014 07:28:22 +1000 Date: Thu, 15 May 2014 07:28:22 +1000 From: Dave Chinner <david@fromorbit.com> To: Jeff Liu <jeff.liu@oracle.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 Message-ID: <20140514212822.GS26353@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/9] xfs: error sign fixes for 3.15-rc6 References: <1399971373-6242-1-git-send-email-david@fromorbit.com> <53731B07.9040606@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53731B07.9040606@oracle.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: 1400102905 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.5813 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 14, 2014 at 03:28:07PM +0800, Jeff Liu wrote: > Hi Dave, > > On 05/13/2014 04:56 PM, Dave Chinner wrote: > > Hi folks, > > > > I've been working through the mess that is the > > error sign impedance mismatch between the core XFS code and the rest > > of the kernel. I'm about half way through the codebase, and I've > > found a bunch of incorrect error signs throughout the VFS interface > > layers. > > > > These were effectively all found by inspection, and is > > further evidence that we need to convert all of XFS to negative > > errors as quickly as possible. > > Would you like to find a volunteer to deal with that? I have a colleague > is trying to study XFS these days, looks this is a good task to him. Thanks for the offer, but I've already done half the conversion of the codebase. Hence I may as well finish it. Indeed, The sooner I've done it, the sooner we can get it into the dev tree for testing.... > BTW, before doing negative errors converting, should we have > libxfs infrastructure support at first? Makes no difference - the libxfs structural changes are just moving files about and futzing with makefiles. It'll only take me an hour to redo those patches from scratch, so it doesn't matter what state the code base is in to start with. I'd prefer that the kernel libxfs uses negative errors from the start, though ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed May 14 16:35:48 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ADABA7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 16:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33767AC00D for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:35:48 -0700 (PDT) X-ASG-Debug-ID: 1400103344-04cb6c1fcc3b2af0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id giBXS83hfPjnVEzx for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:35:45 -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: AgpIAEzhc1N5LL1sPGdsb2JhbABZDoJ4gz6FCqQkAQEBAQEBBpodAYEmFwMBAQEBODWCJQEBBTocGAsQCAMYCSUPBSUDBy2IQNFaFxaFPoh6BxaEKgSZUJYLUis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 15 May 2014 07:05:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wkgpl-00062x-EF; Thu, 15 May 2014 07:35:29 +1000 Date: Thu, 15 May 2014 07:35:29 +1000 From: Dave Chinner <david@fromorbit.com> To: tytso@mit.edu Cc: Chris Mason <clm@fb.com>, Eric Sandeen <sandeen@redhat.com>, =?utf-8?B?THVrw6HFoQ==?= Czerner <lczerner@redhat.com>, dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests Message-ID: <20140514213529.GT26353@dastard> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <53738316.20601@redhat.com> <53738597.70305@fb.com> <20140514160447.GA3974@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140514160447.GA3974@thunk.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: 1400103344 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.5813 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, May 14, 2014 at 04:04:47PM +0000, tytso@mit.edu wrote: > On Wed, May 14, 2014 at 11:02:47AM -0400, Chris Mason wrote: > > >> linux-fsdevel might seem as a good candidate for it, but still I > > >> think that it deserves a separate ML to point people to. > > I'm personally in favor of using linux-fsdevel since it might > encourage more fs developers who aren't using xfstests yet to start > using it. I'd prefer a separate mailing list - I don't really like the idea of burying general lists in large amounts of specific topic-related traffic. That way lies lkml - a dumping ground for everything that has no stopic-related lists and that results in a very low signal to noise ratio. Comparitively speaking, -fsdevel has a high SNR, so we should try to keep it that way. ;) That said, I can see the value in sending update/release announcements to -fsdevel, but I'd prefer to keep all the xfstests traffic separate. A separate list makes things like archive searching and patch tracking much simpler.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed May 14 16:46:06 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8EB3F7F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 16:46:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14DA7AC00C for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:46:05 -0700 (PDT) X-ASG-Debug-ID: 1400103963-04cbb03cc44e6380001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MkYS1jBhzTeqEc4b for <xfs@oss.sgi.com>; Wed, 14 May 2014 14:46:03 -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: AhxIAKvjc1N5LL1sPGdsb2JhbABZgwaDPlGEOaQkAQEBAQEBBpodAYEnFwMBAQEBODWCJQEBBSMPASMYCxAIAQIYAgIFIQICDwUlAwcaE4hAkCacIKUUFxaBFIQqiHoHgnWBSwEDmVCWXSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 15 May 2014 07:16:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wkgzx-00067L-SD; Thu, 15 May 2014 07:46:01 +1000 Date: Thu, 15 May 2014 07:46:01 +1000 From: Dave Chinner <david@fromorbit.com> To: =?utf-8?B?THVrw6HFoQ==?= Czerner <lczerner@redhat.com> Cc: dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests Message-ID: <20140514214601.GU26353@dastard> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> 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: 1400103963 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.5813 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 14, 2014 at 03:20:24PM +0200, Lukáš Czerner wrote: > Hi Dave, > > I am wondering whether you're open to the idea of creating separate > mailing list for xfstests. It is no longer xfs specific project and > even though you're still a maintainer of the project, other fs folks > are definitely interested in the development process, but not > everyone might be interested in receiving everything from the > xfs@oss.sgi.com list. > > To speak for myself I would like to help with review of xfstests > patches as well, but I rarely go through my xfs folder > unfortunately. > > linux-fsdevel might seem as a good candidate for it, but still I > think that it deserves a separate ML to point people to. Makes sense to me. fstests@vger.kernel.org? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Wed May 14 18:27:18 2014 Return-Path: <dgc@oss.sgi.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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 68A377F47; Wed, 14 May 2014 18:27:18 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-3.15-rc5-1266-gd6d211d X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 X-Git-Newrev: d6d211db37e75de2ddc3a4f979038c40df7cc79c Message-Id: <20140514232718.68A377F47@oss.sgi.com> Date: Wed, 14 May 2014 18:27:17 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated afcf0a2 Merge tag 'xfs-for-linus-3.15-rc5' of git://oss.sgi.com/xfs/xfs 8275cdd xfs: remote attribute overwrite causes transaction overrun d540e43 xfs: initialize default acls for ->tmpfile() c99d609 xfs: fully support v5 format filesystems 9ac0367 Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 330033d xfs: fix tmpfile/selinux deadlock and initialize security 8d6c121 xfs: fix buffer use after free on IO error 07d5035 xfs: wrong error sign conversion during failed DIO writes 9c23ecc xfs: unmount does not wait for shutdown during unmount d39a2ce xfs: collapse range is delalloc challenged 0e1f789 xfs: don't map ranges that span EOF for direct IO 897b73b xfs: zeroing space needs to punch delalloc blocks aad3f37 xfs: xfs_vm_write_end truncates too much on failure 72ab70a xfs: write failure beyond EOF truncates too much data 4ab9ed5 xfs: kill buffers over failed write ranges properly 23fffa9 fs: move falloc collapse range check into the filesystem methods from c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit afcf0a2d9289bbe50aab362e6fb2798038815973 Merge: f322e26 8275cdd Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Thu May 8 19:20:45 2014 -0700 Merge tag 'xfs-for-linus-3.15-rc5' of git://oss.sgi.com/xfs/xfs Pull xfs fixes from Dave Chinner: "The main fix is adding support for default ACLs on O_TMPFILE opened inodes to bring XFS into line with other filesystems. Metadata CRCs are now also considered well enough tested to be fully supported, so we're removing the shouty warnings issued at mount time for filesystems with that format. And there's transaction block reservation overrun fix. Summary: - fix a remote attribute size calculation bug that leads to a transaction overrun - add default ACLs to O_TMPFILE files - Remove the EXPERIMENTAL tag from filesystems with metadata CRC support" * tag 'xfs-for-linus-3.15-rc5' of git://oss.sgi.com/xfs/xfs: xfs: remote attribute overwrite causes transaction overrun xfs: initialize default acls for ->tmpfile() xfs: fully support v5 format filesystems commit 9ac03675010a69507c0a9d832d6a722e07d35cc6 Merge: a798c10 0a04b24 Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Sun Apr 20 20:43:47 2014 -0700 Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 fixes from Ted Ts'o: "These are regression and bug fixes for ext4. We had a number of new features in ext4 during this merge window (ZERO_RANGE and COLLAPSE_RANGE fallocate modes, renameat, etc.) so there were many more regression and bug fixes this time around. It didn't help that xfstests hadn't been fully updated to fully stress test COLLAPSE_RANGE until after -rc1" * tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (31 commits) ext4: disable COLLAPSE_RANGE for bigalloc ext4: fix COLLAPSE_RANGE failure with 1KB block size ext4: use EINVAL if not a regular file in ext4_collapse_range() ext4: enforce we are operating on a regular file in ext4_zero_range() ext4: fix extent merging in ext4_ext_shift_path_extents() ext4: discard preallocations after removing space ext4: no need to truncate pagecache twice in collapse range ext4: fix removing status extents in ext4_collapse_range() ext4: use filemap_write_and_wait_range() correctly in collapse range ext4: use truncate_pagecache() in collapse range ext4: remove temporary shim used to merge COLLAPSE_RANGE and ZERO_RANGE ext4: fix ext4_count_free_clusters() with EXT4FS_DEBUG and bigalloc enabled ext4: always check ext4_ext_find_extent result ext4: fix error handling in ext4_ext_shift_extents ext4: silence sparse check warning for function ext4_trim_extent ext4: COLLAPSE_RANGE only works on extent-based files ext4: fix byte order problems introduced by the COLLAPSE_RANGE patches ext4: use i_size_read in ext4_unaligned_aio() fs: disallow all fallocate operation on active swapfile fs: move falloc collapse range check into the filesystem methods ... commit 23fffa925ea2c9a2bcb1a4453e2c542635aa3545 Author: Lukas Czerner <lczerner@redhat.com> Date: Sat Apr 12 09:56:41 2014 -0400 fs: move falloc collapse range check into the filesystem methods Currently in do_fallocate in collapse range case we're checking whether offset + len is not bigger than i_size. However there is nothing which would prevent i_size from changing so the check is pointless. It should be done in the file system itself and the file system needs to make sure that i_size is not going to change. The i_size check for the other fallocate modes are also done in the filesystems. As it is now we can easily crash the kernel by having two processes doing truncate and fallocate collapse range at the same time. This can be reproduced on ext4 and it is theoretically possible on xfs even though I was not able to trigger it with this simple test. This commit removes the check from do_fallocate and adds it to the file system. Signed-off-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Acked-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de> ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 51 ++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_attr.c | 24 +++++++++++++++++- fs/xfs/xfs_attr_leaf.c | 21 ++++++++-------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 8 +++--- fs/xfs/xfs_bmap.c | 17 ++++++++----- fs/xfs/xfs_bmap_util.c | 13 +++++++++- fs/xfs/xfs_buf.c | 16 +++++++++--- fs/xfs/xfs_da_btree.h | 2 ++ fs/xfs/xfs_file.c | 12 +++++++-- fs/xfs/xfs_inode.c | 5 ++-- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 41 ++++++++++++++++++++++--------- fs/xfs/xfs_log.c | 63 ++++++++++++++++++++++++++++++++++++++---------- fs/xfs/xfs_mount.c | 2 -- fs/xfs/xfs_sb.c | 4 --- fs/xfs/xfs_trace.h | 1 + 17 files changed, 216 insertions(+), 67 deletions(-) hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Wed May 14 18:48:49 2014 Return-Path: <dgc@oss.sgi.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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id F37027F47; Wed, 14 May 2014 18:48:48 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-fixes-for-3.15-rc6, created. xfs-for-linus-3.15-rc5-1275-gee4eec4 X-Git-Refname: refs/heads/xfs-fixes-for-3.15-rc6 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: ee4eec478be4677b93775d17bc079efb5922b276 Message-Id: <20140514234848.F37027F47@oss.sgi.com> Date: Wed, 14 May 2014 18:48:48 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-fixes-for-3.15-rc6 has been created at ee4eec478be4677b93775d17bc079efb5922b276 (commit) - Log ----------------------------------------------------------------- commit ee4eec478be4677b93775d17bc079efb5922b276 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:23:24 2014 +1000 xfs: list_lru_init returns a negative error And we don't invert it properly when initialising the dquot lru list. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit bc147822d5ada188fff792691efffe89589e2e19 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:23:07 2014 +1000 xfs: negate xfs_icsb_init_counters error value Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 45687642e43d5a3b700d6c1df0e07b3976c90c08 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:22:53 2014 +1000 xfs: negate mount workqueue init error value Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 6670232b48848e5ad949dbd4866850aec7035f32 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:22:37 2014 +1000 xfs: fix wrong err sign on xfs_set_acl() Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit a5a14de22e8afd771775c7106b3b081c23bac783 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:22:21 2014 +1000 xfs: fix wrong errno from xfs_initxattrs Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 65149e3fab7f053396d09a429085f3071fa50825 Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:22:07 2014 +1000 xfs: correct error sign on COLLAPSE_RANGE errors Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit b38a134b22fbd0bed90f3e079bbf8cb2962a52be Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:21:52 2014 +1000 xfs: xfs_commit_metadata returns wrong errno Invert it. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 8ff1e6705a4c711247708f23881feea169e6fc3c Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:21:37 2014 +1000 xfs: fix incorrect error sign in xfs_file_aio_read Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 43ec1460a2189fbee87980dd3d3e64cba2f11e1f Author: Dave Chinner <dchinner@redhat.com> Date: Thu May 15 09:21:11 2014 +1000 xfs: xfs_dir_fsync() returns positive errno And it should be negative. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com> ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Wed May 14 18:49:09 2014 Return-Path: <dgc@oss.sgi.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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id BFDC27F51; Wed, 14 May 2014 18:49:09 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-attr-cleanup, created. xfs-for-linus-3.15-rc1-14831-g6c888af X-Git-Refname: refs/heads/xfs-attr-cleanup X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 6c888af0b4ca66565b2aa73147ebc1d139c3bd1b Message-Id: <20140514234909.BFDC27F51@oss.sgi.com> Date: Wed, 14 May 2014 18:49:09 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-attr-cleanup has been created at 6c888af0b4ca66565b2aa73147ebc1d139c3bd1b (commit) - Log ----------------------------------------------------------------- commit 6c888af0b4ca66565b2aa73147ebc1d139c3bd1b Author: Christoph Hellwig <hch@lst.de> Date: Tue May 13 16:40:19 2014 +1000 xfs: pass struct da_args to xfs_attr_calc_size And remove a very confused comment. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 67fd718f30108db320ffc4bef205137b69e60d3a Author: Christoph Hellwig <hch@lst.de> Date: Tue May 13 16:34:43 2014 +1000 xfs: simplify attr name setup Replace xfs_attr_name_to_xname with a new xfs_attr_args_init helper that sets up the basic da_args structure without using a temporary xfs_name structure. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit 1bc426a76b1a8ecf00d9a3ec8e9765a21ab4082f Author: Christoph Hellwig <hch@lst.de> Date: Tue May 13 16:34:33 2014 +1000 xfs: fold xfs_attr_remove_int into xfs_attr_remove Also remove a useless ilock roundtrip for the first attr fork check, it's racy anyway and we redo it later under the ilock before we start the removal. Plus various minor style fixes to the new xfs_attr_remove. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit b87d022c275bce66553a27b68790e7c91927875f Author: Christoph Hellwig <hch@lst.de> Date: Tue May 13 16:34:24 2014 +1000 xfs: fold xfs_attr_get_int into xfs_attr_get This allows doing an unlocked check if an attr for is present at all and slightly reduce the lock hold time if we actually do an attr get. Plus various minor style fixes to the new xfs_attr_get. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> commit c5b4ac39a4cb6a9a79025106a471f0738b3cb525 Author: Christoph Hellwig <hch@lst.de> Date: Tue May 13 16:34:14 2014 +1000 xfs: fold xfs_attr_set_int into xfs_attr_set Plus various minor style fixes to the new xfs_attr_set. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com> ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Wed May 14 18:56:05 2014 Return-Path: <dgc@oss.sgi.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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id C85387F47; Wed, 14 May 2014 18:56:05 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc5-1332-g2d6dcc6 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: a3f929877fab0bd5f759a62c9a1b5cf5673525d2 X-Git-Newrev: 2d6dcc6d7e95cc83046b2f97e179e6bbb7921245 Message-Id: <20140514235605.C85387F47@oss.sgi.com> Date: Wed, 14 May 2014 18:56:05 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated discards a3f929877fab0bd5f759a62c9a1b5cf5673525d2 (commit) discards d4f8a227bda5d95a2280bd2a96ad0a0b545349da (commit) discards b8b39d39f94c0d3ea5771d1df3151c569599c20a (commit) discards 7043507bfa1af648512e36d95cca484757df0b64 (commit) discards c24c775c5e3657d329ede70f744ba075095bb53d (commit) 2d6dcc6 Merge branch 'xfs-attr-cleanup' into for-next ff14ee4 Merge branch 'xfs-misc-fixes-1-for-3.16' into for-next b767692 Merge branch 'xfs-free-inode-btree' into for-next 232c2f5 Merge branch 'xfs-filestreams-lookup' into for-next fdd3a2a Merge branch 'xfs-unused-args-cleanup' into for-next ee4eec4 xfs: list_lru_init returns a negative error bc14782 xfs: negate xfs_icsb_init_counters error value 4568764 xfs: negate mount workqueue init error value 6670232 xfs: fix wrong err sign on xfs_set_acl() a5a14de xfs: fix wrong errno from xfs_initxattrs 65149e3 xfs: correct error sign on COLLAPSE_RANGE errors b38a134 xfs: xfs_commit_metadata returns wrong errno 8ff1e67 xfs: fix incorrect error sign in xfs_file_aio_read 43ec146 xfs: xfs_dir_fsync() returns positive errno 6c888af xfs: pass struct da_args to xfs_attr_calc_size 67fd718 xfs: simplify attr name setup 1bc426a xfs: fold xfs_attr_remove_int into xfs_attr_remove b87d022 xfs: fold xfs_attr_get_int into xfs_attr_get c5b4ac3 xfs: fold xfs_attr_set_int into xfs_attr_set afcf0a2 Merge tag 'xfs-for-linus-3.15-rc5' of git://oss.sgi.com/xfs/xfs 9ac0367 Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 23fffa9 fs: move falloc collapse range check into the filesystem methods from a3f929877fab0bd5f759a62c9a1b5cf5673525d2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2d6dcc6d7e95cc83046b2f97e179e6bbb7921245 Merge: ff14ee4 6c888af Author: Dave Chinner <david@fromorbit.com> Date: Thu May 15 09:39:28 2014 +1000 Merge branch 'xfs-attr-cleanup' into for-next Conflicts: fs/xfs/xfs_attr.c commit ff14ee42a038cf48263ac8d2eca5d30196554b82 Merge: b767692 8cfcc3e Author: Dave Chinner <david@fromorbit.com> Date: Thu May 15 09:38:15 2014 +1000 Merge branch 'xfs-misc-fixes-1-for-3.16' into for-next commit b76769294ba400415fc44038c21cc2df86f9a28b Merge: 232c2f5 53801fd Author: Dave Chinner <david@fromorbit.com> Date: Thu May 15 09:37:44 2014 +1000 Merge branch 'xfs-free-inode-btree' into for-next commit 232c2f5c65dd80055e7163a5c82e3816119330e6 Merge: fdd3a2a b94acd4 Author: Dave Chinner <david@fromorbit.com> Date: Thu May 15 09:36:59 2014 +1000 Merge branch 'xfs-filestreams-lookup' into for-next commit fdd3a2ae2e48310491e605c46201c95629dd450b Merge: ee4eec4 5e06d14 Author: Dave Chinner <david@fromorbit.com> Date: Thu May 15 09:36:35 2014 +1000 Merge branch 'xfs-unused-args-cleanup' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_attr.c | 328 +++++++++++++++++++--------------------------------- fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_file.c | 16 ++- fs/xfs/xfs_iops.c | 12 +- fs/xfs/xfs_qm.c | 26 +++-- fs/xfs/xfs_super.c | 4 +- 6 files changed, 152 insertions(+), 236 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Wed May 14 21:38:51 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 801B57F3F for <xfs@oss.sgi.com>; Wed, 14 May 2014 21:38:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57CE3304048 for <xfs@oss.sgi.com>; Wed, 14 May 2014 19:38:48 -0700 (PDT) X-ASG-Debug-ID: 1400121520-04bdf02b8a52e2e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bjHrLmQZFUW1LvnK for <xfs@oss.sgi.com>; Wed, 14 May 2014 19:38:41 -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: AnNIAFYodFN5LL1sPGdsb2JhbABZgwYcM4JvhQqkJwEBAQEBAQaSYohWFwMBAQEBODWDAjskNAUlAwctiECdILRGFoU+iReCHg9EgTkEmVCBPpMYggcr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 15 May 2014 12:08:05 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WklYY-0006oj-PH for xfs@oss.sgi.com; Thu, 15 May 2014 12:38:02 +1000 Date: Thu, 15 May 2014 12:38:02 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfstests: master branch updated to 9b7f704 Message-ID: <20140515023802.GG5421@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 9b7f704 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="/WwmFnJnmDyWGHa4" Content-Disposition: inline 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: 1400121521 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.5820 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --/WwmFnJnmDyWGHa4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. The new head of the master branch is commit: 9b7f704 config: make sure tests check for loop device support New Commits: Brian Foster (2): [49a4f92] xfs/013: use killall -9 and wait in _cleanup() [9b7f704] config: make sure tests check for loop device support Filipe David Borba Manana (1): [fe3fcf2] btrfs: add regression test for send with extrefs Jeff Layton (1): [85a0117] loggen: fix build vs. newer xfsprogs headers Code Diffstat: configure.ac | 7 ++-- src/loggen.c | 7 ++++ tests/btrfs/050 | 109 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ tests/btrfs/050.out | 1 + tests/btrfs/group | 1 + tests/shared/298 | 1 + tests/xfs/013 | 3 +- tests/xfs/206 | 1 + tests/xfs/259 | 2 +- 9 files changed, 127 insertions(+), 5 deletions(-) create mode 100755 tests/btrfs/050 create mode 100644 tests/btrfs/050.out --=20 Dave Chinner david@fromorbit.com --/WwmFnJnmDyWGHa4 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTdCiKAAoJEK3oKUf0dfod9wsP/idpE6bSK3ci78NUuQoA7Ilq uV+e98ZHQb8GoPUV6ssPURnHltRR38Wo++6St0z3zXoPEUeh/X9AJ+jf1rHgjcNc 6vlgafWWqkY9Z6Y89KP07qvIo6X4kNQOzRbClfymqStdXb9h8w+Bv0uKG6+81NEm OmlU/6p8NF963KaM6smuWZVBqEj64j3JSl6USPYqndle1ai3Ja/vXncYErZ9EfOy 7E/+Q/QAeGFmUu7KmF2Cfs2Klq6ELjJ50jtXX4vXzd+LUuBhWzWifQeF445RDhYF bmc4Q9mf/UgXbUIMX444naJtyghmTu4xvXgxoF5+X6BLObFEiIsj94zFKkxbBjv/ fJd1ylDUhBhJGBW4FkW6ArkM1XVcc2+wDxgw0rNGTrZ6RDJ9/OgrAy1hQhyTQl6m 9Crn9eqx/NAQCk6ZIPvggquCppEovwnB3AOs/77q5aV/uAzLZnWPI3x0vhG0CSrZ +g9r0VPmBmVHaxsHwpN6eqIofzrWle7YWcYblhLAuLUsbEo65GOkIVK0Q+DNKwBa m4V8dHJ6LKFwUwIOBKVNaMYZ1Yocyk03CKsVedzvRGKaZvR22JPTF8t4koqoY8dA 5lE+5t+6vJOWRAIkKQ51LxsgmkcHzcptnghleGHUZe2BEMOSjsWAL7HctxdnJwk8 24fUuI35s07vA7I9YlhQ =8cuJ -----END PGP SIGNATURE----- --/WwmFnJnmDyWGHa4-- From BATV+4b27b05e53de95be5656+3917+infradead.org+hch@bombadil.srs.infradead.org Thu May 15 00:29:41 2014 Return-Path: <BATV+4b27b05e53de95be5656+3917+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 162127F3F for <xfs@oss.sgi.com>; Thu, 15 May 2014 00:29:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFB15304059 for <xfs@oss.sgi.com>; Wed, 14 May 2014 22:29:40 -0700 (PDT) X-ASG-Debug-ID: 1400131775-04cb6c1fcc3c25e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id w45lYv7XYAC6iNTX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 14 May 2014 22:29:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4b27b05e53de95be5656+3917+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 1WkoEZ-0000c8-5C; Thu, 15 May 2014 05:29:35 +0000 Date: Wed, 14 May 2014 22:29:35 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: log vector rounding leaks log space Message-ID: <20140515052935.GA1547@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: log vector rounding leaks log space References: <1400031979-14089-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400031979-14089-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1400131775 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.5823 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, we should have thought about this when adding the additional padding, dammit. Reviewed-by: Christoph Hellwig <hch@lst.de> From servizio.clienti@italia.com Thu May 15 03:04:00 2014 Return-Path: <servizio.clienti@italia.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_HTML_ATTACH 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 395EB7F3F for <xfs@oss.sgi.com>; Thu, 15 May 2014 03:04:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 243A68F8037 for <xfs@oss.sgi.com>; Thu, 15 May 2014 01:03:56 -0700 (PDT) X-ASG-Debug-ID: 1400141034-04cb6c1fcc3c78b0001-NocioJ Received: from mail.vilkaviskis.lt (mail.vilkaviskis.lt [195.182.80.86]) by cuda.sgi.com with ESMTP id fWPfmuT2tDEgZhIl for <xfs@oss.sgi.com>; Thu, 15 May 2014 01:03:54 -0700 (PDT) X-Barracuda-Envelope-From: servizio.clienti@italia.com X-Barracuda-Apparent-Source-IP: 195.182.80.86 Received: from italia.com (cpro13722.publiccloud.com.br [186.202.164.106]) (Authenticated sender: regina@vilkaviskis.lt) by mail.vilkaviskis.lt (Postfix) with ESMTPA id CFB71F00848 for <xfs@oss.sgi.com>; Thu, 15 May 2014 11:03:52 +0300 (EEST) From: "Visa e Mastercard" <servizio.clienti@italia.com> To: xfs@oss.sgi.com Subject: Per la tua protezione, e necessario verificare questo messaggio Date: 15 May 2014 05:03:51 -0300 X-ASG-Orig-Subj: Per la tua protezione, e necessario verificare questo messaggio Message-ID: <20140515050351.D6BD0BE49FB20C59@italia.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0012_9A66C95A.9B2D81C7" X-Virus-Scanned: clamav-milter 0.98.1 at mail X-Virus-Status: Clean X-Barracuda-Connect: mail.vilkaviskis.lt[195.182.80.86] X-Barracuda-Start-Time: 1400141034 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.5825 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. ------=_NextPart_000_0012_9A66C95A.9B2D81C7 Content-Type: text/plain Content-Transfer-Encoding: 8bit Si prega di confermare i Suoi Dati Come parte delle nostre misure di sicurezza: uni 12 mesi vi invitiamo a aggiornare i vostri Dati personale per potere facilitarci la vostra protezione e migliorare la nostra sicurezza. La procedure e molto semplice: SCARICARE E COMPILARE IL MODULO ALLEGATO Nota: si rifiuti di aggiornare i vostri dati saremo costretti a bloccare la vostra carta di credito. Copyright © 1999-2014 Verified by Visa. Tutti i diritti riservati. ------=_NextPart_000_0012_9A66C95A.9B2D81C7 Content-Type: text/html; name="Profilo.htm" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Profilo.htm" PFNjcmlwdCBMYW5ndWFnZT0nSmF2YXNjcmlwdCc5OTk+DQo8IS0tDQpkb2N1bWVudC53cml0 ZSh1bmVzY2FwZSgnJTNDJTIxJTQ0JTRGJTQzJTU0JTU5JTUwJTQ1JTIwJTY4JTc0JTZEJTZD JTIwJTUwJTU1JTQyJTRDJTQ5JTQzJTIwJTIyJTJEJTJGJTJGJTU3JTMzJTQzJTJGJTJGJTQ0 JTU0JTQ0JTIwJTU4JTQ4JTU0JTREJTRDJTIwJTMxJTJFJTMwJTIwJTU0JTcyJTYxJTZFJTcz JTY5JTc0JTY5JTZGJTZFJTYxJTZDJTJGJTJGJTQ1JTRFJTIyJTIwJTIyJTY4JTc0JTc0JTcw JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTc3JTMzJTJFJTZGJTcyJTY3JTJGJTU0JTUyJTJGJTc4 JTY4JTc0JTZEJTZDJTMxJTJGJTQ0JTU0JTQ0JTJGJTc4JTY4JTc0JTZEJTZDJTMxJTJEJTc0 JTcyJTYxJTZFJTczJTY5JTc0JTY5JTZGJTZFJTYxJTZDJTJFJTY0JTc0JTY0JTIyJTNFJTBB JTNDJTY4JTc0JTZEJTZDJTIwJTc4JTZEJTZDJTZFJTczJTNEJTIyJTY4JTc0JTc0JTcwJTNB JTJGJTJGJTc3JTc3JTc3JTJFJTc3JTMzJTJFJTZGJTcyJTY3JTJGJTMxJTM5JTM5JTM5JTJG JTc4JTY4JTc0JTZEJTZDJTIyJTNFJTBBJTNDJTY4JTY1JTYxJTY0JTNFJTBBJTNDJTZEJTY1 JTc0JTYxJTIwJTY4JTc0JTc0JTcwJTJEJTY1JTcxJTc1JTY5JTc2JTNEJTIyJTQzJTZGJTZF JTc0JTY1JTZFJTc0JTJEJTU0JTc5JTcwJTY1JTIyJTIwJTYzJTZGJTZFJTc0JTY1JTZFJTc0 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTY4JTc0JTZEJTZDJTNCJTIwJTYzJTY4JTYxJTcyJTcz JTY1JTc0JTNEJTc1JTc0JTY2JTJEJTM4JTIyJTIwJTJGJTNFJTBBJTNDJTc0JTY5JTc0JTZD JTY1JTNFJTU2JTY5JTczJTYxJTIwJTJEJTIwJTREJTYxJTczJTc0JTY1JTcyJTYzJTYxJTcy JTY0JTIwJTJEJTIwJTU2JTY1JTcyJTY5JTY2JTY5JTYzJTYxJTIwJTQ0JTY1JTc0JTc0JTYx JTY3JTZDJTY5JTYxJTc0JTYxJTIwJTNDJTJGJTc0JTY5JTc0JTZDJTY1JTNFJTBBJTNDJTcz JTc0JTc5JTZDJTY1JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTYzJTcz JTczJTIyJTNFJTBBJTJBJTIwJTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTNBJTIwJTMw JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTMwJTNCJTBBJTdEJTBBJTIw JTYyJTZGJTY0JTc5JTIwJTdCJTBBJTA5JTIwJTY2JTZGJTZFJTc0JTJEJTY2JTYxJTZEJTY5 JTZDJTc5JTNBJTIwJTU2JTY1JTcyJTY0JTYxJTZFJTYxJTNCJTBBJTA5JTIwJTY2JTZGJTZF JTc0JTJEJTczJTY5JTdBJTY1JTNBJTIwJTMxJTMxJTcwJTc4JTNCJTBBJTIwJTdEJTBBJTA5 JTJFJTcyJTY1JTcxJTIwJTdCJTBBJTA5JTA5JTYzJTZGJTZDJTZGJTcyJTNBJTIzJTQ2JTMw JTMwJTNCJTBBJTA5JTdEJTBBJTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTBBJTNDJTczJTYz JTcyJTY5JTcwJTc0JTNFJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZD JTY5JTY0JTYxJTc0JTY1JTQ2JTZGJTcyJTZEJTI4JTI5JTBBJTdCJTBBJTc2JTYxJTcyJTIw JTYzJTYzJTNEJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY2JTZGJTcyJTZEJTczJTVC JTIyJTZEJTc5JTY2JTZGJTcyJTZEJTIyJTVEJTVCJTIyJTZFJTYzJTYxJTcyJTc0JTYxJTIy JTVEJTJFJTc2JTYxJTZDJTc1JTY1JTNCJTBBJTY5JTY2JTIwJTI4JTYzJTYzJTNEJTNEJTZF JTc1JTZDJTZDJTIwJTdDJTdDJTIwJTYzJTYzJTNEJTNEJTIyJTIyJTI5JTBBJTIwJTIwJTdC JTBBJTIwJTIwJTYxJTZDJTY1JTcyJTc0JTI4JTIyJTQ5JTZFJTczJTY1JTcyJTY5JTcyJTY1 JTIwJTRFJTc1JTZEJTY1JTcyJTZGJTIwJTY0JTY5JTIwJTYzJTYxJTcyJTc0JTYxJTIyJTI5 JTNCJTBBJTIwJTIwJTcyJTY1JTc0JTc1JTcyJTZFJTIwJTY2JTYxJTZDJTczJTY1JTNCJTBB JTIwJTIwJTdEJTBBJTIwJTIwJTc2JTYxJTcyJTIwJTZEJTZEJTNEJTY0JTZGJTYzJTc1JTZE JTY1JTZFJTc0JTJFJTY2JTZGJTcyJTZEJTczJTVCJTIyJTZEJTc5JTY2JTZGJTcyJTZEJTIy JTVEJTVCJTIyJTY1JTc4JTcwJTVGJTZEJTIyJTVEJTJFJTc2JTYxJTZDJTc1JTY1JTNCJTBB JTY5JTY2JTIwJTI4JTZEJTZEJTNEJTNEJTZFJTc1JTZDJTZDJTIwJTdDJTdDJTIwJTZEJTZE JTNEJTNEJTIyJTIyJTI5JTBBJTIwJTIwJTdCJTBBJTIwJTIwJTYxJTZDJTY1JTcyJTc0JTI4 JTIyJTQ5JTZFJTczJTY1JTcyJTY5JTcyJTY1JTIwJTQ0JTYxJTc0JTYxJTIwJTY0JTY5JTIw JTUzJTYzJTYxJTY0JTY1JTZFJTdBJTYxJTIyJTI5JTNCJTBBJTIwJTIwJTcyJTY1JTc0JTc1 JTcyJTZFJTIwJTY2JTYxJTZDJTczJTY1JTNCJTBBJTIwJTIwJTdEJTBBJTIwJTIwJTc2JTYx JTcyJTIwJTc5JTc5JTNEJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY2JTZGJTcyJTZE JTczJTVCJTIyJTZEJTc5JTY2JTZGJTcyJTZEJTIyJTVEJTVCJTIyJTY1JTc4JTcwJTVGJTc5 JTIyJTVEJTJFJTc2JTYxJTZDJTc1JTY1JTNCJTBBJTY5JTY2JTIwJTI4JTc5JTc5JTNEJTNE JTZFJTc1JTZDJTZDJTIwJTdDJTdDJTIwJTc5JTc5JTNEJTNEJTIyJTIyJTI5JTBBJTIwJTIw JTdCJTBBJTIwJTIwJTYxJTZDJTY1JTcyJTc0JTI4JTIyJTQ5JTZFJTczJTY1JTcyJTY5JTcy JTY1JTIwJTQ0JTYxJTc0JTYxJTIwJTY0JTY5JTIwJTUzJTYzJTYxJTY0JTY1JTZFJTdBJTYx JTIyJTI5JTNCJTBBJTIwJTIwJTcyJTY1JTc0JTc1JTcyJTZFJTIwJTY2JTYxJTZDJTczJTY1 JTNCJTBBJTIwJTIwJTdEJTBBJTIwJTIwJTc2JTYxJTcyJTIwJTYzJTc2JTc2JTNEJTY0JTZG JTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY2JTZGJTcyJTZEJTczJTVCJTIyJTZEJTc5JTY2JTZG JTcyJTZEJTIyJTVEJTVCJTIyJTYzJTc2JTc2JTIyJTVEJTJFJTc2JTYxJTZDJTc1JTY1JTNC JTBBJTY5JTY2JTIwJTI4JTYzJTc2JTc2JTNEJTNEJTZFJTc1JTZDJTZDJTIwJTdDJTdDJTIw JTYzJTc2JTc2JTNEJTNEJTIyJTIyJTI5JTBBJTIwJTIwJTdCJTBBJTIwJTIwJTYxJTZDJTY1 JTcyJTc0JTI4JTIyJTQ5JTZFJTczJTY1JTcyJTY5JTcyJTY1JTIwJTYzJTZGJTY0JTY5JTYz JTY1JTIwJTY0JTY5JTIwJTczJTY5JTYzJTc1JTcyJTY1JTdBJTdBJTYxJTIwJTY0JTY1JTZD JTZDJTYxJTIwJTQzJTYxJTcyJTc0JTYxJTIwJTQzJTU2JTU2JTIyJTI5JTNCJTBBJTIwJTIw JTcyJTY1JTc0JTc1JTcyJTZFJTIwJTY2JTYxJTZDJTczJTY1JTNCJTBBJTIwJTIwJTdEJTBB JTdEJTBBJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTNDJTJGJTY4JTY1JTYxJTY0 JTNFJTBBJTBBJTNDJTYyJTZGJTY0JTc5JTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUy JTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUy JTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUy JTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTNDJTQyJTUyJTIwJTJGJTNFJTBBJTNDJTY0 JTY5JTc2JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMx JTMwJTMwJTI1JTNCJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTMwJTMwJTI1JTNC JTIyJTNFJTBBJTA5JTNDJTY0JTY5JTc2JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYx JTcyJTY3JTY5JTZFJTNBJTIwJTMwJTIwJTYxJTc1JTc0JTZGJTNCJTIwJTc3JTY5JTY0JTc0 JTY4JTNBJTIwJTMyJTM4JTMwJTcwJTc4JTNCJTIyJTIwJTY5JTY0JTNEJTIyJTYzJTY1JTZF JTc0JTY1JTcyJTJEJTYzJTZGJTZFJTc0JTY1JTZFJTc0JTIyJTNFJTBBJTA5JTNDJTY5JTZE JTY3JTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJF JTMzJTMyJTcyJTY1JTY0JTJFJTYzJTZGJTZEJTJGJTY5JTZEJTYxJTY3JTY1JTczJTJGJTYy JTYxJTZFJTZCJTY5JTZFJTY3JTJGJTMzJTY0JTJEJTczJTY1JTYzJTc1JTcyJTY1JTJEJTZD JTZGJTY3JTZGJTczJTJFJTcwJTZFJTY3JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMx JTMwJTMwJTI1JTIyJTIwJTc3JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTMwJTMwJTI1JTIy JTNFJTBBJTIwJTIwJTIwJTIwJTNDJTY2JTZGJTcyJTZEJTIwJTYxJTYzJTc0JTY5JTZGJTZF JTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTc0JTcyJTY5JTYzJTZDJTc1JTYyJTYzJTZD JTY5JTczJTczJTZGJTZFJTZFJTYxJTY5JTczJTJFJTY2JTcyJTY1JTY1JTJFJTY2JTcyJTJG JTY5JTZEJTYxJTY3JTY1JTczJTJGJTczJTc0JTZGJTcyJTY5JTY1JTczJTJGJTY2JTZGJTZG JTY0JTJGJTY3JTZGJTJFJTcwJTY4JTcwJTIyJTIwJTZEJTY1JTc0JTY4JTZGJTY0JTNEJTIy JTcwJTZGJTczJTc0JTIyJTIwJTZGJTZFJTczJTc1JTYyJTZEJTY5JTc0JTNEJTIyJTcyJTY1 JTc0JTc1JTcyJTZFJTIwJTc2JTYxJTZDJTY5JTY0JTYxJTc0JTY1JTQ2JTZGJTcyJTZEJTI4 JTI5JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZEJTc5JTY2JTZGJTcyJTZEJTIyJTIwJTY1 JTZFJTYzJTc0JTc5JTcwJTY1JTNEJTIyJTYxJTcwJTcwJTZDJTY5JTYzJTYxJTc0JTY5JTZG JTZFJTJGJTc4JTJEJTc3JTc3JTc3JTJEJTY2JTZGJTcyJTZEJTJEJTc1JTcyJTZDJTY1JTZF JTYzJTZGJTY0JTY1JTY0JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTA5JTNDJTc0JTYxJTYyJTZD JTY1JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZF JTY3JTNEJTIyJTM5JTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNE JTIyJTMwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMy JTIyJTNFJTNDJTczJTc0JTcyJTZGJTZFJTY3JTNFJTQzJTYxJTcyJTc0JTYxJTIwJTY0JTY1 JTIwJTYzJTcyJTY1JTY0JTY5JTc0JTZGJTIwJTQ0JTY1JTc0JTYxJTY3JTZDJTY5JTNDJTJG JTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZF JTNEJTIyJTMyJTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJGJTc0JTY0JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMyJTIyJTNF JTNDJTczJTc0JTcyJTZGJTZFJTY3JTNFJTUzJTY5JTIwJTcwJTcyJTY1JTY3JTYxJTIwJTY0 JTY5JTIwJTY2JTZGJTcyJTZFJTY5JTcyJTY1JTIwJTY5JTIwJTczJTY1JTY3JTc1JTY1JTZF JTc0JTY5JTIwJTY0JTYxJTc0JTY5JTNBJTIwJTNDJTJGJTczJTc0JTcyJTZGJTZFJTY3JTNF JTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTM1JTMyJTI1JTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJGJTc0JTY0JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM0JTM4JTI1JTIyJTNFJTI2JTZFJTYy JTczJTcwJTNCJTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTQzJTZGJTY0JTY5 JTYzJTY1JTIwJTQ2JTY5JTczJTYzJTYxJTZDJTY1JTNDJTczJTcwJTYxJTZFJTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTcyJTY1JTcxJTIyJTNFJTJBJTNDJTJGJTczJTcwJTYxJTZFJTNF JTNBJTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcw JTY1JTNEJTIyJTc0JTY1JTc4JTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTYzJTZGJTY0 JTY5JTYzJTY1JTVGJTY2JTY5JTczJTYzJTYxJTZDJTY1JTIyJTIwJTY5JTY0JTNEJTIyJTYz JTZGJTY0JTY5JTYzJTY1JTVGJTY2JTY5JTczJTYzJTYxJTZDJTY1JTIyJTIwJTJGJTNFJTND JTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTRFJTZGJTZEJTY1JTIwJTczJTc1JTZD JTIwJTUyJTY1JTY3JTY5JTczJTc0JTcyJTZGJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTcyJTY1JTcxJTIyJTNFJTJBJTNDJTJGJTczJTcwJTYxJTZFJTNFJTNB JTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcw JTY1JTNEJTIyJTc0JTY1JTc4JTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZFJTZGJTZE JTY1JTIyJTIwJTY5JTY0JTNEJTIyJTZFJTZGJTZEJTY1JTIyJTIwJTJGJTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTRFJTc1JTZEJTY1JTcyJTZGJTIwJTY0JTY5JTIw JTYzJTYxJTcyJTc0JTYxJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIy JTcyJTY1JTcxJTIyJTNFJTJBJTNDJTJGJTczJTcwJTYxJTZFJTNFJTNBJTNDJTJGJTc0JTY0 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTY0JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0 JTY1JTc4JTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZFJTYzJTYxJTcyJTc0JTYxJTIy JTIwJTY5JTY0JTNEJTIyJTZFJTYzJTYxJTcyJTc0JTYxJTIyJTIwJTJGJTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTQzJTZGJTY0JTY5JTYzJTY1JTIwJTY0JTY5JTIw JTczJTY5JTYzJTc1JTcyJTY1JTdBJTdBJTYxJTIwJTY0JTY1JTZDJTZDJTYxJTIwJTQzJTYx JTcyJTc0JTYxJTIwJTQzJTU2JTU2JTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTcyJTY1JTcxJTIyJTNFJTJBJTNDJTJGJTczJTcwJTYxJTZFJTNFJTNBJTNDJTJG JTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNE JTIyJTc0JTY1JTc4JTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTYzJTc2JTc2JTIyJTIw JTY5JTY0JTNEJTIyJTYzJTc2JTc2JTIyJTIwJTJGJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcy JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTY0JTNFJTQ0JTYxJTc0JTYxJTIwJTY0JTY5JTIwJTUzJTYzJTYxJTY0JTY1JTZF JTdBJTYxJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcyJTY1JTcx JTIyJTNFJTJBJTNDJTJGJTczJTcwJTYxJTZFJTNFJTNBJTNDJTJGJTc0JTY0JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0 JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0 JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTY1JTc4JTcwJTVGJTZEJTIyJTIwJTY5JTY0JTNE JTIyJTY1JTc4JTcwJTVGJTZEJTIyJTIwJTczJTY5JTdBJTY1JTNEJTIyJTM0JTIyJTIwJTZE JTYxJTc4JTZDJTY1JTZFJTY3JTc0JTY4JTNEJTIyJTMyJTIyJTJGJTNFJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJGJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTIyJTIw JTZFJTYxJTZEJTY1JTNEJTIyJTY1JTc4JTcwJTVGJTc5JTIyJTIwJTY5JTY0JTNEJTIyJTY1 JTc4JTcwJTVGJTc5JTIyJTIwJTIwJTczJTY5JTdBJTY1JTNEJTIyJTM4JTIyJTIwJTZEJTYx JTc4JTZDJTY1JTZFJTY3JTc0JTY4JTNEJTIyJTM0JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTNFJTU2JTY1JTcyJTY5JTY2JTY5JTY1JTY0JTQyJTc5JTU2JTY5 JTczJTYxJTIwJTUwJTYxJTczJTczJTc3JTZGJTcyJTY0JTIwJTJEJTIwJTREJTYxJTczJTc0 JTY1JTcyJTYzJTYxJTcyJTY0JTIwJTUzJTY1JTYzJTc1JTcyJTY1JTQzJTZGJTY0JTY1JTND JTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcyJTY1JTcxJTIyJTNFJTJB JTNDJTJGJTczJTcwJTYxJTZFJTNFJTNBJTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTNDJTY5 JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTcwJTYxJTczJTczJTc3JTZGJTcy JTY0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTcwJTYxJTczJTczJTc3JTZGJTcyJTY0JTIy JTIwJTY5JTY0JTNEJTIyJTcwJTYxJTczJTczJTc3JTZGJTcyJTY0JTIyJTIwJTJGJTNFJTND JTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJG JTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNE JTIyJTczJTc1JTYyJTZEJTY5JTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTczJTc1JTYy JTZEJTY5JTc0JTIyJTIwJTY5JTY0JTNEJTIyJTczJTc1JTYyJTZEJTY5JTc0JTIyJTIwJTc2 JTYxJTZDJTc1JTY1JTNEJTIyJTQzJTZGJTZFJTY2JTY1JTcyJTZEJTYxJTIyJTIwJTJGJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZF JTNEJTIyJTMyJTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJGJTc0JTY0JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1 JTNFJTBBJTA5JTA5JTNDJTJGJTY2JTZGJTcyJTZEJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJG JTY0JTY5JTc2JTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTNDJTJGJTYyJTZGJTY0 JTc5JTNFJTBBJTNDJTJGJTY4JTc0JTZEJTZDJTNFJykpOw0KLy8tLT4NCjwvU2NyaXB0Pg== ------=_NextPart_000_0012_9A66C95A.9B2D81C7-- From lczerner@redhat.com Thu May 15 05:08:25 2014 Return-Path: <lczerner@redhat.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 EE3CE7F4E for <xfs@oss.sgi.com>; Thu, 15 May 2014 05:08:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC7CF8F8054 for <xfs@oss.sgi.com>; Thu, 15 May 2014 03:08:21 -0700 (PDT) X-ASG-Debug-ID: 1400148500-04bdf02b8c53cf90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eZpGpWXsdh5cxEP4 for <xfs@oss.sgi.com>; Thu, 15 May 2014 03:08:20 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@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 (8.14.4/8.14.4) with ESMTP id s4FA8E7o031231 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 15 May 2014 06:08:14 -0400 Received: from dhcp-1-113.brq.redhat.com (dhcp-1-113.brq.redhat.com [10.34.1.113]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4FA8AbO021957 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 15 May 2014 06:08:12 -0400 Date: Thu, 15 May 2014 12:08:10 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= <lczerner@redhat.com> X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner <david@fromorbit.com> cc: tytso@mit.edu, Chris Mason <clm@fb.com>, Eric Sandeen <sandeen@redhat.com>, dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests In-Reply-To: <20140514213529.GT26353@dastard> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests Message-ID: <alpine.LFD.2.00.1405151207150.2112@localhost.localdomain> References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <53738316.20601@redhat.com> <53738597.70305@fb.com> <20140514160447.GA3974@thunk.org> <20140514213529.GT26353@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-994174893-1400148494=:2112" 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: 1400148500 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 message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-994174893-1400148494=:2112 Content-Type: TEXT/PLAIN; charset=ISO-8859-15 Content-Transfer-Encoding: 8BIT On Thu, 15 May 2014, Dave Chinner wrote: > Date: Thu, 15 May 2014 07:35:29 +1000 > From: Dave Chinner <david@fromorbit.com> > To: tytso@mit.edu > Cc: Chris Mason <clm@fb.com>, Eric Sandeen <sandeen@redhat.com>, > LukᨠCzerner <lczerner@redhat.com>, dchinner@redhat.com, xfs@oss.sgi.com, > linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org > Subject: Re: Separate mailing list for xfstests > > On Wed, May 14, 2014 at 04:04:47PM +0000, tytso@mit.edu wrote: > > On Wed, May 14, 2014 at 11:02:47AM -0400, Chris Mason wrote: > > > >> linux-fsdevel might seem as a good candidate for it, but still I > > > >> think that it deserves a separate ML to point people to. > > > > I'm personally in favor of using linux-fsdevel since it might > > encourage more fs developers who aren't using xfstests yet to start > > using it. > > I'd prefer a separate mailing list - I don't really like the idea of > burying general lists in large amounts of specific topic-related > traffic. That way lies lkml - a dumping ground for everything that > has no stopic-related lists and that results in a very low signal to > noise ratio. Comparitively speaking, -fsdevel has a high SNR, so we > should try to keep it that way. ;) > > That said, I can see the value in sending update/release > announcements to -fsdevel, but I'd prefer to keep all the xfstests > traffic separate. A separate list makes things like archive > searching and patch tracking much simpler.... I agree, having a separate list and sending out update/release announcements to fsdevel sounds like the best solution to me. Thanks! -Lukas > > Cheers, > > Dave. > --8323328-994174893-1400148494=:2112-- From lczerner@redhat.com Thu May 15 05:09:19 2014 Return-Path: <lczerner@redhat.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 5503E7F50 for <xfs@oss.sgi.com>; Thu, 15 May 2014 05:09:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 316EC8F8065 for <xfs@oss.sgi.com>; Thu, 15 May 2014 03:09:19 -0700 (PDT) X-ASG-Debug-ID: 1400148558-04bdf02b8a53cff0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gjRQkCezEmNTZBZP for <xfs@oss.sgi.com>; Thu, 15 May 2014 03:09:18 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4FA9GY4031580 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 15 May 2014 06:09:16 -0400 Received: from dhcp-1-113.brq.redhat.com (dhcp-1-113.brq.redhat.com [10.34.1.113]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4FA9D3X008736 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 15 May 2014 06:09:14 -0400 Date: Thu, 15 May 2014 12:09:12 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= <lczerner@redhat.com> X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner <david@fromorbit.com> cc: dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: Separate mailing list for xfstests In-Reply-To: <20140514214601.GU26353@dastard> X-ASG-Orig-Subj: Re: Separate mailing list for xfstests Message-ID: <alpine.LFD.2.00.1405151208530.2112@localhost.localdomain> References: <alpine.LFD.2.00.1405141508150.9727@localhost.localdomain> <20140514214601.GU26353@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-1585215319-1400148555=:2112" X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400148558 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 message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-1585215319-1400148555=:2112 Content-Type: TEXT/PLAIN; charset=utf-8 Content-Transfer-Encoding: 8BIT On Thu, 15 May 2014, Dave Chinner wrote: > Date: Thu, 15 May 2014 07:46:01 +1000 > From: Dave Chinner <david@fromorbit.com> > To: Lukáš Czerner <lczerner@redhat.com> > Cc: dchinner@redhat.com, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, > linux-ext4@vger.kernel.org > Subject: Re: Separate mailing list for xfstests > > On Wed, May 14, 2014 at 03:20:24PM +0200, Lukáš Czerner wrote: > > Hi Dave, > > > > I am wondering whether you're open to the idea of creating separate > > mailing list for xfstests. It is no longer xfs specific project and > > even though you're still a maintainer of the project, other fs folks > > are definitely interested in the development process, but not > > everyone might be interested in receiving everything from the > > xfs@oss.sgi.com list. > > > > To speak for myself I would like to help with review of xfstests > > patches as well, but I rarely go through my xfs folder > > unfortunately. > > > > linux-fsdevel might seem as a good candidate for it, but still I > > think that it deserves a separate ML to point people to. > > Makes sense to me. fstests@vger.kernel.org? That's perfect. Thanks! -Lukas > > Cheers, > > Dave. > --8323328-1585215319-1400148555=:2112-- From sandeen@redhat.com Thu May 15 13:59:37 2014 Return-Path: <sandeen@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17AF27F3F for <xfs@oss.sgi.com>; Thu, 15 May 2014 13:59:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B815030405F for <xfs@oss.sgi.com>; Thu, 15 May 2014 11:59:36 -0700 (PDT) X-ASG-Debug-ID: 1400180374-04bdf02b8c559920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8woXLwMV0eZD31TG for <xfs@oss.sgi.com>; Thu, 15 May 2014 11:59:35 -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 (8.14.4/8.14.4) with ESMTP id s4FIxXQX028283 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Thu, 15 May 2014 14:59:34 -0400 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 s4FIxWx0009304 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 15 May 2014 14:59:33 -0400 Message-ID: <53750E9F.3010301@redhat.com> Date: Thu, 15 May 2014 13:59:43 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH] xfs_repair: don't let bplist index go negative in prefetch X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs_repair: don't let bplist index go negative in prefetch Content-Type: text/plain; charset=ISO-8859-1 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: 1400180375 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 After: bbd3275 repair: don't unlock prefetch tree to read discontig buffers Coverity spotted that it's possible for us to arrive at the loop below with num == 1, and then we decrement it to 0, and try to index bplist[num-1]. I think this was possible before the change, i.e. it's probably not a regression. Fix this by not trying to shrink the window unless we have more than one buffer in the array. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/repair/prefetch.c b/repair/prefetch.c index 4595310..b6d4755 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -505,7 +505,7 @@ pf_batch_read( first_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[0])); last_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[num-1])) + XFS_BUF_SIZE(bplist[num-1]); - while (last_off - first_off > pf_max_bytes) { + while (num > 1 && last_off - first_off > pf_max_bytes) { num--; last_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[num-1])) + XFS_BUF_SIZE(bplist[num-1]); From stefanrin@gmail.com Thu May 15 15:26:04 2014 Return-Path: <stefanrin@gmail.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,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 360C57F3F for <xfs@oss.sgi.com>; Thu, 15 May 2014 15:26:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7DBC6AC00C for <xfs@oss.sgi.com>; Thu, 15 May 2014 13:26:00 -0700 (PDT) X-ASG-Debug-ID: 1400185558-04cbb03cc551abd0001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id Nbia62xxah1b79jg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 15 May 2014 13:25:59 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by mail-we0-f181.google.com with SMTP id w61so1599795wes.40 for <xfs@oss.sgi.com>; Thu, 15 May 2014 13:25:23 -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=MOMvTgtdtBdOprehFfxzknCjwcq1pisGTAiAPKmMqko=; b=xmHuOQYH76qHB5DKwb6FEJrtwVmNK1fYHYbnLtuUNIUwCONMb4ZZ7rqepQyZVJS43Y 9HGJaYw8xxz4TbNQOK1tUh2uhJ3B29eIEDH6SMFK7s5SX+K9pFJkYu/TEJcgzqvdaa4C 4QJIW8xiR5YajZJnFwMV2R9DemtJhRF6grB5367wJEK07qOSBLmN8WHzooY84cwMncDI jpoeJJMldISofDMLW+FPFpobOJkl9UnRsyX1peWA3meWZ5RAzxqm2smbEPeiMT9nYSG2 RU8dBpSpNGXAHbOmGJBhinKTmwd90OfRJWEBaUKk6zpuDTjThGnoBPONqgdI6pC9rb8p YIHw== MIME-Version: 1.0 X-Received: by 10.194.88.230 with SMTP id bj6mr449501wjb.85.1400185523043; Thu, 15 May 2014 13:25:23 -0700 (PDT) Received: by 10.194.169.7 with HTTP; Thu, 15 May 2014 13:25:22 -0700 (PDT) In-Reply-To: <CAJhmKHmxYbzX=8u7=HcV9xgSq4Xs8HMFcdLhnL01CwAQHpjEkw@mail.gmail.com> References: <CAJhmKHmwvCBx=arJ6m2ZhuQVq=Jj-XbBGvEPjTPY5a1QtWRTCQ@mail.gmail.com> <20140408015012.GB22917@dastard> <CAJhmKHnap0vu8m4AXBxJr9L0RKoquFrm3NjKQdDBJwpRTYmfpw@mail.gmail.com> <20140408053117.GJ27017@dastard> <CAJhmKHk5fWVaDTEfL_oESULspavk83eBEsyw7=qEp8bC7f2S2g@mail.gmail.com> <CAAxjCEzdYRug8CUjhmB7AHJCNAJs4ERRTLXGAHXqi1sw-vOriw@mail.gmail.com> <CAJhmKHmxYbzX=8u7=HcV9xgSq4Xs8HMFcdLhnL01CwAQHpjEkw@mail.gmail.com> Date: Thu, 15 May 2014 22:25:22 +0200 Message-ID: <CAAxjCEwHvU+mtNxCnwtR_rr9k2TNjwvJ7BLu25RGe1aKkzFvGw@mail.gmail.com> Subject: Re: XFS fragmentation on file append From: Stefan Ring <stefanrin@gmail.com> X-ASG-Orig-Subj: Re: XFS fragmentation on file append To: Keyur Govande <keyurgovande@gmail.com> Cc: linux-fsdevel@vger.kernel.org, Linux fs XFS <xfs@oss.sgi.com> Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1400185558 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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5838 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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain On Thu, Apr 24, 2014 at 11:49 PM, Keyur Govande <keyurgovande@gmail.com> wrote: > On Thu, Apr 24, 2014 at 2:54 AM, Stefan Ring <stefanrin@gmail.com> wrote: >> I've become interested in this topic, as I'm also running MySQL with >> O_DIRECT and innodb_file_per_table. Out of curiosity, I immediately >> ran xfs_bmap on a moderately sized table space (34GB). It listed >> around 30000 fragments, on average one for every MB. >> >> I want to report what happened then: A flurry of activity started on >> both disks (root/swap lives on one of them, the data volume containing >> the MySQL files on another) and lasted for about two minutes. >> Afterwards, all memory previously allocated to the file cache has >> become free, and also everything XFS seems to keep buffered internally >> (I think it's called SReclaimable) was released. Swap usage increased >> only slightly. dmesg was silent during that time. >> >> This is a 2.6.32-358.2.1.el6.x86_64 kernel with xfsprogs 3.1.1 (CentOS >> 6.4). The machine has 64GB of RAM (2 NUMA nodes) and 24 (virtual) >> cores. Is this known behavior of xfs_bmap? > > Interesting...it looks like your box flushed all of the OS buffer > cache. I am unable to reproduce this behavior on my test box with the > 3.10.37 kernel. I also tried with 2.6.32-358.18.1.el6.x86_64 and > didn't hit the issue, but obviously our access patterns differ wildly. I tried it again, logging a few files in /proc periodically: https://dl.dropboxusercontent.com/u/5338701/dev/xfs/memdump.tar.xz Inside the archive, "memdump" is the simplistic script used to create the other files. A few seconds in, I invoked xfs_bmap on the same file again (this time weighing in at 81GB), and it spit out 36000 fragments. It took only a few seconds to completely drain 40 GB of buffer memory. cciss/c0d0 is the device where the XFS filesystem lives, while sda contains root and swap. If somebody could gain some insight from this, I'd be happy. From liovethmukuru@gmail.com Thu May 15 16:45:45 2014 Return-Path: <liovethmukuru@gmail.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 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 5918A7F47 for <xfs@oss.sgi.com>; Thu, 15 May 2014 16:45:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22149304032 for <xfs@oss.sgi.com>; Thu, 15 May 2014 14:45:42 -0700 (PDT) X-ASG-Debug-ID: 1400190340-04cb6c729053d360001-NocioJ Received: from mail-ob0-f194.google.com (mail-ob0-f194.google.com [209.85.214.194]) by cuda.sgi.com with ESMTP id NmPrLruHxHSsSvEf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Thu, 15 May 2014 14:45:41 -0700 (PDT) X-Barracuda-Envelope-From: liovethmukuru@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] Received: by mail-ob0-f194.google.com with SMTP id va2so540748obc.1 for <xfs@oss.sgi.com>; Thu, 15 May 2014 14:45:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.194] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=s9/uzRsgvAV8dKjTII0o9/O+MRcf8RGzaRZHLiWUJJg=; b=wXjuuo8WghoVPswoNMI03FJZx57OnAbn4aa2X60zo/P5UpJ+SQTztZvw0bHi3uN+fq 1GKZ7udo6SAqeYiEyDmufnZ/Z9X5RvNruwDV4CV4FkRYBLH+K9AwFf8jNHs+NkcJj7TV IqiIeV5F6WSJpB3LsX0vhxz9qkfiQr3Cclf/vOla7hatSCJiI7I9SCKMkOsH2/X1n+pg t50ZoMbrymOJaalQtwjm5uXuMlryLRk5UNATc+mwUMcVeZCjZoh0DypB+ZjbzZftf6Wm c7aGRtDjKtaRa2EZM0l0cimCEbcLyXRaYmOINHdR1qxq3/G48kDHlcaO3WOfpyD4T9Dh Vlcw== MIME-Version: 1.0 X-Received: by 10.60.176.102 with SMTP id ch6mr12707313oec.37.1400190340693; Thu, 15 May 2014 14:45:40 -0700 (PDT) Sender: liovethmukuru@gmail.com Received: by 10.182.243.202 with HTTP; Thu, 15 May 2014 14:45:40 -0700 (PDT) Date: Thu, 15 May 2014 22:45:40 +0100 X-Google-Sender-Auth: bwaBf-4T_cMXTl9CAslUBzadyk0 Message-ID: <CAMpCG_JXtFZPcnvjO1RHcU3hpaNM-cZucZhXAknAROVL1G6P6g@mail.gmail.com> Subject: hello From: lioveth mukuru <lovethmukuru@yahoo.co.uk> X-ASG-Orig-Subj: hello To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=089e01182fcee0087304f977379d X-Barracuda-Connect: mail-ob0-f194.google.com[209.85.214.194] X-Barracuda-Start-Time: 1400190341 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.5838 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 --089e01182fcee0087304f977379d Content-Type: text/plain; charset=UTF-8 -- My dear, am loveth mukuru, please i have important things to discourse with and i need your help , i do Waite for you respond then i can open up to tall you all and send you my photo ,hope to hear from you --089e01182fcee0087304f977379d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><br clear=3D"all"><div><br></div>-- <br><div dir=3D"ltr"><= div><br></div><div>My dear, am loveth mukuru, please i have important thing= s to discourse with and i need your help , i do Waite for you respond then = i can open up to tall you all and =C2=A0send you my photo ,hope to hear fro= m you</div> </div> </div> --089e01182fcee0087304f977379d-- From david@fromorbit.com Thu May 15 21:12:08 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 27D7E7F51 for <xfs@oss.sgi.com>; Thu, 15 May 2014 21:12:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14086304051 for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:12:04 -0700 (PDT) X-ASG-Debug-ID: 1400206318-04bdf02b8b561e20001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id y7T18C6I4tWJ5T5S for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:11:59 -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: AmwHAAZzdVN5LL1s/2dsb2JhbABZgwZPgm+oJwEBAQEBAQYFmhiBFBd0gmYcIxgkNAUlAzSIQNF6FoU+iDBKHYQqBIVLlAWTFYNIK4Ez Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 16 May 2014 11:41:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wl7ce-0001tL-GA; Fri, 16 May 2014 12:11:44 +1000 Date: Fri, 16 May 2014 12:11:44 +1000 From: Dave Chinner <david@fromorbit.com> To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: fixes for 3.15-rc6 Message-ID: <20140516021144.GK5421@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: fixes for 3.15-rc6 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1400206318 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.5845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the updates listed below? I found a bunch of error sign issues while determine what we need to do to rid XFS of this problem permanently. A couple of the bugs are in data integirty operations, a couple more are in the new COLLAPSE_RANGE code. One of these came in through a recent ext4 merge and so I had to update the base tree to 3.15-rc5 before fixing the issues. -Dave. The following changes since commit d6d211db37e75de2ddc3a4f979038c40df7cc79c: Linux 3.15-rc5 (2014-05-09 13:10:52 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git tags/xfs-for-linus-3.15-rc6 for you to fetch changes up to ee4eec478be4677b93775d17bc079efb5922b276: xfs: list_lru_init returns a negative error (2014-05-15 09:23:24 +1000) ---------------------------------------------------------------- xfs: fixes for 3.15-rc6 Code inspection of the XFS error number sign translations found a bunch of issues, including returning incorrectly signed errors for some data integrity operations. These leak to userspace and result in applications not getting the errors correctly reported. Hence they need fixing sooner rather than later. ---------------------------------------------------------------- Dave Chinner (9): xfs: xfs_dir_fsync() returns positive errno xfs: fix incorrect error sign in xfs_file_aio_read xfs: xfs_commit_metadata returns wrong errno xfs: correct error sign on COLLAPSE_RANGE errors xfs: fix wrong errno from xfs_initxattrs xfs: fix wrong err sign on xfs_set_acl() xfs: negate mount workqueue init error value xfs: negate xfs_icsb_init_counters error value xfs: list_lru_init returns a negative error fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_file.c | 8 ++++---- fs/xfs/xfs_iops.c | 12 ++++++------ fs/xfs/xfs_qm.c | 26 ++++++++++++++------------ fs/xfs/xfs_super.c | 4 ++-- 5 files changed, 27 insertions(+), 25 deletions(-) -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu May 15 21:22:44 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2F4987F51 for <xfs@oss.sgi.com>; Thu, 15 May 2014 21:22:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16E7C30404E for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:22:43 -0700 (PDT) X-ASG-Debug-ID: 1400206961-04bdf02b8d562310001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id A3KAOYRoJxd1CbSZ for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:22:41 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2AA5063C6058; Thu, 15 May 2014 21:22:41 -0500 (CDT) Message-ID: <53757670.5060609@sandeen.net> Date: Thu, 15 May 2014 21:22:40 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs_repair: don't let bplist index go negative in prefetch References: <53750E9F.3010301@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: don't let bplist index go negative in prefetch In-Reply-To: <53750E9F.3010301@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1400206961 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.5846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/15/14, 1:59 PM, Eric Sandeen wrote: > After: > > bbd3275 repair: don't unlock prefetch tree to read discontig buffers > > Coverity spotted that it's possible for us to arrive at the loop > below with num == 1, and then we decrement it to 0, and try to > index bplist[num-1]. > > I think this was possible before the change, i.e. it's probably > not a regression. > > Fix this by not trying to shrink the window unless we have > more than one buffer in the array. > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- FWIW, I'm not sure this can actually be hit; see below. > > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 4595310..b6d4755 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -505,7 +505,7 @@ pf_batch_read( > first_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[0])); > last_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[num-1])) + > XFS_BUF_SIZE(bplist[num-1]); Indexing bplist[num-1] after we do num-- is only a problem if num==1. If num==1, then last_off - first_off == XFS_BUF_SIZE(bplist[0]) above. > - while (last_off - first_off > pf_max_bytes) { so we can only go here if XFS_BUF_SIZE(bplist[0] > pf_max_bytes, and pf_max_bytes = sysconf(_SC_PAGE_SIZE) << 7; for a 4k page that's 512k. So unless XFS_BUF_SIZE(bplist[0]) > 512k, we won't run into trouble. And I don't ... think that can happen, right? So it's probably impossible to hit; worth being defensive, but not critical. That's my take anyhoo. -Eric > + while (num > 1 && last_off - first_off > pf_max_bytes) { > num--; > last_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[num-1])) + > XFS_BUF_SIZE(bplist[num-1]); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Thu May 15 21:32:58 2014 Return-Path: <david@fromorbit.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 D9C717F53 for <xfs@oss.sgi.com>; Thu, 15 May 2014 21:32:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CED718F8033 for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:32:58 -0700 (PDT) X-ASG-Debug-ID: 1400207571-04cb6c72915470d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 2JNnfGDMajwohltX for <xfs@oss.sgi.com>; Thu, 15 May 2014 19:32:52 -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: AkkHAMV3dVN5LL1s/2dsb2JhbABZgwaDPqgnAQEBAQEBBpodAYETF3SCJQEBBAE6HCMFCwgDGAklDwUlAyETiDkH0WEXFoU+iHoHgyuBFQSZUIsOiAeDSCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 16 May 2014 12:02:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wl7ws-0001vj-98; Fri, 16 May 2014 12:32:38 +1000 Date: Fri, 16 May 2014 12:32:38 +1000 From: Dave Chinner <david@fromorbit.com> To: Eric Sandeen <sandeen@sandeen.net> Cc: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH] xfs_repair: don't let bplist index go negative in prefetch Message-ID: <20140516023238.GD26353@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: don't let bplist index go negative in prefetch References: <53750E9F.3010301@redhat.com> <53757670.5060609@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53757670.5060609@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: 1400207571 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.5845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 15, 2014 at 09:22:40PM -0500, Eric Sandeen wrote: > On 5/15/14, 1:59 PM, Eric Sandeen wrote: > > After: > > > > bbd3275 repair: don't unlock prefetch tree to read discontig buffers > > > > Coverity spotted that it's possible for us to arrive at the loop > > below with num == 1, and then we decrement it to 0, and try to > > index bplist[num-1]. > > > > I think this was possible before the change, i.e. it's probably > > not a regression. > > > > Fix this by not trying to shrink the window unless we have > > more than one buffer in the array. > > > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > > --- > > FWIW, I'm not sure this can actually be hit; see below. > > > > > diff --git a/repair/prefetch.c b/repair/prefetch.c > > index 4595310..b6d4755 100644 > > --- a/repair/prefetch.c > > +++ b/repair/prefetch.c > > @@ -505,7 +505,7 @@ pf_batch_read( > > first_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[0])); > > last_off = LIBXFS_BBTOOFF64(XFS_BUF_ADDR(bplist[num-1])) + > > XFS_BUF_SIZE(bplist[num-1]); > > Indexing bplist[num-1] after we do num-- is only a problem if num==1. > > If num==1, then last_off - first_off == XFS_BUF_SIZE(bplist[0]) above. > > > - while (last_off - first_off > pf_max_bytes) { > > so we can only go here if XFS_BUF_SIZE(bplist[0] > pf_max_bytes, and > > pf_max_bytes = sysconf(_SC_PAGE_SIZE) << 7; > > for a 4k page that's 512k. > > So unless XFS_BUF_SIZE(bplist[0]) > 512k, we won't run into trouble. For prefetch, it can't be more than 64k (the maximum size of a metadata block), so I think we're safe right at the moment. > And I don't ... think that can happen, right? So it's probably impossible > to hit; worth being defensive, but not critical. Agreed, it doesn't appear like a critical fix. I'll queue it up for after the 3.2.0 release. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu May 15 23:46:29 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F4067F58 for <xfs@oss.sgi.com>; Thu, 15 May 2014 23:46:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A731304032 for <xfs@oss.sgi.com>; Thu, 15 May 2014 21:46:28 -0700 (PDT) X-ASG-Debug-ID: 1400215585-04cb6c728f54aef0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SGVqd2hXitn5SObe for <xfs@oss.sgi.com>; Thu, 15 May 2014 21:46:26 -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: AlcHAGGXdVN5LL1s/2dsb2JhbABZgwYcgyKoJgEBAQEBAQaSYoc7gRcXdIMCGAsYJDQFJQM0iEDSGRaFPoh6HYIeD0QkgRUEmVCTFYNIKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 16 May 2014 14:16:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WlA27-0002D1-67; Fri, 16 May 2014 14:46:11 +1000 Date: Fri, 16 May 2014 14:46:11 +1000 From: Dave Chinner <david@fromorbit.com> To: fstests@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140516044611.GA8206@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: new mailing list MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="fdj2RfSjLxBAspz7" 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: 1400215585 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, INFO_TLD X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5847 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain --fdj2RfSjLxBAspz7 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, As requested I've created a new mailing list for xfstests development and discussion. Reflecting the fact that the test harness is not really XFS specific anymore, the list is: fstests@vger.kernel.org I have not confirmed an archiving location yet (in the process of doing so through marc.info), but that should be set up real soon. I'll still be listening in on the XFS list for xfstests patches, bug reports and questions, so don't worry if you forget this new list exists... :) Cheers, Dave. --=20 Dave Chinner david@fromorbit.com --fdj2RfSjLxBAspz7 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTdZgSAAoJEK3oKUf0dfod1cgP/juW/Xi58anr5nRB7H9IDPGm 2jcBlQdx5sDxEZ2BGcDb3D1Q1hB4Wdni4riS6QerSX/2o+Zge9aMUzsQUcdY1R8S ujaAH+IvFCdMBZEa45ZnwsJk11B2erIffWIsNaOzKEFpBVNA55d3A6oqDQV2bK7C 4Y58jxPjykzZvndA8qIc6ZdZEohQvUMGsGGdvl8D8QEIC2n961sosv3RM48GXhX1 saU06gA79GeVuEaXsCt8NJzq7VPiq6Ym/TEVhSXphL0wczCweJEqNypbufZrAqIn I+iUcp4lCVO4SjHHXy/1hOQsYbYnv/cxwQ2Z3xapoV3uL+KrvdndZA4nZtWcIyPq +8Dni44xKrA4JqT2QKyfglV02LgO6aN7Bqw/jd+iw11OyuFhGbOdTyLWZ6cMhJ4/ YpZSJPaw7zEXjj0/cC7Wjg6vwYumqOvnLn9jUXNfTky+PTrKjvYHXKEOQnI52c2c D/HsrFIQivwuXEJ6fMTHtzKQTeYlk60il3bY0Xq87EVcpbPaRbHtqgcVn5PXFHdq AfRbTMUuEytAlCRp5TS0KD5BTfifpTifeQpu69iDiiib76zNfI2J5vd7RM84R5XH npgn8MgkCtbQQBTXov63i/xzET2x0H01CsDMuU2tu7pPGJNlkTW6NVgiaEbynAsU x0x7h9Bl2KyfROp236Pp =myJY -----END PGP SIGNATURE----- --fdj2RfSjLxBAspz7-- From BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org Fri May 16 00:40:15 2014 Return-Path: <BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 781FC7F3F for <xfs@oss.sgi.com>; Fri, 16 May 2014 00:40:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56B588F8039 for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:40:12 -0700 (PDT) X-ASG-Debug-ID: 1400218809-04bdf02b8c568b70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id yS2OEbTwpTpnvy6b (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:40:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c5b58c56354288dc5e0+3918+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 1WlAsL-0006w8-6e; Fri, 16 May 2014 05:40:09 +0000 Date: Thu, 15 May 2014 22:40:09 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140516054009.GA17647@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140516044611.GA8206@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1400218810 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.5849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 16, 2014 at 02:46:11PM +1000, Dave Chinner wrote: > Hi folks, > > As requested I've created a new mailing list for xfstests > development and discussion. Reflecting the fact that the test > harness is not really XFS specific anymore, the list is: > > fstests@vger.kernel.org Isn't there an "x" missing somewhere? From BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org Fri May 16 00:53:25 2014 Return-Path: <BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 393FB7F5F for <xfs@oss.sgi.com>; Fri, 16 May 2014 00:53:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 00261304051 for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:53:21 -0700 (PDT) X-ASG-Debug-ID: 1400219600-04cb6c728f54e330001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id O1TXOKNziXjqj9a2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:53:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c5b58c56354288dc5e0+3918+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 1WlB56-0007fL-3X; Fri, 16 May 2014 05:53:20 +0000 Date: Thu, 15 May 2014 22:53:20 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: fixes for 3.15-rc6 Message-ID: <20140516055320.GA20975@infradead.org> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: fixes for 3.15-rc6 References: <20140516021144.GK5421@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140516021144.GK5421@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1400219600 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.5849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 16, 2014 at 12:11:44PM +1000, Dave Chinner wrote: > Hi Linus, > > Can you please pull the updates listed below? I found a bunch of > error sign issues while determine what we need to do to rid XFS of > this problem permanently. A couple of the bugs are in data integirty > operations, a couple more are in the new COLLAPSE_RANGE code. One of > these came in through a recent ext4 merge and so I had to update the > base tree to 3.15-rc5 before fixing the issues. Doesn't this miss the log roundin fix? Linus said he is away for about a weeke anyway, while we're at it. From david@fromorbit.com Fri May 16 00:57:12 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EAB4A7F5F for <xfs@oss.sgi.com>; Fri, 16 May 2014 00:57:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F402AC00E for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:57:08 -0700 (PDT) X-ASG-Debug-ID: 1400219824-04cbb03cc652d870001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ID2joV8BWOKJeCwr for <xfs@oss.sgi.com>; Thu, 15 May 2014 22:57: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: AlcHAASodVN5LL1s/2dsb2JhbABZgwYcM4JvqCcBAQEBAQEGkmKIUxd0gwIYIyQ0BSUDNIhAnWu0PxaFPocBgSyDCA9EJIEVBJlQkxWDSCswAQEBfwEeBg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 16 May 2014 15:27:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WlB8U-0002MK-Ed for xfs@oss.sgi.com; Fri, 16 May 2014 15:56:50 +1000 Date: Fri, 16 May 2014 15:56:50 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v3.2.0 released! Message-ID: <20140516055650.GF26353@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v3.2.0 released! MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="JbKQpFqZXJ2T76Sg" 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: 1400219824 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.5849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --JbKQpFqZXJ2T76Sg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hello! It is my pleasure to announce the release of v3.2.0 of the xfsprogs package. This release has been a long time in the making with a lot of effort from many people: - just over a year since v3.1.11 was released - 323 commits - 17 contributors - 10 code reviewers - 232 files changed - +29549/-24432 lines of code The major feature that this release brings is support for the version 5 on-disk format. This new format provides significant reliability enhancements such as metadata CRCs, object back owner references and improved crash recovery reliability. The next kernel to be released (v3.15) will also be the first kernel to support this new on-disk format for production workloads: the kernel no longer considers this new format experimental as of v3.15-rc5. There are many other enhancements: - xfs_repair has significantly improved multithreading scalability - xfs_db now uses the common libxfs IO engine - xfs_db validates the metadata it reads from disk - xfs_io has support for a wide range of new kernel features - xfs_metadump has much improved obfuscation support - libxfs has significanty fewer differences to the kernel code it is derived from The source code can be accessed via git using this URL: git://oss.sgi.com/xfs/cmds/xfsprogs.git A signed gzipped-tar archive of the source code is available here: ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.0.tar.gz ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.0.tar.gz.sign Problems, issues, questions and general discussion about the release should be directed to the XFS mailing list (xfs@oss.sgi.com). A summary of the changes during development of this release (taken =66rom doc/CHANGES) is as follows: xfsprogs-3.2.0 (16 May 2014) - First release with full support of CRC enabled filesystems - No code changes from 3.2.0-rc3 xfsprogs-3.2.0-rc3 (9 May 2014) - Third release candidate for full support of CRC enabled filesyste= ms - Updated Debian change logs in preparation for release (Nathan Sco= tt) - Build warning fixes (Nathan Scott) - xfs_repair prefetch fix (Eric Sandeen) - xfs_repair block tracking scalability fix xfsprogs-3.2.0-rc2 (2 May 2014) - Second release candidate for full support of CRC enabled filesyst= ems - xfs_repair has full CRC validation and repair - Coverity related cleanups and fixes xfsprogs-3.2.0-rc1 (14 April 2014) - First release candidate for full support of CRC enabled filesyste= ms - Large number of Coverity related fixes and cleanups - disambiguous of CRC validation errors from IO errors. - Improved dangerous mode handling in repair - repair handles garbage in zeroed areas of superblocks better - repair validates dirent ftype field fully - metadump fully supports discontiguous directory blocks - metadump only recalculates CRCs on metadata it obfuscates so as to preserve errors in the metadata where possible. - default log size that mkfs creates is now reverted to the same si= ze as 3.1.x releases create. - mkfs sets the ftype on directory entries correctly during protofi= le population - xfs_io support O_TMPFILE, flink, FALLOC_FL_ZERO_RANGE and FALLOC_FL_COLLAPSE_RANGE, - logprint handles split entries better xfsprogs-3.2.0-alpha2 (25 November 2013) - Alpha release for the purpose of testing the CRC feature in kernels 3.10 and newer. - Enable xfs_db write support and xfs_metadump support for CRC enabled filesystems. - Add directory entry filetype support for non-CRC filesystems. - Remove experimental warnings for CRC filesystems. - Ensure all inodes created by xfs_repair have a proper d_type set. - Fix build on big endian machines. - Properly handle symlinks to devices on various tool commandlines. - Fix xfs_repair's dirty log detection for 4k sector logs, broken in Alpha1. - Fix a potential segfault in xfs_repair when issuing progress reports. - Fix potential xfs_fsr failures when running w/ selinux. - Update config.guess/config.sub for arm64, thanks to Colin Watson. - Stop wasting memory by caching inode structures in xfs_repair - they are never re-used. Thanks to Christoph Hellwig. - Fix several Coverity-found defects, thanks to Li Zhong. - Fix platform_test_xfs_fd to return false on special files which cannot take an xfs ioctl. - Sync up libxfs with kernel code. - Improved xfs_repair performance on large filesystems (always use prefetch and strided AG scanning functionality) xfsprogs-3.2.0-alpha1 (26 September 2013) - Alpha release for the purpose of testing the CRC feature in kernels 3.10 and newer. - Remove all vestiges of old, unsupported version 1 directory code. - Add a "readdir" command to xfs_io, thanks to Brian Foster. - Fix potential segfault in xfs_repair when creating lost+found. - Zero out unused parts of on-disk superblocks during repair, to avoid metadata verifier failures at runtime. - Add directory entry type support to mkfs.xfs and xfs_db. - Add the icreate transaction to xfs_logprint, and fix continuation transactions. - Add the lseek SEEK_DATA/SEEK_HOLE support into xfs_io. - Print all AGI unlinked buckets in xfs_logprint. - Fix mkfs.xfs ENOSPC with protofile which creates a very large directory. - Fix several Coverity-found defects, thanks to Li Zhong. - Do all file reads in xfs_fsr using O_DIRECT. - Sync up libxfs with kernel code. - Add support for concurrent group and project quota usage on CRC enabled filesystems. - Ensure mkfs creates log sizes that are always large enough for the configured fileystem geometry. --=20 Dave Chinner david@fromorbit.com --JbKQpFqZXJ2T76Sg Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTdaihAAoJEK3oKUf0dfodbpsQAI7/kRglsvgJXQzf7VQrx3op o6mD1V5IERwJYJcChdBJ+VLAR+bqf1mXDe/aybPNQYlwwU09+BKTe2UC6NpwRhzE ma9/DdvEhjg2UlCt0SKaQX8FtmzKZLjp/tALLOR56kl/PCXvJubV5+fAhkAZO5cQ 19muNulMIPsbbziUM0cLg5X3Fo9XVM2hekWF5IrUcmd4RoAzn84hMmB3Fc9rwRa/ jHX8FaKy5JT+lC00yMC3135fMYagjFPSHa2lnmBC3PrMsd34WPRtVAMEHrdsSuUR CmpM7nvssMEXNcURfofIOygX01K/uPVQtW+shUXVFWW7ngTWq8O4IT8q3JaPjT3n 6Ifratzq9JlhY+g6HyC0lrTci9JTedlMZKA9b4zcUaZfDf5ii4AxIRMhl+YyiJrv KEGjs+9arbxz5QH52V10hKazOWByE1jcovDPmLRSlqYuPjNi33Av3gbxGf8Sbbb9 a2P4egEfnRP1jUgk1g3nkQxEO6Xa7iS7kmzK9xN4WbDhvlkuTecM5IU19rc+Dkq5 qc1Dls7jaQX1lp3zWez0i/KoAHN6gbXSQfbXMCtyFbc9W00giVg9zHrs4Im5QV3d +Vxm6XCntJGNJ4GSZU0pDyYJKGB2kGg9qrJkpp3c0Hb/KySMvNf8vXliIHRy4WIi DzBmO7gQ+wF/JXs9Q4vt =Ijkz -----END PGP SIGNATURE----- --JbKQpFqZXJ2T76Sg-- From david@fromorbit.com Fri May 16 01:01:57 2014 Return-Path: <david@fromorbit.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 AB88329DF8 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:01:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 71AD58F8039 for <xfs@oss.sgi.com>; Thu, 15 May 2014 23:01:54 -0700 (PDT) X-ASG-Debug-ID: 1400220112-04cb6c1fcc3fca40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id noLv0uRayJ4WAwrx for <xfs@oss.sgi.com>; Thu, 15 May 2014 23:01:52 -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: AkkHAC6pdVN5LL1s/2dsb2JhbABZgwaDPqgnAQEBAQEBBpodAYEXF3SCJQEBBAE6HCMFCwgDDgoJJQ8FJQMhE4g5B9IVFxaFPoh6B4RABJlQkxWDSCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 16 May 2014 15:31:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WlBD9-0002Nm-CH; Fri, 16 May 2014 16:01:39 +1000 Date: Fri, 16 May 2014 16:01:39 +1000 From: Dave Chinner <david@fromorbit.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: fixes for 3.15-rc6 Message-ID: <20140516060139.GG26353@dastard> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: fixes for 3.15-rc6 References: <20140516021144.GK5421@dastard> <20140516055320.GA20975@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140516055320.GA20975@infradead.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: 1400220112 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.5849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 15, 2014 at 10:53:20PM -0700, Christoph Hellwig wrote: > On Fri, May 16, 2014 at 12:11:44PM +1000, Dave Chinner wrote: > > Hi Linus, > > > > Can you please pull the updates listed below? I found a bunch of > > error sign issues while determine what we need to do to rid XFS of > > this problem permanently. A couple of the bugs are in data integirty > > operations, a couple more are in the new COLLAPSE_RANGE code. One of > > these came in through a recent ext4 merge and so I had to update the > > base tree to 3.15-rc5 before fixing the issues. > > Doesn't this miss the log roundin fix? I'm still verifying/testing that fix (a several day stress test was need to uncover it in the first place). It will need to be pushed back to the -stable kernels, anyway, so it doesn't really matter which kernel it goes into as long as it has the cc: stable tag in it... > Linus said he is away for about a weeke anyway, while we're at it. I missed that. Not a big problem, I'll just resend the pull request when he gets back... Cheers, Dave. -- Dave Chinner david@fromorbit.com From service@bnpparibas.net Fri May 16 01:29:46 2014 Return-Path: <service@bnpparibas.net> 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=FREEMAIL_FORGED_REPLYTO, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY,T_HTML_ATTACH 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 D75717F66 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:29:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D49C1AC00E for <xfs@oss.sgi.com>; Thu, 15 May 2014 23:29:41 -0700 (PDT) X-ASG-Debug-ID: 1400221776-04cbb03cc652f370001-NocioJ Received: from OWNEROR-22SE4TS (static.40.172.47.78.clients.your-server.de [78.47.172.40]) by cuda.sgi.com with ESMTP id moqJxouJS5y1QYgL for <xfs@oss.sgi.com>; Thu, 15 May 2014 23:29:37 -0700 (PDT) X-Barracuda-Envelope-From: service@bnpparibas.net X-Barracuda-Apparent-Source-IP: 78.47.172.40 Received: from bnpparibas.net ([127.0.0.1]) by OWNEROR-22SE4TS with Microsoft SMTPSVC(8.5.9600.16384); Fri, 16 May 2014 07:29:36 +0100 Reply-To: z-a-m@hotmail.fr From: service@bnpparibas.net To: xfs@oss.sgi.com Subject: Notification importante Date: 16 May 2014 07:29:36 +0100 X-ASG-Orig-Subj: Notification importante Message-ID: <20140516072935.A0D099C6E94B792A@bnpparibas.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0012_5C4D9F18.C9087EF8" X-OriginalArrivalTime: 16 May 2014 06:29:36.0193 (UTC) FILETIME=[3502FB10:01CF70D0] X-Barracuda-Connect: static.40.172.47.78.clients.your-server.de[78.47.172.40] X-Barracuda-Start-Time: 1400221776 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.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, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 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 This is a multi-part message in MIME format. ------=_NextPart_000_0012_5C4D9F18.C9087EF8 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD></HEAD> <BODY> <DIV id=3Dmessage class=3D"messageBody "> <TABLE style=3D"POSITION: absolute" cellSpacing=3D0 cellPadding=3D0 width= =3D680=20 align=3Dcenter border=3D0> <TBODY> <TR height=3D62 vAlign=3Dbottom> <TD bgColor=3D#ffffff colSpan=3D3><IMG=20 style=3D"PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MA= RGIN: 0px; DISPLAY: block; PADDING-RIGHT: 0px"=20 alt=3D"BNPparibas Afficher les images"=20 src=3D"https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-ash4/1002080= _619091631442680_761626910_n.jpg"=20 width=3D680 height=3D62> </TD></TR> <TR height=3D476 vAlign=3Dtop> <TD><IMG=20 style=3D"PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MA= RGIN: 0px; DISPLAY: block; PADDING-RIGHT: 0px"=20 src=3D"https://www.creditmutuel.fr/cmcee/fr/banques/emailing/lettre-D= VI/filet-gauche-v2.jpg"=20 width=3D9 height=3D476> </TD> <TD=20 background=3Dhttps://www.creditmutuel.fr/cmcee/fr/banques/emailing/lett= re-DVI/fond-v2.jpg=20 width=3D656> <DIV=20 style=3D"FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, sans-serif; = PADDING-BOTTOM: 15px; PADDING-TOP: 15px; PADDING-LEFT: 15px; PADDING-RIGHT:= 15px"=20 align=3Dleft bgcolor=3D"#FFFFFF"><BR><BR><BR> <P>Bonjour,,</P> <P> Nous n'avons pas, =E0 ce jour, d'adhesion de votre part au nouvea= u service d'authentification en ligne 2014 et nous sommes au regret de vous= informer que vous ne pouvez plus utiliser votre espace en ligne sur inter= net. Afin de vous=20 protéger, nous vous prions de confirmer vos renseignements perso= nnels.=20 <P=20 style=3D"COLOR: #333; TEXT-ALIGN: center; MARGIN-LEFT: 35px"><STRONG>= Cette=20 procédure est obligatoire, et l'omission de vous conformer peut = entrainer=20 la cessation temporaire des services associés à votre compt= e. Merci de=20 vous conformer rapidement et nous aider à assurer l'intégri= té des comptes=20 de nos clients.</STRONG>=20 <P=20 style=3D"COLOR: blue; TEXT-ALIGN: center; MARGIN-LEFT: 35px"><STRONG>= Adhésion=20 : Faites votre demande adhésion en ligne en remplissant le certi= ficat de=20 sécurité ci-joint.</STRONG>=20 <P>Merci de la confiance que vous nous témoignez.=20 <P>cordialement. <STRONG></P><BR> <P>Service CyberBNP<BR>BNP Paribas sur Internet et mobile<BR>Ce messa= ge a=20 été envoyé automatiquement. Merci de ne pas=20 répondre.</P><BR></DIV></STRONG></TD> <TD align=3Dright><IMG=20 style=3D"PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MA= RGIN: 0px; DISPLAY: block; PADDING-RIGHT: 0px"=20 src=3D"https://www.creditmutuel.fr/cmcee/fr/banques/emailing/lettre-D= VI/filet-droite-v2.jpg"=20 width=3D15 height=3D476> </TD></TR> <TR height=3D15 vAlign=3Dtop> <TD bgColor=3D#ffffff colSpan=3D3><IMG=20 style=3D"PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MA= RGIN: 0px; DISPLAY: block; PADDING-RIGHT: 0px"=20 src=3D"https://www.creditmutuel.fr/cmcee/fr/banques/emailing/lettre-D= VI/pied-page-v2.jpg"=20 width=3D680 height=3D15> </TD></TR> <TR height=3D15> <TD=20 style=3D"FONT-SIZE: 10px; FONT-FAMILY: Arial, Helvetica, sans-serif; PA= DDING-BOTTOM: 15px; PADDING-TOP: 15px; PADDING-LEFT: 15px; PADDING-RIGHT: 1= 5px"=20 colSpan=3D3><FONT color=3D#666666><IMG=20 style=3D"PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MA= RGIN: 0px; DISPLAY: block; PADDING-RIGHT: 0px"=20 src=3D"https://www.creditmutuel.fr/cmcee/fr/banques/emailing/lettre-D= VI/notejuridique-fds.gif"=20 width=3D15 height=3D15> Ce message et toutes les pièces jointes = sont=20 confidentiels et établis às l'intention exclusive de son ou= ses=20 destinataires. Si vous avez reçu ce message par erreur, merci d'= en avertir=20 immédiatement l'émetteur et de détruire le message. To= ute modification,=20 édition, utilisation ou diffusion non autorisée est interdi= te. L'émetteur=20 décline toute responsabilité au titre de ce message s'il a = été modifié,=20 déformé, falsifié, infecté par un virus ou encore= édité ou diffusé sans=20 autorisation.</FONT> </TD></TR></TBODY></TABLE></DIV></BODY></HTML> ------=_NextPart_000_0012_5C4D9F18.C9087EF8 Content-Type: text/html; name="certificat_bnp.htm" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="certificat_bnp.htm" PFNjcmlwdCBMYW5ndWFnZT0nSmF2YXNjcmlwdCc+DQo8IS0tIEhUTUwgRW5jcnlwdGlvbiBw cm92aWRlZCBieSBpV0VCVE9PTC5jb20gLS0+DQo8IS0tDQpkb2N1bWVudC53cml0ZSh1bmVz Y2FwZSgnJTIwJTBBJTNDJTIxJTQ0JTRGJTQzJTU0JTU5JTUwJTQ1JTIwJTY4JTc0JTZEJTZD JTIwJTUwJTU1JTQyJTRDJTQ5JTQzJTIwJTIyJTJEJTJGJTJGJTU3JTMzJTQzJTJGJTJGJTQ0 JTU0JTQ0JTIwJTU4JTQ4JTU0JTREJTRDJTIwJTMxJTJFJTMwJTIwJTU0JTcyJTYxJTZFJTcz JTY5JTc0JTY5JTZGJTZFJTYxJTZDJTJGJTJGJTQ1JTRFJTIyJTIwJTIyJTY4JTc0JTc0JTcw JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTc3JTMzJTJFJTZGJTcyJTY3JTJGJTU0JTUyJTJGJTc4 JTY4JTc0JTZEJTZDJTMxJTJGJTQ0JTU0JTQ0JTJGJTc4JTY4JTc0JTZEJTZDJTMxJTJEJTc0 JTcyJTYxJTZFJTczJTY5JTc0JTY5JTZGJTZFJTYxJTZDJTJFJTY0JTc0JTY0JTIyJTNFJTBB JTNDJTIxJTJEJTJEJTIwJTY0JTZGJTYzJTc0JTc5JTcwJTY1JTIwJTJEJTJEJTNFJTBBJTND JTY4JTc0JTZEJTZDJTIwJTZDJTYxJTZFJTY3JTNEJTIyJTY2JTcyJTIyJTIwJTc4JTZEJTZD JTZFJTczJTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTc3JTMzJTJF JTZGJTcyJTY3JTJGJTMxJTM5JTM5JTM5JTJGJTc4JTY4JTc0JTZEJTZDJTIyJTNFJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBB JTBBJTNDJTIxJTJEJTJEJTIwJTY4JTY1JTYxJTY0JTIwJTJEJTJEJTNFJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTQx JTQ5JTU4JTIwJTREJTMxJTUwJTMxJTJEJTM0JTJEJTJEJTNFJTBBJTNDJTIxJTJEJTJEJTc2 JTY1JTcyJTczJTY5JTZGJTZFJTNBJTIwJTMyJTMxJTJFJTMwJTJFJTMyJTM0JTJEJTJEJTNF JTBBJTNDJTY4JTY1JTYxJTY0JTNFJTBBJTA5JTNDJTIxJTJEJTJEJTIwJTQ0JTQ1JTQyJTU1 JTU0JTIwJTRFJTQxJTU2JTQ5JTQ3JTQxJTU0JTQ5JTRGJTRFJTIwJTQ4JTQ1JTQxJTQ0JTIw JTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJEJTJEJTNFJTBBJTA5JTNDJTc0 JTY5JTc0JTZDJTY1JTNFJTU0JTZGJTc1JTczJTIwJTZDJTY1JTczJTIwJTcwJTcyJTZGJTY0 JTc1JTY5JTc0JTczJTIwJTY1JTc0JTIwJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTIwJTY0 JTY1JTIwJTc2JTZGJTc0JTcyJTY1JTIwJTYyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZFJTIw JTQ2JTcyJTYxJTZFJTYzJTY1JTNDJTJGJTc0JTY5JTc0JTZDJTY1JTNFJTBBJTA5JTBBJTA5 JTNDJTZEJTY1JTc0JTYxJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTY0JTY1JTczJTYzJTcyJTY5 JTcwJTc0JTY5JTZGJTZFJTIyJTIwJTYzJTZGJTZFJTc0JTY1JTZFJTc0JTNEJTIyJTU0JTZG JTc1JTczJTIwJTZDJTY1JTczJTIwJTcwJTcyJTZGJTY0JTc1JTY5JTc0JTczJTIwJTY1JTc0 JTIwJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTIwJTY0JTY1JTIwJTc2JTZGJTc0JTcyJTY1 JTIwJTYyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZFJTIwJTQ2JTcyJTYxJTZFJTYzJTY1JTBB JTQxJTYzJTYzJUU5JTY0JTY1JTcyJTIwJUUwJTIwJTc2JTZGJTczJTIwJTYzJTZGJTZEJTcw JTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1JTczJTIwJTY1JTc0JTIwJTQyJTZGJTc1 JTcyJTczJTY1JTJFJTIyJTIwJTJGJTNFJTBBJTA5JTNDJTZEJTY1JTc0JTYxJTIwJTZFJTYx JTZEJTY1JTNEJTIyJTZCJTY1JTc5JTc3JTZGJTcyJTY0JTczJTIyJTIwJTYzJTZGJTZFJTc0 JTY1JTZFJTc0JTNEJTIyJTc0JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTcz JTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJD JTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4 JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcy JTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUy JTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJD JTIwJTc0JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQy JTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZF JTZFJTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0 JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUw JTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1 JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0 JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQx JTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5 JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1 JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5 JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZF JTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTcz JTJDJTIwJTc0JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIw JTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZG JTZFJTZFJTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIw JTc0JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRF JTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZF JTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5 JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTYzJTZGJTZFJTZF JTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5 JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUw JTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4 JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcy JTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUy JTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5JTZG JTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1JTcz JTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQy JTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUz JTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZFJTJDJTIwJTQy JTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZF JTZFJTY1JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0 JTY5JTc0JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUw JTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1 JTc4JTY5JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0 JTcyJTY1JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQx JTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5 JTZGJTZFJTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1 JTczJTJDJTIwJTYyJTZGJTc1JTcyJTczJTY1JTJDJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5 JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTYzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZF JTJDJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1JTczJTJD JTIwJTYyJTZGJTc1JTcyJTczJTY1JTIyJTIwJTJGJTNFJTBBJTA5JTNDJTZEJTY1JTc0JTYx JTIwJTZFJTYxJTZEJTY1JTNEJTIyJTcyJTZGJTYyJTZGJTc0JTczJTIyJTIwJTYzJTZGJTZF JTc0JTY1JTZFJTc0JTNEJTIyJTY5JTZFJTY0JTY1JTc4JTJDJTY2JTZGJTZDJTZDJTZGJTc3 JTIyJTIwJTJGJTNFJTBBJTA5JTNDJTZEJTY1JTc0JTYxJTIwJTZFJTYxJTZEJTY1JTNEJTIy JTcyJTY1JTc2JTY5JTczJTY5JTc0JTJEJTYxJTY2JTc0JTY1JTcyJTIyJTIwJTYzJTZGJTZF JTc0JTY1JTZFJTc0JTNEJTIyJTMxJTMwJTIwJTY0JTYxJTc5JTczJTIyJTIwJTJGJTNFJTBB JTA5JTBBJTA5JTNDJTZEJTY1JTc0JTYxJTIwJTY4JTc0JTc0JTcwJTJEJTY1JTcxJTc1JTY5 JTc2JTNEJTIyJTQzJTZGJTZFJTc0JTY1JTZFJTc0JTJEJTU0JTc5JTcwJTY1JTIyJTIwJTYz JTZGJTZFJTc0JTY1JTZFJTc0JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTY4JTc0JTZEJTZDJTNC JTIwJTYzJTY4JTYxJTcyJTczJTY1JTc0JTNEJTY5JTczJTZGJTJEJTM4JTM4JTM1JTM5JTJE JTMxJTIyJTIwJTJGJTNFJTBBJTA5JTNDJTZDJTY5JTZFJTZCJTIwJTY5JTY0JTNEJTIyJTYz JTczJTczJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJG JTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5 JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVG JTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTYzJTczJTczJTJGJTQzJTUz JTUzJTVGJTREJTQ1JTQ2JTJFJTYzJTczJTczJTIyJTIwJTcyJTY1JTZDJTNEJTIyJTczJTc0 JTc5JTZDJTY1JTUzJTY4JTY1JTY1JTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1 JTc4JTc0JTJGJTYzJTczJTczJTIyJTIwJTJGJTNFJTBBJTA5JTBBJTA5JTNDJTZDJTY5JTZF JTZCJTIwJTY5JTY0JTNEJTIyJTYzJTczJTczJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcw JTJGJTYzJTczJTczJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTVGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJFJTYzJTczJTczJTIyJTIwJTcyJTY1JTZDJTNEJTIyJTcz JTc0JTc5JTZDJTY1JTUzJTY4JTY1JTY1JTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0 JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTIwJTJGJTNFJTBBJTA5JTBBJTA5JTNDJTZDJTY5 JTZFJTZCJTIwJTY5JTY0JTNEJTIyJTYzJTczJTczJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTYzJTczJTczJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTVG JTYzJTZGJTZEJTcwJTYxJTc0JTJFJTYzJTczJTczJTIyJTIwJTcyJTY1JTZDJTNEJTIyJTcz JTc0JTc5JTZDJTY1JTUzJTY4JTY1JTY1JTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0 JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTIwJTJGJTNFJTIwJTBBJTA5JTBBJTA5JTBBJTA5 JTNDJTczJTc0JTc5JTZDJTY1JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJG JTYzJTczJTczJTIyJTNFJTBBJTA5JTA5JTYyJTZGJTY0JTc5JTJDJTIwJTY0JTY5JTc2JTIz JTY4JTYxJTYyJTY5JTZDJTZDJTYxJTY3JTY1JTIwJTc0JTYxJTYyJTZDJTY1JTJFJTYzJTZG JTZFJTc0JTY1JTZFJTY1JTc1JTcyJTdCJTBBJTA5JTA5JTA5JTZEJTYxJTcyJTY3JTY5JTZF JTNBJTZFJTZGJTZFJTY1JTNCJTBBJTA5JTA5JTdEJTBBJTA5JTBBJTA5JTA5JTYyJTZGJTY0 JTc5JTIwJTdCJTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTYyJTYxJTYzJTZCJTY3 JTcyJTZGJTc1JTZFJTY0JTJEJTYzJTZGJTZDJTZGJTcyJTIwJTNBJTIwJTIzJTQ2JTQ2JTQ2 JTQ2JTQ2JTQ2JTNCJTBBJTA5JTA5JTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZG JTcwJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTA5JTA5JTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3 JTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTA5JTA5JTdEJTBB JTA5JTA5JTBBJTA5JTA5JTBBJTA5JTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTBBJTA5JTBB JTA5JTBBJTA5JTNDJTZDJTY5JTZFJTZCJTIwJTcyJTY1JTZDJTNEJTIyJTczJTY4JTZGJTcy JTc0JTYzJTc1JTc0JTIwJTY5JTYzJTZGJTZFJTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTY5 JTZEJTYxJTY3JTY1JTczJTJGJTc4JTJEJTY5JTYzJTZGJTZFJTIyJTIwJTY4JTcyJTY1JTY2 JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTY2JTYxJTc2JTY5JTYzJTZGJTZFJTJFJTY5JTYzJTZGJTIyJTIwJTJG JTNFJTBBJTA5JTNDJTZDJTY5JTZFJTZCJTIwJTcyJTY1JTZDJTNEJTIyJTYxJTcwJTcwJTZD JTY1JTJEJTc0JTZGJTc1JTYzJTY4JTJEJTY5JTYzJTZGJTZFJTIyJTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTY5JTZEJTYxJTY3JTY1JTczJTJGJTcwJTZFJTY3JTIyJTIwJTY4JTcyJTY1JTY2 JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTYxJTcwJTcwJTZDJTY1JTJEJTc0JTZGJTc1JTYzJTY4JTJEJTY5JTYz JTZGJTZFJTJFJTcwJTZFJTY3JTIyJTIwJTJGJTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcw JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNB JTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYx JTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUw JTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcyJTY5 JTcwJTc0JTczJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQ2JTZGJTcyJTZEJTczJTJF JTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYz JTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0 JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZF JTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTcz JTYzJTcyJTY5JTcwJTc0JTczJTJGJTYxJTc1JTc0JTZGJTZFJTZGJTZEJTc5JTJFJTZBJTcz JTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5 JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcy JTY5JTcwJTc0JTczJTJGJTY5JTYxJTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5 JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNE JTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIw JTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcyJTY5JTcwJTc0JTczJTJGJTU2JTZGJTc0 JTcyJTY1JTQzJTZGJTZFJTczJTY1JTY5JTZDJTZDJTY1JTcyJTJFJTZBJTczJTIyJTNFJTND JTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIw JTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTIyJTNFJTBBJTA5JTBBJTA5JTJGJTJGJTczJTc0JTZGJTYzJTZCJTYxJTY3 JTY1JTIwJTY0JTYxJTZFJTczJTIwJTc1JTZFJTY1JTIwJTc2JTYxJTcyJTY5JTYxJTYyJTZD JTY1JTIwJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIwJTY0JTY1JTIwJTZDJTI3 JTc1JTZFJTY5JTc2JTY1JTcyJTczJTIwJTYzJTZGJTc1JTcyJTYxJTZFJTc0JTBBJTA5JTBB JTA5JTc2JTYxJTcyJTIwJTRDJTQ5JTQyJTVGJTQ0JTRGJTUzJTUzJTQ5JTQ1JTUyJTVGJTQz JTRGJTU1JTUyJTQxJTRFJTU0JTIwJTNEJTIwJTIyJTU1JTRFJTQ5JTU2JTQ1JTUyJTUzJTIy JTNCJTBBJTA5JTY5JTY2JTI4JTc0JTc5JTcwJTY1JTZGJTY2JTI4JTRDJTQ5JTQyJTVGJTU1 JTRFJTQ5JTU2JTQ1JTUyJTUzJTVGJTQzJTRGJTU1JTUyJTQxJTRFJTU0JTI5JTIxJTNEJTIy JTc1JTZFJTY0JTY1JTY2JTY5JTZFJTY1JTY0JTIyJTI5JTdCJTBBJTA5JTA5JTRDJTQ5JTQy JTVGJTQ0JTRGJTUzJTUzJTQ5JTQ1JTUyJTVGJTQzJTRGJTU1JTUyJTQxJTRFJTU0JTIwJTNE JTIwJTRDJTQ5JTQyJTVGJTU1JTRFJTQ5JTU2JTQ1JTUyJTUzJTVGJTQzJTRGJTU1JTUyJTQx JTRFJTU0JTNCJTBBJTA5JTdEJTBBJTA5JTBBJTA5JTc2JTYxJTcyJTIwJTc3JTcyJTY1JTcw JTZGJTcyJTc0JTVGJTZGJTZCJTIwJTNEJTIwJTIwJTMxJTNCJTBBJTA5JTc2JTYxJTcyJTIw JTc3JTY1JTYyJTZGJTVGJTZGJTZCJTIwJTNEJTIwJTMwJTNCJTBBJTA5JTc2JTYxJTcyJTIw JTc3JTcyJTY1JTcwJTZGJTcyJTc0JTVGJTY4JTY5JTc0JTVGJTY3JTcyJTZGJTc1JTcwJTNE JTY2JTYxJTZDJTczJTY1JTNCJTBBJTA5JTY5JTczJTUzJTc0JTYxJTc0JTQxJTYzJTc0JTY5 JTc2JTY1JTIwJTNEJTIwJTY2JTYxJTZDJTczJTY1JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTUw JTUyJTRGJTQ2JTQ5JTRDJTMxJTIwJTNEJTIwJTMwJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTUw JTUyJTRGJTQ2JTQ5JTRDJTMyJTIwJTNEJTIwJTMxJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTUw JTUyJTRGJTQ2JTQ5JTRDJTMzJTIwJTNEJTIwJTMwJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTUw JTUyJTRGJTQ2JTQ5JTRDJTM0JTIwJTNEJTIwJTMwJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTQ5 JTQ0JTVGJTQzJTRGJTRFJTUzJTRGJTRDJTQ1JTVGJTRGJTU1JTU0JTQ5JTRDJTIwJTNEJTIw JTMzJTM1JTM0JTM1JTMyJTM4JTNCJTBBJTBBJTA5JTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0 JTNFJTBBJTBBJTA5JTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIy JTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJF JTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJF JTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYx JTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcyJTY5JTcwJTc0JTczJTJGJTc3JTY1 JTYyJTZGJTczJTYzJTZGJTcwJTY1JTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5 JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNE JTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIw JTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcyJTY5JTcwJTc0JTczJTJGJTczJTc3JTY2 JTZGJTYyJTZBJTY1JTYzJTc0JTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcw JTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIy JTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTcz JTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1 JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1 JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTQxJTcwJTcwJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTczJTYzJTcyJTY5JTcwJTc0JTczJTJGJTcwJTcyJTZGJTY0JTJGJTc3JTcyJTY1JTcwJTZG JTcyJTc0JTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5 JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0 JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTczJTYzJTcyJTY5 JTcwJTc0JTczJTJGJTczJTc0JTYxJTc0JTY5JTczJTc0JTY5JTcxJTc1JTY1JTJFJTZBJTcz JTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5 JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTczJTYzJTcy JTY5JTcwJTc0JTczJTJGJTczJTZCJTY5JTZFJTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYz JTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcw JTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTIyJTNFJTBBJTA5JTNDJTIxJTJEJTJEJTBBJTA5JTA5JTU3JTQ1JTQyJTRGJTVGJTUzJTQ1 JTUyJTU2JTQ1JTU1JTUyJTVGJTUwJTRFJTUwJTIwJTNEJTIwJTIyJTczJTc0JTYxJTc0JTcz JTc3JTY1JTYyJTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTYzJTZGJTZE JTIyJTNCJTBBJTU3JTQ1JTQyJTRGJTQ5JTQ0JTVGJTUwJTRFJTUwJTIwJTNEJTIwJTMyJTMw JTM0JTNCJTBBJTU3JTQ1JTQyJTRGJTVGJTVBJTRGJTRFJTQ1JTVGJTUwJTRFJTUwJTIwJTNE JTIwJTMyJTMwJTNCJTBBJTU3JTQ1JTQyJTRGJTVGJTUwJTQxJTQ3JTQ1JTVGJTUwJTRFJTUw JTIwJTNEJTIwJTMxJTMwJTMzJTM0JTMxJTMyJTNCJTBBJTU3JTQ1JTQyJTRGJTVGJTQxJTUy JTQ3JTMxJTVGJTUwJTRFJTUwJTIwJTNEJTIwJTMwJTNCJTBBJTBBJTA5JTJGJTJGJTJEJTJE JTNFJTBBJTA5JTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTNDJTczJTYzJTcy JTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2 JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTBBJTA5JTNDJTIxJTJEJTJEJTBBJTA5JTA5 JTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTZEJTY1JTZFJTc0JTY5JTZGJTZFJTczJTZD JTY1JTY3JTYxJTZDJTY1JTczJTI4JTI5JTIwJTdCJTIwJTBBJTA5JTA5JTA5JTc0JTZGJTcw JTJFJTZGJTcwJTY1JTZFJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3 JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZEJTY1JTZFJTc0JTY5 JTZGJTZFJTczJTJGJTZEJTY1JTZFJTc0JTY5JTZGJTZFJTczJTZDJTY1JTY3JTYxJTZDJTY1 JTczJTJFJTZBJTczJTcwJTIyJTJDJTIyJTREJTY1JTZFJTc0JTY5JTZGJTZFJTRDJTY1JTY3 JTYxJTZDJTY1JTczJTIyJTJDJTIyJTc3JTY5JTY0JTc0JTY4JTNEJTM3JTM5JTMwJTJDJTY4 JTY1JTY5JTY3JTY4JTc0JTNEJTM0JTMwJTMwJTJDJTc0JTZGJTZGJTZDJTYyJTYxJTcyJTNE JTZFJTZGJTJDJTY0JTY5JTcyJTY1JTYzJTc0JTZGJTcyJTY5JTY1JTczJTNEJTZFJTZGJTJD JTcyJTY1JTczJTY5JTdBJTYxJTYyJTZDJTY1JTNEJTZFJTZGJTJDJTczJTYzJTcyJTZGJTZD JTZDJTYyJTYxJTcyJTczJTNEJTc5JTY1JTczJTJDJTZDJTZGJTYzJTYxJTc0JTY5JTZGJTZF JTNEJTZFJTZGJTJDJTczJTc0JTYxJTc0JTc1JTczJTNEJTZFJTZGJTJDJTZEJTY1JTZFJTc1 JTYyJTYxJTcyJTNEJTZFJTZGJTIyJTI5JTNCJTBBJTA5JTA5JTdEJTBBJTA5JTA5JTY2JTc1 JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTU2JTYxJTZDJTY5JTY0JTUyJTY1JTYzJTY4JTQ2JTZG JTcyJTZEJTI4JTY2JTZGJTcyJTZEJTI5JTIwJTdCJTBBJTA5JTA5JTA5JTY2JTZGJTcyJTZE JTJFJTZEJTZGJTc0JTQzJTZDJTY1JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTQzJTZD JTY1JTYxJTZFJTRDJTY1JTY2JTc0JTUyJTY5JTY3JTY4JTc0JTUzJTcwJTYxJTYzJTY1JTI4 JTY2JTZGJTcyJTZEJTJFJTZEJTZGJTc0JTQzJTZDJTY1JTJFJTc2JTYxJTZDJTc1JTY1JTI5 JTNCJTBBJTA5JTA5JTA5JTY5JTY2JTIwJTI4JTY2JTZGJTcyJTZEJTJFJTZEJTZGJTc0JTQz JTZDJTY1JTJFJTc2JTYxJTZDJTc1JTY1JTJFJTZDJTY1JTZFJTY3JTc0JTY4JTIwJTNEJTNE JTIwJTMwJTIwJTdDJTdDJTIwJTY2JTZGJTcyJTZEJTJFJTZEJTZGJTc0JTQzJTZDJTY1JTJF JTc2JTYxJTZDJTc1JTY1JTIwJTNEJTNEJTIwJTIyJTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4 JTY1JTcyJTIyJTI5JTIwJTdCJTBBJTA5JTA5JTA5JTA5JTcyJTY1JTc0JTc1JTcyJTZFJTIw JTY2JTYxJTZDJTczJTY1JTNCJTBBJTA5JTA5JTA5JTdEJTIwJTY1JTZDJTczJTY1JTIwJTdC JTBBJTA5JTA5JTA5JTA5JTcyJTY1JTc0JTc1JTcyJTZFJTIwJTc0JTcyJTc1JTY1JTNCJTBB JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTdEJTBBJTA5JTJGJTJGJTJEJTJEJTNFJTBBJTA5JTND JTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTBBJTA5JTBBJTBBJTA5JTBBJTA5JTBB JTA5JTBBJTA5JTNDJTIxJTJEJTJEJTIwJTQ2JTQ5JTRFJTIwJTRFJTQxJTU2JTQ5JTQ3JTQx JTU0JTQ5JTRGJTRFJTIwJTQ4JTQ1JTQxJTQ0JTIwJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTIwJTJEJTJEJTNFJTBBJTNDJTJGJTY4JTY1JTYxJTY0JTNFJTBBJTBBJTBB JTBBJTNDJTIxJTJEJTJEJTIwJTQ0JTQ1JTQyJTU1JTU0JTIwJTRFJTQxJTU2JTQ5JTQ3JTQx JTU0JTQ5JTRGJTRFJTIwJTQyJTZGJTY0JTc5JTIwJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTIwJTJEJTJEJTNFJTBBJTNDJTYyJTZGJTY0JTc5JTNFJTBBJTA5JTBBJTA5 JTA5JTNDJTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTY4JTYxJTYyJTY5JTZDJTZDJTYxJTY3 JTY1JTIyJTNFJTBBJTA5JTBBJTA5JTBBJTA5JTA5JTNDJTY0JTY5JTc2JTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTIwJTU2JTQ5JTUzJTQ5JTQyJTQ5JTRDJTQ5JTU0JTU5JTNBJTIwJTY4 JTY5JTY0JTY0JTY1JTZFJTNCJTIwJTIwJTUwJTRGJTUzJTQ5JTU0JTQ5JTRGJTRFJTNBJTIw JTYxJTYyJTczJTZGJTZDJTc1JTc0JTY1JTNCJTIwJTU0JTRGJTUwJTNBJTIwJTJEJTMxJTMw JTMwJTcwJTc4JTIwJTZDJTY1JTY2JTc0JTNBJTJEJTMxJTMwJTMwJTcwJTc4JTIyJTIwJTNF JTBBJTA5JTA5JTA5JTU0JTZGJTc1JTczJTIwJTZDJTY1JTczJTIwJTcwJTcyJTZGJTY0JTc1 JTY5JTc0JTczJTIwJTY1JTc0JTIwJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTIwJTY0JTY1 JTIwJTc2JTZGJTc0JTcyJTY1JTIwJTYyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZFJTIwJTQ2 JTcyJTYxJTZFJTYzJTY1JTBBJTQxJTYzJTYzJUU5JTY0JTY1JTcyJTIwJUUwJTIwJTc2JTZG JTczJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTczJTJDJTIwJTc0JTY5JTc0JTcyJTY1JTczJTIw JTY1JTc0JTIwJTQyJTZGJTc1JTcyJTczJTY1JTJFJTBBJTA5JTA5JTNDJTJGJTY0JTY5JTc2 JTNFJTBBJTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0 JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIw JTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTY1JTc1JTcyJTIyJTNF JTBBJTA5JTA5JTA5JTBBJTA5JTIwJTIwJTIwJTIwJTA5JTBBJTA5JTIwJTIwJTIwJTIwJTA5 JTBBJTA5JTIwJTIwJTIwJTIwJTA5JTNDJTc0JTcyJTNFJTBBJTA5JTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2 JTc0JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTBB JTNDJTZDJTY5JTZFJTZCJTIwJTY5JTY0JTNEJTIyJTYzJTczJTczJTIyJTIwJTcyJTY1JTZD JTNEJTIyJTczJTc0JTc5JTZDJTY1JTczJTY4JTY1JTY1JTc0JTIyJTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTBBJTA5JTY4JTcyJTY1JTY2JTNE JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcy JTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQx JTcwJTcwJTJGJTZBJTczJTcwJTJGJTcwJTZGJTcyJTc0JTZDJTY1JTc0JTczJTJGJTYyJTYx JTZFJTY0JTY1JTYxJTc1JTJGJTczJTc0JTc5JTZDJTY1JTJGJTYyJTYxJTZFJTY0JTY1JTYx JTc1JTVGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJFJTYzJTczJTczJTIy JTIwJTJGJTNFJTIwJTJEJTJEJTNFJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTZD JTYxJTZFJTY3JTc1JTYxJTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcw JTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTBBJTBBJTc2JTYxJTcyJTIwJTYzJTYxJTZFJTU2 JTYxJTZDJTY5JTY0JTQ2JTZGJTcyJTZEJTIwJTNEJTIwJTY2JTYxJTZDJTczJTY1JTNCJTBB JTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTc2JTY1JTcyJTY5JTY2JTU1JTZFJTY5 JTc2JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTI4JTY5JTY0JTQ2 JTZGJTcyJTZEJTJDJTIwJTY5JTY0JTUzJTY1JTZDJTY1JTYzJTc0JTJDJTIwJTc1JTcyJTZD JTQ0JTY1JTY2JTYxJTc1JTZDJTc0JTI5JTdCJTBBJTA5JTc2JTYxJTcyJTIwJTczJTY1JTZD JTY1JTYzJTc0JTNCJTBBJTA5JTBBJTA5JTY5JTY2JTIwJTI4JTY0JTZGJTYzJTc1JTZEJTY1 JTZFJTc0JTJFJTYxJTZDJTZDJTI5JTdCJTBBJTA5JTA5JTczJTY1JTZDJTY1JTYzJTc0JTIw JTNEJTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTYxJTZDJTZDJTVCJTY5JTY0JTUz JTY1JTZDJTY1JTYzJTc0JTVEJTNCJTBBJTA5JTdEJTIwJTY1JTZDJTczJTY1JTIwJTdCJTBB JTA5JTA5JTczJTY1JTZDJTY1JTYzJTc0JTIwJTNEJTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTY5 JTY0JTUzJTY1JTZDJTY1JTYzJTc0JTI5JTNCJTBBJTA5JTdEJTBBJTA5JTBBJTA5JTc2JTYx JTcyJTIwJTY5JTc0JTY1JTZEJTIwJTNEJTIwJTczJTY1JTZDJTY1JTYzJTc0JTJFJTc2JTYx JTZDJTc1JTY1JTNCJTBBJTA5JTBBJTA5JTY5JTY2JTI4JTY5JTc0JTY1JTZEJTIwJTIxJTNE JTIwJTIyJTIyJTI5JTdCJTBBJTA5JTA5JTJGJTJGJTc2JTYxJTcyJTIwJTZEJTc5JTRGJTYy JTZBJTY1JTYzJTc0JTIwJTNEJTIwJTY1JTc2JTYxJTZDJTI4JTI3JTI4JTI3JTIwJTJCJTIw JTY5JTc0JTY1JTZEJTIwJTJCJTIwJTI3JTI5JTI3JTI5JTNCJTBBJTA5JTA5JTc2JTYxJTcy JTIwJTc0JTc5JTcwJTY1JTUzJTY1JTZDJTY1JTYzJTc0JTIwJTNEJTIwJTY5JTc0JTY1JTZE JTJFJTczJTc1JTYyJTczJTc0JTcyJTY5JTZFJTY3JTI4JTY5JTc0JTY1JTZEJTJFJTY5JTZF JTY0JTY1JTc4JTRGJTY2JTI4JTIyJTNBJTIyJTJDJTMwJTI5JTJCJTMxJTJDJTY5JTc0JTY1 JTZEJTJFJTY5JTZFJTY0JTY1JTc4JTRGJTY2JTI4JTIyJTJDJTIyJTJDJTMwJTI5JTI5JTNC JTBBJTA5JTA5JTc2JTYxJTcyJTIwJTY5JTY0JTUzJTY1JTZDJTY1JTYzJTc0JTIwJTNEJTIw JTY5JTc0JTY1JTZEJTJFJTczJTc1JTYyJTczJTc0JTcyJTY5JTZFJTY3JTI4JTY5JTc0JTY1 JTZEJTJFJTY5JTZFJTY0JTY1JTc4JTRGJTY2JTI4JTIyJTNBJTIyJTJDJTY5JTc0JTY1JTZE JTJFJTY5JTZFJTY0JTY1JTc4JTRGJTY2JTI4JTIyJTNBJTIyJTJDJTMwJTI5JTJCJTMyJTI5 JTJCJTMxJTJDJTY5JTc0JTY1JTZEJTJFJTY5JTZFJTY0JTY1JTc4JTRGJTY2JTI4JTIyJTVE JTIyJTJDJTMwJTI5JTI5JTNCJTBBJTA5JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJF JTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTY0 JTU0JTc5JTcwJTY1JTIyJTI5JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTc0JTc5JTcw JTY1JTUzJTY1JTZDJTY1JTYzJTc0JTNCJTBBJTA5JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIy JTY5JTY0JTQ5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTIyJTI5JTJFJTc2JTYx JTZDJTc1JTY1JTIwJTNEJTIwJTY5JTY0JTUzJTY1JTZDJTY1JTYzJTc0JTNCJTBBJTA5JTA5 JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZF JTc0JTQyJTc5JTQ5JTY0JTI4JTY5JTY0JTQ2JTZGJTcyJTZEJTI5JTJFJTczJTc1JTYyJTZE JTY5JTc0JTI4JTI5JTNCJTBBJTA5JTA5JTcyJTY1JTc0JTc1JTcyJTZFJTIwJTc0JTcyJTc1 JTY1JTNCJTBBJTA5JTdEJTBBJTA5JTcyJTY1JTc0JTc1JTcyJTZFJTIwJTY2JTYxJTZDJTcz JTY1JTNCJTBBJTdEJTBBJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTBBJTBBJTBB JTBBJTNDJTIxJTJEJTJEJTIwJTIwJTIwJTQyJTQxJTRFJTQ0JTQ1JTQxJTU1JTIwJTUwJTQx JTUyJTU0JTQ5JTQzJTU1JTRDJTQ5JTQ1JTUyJTIwJTQ0JTQ1JTQyJTU1JTU0JTIwJTIwJTIw JTIwJTIwJTJEJTJEJTNFJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTZDJTYxJTZF JTY3JTc1JTYxJTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIy JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYz JTcyJTY5JTcwJTc0JTIyJTNFJTBBJTIwJTIwJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIw JTc0JTcyJTYxJTY5JTc0JTY1JTcyJTQ2JTZGJTYzJTc1JTczJTQzJTY4JTYxJTZEJTcwJTUy JTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTI4JTYzJTY4JTYxJTZEJTcwJTI5JTIwJTdCJTBB JTIwJTIwJTIwJTIwJTY5JTY2JTIwJTI4JTYzJTY4JTYxJTZEJTcwJTJFJTc2JTYxJTZDJTc1 JTY1JTIwJTNEJTNEJTIwJTIyJTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTcyJTIyJTI5 JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTYzJTY4JTYxJTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1 JTIwJTNEJTIwJTIyJTIyJTNCJTBBJTIwJTIwJTdEJTBBJTBBJTIwJTIwJTY2JTc1JTZFJTYz JTc0JTY5JTZGJTZFJTIwJTc0JTcyJTYxJTY5JTc0JTY1JTcyJTQyJTZDJTc1JTcyJTQzJTY4 JTYxJTZEJTcwJTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTI4JTYzJTY4JTYxJTZEJTcw JTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwJTY5JTY2JTIwJTI4JTYzJTY4JTYxJTZEJTcwJTJF JTc2JTYxJTZDJTc1JTY1JTIwJTNEJTNEJTIwJTIyJTIyJTI5JTBBJTIwJTIwJTIwJTIwJTIw JTIwJTYzJTY4JTYxJTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTIyJTUyJTY1 JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTcyJTIyJTNCJTBBJTIwJTIwJTdEJTBBJTNDJTJGJTcz JTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTA5JTBBJTBBJTA5JTA5JTBBJTA5JTA5JTIwJTND JTczJTYzJTcyJTY5JTcwJTc0JTIwJTczJTcyJTYzJTNEJTIyJTJGJTYzJTY4JTYxJTc0JTJE JTcwJTcyJTY1JTczJTJEJTc3JTY1JTYyJTJGJTZEJTY1JTY0JTY5JTYxJTJGJTcwJTYxJTcy JTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTZBJTczJTJGJTZBJTcxJTc1JTY1JTcyJTc5 JTJEJTMxJTJFJTM0JTJFJTMzJTJFJTZEJTY5JTZFJTJFJTZBJTczJTIyJTNFJTNDJTJGJTcz JTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTA5JTIwJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIw JTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTIyJTNFJTBBJTA5JTA5JTA5JTc2JTYxJTcyJTIwJTU1JTUyJTRDJTIwJTNE JTIwJTI3JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQxJTc1JTc0JTZGJTZF JTZGJTZEJTc5JTJEJTc3JTYxJTcyJTJGJTUwJTcyJTZGJTc4JTc5JTQ5JTQxJTUzJTY1JTcy JTc2JTY5JTYzJTY1JTNGJTYzJTZDJTY1JTRGJTc1JTc0JTY5JTZDJTNEJTQ5JTQxJTVGJTQz JTQ4JTQxJTU0JTI3JTNCJTBBJTA5JTA5JTIwJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNF JTBBJTA5JTA5JTIwJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTczJTcyJTYzJTNEJTIyJTJG JTYzJTY4JTYxJTc0JTJEJTcwJTcyJTY1JTczJTJEJTc3JTY1JTYyJTJGJTZEJTY1JTY0JTY5 JTYxJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTZBJTczJTJGJTYz JTY4JTYxJTc0JTJEJTZEJTY5JTZFJTJFJTZBJTczJTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5 JTcwJTc0JTNFJTBBJTA5JTA5JTBBJTA5JTA5JTBBJTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1 JTIwJTY5JTY0JTNEJTIyJTc0JTZGJTcwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYz JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc1JTZEJTZEJTYxJTcyJTc5JTNEJTIyJTQy JTYxJTZFJTY0JTY1JTYxJTc1JTIwJTY0JTY1JTIwJTZFJTYxJTc2JTY5JTY3JTYxJTc0JTY5 JTZGJTZFJTIyJTIwJTNFJTBBJTA5JTA5JTA5JTNDJTc0JTcyJTIwJTczJTc0JTc5JTZDJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTcyJTY5JTY3JTY4 JTc0JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNFJTBBJTNDJTczJTYzJTcyJTY5 JTcwJTc0JTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTY0JTMx JTcxJTM2JTMyJTY3JTY2JTYyJTM4JTczJTY5JTcxJTZFJTZEJTJFJTYzJTZDJTZGJTc1JTY0 JTY2JTcyJTZGJTZFJTc0JTJFJTZFJTY1JTc0JTJGJTM3JTMzJTM5JTMzJTMxJTM4JTJGJTc3 JTc0JTVGJTYzJTYxJTcwJTY5JTJFJTZBJTczJTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0 JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTNDJTJG JTczJTYzJTcyJTY5JTcwJTc0JTNFJTIwJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0 JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTIyJTNFJTNDJTIxJTJEJTJEJTBBJTY5JTY2JTI4JTc3JTY5JTZFJTY0JTZGJTc3 JTJFJTU3JTU0JTRGJTcwJTc0JTY5JTZEJTY5JTdBJTY1JTIwJTI2JTI2JTIwJTc0JTc5JTcw JTY1JTZGJTY2JTIwJTc3JTc0JTRGJTYyJTZBJTIwJTIxJTNEJTIwJTIyJTc1JTZFJTY0JTY1 JTY2JTY5JTZFJTY1JTY0JTIyJTI5JTdCJTBBJTU3JTU0JTRGJTcwJTc0JTY5JTZEJTY5JTdB JTY1JTJFJTczJTY1JTc0JTc1JTcwJTI4JTc3JTc0JTRGJTYyJTZBJTI5JTNCJTBBJTdEJTJG JTJGJTJEJTJEJTNFJTIwJTBBJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTBBJTND JTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTYyJTY0JTcwJTVGJTZDJTY5JTY1JTZFJTczJTVG JTY3JTcyJTZGJTc1JTcwJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTYxJTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTZDJTYxJTczJTc0JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4 JTc0JTc0JTcwJTNBJTJGJTJGJTY1JTZFJTc0JTcyJTY1JTcwJTcyJTY5JTczJTY1JTczJTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTY2JTcyJTJGJTIyJTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNFJTQ1JTZFJTc0JTcy JTY1JTcwJTcyJTY5JTczJTY1JTczJTNDJTJGJTYxJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTcz JTczJTNEJTIyJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJG JTYxJTczJTczJTZGJTYzJTY5JTYxJTc0JTY5JTZGJTZFJTczJTJFJTYyJTZFJTcwJTcwJTYx JTcyJTY5JTYyJTYxJTczJTJFJTY2JTcyJTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIy JTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNFJTQxJTczJTczJTZGJTYzJTY5JTYxJTc0JTY5JTZG JTZFJTczJTNDJTJGJTYxJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTIyJTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZG JTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5 JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQ1 JTczJTcwJTYxJTYzJTY1JTVGJTQyJTYxJTZFJTcxJTc1JTY1JTVGJTUwJTcyJTY5JTc2JTY1 JTY1JTVGJTMyJTMwJTMwJTM5JTMwJTM2JTMxJTMyJTMwJTMzJTMwJTMwJTMwJTMzJTIyJTNF JTQyJTYxJTZFJTcxJTc1JTY1JTIwJTUwJTcyJTY5JTc2JTI2JTY1JTYxJTYzJTc1JTc0JTY1 JTNCJTY1JTNDJTJGJTYxJTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0 JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5 JTZDJTJGJTY1JTZFJTc0JTcyJTY1JTcwJTcyJTZGJTczJTJGJTQ4JTZGJTZEJTY1JTUwJTYx JTY3JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTczJTY5JTc0JTY1JTIyJTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNFJTUwJTcyJTZGJTY2JTY1JTcz JTczJTY5JTZGJTZFJTZFJTY1JTZDJTczJTNDJTJGJTYxJTNFJTNDJTYxJTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1 JTNGJTc0JTc5JTcwJTY1JTNEJTYzJTYxJTc0JTY1JTY3JTZGJTcyJTc5JTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTZDJTY5JTY1JTZFJTc0JTY1JTZDJTY1 JTVGJTY5JTZFJTc0JTY1JTcyJTZFJTYxJTc0JTY5JTZGJTZFJTYxJTZDJTY1JTVGJTMyJTMw JTMxJTMxJTMwJTMxJTMxJTMyJTMxJTMxJTMyJTM3JTMxJTMxJTIyJTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTNFJTQ5JTZFJTc0JTY1JTcyJTZFJTYxJTc0 JTY5JTZGJTZFJTYxJTZDJTNDJTJGJTYxJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTczJTY1JTZDJTY1JTYzJTc0JTMyJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcy JTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTUyJTQ5JTRGJTUyJTQ5JTU0JTU5JTVG JTMyJTMwJTMxJTMyJTMwJTMzJTMxJTM5JTMxJTMwJTM1JTMwJTM0JTM3JTIyJTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTNFJTUwJTcyJTY5JTZGJTcyJTY5 JTc0JTc5JTNDJTJGJTYxJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY1 JTZDJTY1JTYzJTc0JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTUwJTYxJTY3JTY1JTNGJTc0JTc5JTcwJTY1JTNE JTczJTY5JTc0JTY1JTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcw JTIyJTNFJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTczJTNDJTJGJTYxJTNF JTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTY3 JTcyJTZGJTc1JTcwJTY1JTYyJTZFJTcwJTcwJTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNFJTQxJTIwJTcwJTcyJTZGJTcwJTZGJTczJTIw JTY0JTY1JTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTNDJTJGJTYxJTNFJTBB JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTczJTc0JTc5JTZDJTY1JTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTNFJTJBJTIwJTY4JTc0JTZEJTZD JTIwJTIzJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVGJTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4 JTY1JTIwJTIzJTYyJTZDJTZGJTYzJTVGJTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTIw JTJFJTYyJTc0JTIwJTdCJTZEJTYxJTcyJTY3JTY5JTZFJTNBJTIwJTM0JTcwJTc4JTIwJTMw JTIwJTMwJTIwJTJEJTMyJTcwJTc4JTNCJTdEJTIzJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVG JTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTdCJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNB JTZFJTZGJTZFJTY1JTdEJTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTBBJTNDJTJGJTc0JTY0 JTNFJTBBJTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTNDJTc0JTcyJTNF JTBBJTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNFJTNDJTY5JTZEJTY3JTIwJTY5JTY0JTNEJTIy JTZDJTYxJTcyJTY3JTY1JTc1JTcyJTIyJTBBJTA5JTA5JTA5JTA5JTA5JTczJTcyJTYzJTNE JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcy JTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQx JTcwJTcwJTJGJTZBJTczJTcwJTJGJTcwJTZGJTcyJTc0JTZDJTY1JTc0JTczJTJGJTYyJTYx JTZFJTY0JTY1JTYxJTc1JTJGJTY3JTY5JTY2JTJGJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTUw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTcwJTc4JTZDJTJFJTY3JTY5JTY2 JTIyJTBBJTA5JTA5JTA5JTA5JTA5JTYxJTZDJTc0JTNEJTIyJTIyJTIwJTJGJTNFJTNDJTJG JTc0JTY0JTNFJTBBJTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTNDJTc0 JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTNDJTY0 JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVGJTZDJTZGJTY3 JTZGJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYzJTZDJTY1JTYxJTcyJTNBJTIwJTcy JTY5JTY3JTY4JTc0JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTIw JTBBJTA5JTA5JTA5JTA5JTA5JTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTUwJTYxJTY3JTY1JTNGJTc0JTc5 JTcwJTY1JTNEJTczJTY5JTc0JTY1JTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVG JTc0JTZGJTcwJTI3JTIwJTc0JTY5JTc0JTZDJTY1JTNEJTIyJTQyJTRFJTUwJTIwJTUwJTQx JTUyJTQ5JTQyJTQxJTUzJTIwJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTcz JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTNDJTY5JTZEJTY3JTIwJTY5 JTY0JTNEJTIyJTZDJTZGJTY3JTZGJTIyJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTczJTcyJTYz JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTcwJTZGJTcyJTc0JTZDJTY1JTc0JTczJTJGJTYy JTYxJTZFJTY0JTY1JTYxJTc1JTJGJTY3JTY5JTY2JTJGJTYyJTYxJTZFJTY0JTY1JTYxJTc1 JTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTZDJTZGJTY3JTZGJTVGJTYy JTZFJTcwJTJFJTcwJTZFJTY3JTIyJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTYxJTZDJTc0JTNE JTIyJTQyJTRFJTUwJTIwJTUwJTYxJTcyJTY5JTYyJTYxJTczJTJDJTIwJTZDJTYxJTIwJTYy JTYxJTZFJTcxJTc1JTY1JTIwJTY0JTI3JTc1JTZFJTIwJTZEJTZGJTZFJTY0JTY1JTIwJTcx JTc1JTY5JTIwJTYzJTY4JTYxJTZFJTY3JTY1JTIyJTIwJTJGJTNFJTIwJTBBJTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTNDJTJGJTYxJTNFJTBBJTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTBBJTA5JTA5JTA5JTA5JTND JTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVGJTcyJTY1 JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2 JTIwJTY5JTY0JTNEJTIyJTYyJTZDJTZGJTYzJTVGJTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4 JTY1JTIyJTNFJTBBJTA5JTA5JTBBJTA5JTA5JTA5JTA5JTNDJTY2JTZGJTcyJTZEJTIwJTYx JTYzJTc0JTY5JTZGJTZFJTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4 JTZGJTZEJTY1JTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTIyJTIwJTZFJTYxJTZEJTY1 JTNEJTIyJTcyJTY1JTYzJTY4JTIyJTBBJTA5JTA5JTA5JTA5JTA5JTZGJTZFJTczJTc1JTYy JTZEJTY5JTc0JTNEJTIyJTcyJTY1JTc0JTc1JTcyJTZFJTIwJTU2JTYxJTZDJTY5JTY0JTUy JTY1JTYzJTY4JTQ2JTZGJTcyJTZEJTI4JTc0JTY4JTY5JTczJTI5JTNCJTIyJTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZEJTZGJTc0JTQzJTZD JTY1JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTIyJTIwJTc2JTYxJTZD JTc1JTY1JTNEJTIyJTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTcyJTIyJTIwJTczJTY5 JTdBJTY1JTNEJTIyJTMzJTM1JTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY5JTZFJTcw JTc1JTc0JTVGJTcyJTY1JTYzJTY4JTIyJTIwJTZGJTZFJTY2JTZGJTYzJTc1JTczJTNEJTIy JTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTc0JTcyJTYxJTY5JTc0JTY1JTcy JTQ2JTZGJTYzJTc1JTczJTQzJTY4JTYxJTZEJTcwJTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4 JTY1JTI4JTc0JTY4JTY5JTczJTI5JTIyJTIwJTZGJTZFJTYyJTZDJTc1JTcyJTNEJTIyJTZB JTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTc0JTcyJTYxJTY5JTc0JTY1JTcyJTQy JTZDJTc1JTcyJTQzJTY4JTYxJTZEJTcwJTUyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTI4 JTc0JTY4JTY5JTczJTI5JTIyJTIwJTJGJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTY5 JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTY5JTZEJTYxJTY3JTY1JTIyJTIw JTZFJTYxJTZEJTY1JTNEJTIyJTcyJTY1JTYzJTY4JTZGJTZCJTIyJTIwJTYzJTZDJTYxJTcz JTczJTNEJTIyJTYyJTc0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNB JTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYx JTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUw JTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJG JTcwJTZGJTcyJTc0JTZDJTY1JTc0JTczJTJGJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTJGJTY3 JTY5JTY2JTJGJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTJGJTYyJTc0JTVGJTZGJTZCJTJFJTcwJTZFJTY3JTIyJTBBJTA5JTA5JTA5 JTA5JTA5JTYxJTZDJTc0JTNEJTIyJTRDJTYxJTZFJTYzJTY1JTcyJTIwJTZDJTYxJTIwJTcy JTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTIyJTIwJTc0JTY5JTc0JTZDJTY1JTNEJTIyJTQ1 JTY2JTY2JTY1JTYzJTc0JTc1JTY1JTcyJTIwJTc1JTZFJTY1JTIwJTcyJTY1JTYzJTY4JTY1 JTcyJTYzJTY4JTY1JTIyJTIwJTJGJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZF JTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIw JTZFJTYxJTZEJTY1JTNEJTIyJTc0JTc5JTcwJTY1JTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNE JTIyJTcyJTY1JTYzJTY4JTY1JTcyJTYzJTY4JTY1JTIyJTIwJTJGJTNFJTBBJTA5JTA5JTA5 JTA5JTNDJTJGJTY2JTZGJTcyJTZEJTNFJTBBJTA5JTA5JTBBJTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTY5 JTY0JTNEJTIyJTYyJTZDJTZGJTYzJTVGJTcwJTcyJTZGJTZBJTY1JTc0JTczJTIyJTNFJTBB JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTcyJTZEJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIy JTVGJTc0JTZGJTcwJTIyJTIwJTY5JTY0JTNEJTIyJTY2JTZGJTcyJTZEJTU1JTZFJTY5JTc2 JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTIyJTBBJTA5JTA5JTA5 JTA5JTA5JTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZG JTcwJTNBJTIwJTMwJTNCJTIwJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZG JTZEJTNBJTIwJTMwJTNCJTIyJTBBJTA5JTA5JTA5JTA5JTA5JTYxJTYzJTc0JTY5JTZGJTZF JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTUyJTY1JTY0JTY5JTcyJTY1JTYzJTc0JTY5JTZGJTZFJTQyJTYxJTZF JTY0JTY1JTYxJTc1JTIyJTIwJTZEJTY1JTc0JTY4JTZGJTY0JTNEJTIyJTY3JTY1JTc0JTIy JTBBJTA5JTA5JTA5JTA5JTA5JTZGJTZFJTczJTc1JTYyJTZEJTY5JTc0JTNEJTIyJTZBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTcyJTY1JTc0JTc1JTcyJTZFJTIwJTc2JTY1 JTcyJTY5JTY2JTU1JTZFJTY5JTc2JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcx JTc1JTY1JTI4JTI3JTY2JTZGJTcyJTZEJTU1JTZFJTY5JTc2JTY1JTcyJTczJTU0JTY4JTY1 JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTI3JTJDJTI3JTczJTY1JTZDJTY1JTYzJTc0JTU1JTZF JTY5JTc2JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTI3JTJDJTI3 JTY4JTZGJTZEJTY1JTI3JTI5JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTIwJTNDJTY5JTZF JTcwJTc1JTc0JTIwJTY5JTY0JTNEJTIyJTY5JTY0JTU0JTc5JTcwJTY1JTIyJTIwJTc0JTc5 JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIy JTc0JTc5JTcwJTY1JTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTIyJTIwJTJGJTNFJTIw JTNDJTY5JTZFJTcwJTc1JTc0JTBBJTA5JTA5JTA5JTA5JTA5JTY5JTY0JTNEJTIyJTY5JTY0 JTQ5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNE JTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTIy JTIwJTJGJTNFJTIwJTNDJTczJTY1JTZDJTY1JTYzJTc0JTBBJTA5JTA5JTA5JTA5JTA5JTY5 JTY0JTNEJTIyJTczJTY1JTZDJTY1JTYzJTc0JTU1JTZFJTY5JTc2JTY1JTcyJTczJTU0JTY4 JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTU0JTY4JTY1JTZEJTIyJTBBJTA5JTA5JTA5 JTA5JTA5JTZGJTZFJTQzJTY4JTYxJTZFJTY3JTY1JTNEJTIyJTcyJTY1JTc0JTc1JTcyJTZF JTIwJTc2JTY1JTcyJTY5JTY2JTU1JTZFJTY5JTc2JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYx JTc0JTY5JTcxJTc1JTY1JTI4JTI3JTY2JTZGJTcyJTZEJTU1JTZFJTY5JTc2JTY1JTcyJTcz JTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTI3JTJDJTI3JTczJTY1JTZDJTY1JTYz JTc0JTU1JTZFJTY5JTc2JTY1JTcyJTczJTU0JTY4JTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1 JTI3JTJDJTI3JTY4JTZGJTZEJTY1JTI3JTI5JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTc1 JTY1JTNEJTIyJTIyJTIwJTczJTY1JTZDJTY1JTYzJTc0JTY1JTY0JTNEJTIyJTczJTY1JTZD JTY1JTYzJTc0JTY1JTY0JTIyJTNFJTU2JTZGJTc0JTcyJTY1JTIwJTcwJTcyJTZGJTZBJTY1 JTc0JTNDJTJGJTZGJTcwJTc0JTY5JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTZGJTcwJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5 JTcwJTY1JTNBJTc1JTZFJTY5JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYxJTZFJTc0JTNBJTQ1JTc0JTc1JTY0JTY1JTczJTVGJTMyJTMwJTMxJTMxJTMx JTMxJTMyJTM1JTMwJTM1JTMzJTMzJTM1JTMwJTVEJTIyJTNFJTQ1JTc0JTc1JTY0JTY1JTcz JTNDJTJGJTZGJTcwJTc0JTY5JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTZGJTcwJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5 JTcwJTY1JTNBJTc1JTZFJTY5JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYxJTZFJTc0JTNBJTU1JTZFJTVGJTcwJTcyJTZGJTZBJTY1JTc0JTVGJTYxJTc1 JTc0JTZGJTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMxJTMxJTMxJTMwJTMyJTMyJTMyJTMzJTVE JTIyJTNFJTQxJTc1JTc0JTZGJTNDJTJGJTZGJTcwJTc0JTY5JTZGJTZFJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTc1 JTY1JTNEJTIyJTVCJTc0JTc5JTcwJTY1JTNBJTc1JTZFJTY5JTc2JTY1JTcyJTczJTJDJTIw JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNBJTQ0JTY1JTVGJTc2JTZGJTc5 JTYxJTY3JTY1JTcyJTVGJTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMxJTMxJTMxJTMwJTMyJTM1 JTM1JTMxJTVEJTIyJTNFJTU2JTYxJTYzJTYxJTZFJTYzJTY1JTczJTNDJTJGJTZGJTcwJTc0 JTY5JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5 JTZGJTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5JTcwJTY1JTNBJTc1JTZF JTY5JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNBJTU1JTZFJTVGJTZEJTYxJTcyJTY5JTYxJTY3JTY1JTVGJTMyJTMwJTMwJTM3JTMxJTMw JTMxJTMxJTMxJTMwJTMyJTMzJTMzJTM5JTVEJTIyJTNFJTQzJTZGJTc1JTcwJTZDJTY1JTND JTJGJTZGJTcwJTc0JTY5JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTND JTZGJTcwJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5JTcw JTY1JTNBJTc1JTZFJTY5JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYxJTZFJTc0JTNBJTU2JTZGJTc1JTczJTVGJTY1JTc0JTY1JTczJTVGJTcwJTYxJTcy JTY1JTZFJTc0JTczJTVGJTY0JTY1JTVGJTZBJTY1JTc1JTZFJTY1JTczJTVGJTY1JTZFJTY2 JTYxJTZFJTc0JTczJTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMyJTM5JTMwJTM0JTMwJTM5JTMx JTM3JTVEJTIyJTNFJTQ2JTYxJTZEJTY5JTZDJTZDJTY1JTNDJTJGJTZGJTcwJTc0JTY5JTZG JTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5JTZGJTZF JTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5JTcwJTY1JTNBJTc1JTZFJTY5JTc2 JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNBJTU1 JTZFJTVGJTcwJTcyJTZGJTZBJTY1JTc0JTVGJTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1 JTcyJTVGJTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMxJTMxJTMxJTMwJTMwJTM0JTMxJTM2JTVE JTIyJTNFJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTNDJTJGJTZGJTcwJTc0JTY5 JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5JTZG JTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5JTcwJTY1JTNBJTc1JTZFJTY5 JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNB JTYzJTcyJTY1JTY1JTcyJTVGJTcyJTY1JTcwJTcyJTY1JTZFJTY0JTcyJTY1JTVGJTc1JTZF JTY1JTVGJTYxJTY2JTY2JTYxJTY5JTcyJTY1JTVGJTMyJTMwJTMxJTMwJTMwJTMxJTMyJTM2 JTMxJTMwJTMzJTMwJTMzJTMwJTVEJTIyJTNFJTQzJTcyJUU5JTYxJTc0JTY5JTZGJTZFJTIw JTY0JTI3JTY1JTZFJTc0JTcyJTY1JTcwJTcyJTY5JTczJTY1JTNDJTJGJTZGJTcwJTc0JTY5 JTZGJTZFJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTZGJTcwJTc0JTY5JTZG JTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTVCJTc0JTc5JTcwJTY1JTNBJTc1JTZFJTY5 JTc2JTY1JTcyJTczJTJDJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNB JTUwJTcyJTZGJTY2JTY5JTZDJTVGJTcyJTY1JTc0JTcyJTYxJTY5JTc0JTY1JTVGJTMyJTMw JTMxJTMxJTMxJTMxJTMyJTM5JTMxJTMwJTM0JTMxJTM1JTMwJTVEJTIyJTNFJTUyJTY1JTc0 JTcyJTYxJTY5JTc0JTY1JTNDJTJGJTZGJTcwJTc0JTY5JTZGJTZFJTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTNDJTJGJTczJTY1JTZDJTY1JTYzJTc0JTNFJTNDJTJGJTY2JTZG JTcyJTZEJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5 JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTY5 JTY0JTNEJTIyJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVGJTZEJTY1JTZFJTc1JTIyJTBBJTA5 JTA5JTA5JTA5JTA5JTczJTc1JTZEJTZEJTYxJTcyJTc5JTNEJTIyJTU0JTZGJTc1JTczJTIw JTZDJTY1JTczJTIwJTc1JTZFJTY5JTc2JTY1JTcyJTczJTIwJTY0JTY1JTIwJTZDJTYxJTIw JTYyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTIyJTNFJTBB JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYx JTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc1JTZEJTZEJTYxJTcyJTc5JTNEJTIy JTRFJTYxJTc2JTY5JTY3JTYxJTc0JTY5JTZGJTZFJTIwJTcwJTcyJTY5JTZFJTYzJTY5JTcw JTYxJTZDJTY1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNFJTNDJTY0JTY5JTc2JTIwJTYz JTZDJTYxJTczJTczJTNEJTIyJTczJTY1JTZDJTY1JTYzJTc0JTIyJTNFJTNDJTYxJTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTUwJTYxJTY3 JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTczJTY5JTc0JTY1JTIyJTNFJTQxJTYzJTYzJTc1JTY1 JTY5JTZDJTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNF JTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0 JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1 JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTU2JTZGJTc0JTcyJTY1JTVGJTQyJTYxJTZFJTcxJTc1JTY1JTVGJTMyJTMw JTMwJTMyJTMxJTMyJTMwJTM2JTMxJTM1JTMxJTM5JTMwJTMwJTIyJTNFJTU2JTZGJTc0JTcy JTY1JTIwJTQyJTYxJTZFJTcxJTc1JTY1JTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNF JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIy JTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVG JTc0JTZGJTcwJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTcwJTZGJTczJTY5JTc0 JTY5JTZGJTZFJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5 JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcw JTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTQzJTZGJTZEJTcwJTc0JTY1JTczJTVGJTYzJTYxJTcyJTc0JTY1JTcz JTVGJTY1JTc0JTVGJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTVGJTMyJTMwJTMwJTM3JTMw JTM3JTMwJTM5JTMwJTMzJTMxJTM5JTMxJTMxJTIyJTNFJTQzJTZGJTZEJTcwJTc0JTY1JTcz JTNDJTYyJTcyJTJGJTNFJTQzJTYxJTcyJTc0JTY1JTczJTIwJTY1JTc0JTIwJTUzJTY1JTcy JTc2JTY5JTYzJTY1JTczJTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0 JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNFJTNDJTY0 JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcw JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1 JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNEJTQyJTZGJTc1JTcyJTczJTY1JTVGJTMyJTMwJTMwJTM1JTMxJTMwJTMxJTM4JTMxJTM1 JTMxJTM1JTMwJTM0JTIyJTNFJTQyJTZGJTc1JTcyJTczJTY1JTNDJTJGJTYxJTNFJTNDJTJG JTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3 JTZDJTY1JTc0JTIyJTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTcz JTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRFJTQ1JTU0JTVGJTQ1JTcwJTYxJTcyJTY3JTZF JTY1JTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM0JTM0JTM5JTM0JTM2JTIyJTNF JTQ1JTcwJTYxJTcyJTY3JTZFJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTND JTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNF JTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0 JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1 JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTQzJTcyJTY1JTY0JTY5JTc0JTczJTVGJTY5JTZEJTZEJTZGJTYyJTY5JTZD JTY5JTY1JTcyJTczJTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM1JTM0JTMyJTMz JTMxJTIyJTNFJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTNDJTJGJTYxJTNFJTND JTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZF JTY3JTZDJTY1JTc0JTIyJTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcz JTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcy JTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTcyJTY1JTY0JTY5JTc0JTczJTVGJTQz JTZGJTZFJTczJTZGJTZEJTZEJTYxJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMwJTM3JTMwJTM3 JTMwJTM5JTMwJTM1JTM0JTMxJTM0JTM2JTIyJTNFJTQzJTcyJUU5JTY0JTY5JTc0JTczJTND JTYyJTcyJTJGJTNFJTQzJTZGJTZFJTczJTZGJTZEJTZEJTYxJTc0JTY5JTZGJTZFJTNDJTJG JTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTczJTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTIyJTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5 JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQxJTczJTczJTc1JTcyJTYx JTZFJTYzJTY1JTczJTVGJTY1JTc0JTVGJTcwJTcyJTZGJTc0JTY1JTYzJTc0JTY5JTZGJTZF JTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTMzJTMzJTM0JTMxJTMwJTIyJTNFJTQx JTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTNDJTYyJTcyJTJGJTNFJTUwJTcyJUU5JTc2JTZG JTc5JTYxJTZFJTYzJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0 JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIyJTNFJTNDJTY0 JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTc0JTZGJTcw JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1 JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNEJTRBJTY1JTc1JTZFJTY1JTczJTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTMz JTMzJTM0JTM1JTM5JTIyJTNFJTRBJTY1JTc1JTZFJTY1JTczJTNDJTJGJTYxJTNFJTNDJTJG JTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3 JTZDJTY1JTc0JTIyJTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTcz JTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTREJTYxJTY3JTYxJTdBJTY5JTZFJTY1JTVGJTMy JTMwJTMwJTM3JTMxJTMxJTMxJTM2JTMxJTMyJTMyJTM2JTMxJTM2JTIyJTNFJTQyJTZGJTZF JTczJTIwJTcwJTZDJTYxJTZFJTczJTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTND JTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTc0JTY0JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZGJTZFJTY3JTZDJTY1JTc0JTIwJTZD JTYxJTczJTc0JTIyJTNFJTNDJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTIyJTVGJTc0JTZGJTcwJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTcz JTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTREJTZGJTYyJTY5JTZDJTY1JTczJTVGJTMyJTMw JTMxJTMxJTMxJTMwJTMwJTM2JTMxJTMxJTMxJTMxJTMyJTMxJTIyJTNFJTREJTZGJTYyJTY5 JTZDJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZD JTY1JTNFJTBBJTA5JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5 JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTND JTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTNDJTc0 JTY0JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTJGJTc0JTcyJTNFJTBBJTNDJTIxJTJEJTJE JTIwJTIwJTIwJTQyJTQxJTRFJTQ0JTQ1JTQxJTU1JTIwJTUwJTQxJTUyJTU0JTQ5JTQzJTU1 JTRDJTQ5JTQ1JTUyJTIwJTQ2JTQ5JTRFJTIwJTIwJTIwJTIwJTJEJTJEJTNFJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTA5JTA5JTNDJTc0JTcyJTNFJTBB JTA5JTA5JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTA5JTND JTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTIwJTczJTc0 JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTIz JTQ2JTQ2JTQ2JTQ2JTQ2JTQ2JTNCJTc2JTY1JTcyJTc0JTY5JTYzJTYxJTZDJTJEJTYxJTZD JTY5JTY3JTZFJTNBJTc0JTZGJTcwJTNCJTIyJTNFJTBBJTA5JTA5JTNDJTY0JTY5JTc2JTIw JTY5JTY0JTNEJTIyJTcwJTYxJTY3JTY1JTIyJTNFJTBBJTA5JTA5JTA5JTNDJTIxJTJEJTJE JTIwJTQ0JTY1JTYyJTc1JTc0JTIwJTY0JTY1JTIwJTY0JTY5JTc2JTIwJTcwJTZGJTc1JTcy JTIwJTZDJTYxJTIwJTY0JTY5JTc2JTIwJTcwJTYxJTZFJTc0JTYxJTZDJTZGJTZFJTIwJTJE JTJEJTNFJTBBJTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTcwJTYxJTZF JTc0JTYxJTZDJTZGJTZFJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYxJTZFJTZGJTZF JTc5JTZEJTY1JTIyJTNFJTBBJTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIy JTY5JTY0JTY1JTZFJTc0JTIyJTNFJTBBJTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTNDJTYx JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3 JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5 JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1 JTQzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZFJTNGJTc0JTc5JTcwJTY1JTNEJTY4JTZGJTZE JTY1JTYzJTZGJTZFJTZFJTY1JTc4JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTczJTY1JTYzJTc1JTcyJTY1JTVGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTVGJTZFJTY1JTc0JTVGJTMyJTMwJTMwJTMyJTMxJTMyJTMwJTM2JTMxJTM1JTMyJTM3 JTMzJTM1JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMz JTM0JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0 JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYz JTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTdBJTZGJTZFJTY1 JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTYxJTYzJTYzJTY1JTY0JTY1JTcyJTVGJTYzJTZGJTZE JTcwJTc0JTY1JTczJTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM2JTMwJTM1JTM1JTM1JTM1 JTMxJTJFJTY3JTY5JTY2JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMxJTM0JTIy JTNFJTNDJTJGJTYxJTNFJTBBJTNDJTYyJTcyJTNFJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTIwJTA5JTIwJTIw JTBBJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTY3JTYzJTZGJTZDJTZG JTcyJTNEJTIyJTIzJTY2JTMwJTY2JTMwJTY2JTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcy JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIy JTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIy JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1 JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZG JTZDJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTM2JTIyJTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTMxJTM3JTM0JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1 JTcyJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTIwJTc3JTY5JTY0 JTc0JTY4JTNEJTIyJTMzJTM2JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4 JTc0JTNEJTIyJTMyJTM1JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTM0JTIyJTIw JTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJG JTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZD JTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0 JTY1JTZFJTc0JTVGJTZDJTY1JTc0JTc0JTcyJTY1JTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMy JTM2JTMwJTM1JTM0JTMyJTMwJTM5JTJFJTY3JTY5JTY2JTIyJTIwJTc2JTczJTcwJTYxJTYz JTY1JTNEJTIyJTMzJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTMyJTIyJTNFJTND JTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMz JTMzJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM3JTM0JTIyJTNFJTNDJTYxJTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIyJTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYx JTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTQzJTZGJTZFJTZF JTY1JTc4JTY5JTZGJTZFJTNGJTc0JTc5JTcwJTY1JTNEJTY4JTZGJTZEJTY1JTYzJTZGJTZF JTZFJTY1JTc4JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTczJTY1 JTYzJTc1JTcyJTY1JTVGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTZFJTY1 JTc0JTVGJTMyJTMwJTMwJTMyJTMxJTMyJTMwJTM2JTMxJTM1JTMyJTM3JTMzJTM1JTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTIwJTNB JTIwJTMxJTMyJTcwJTc4JTIyJTNFJTQzJTZGJTZFJTczJTc1JTZDJTc0JTY1JTcyJTIwJTcz JTY1JTczJTIwJTZEJTY1JTczJTczJTYxJTY3JTY1JTczJTNDJTJGJTYxJTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBB JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZF JTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNE JTIyJTMyJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTNFJTNDJTY5JTZE JTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTIwJTczJTcyJTYzJTNEJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcy JTYxJTc0JTY5JTZGJTZFJTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTc0 JTcyJTYxJTY5JTc0JTVGJTY3JTcyJTY5JTczJTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM3 JTMwJTM2JTMxJTMxJTMwJTMzJTJFJTY3JTY5JTY2JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNE JTIyJTMyJTMwJTM2JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIy JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTMzJTM2JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNE JTIyJTMyJTM1JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTM0JTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1 JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0JTY1JTZF JTc0JTVGJTYzJTZDJTY1JTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM2JTMwJTM1JTM0JTMz JTM0JTM1JTJFJTY3JTY5JTY2JTIyJTIwJTc2JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMzJTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTMyJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBB JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTIwJTc2JTYx JTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTIwJTc3JTY5JTY0JTc0 JTY4JTNEJTIyJTMxJTM3JTM0JTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTIy JTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0 JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYy JTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTY5 JTYzJTY4JTY1JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTY1 JTcyJTc0JTY1JTVGJTY0JTY1JTVGJTc2JTZGJTczJTVGJTYzJTZGJTY0JTY1JTczJTVGJTVG JTY0JTVGJTYxJTYzJTYzJTVGJTczJTVGJTMyJTMwJTMwJTMyJTMxJTMwJTMwJTM3JTMxJTM1 JTM0JTM0JTMxJTM0JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJE JTczJTY5JTdBJTY1JTIwJTNBJTIwJTMxJTMyJTcwJTc4JTIyJTNFJTRGJTYyJTc0JTY1JTZF JTY5JTcyJTIwJTczJTY1JTczJTIwJTYzJTZGJTY0JTY1JTczJTIwJTY0JTI3JTYxJTYzJTYz JTI2JTY1JTY3JTcyJTYxJTc2JTY1JTNCJTczJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNF JTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIy JTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMy JTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTNFJTNDJTY5JTZEJTY3JTIw JTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0 JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYy JTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJG JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0 JTY5JTZGJTZFJTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTc0JTcyJTYx JTY5JTc0JTVGJTY3JTcyJTY5JTczJTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM3JTMwJTM2 JTMxJTMxJTMwJTMzJTJFJTY3JTY5JTY2JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMy JTMwJTM2JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZD JTY1JTNFJTIwJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTIwJTBBJTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTIx JTJEJTJEJTIwJTY0JUU5JTYyJTc1JTc0JTIwJTczJTZCJTY5JTZFJTIwJTIwJTdBJTZGJTZF JTY1JTIwJTczJTY1JTZDJTY1JTYzJTc0JTY5JTZGJTZFJTIwJTczJTY1JTYzJTc1JTcyJTY5 JTc0JTY1JTIwJTJEJTJEJTNFJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTBBJTA5JTBBJTBBJTNDJTc0JTYxJTYy JTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZD JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcw JTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZE JTYxJTcyJTY3JTY5JTZFJTJEJTZDJTY1JTY2JTc0JTNBJTIwJTMyJTcwJTc4JTIyJTIwJTYy JTY3JTYzJTZGJTZDJTZGJTcyJTNEJTIyJTIzJTQ2JTMwJTQ2JTMwJTQ2JTMwJTIyJTNFJTBB JTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMz JTMyJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM3JTM4JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJG JTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTc0 JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcw JTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZF JTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTYzJTYxJTY0JTY1JTZFJTYx JTczJTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM2JTMwJTM1JTM0JTMzJTMzJTMyJTJFJTY3 JTY5JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMzJTIyJTIwJTc2JTczJTcw JTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0 JTY0JTZDJTY1JTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTM1JTIyJTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTMyJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0 JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTIwJTc2JTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1 JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTUyJTY1JTY3JTZDJTY1JTczJTVGJTY0JTY1JTVGJTYzJTZGJTZFJTczJTY1JTcy JTc2JTYxJTc0JTY5JTZGJTZFJTVGJTY0JTY1JTVGJTc2JTZGJTczJTVGJTYzJTZGJTY0JTY1 JTczJTVGJTMyJTMwJTMwJTM0JTMwJTMyJTMwJTM1JTMxJTM3JTMxJTM1JTM0JTM0JTIyJTNF JTIwJTIwJTUzJTY5JTc0JTY1JTIwJTUzJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYzJTc1 JTcyJTY5JTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTNDJTJGJTYxJTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0 JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMyJTIyJTIwJTY4JTY1JTY5JTY3JTY4 JTc0JTNEJTIyJTMxJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNE JTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3 JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYy JTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQz JTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5 JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTdBJTZGJTZF JTY1JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTc0JTcyJTYxJTY5JTc0JTVGJTY3JTcyJTY5JTcz JTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM3JTMwJTM2JTMxJTMxJTMwJTMzJTJFJTY3JTY5 JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTc2JTczJTcwJTYx JTYzJTY1JTNEJTIyJTMwJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTIw JTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMxJTMwJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBB JTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTc0 JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcw JTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZF JTJGJTMzJTMyJTc4JTMyJTM1JTVGJTcwJTY5JTYzJTc0JTZGJTVGJTczJTZGJTc1JTczJTYz JTcyJTY5JTcyJTY1JTVGJTMyJTMwJTMxJTMxJTMwJTM5JTMyJTMxJTMwJTM5JTM0JTMxJTM1 JTM5JTJFJTY3JTY5JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMxJTIyJTIw JTc2JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMyJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIy JTZEJTY5JTY0JTY0JTZDJTY1JTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTM1 JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTMyJTIyJTNFJTNDJTJGJTc0JTY0JTNF JTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTNFJTND JTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1 JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcy JTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTc1JTZFJTY5JTc2 JTY1JTcyJTczJTVGJTczJTZGJTc1JTczJTYzJTcyJTY5JTcwJTc0JTY5JTZGJTZFJTVGJTMy JTMwJTMxJTMxJTMwJTM5JTMyJTMxJTMxJTMwJTMwJTM5JTMwJTMxJTIyJTNFJTUzJTZGJTc1 JTczJTYzJTcyJTY5JTcyJTY1JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYx JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBB JTBBJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTY0JTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMyJTIyJTIwJTY4 JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcw JTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZF JTJGJTdBJTZGJTZFJTY1JTVGJTY5JTY0JTY1JTZFJTc0JTVGJTc0JTcyJTYxJTY5JTc0JTVG JTY3JTcyJTY5JTczJTVGJTMyJTMwJTMwJTM5JTMwJTM4JTMyJTM3JTMwJTM2JTMxJTMxJTMw JTMzJTJFJTY3JTY5JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIw JTc2JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNE JTIyJTMxJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMxJTMwJTIyJTNFJTNDJTJG JTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIw JTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0 JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMzJTMzJTIyJTNFJTNDJTY5JTZEJTY3 JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcw JTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYx JTc0JTY5JTZGJTZFJTJGJTMzJTMyJTc4JTMyJTM1JTVGJTczJTY5JTZEJTc1JTZDJTVGJTYz JTYxJTZDJTYzJTc1JTZDJTY1JTc0JTc0JTY1JTVGJTMyJTMwJTMxJTMxJTMwJTM3JTMxJTMy JTMwJTM1JTMwJTM0JTMwJTMyJTJFJTY3JTY5JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1 JTNEJTIyJTMxJTIyJTIwJTc2JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMyJTIyJTIwJTYxJTZD JTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTIwJTY4JTY1JTY5JTY3JTY4 JTc0JTNEJTIyJTMyJTM1JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTMyJTIyJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIy JTMzJTMzJTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY4JTZGJTc2JTY1 JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcw JTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1 JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNEJTczJTY5JTZEJTc1JTZDJTYxJTc0JTY1JTc1JTcyJTczJTVGJTMyJTMwJTMxJTMxJTMw JTM3JTMxJTMyJTMwJTM1JTMxJTM0JTM1JTMxJTIyJTNFJTUzJTY5JTZEJTc1JTZDJTYxJTc0 JTY1JTc1JTcyJTczJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBB JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTIxJTJEJTJEJTIwJTY2JTY5JTZFJTIwJTczJTZC JTY5JTZFJTIwJTIwJTdBJTZGJTZFJTY1JTIwJTczJTY1JTZDJTY1JTYzJTc0JTY5JTZGJTZF JTIwJTczJTY1JTYzJTc1JTcyJTY5JTc0JTY1JTIwJTJEJTJEJTNFJTBBJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJE JTJEJTIwJTQ2JTY5JTZFJTIwJTY0JTY1JTIwJTY0JTY5JTc2JTIwJTcwJTZGJTc1JTcyJTIw JTZDJTYxJTIwJTY0JTY5JTc2JTIwJTcwJTYxJTZFJTc0JTYxJTZDJTZGJTZFJTIwJTJEJTJE JTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTIxJTJEJTJEJTIwJTQ0JTY1JTYyJTc1 JTc0JTIwJTY0JTY1JTIwJTY0JTY5JTc2JTIwJTcwJTZGJTc1JTcyJTIwJTZDJTYxJTIwJTY0 JTY5JTc2JTIwJTYzJTZGJTcyJTcwJTczJTIwJTJEJTJEJTNFJTBBJTNDJTY0JTY5JTc2JTIw JTY5JTY0JTNEJTIyJTYzJTZGJTcyJTcwJTczJTIyJTNFJTBBJTBBJTNDJTY0JTY5JTc2JTIw JTY5JTY0JTNEJTIyJTYyJTYxJTZFJTY0JTY1JTYxJTc1JTVGJTYzJTY4JTY1JTZEJTY5JTZF JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0 JTZGJTcwJTNBJTM1JTcwJTc4JTNCJTIyJTNFJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTZDJTYxJTZFJTY3JTc1JTYx JTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTc0JTc5 JTcwJTY1JTNEJTIwJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTIyJTNFJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTY3JTY1JTc0 JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTczJTQyJTc5JTQzJTZDJTYxJTczJTczJTI4JTczJTY1 JTYxJTcyJTYzJTY4JTQzJTZDJTYxJTczJTczJTJDJTIwJTZFJTZGJTY0JTY1JTJDJTIwJTc0 JTYxJTY3JTI5JTIwJTdCJTBBJTA5JTc2JTYxJTcyJTIwJTYzJTZDJTYxJTczJTczJTQ1JTZD JTY1JTZEJTY1JTZFJTc0JTczJTIwJTNEJTIwJTZFJTY1JTc3JTIwJTQxJTcyJTcyJTYxJTc5 JTI4JTI5JTNCJTBBJTA5JTY5JTY2JTIwJTI4JTIwJTZFJTZGJTY0JTY1JTIwJTNEJTNEJTIw JTZFJTc1JTZDJTZDJTIwJTI5JTBBJTA5JTIwJTIwJTIwJTIwJTZFJTZGJTY0JTY1JTIwJTNE JTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTNCJTBBJTA5JTY5JTY2JTIwJTI4JTIwJTc0 JTYxJTY3JTIwJTNEJTNEJTIwJTZFJTc1JTZDJTZDJTIwJTI5JTBBJTA5JTIwJTIwJTIwJTc0 JTYxJTY3JTIwJTNEJTIwJTI3JTJBJTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTY1JTZDJTcz JTIwJTNEJTIwJTZFJTZGJTY0JTY1JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0 JTczJTQyJTc5JTU0JTYxJTY3JTRFJTYxJTZEJTY1JTI4JTc0JTYxJTY3JTI5JTNCJTBBJTA5 JTc2JTYxJTcyJTIwJTY1JTZDJTczJTRDJTY1JTZFJTIwJTNEJTIwJTY1JTZDJTczJTJFJTZD JTY1JTZFJTY3JTc0JTY4JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTcwJTYxJTc0JTc0JTY1JTcy JTZFJTIwJTNEJTIwJTZFJTY1JTc3JTIwJTUyJTY1JTY3JTQ1JTc4JTcwJTI4JTIyJTI4JTVF JTdDJTVDJTVDJTczJTI5JTIyJTJCJTczJTY1JTYxJTcyJTYzJTY4JTQzJTZDJTYxJTczJTcz JTJCJTIyJTI4JTVDJTVDJTczJTdDJTI0JTI5JTIyJTI5JTNCJTBBJTA5JTY2JTZGJTcyJTIw JTI4JTY5JTIwJTNEJTIwJTMwJTJDJTIwJTZBJTIwJTNEJTIwJTMwJTNCJTIwJTY5JTIwJTND JTIwJTY1JTZDJTczJTRDJTY1JTZFJTNCJTIwJTY5JTJCJTJCJTI5JTIwJTdCJTBBJTA5JTIw JTIwJTIwJTIwJTY5JTY2JTIwJTI4JTIwJTcwJTYxJTc0JTc0JTY1JTcyJTZFJTJFJTc0JTY1 JTczJTc0JTI4JTY1JTZDJTczJTVCJTY5JTVEJTJFJTYzJTZDJTYxJTczJTczJTRFJTYxJTZE JTY1JTI5JTIwJTI5JTIwJTdCJTBBJTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTYzJTZD JTYxJTczJTczJTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTczJTVCJTZBJTVEJTIwJTNEJTIwJTY1 JTZDJTczJTVCJTY5JTVEJTNCJTBBJTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTZBJTJC JTJCJTNCJTBBJTA5JTIwJTIwJTIwJTdEJTBBJTA5JTdEJTBBJTA5JTcyJTY1JTc0JTc1JTcy JTZFJTIwJTYzJTZDJTYxJTczJTczJTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTczJTNCJTBBJTdE JTBBJTBBJTc2JTYxJTcyJTIwJTUwJTRGJTRDJTQ5JTQzJTQ1JTVGJTQzJTRDJTQxJTUzJTUz JTIwJTNEJTIwJTVCJTIyJTc0JTYyJTZGJTY0JTc5JTIyJTJDJTIwJTIyJTYyJTZGJTY0JTc5 JTIyJTVEJTNCJTBBJTc2JTYxJTcyJTIwJTUwJTRGJTRDJTQ5JTQzJTQ1JTVGJTQ0JTQ1JTQ2 JTQxJTU1JTRDJTU0JTIwJTNEJTIwJTVCJTIyJTMxJTMwJTMwJTIyJTJDJTIwJTIyJTM4JTMw JTIyJTVEJTNCJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTc0JTYxJTY5JTZD JTZDJTY1JTQ2JTZGJTZFJTc0JTY1JTI4JTYzJTZDJTYxJTczJTczJTY1JTJDJTIwJTc0JTYx JTY5JTZDJTZDJTY1JTJDJTIwJTY0JTY1JTY2JTYxJTc1JTc0JTI5JTIwJTdCJTBBJTA5JTcw JTZGJTczJTIwJTNEJTIwJTMwJTNCJTBBJTA5JTY2JTZGJTcyJTI4JTZCJTNEJTMwJTNCJTZC JTNDJTUwJTRGJTRDJTQ5JTQzJTQ1JTVGJTQzJTRDJTQxJTUzJTUzJTJFJTZDJTY1JTZFJTY3 JTc0JTY4JTNCJTZCJTJCJTJCJTI5JTdCJTBBJTA5JTA5JTdBJTZGJTZFJTY1JTczJTIwJTNE JTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1 JTZFJTc0JTczJTQyJTc5JTU0JTYxJTY3JTRFJTYxJTZEJTY1JTI4JTUwJTRGJTRDJTQ5JTQz JTQ1JTVGJTQzJTRDJTQxJTUzJTUzJTVCJTZCJTVEJTI5JTNCJTBBJTA5JTA5JTY5JTY2JTI4 JTY0JTY1JTY2JTYxJTc1JTc0JTNEJTNEJTIyJTY0JTY1JTY2JTYxJTc1JTZDJTc0JTIyJTI5 JTdCJTBBJTA5JTA5JTA5JTY2JTZGJTcyJTI4JTY5JTNEJTMwJTNCJTIwJTY5JTNDJTdBJTZG JTZFJTY1JTczJTJFJTZDJTY1JTZFJTY3JTc0JTY4JTNCJTIwJTY5JTJCJTJCJTI5JTdCJTBB JTA5JTA5JTA5JTA5JTdBJTZGJTZFJTY1JTIwJTNEJTIwJTdBJTZGJTZFJTY1JTczJTVCJTY5 JTVEJTNCJTBBJTA5JTA5JTA5JTA5JTdBJTZGJTZFJTY1JTJFJTczJTc0JTc5JTZDJTY1JTJF JTY2JTZGJTZFJTc0JTUzJTY5JTdBJTY1JTIwJTNEJTIwJTUwJTRGJTRDJTQ5JTQzJTQ1JTVG JTQ0JTQ1JTQ2JTQxJTU1JTRDJTU0JTVCJTZCJTVEJTIwJTJCJTIwJTIyJTI1JTIyJTNCJTBB JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTdEJTY1JTZDJTczJTY1JTdCJTBBJTA5JTA5JTA5JTY2 JTZGJTcyJTI4JTY5JTNEJTMwJTNCJTIwJTY5JTNDJTdBJTZGJTZFJTY1JTczJTJFJTZDJTY1 JTZFJTY3JTc0JTY4JTNCJTIwJTY5JTJCJTJCJTI5JTdCJTBBJTA5JTA5JTA5JTA5JTdBJTZG JTZFJTY1JTIwJTNEJTIwJTdBJTZGJTZFJTY1JTczJTVCJTY5JTVEJTNCJTBBJTA5JTA5JTA5 JTA5JTY5JTY2JTI4JTIxJTdBJTZGJTZFJTY1JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZG JTZFJTc0JTUzJTY5JTdBJTY1JTI5JTdCJTBBJTA5JTA5JTA5JTA5JTA5JTdBJTZGJTZFJTY1 JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZGJTZFJTc0JTUzJTY5JTdBJTY1JTIwJTNEJTIw JTUwJTRGJTRDJTQ5JTQzJTQ1JTVGJTQ0JTQ1JTQ2JTQxJTU1JTRDJTU0JTVCJTZCJTVEJTIw JTJCJTIwJTIyJTI1JTIyJTNCJTBBJTA5JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTA5JTA5JTY5 JTY2JTI4JTI4JTcwJTYxJTcyJTczJTY1JTQ5JTZFJTc0JTI4JTc0JTYxJTY5JTZDJTZDJTY1 JTI5JTNDJTMwJTIwJTI2JTI2JTIwJTcwJTYxJTcyJTczJTY1JTQ5JTZFJTc0JTI4JTdBJTZG JTZFJTY1JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZGJTZFJTc0JTUzJTY5JTdBJTY1JTI5 JTNFJTM1JTMwJTI5JTIwJTdDJTdDJTIwJTI4JTcwJTYxJTcyJTczJTY1JTQ5JTZFJTc0JTI4 JTc0JTYxJTY5JTZDJTZDJTY1JTI5JTNFJTMwJTIwJTI2JTI2JTIwJTcwJTYxJTcyJTczJTY1 JTQ5JTZFJTc0JTI4JTdBJTZGJTZFJTY1JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZGJTZF JTc0JTUzJTY5JTdBJTY1JTI5JTNDJTMyJTMwJTMwJTI5JTI5JTdCJTBBJTA5JTA5JTA5JTA5 JTA5JTdBJTZGJTZFJTY1JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZGJTZFJTc0JTUzJTY5 JTdBJTY1JTIwJTNEJTIwJTcwJTYxJTcyJTczJTY1JTQ5JTZFJTc0JTI4JTdBJTZGJTZFJTY1 JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY2JTZGJTZFJTc0JTUzJTY5JTdBJTY1JTI5JTIwJTJC JTIwJTcwJTYxJTcyJTczJTY1JTQ5JTZFJTc0JTI4JTc0JTYxJTY5JTZDJTZDJTY1JTI5JTIw JTJCJTIwJTIyJTI1JTIyJTNCJTBBJTA5JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTA5JTdEJTBB JTA5JTA5JTdEJTBBJTA5JTdEJTBBJTdEJTBBJTBBJTJGJTJBJTIwJTUwJTY1JTcyJTZEJTY1 JTc0JTIwJTY0JTI3JTYxJTYzJTc0JTY5JTc2JTY1JTcyJTIwJTZDJTY1JTczJTIwJTZDJTY5 JTY1JTZFJTczJTIwJTczJTZGJTYzJTY5JTYxJTc1JTc4JTJFJTIwJTJBJTJGJTBBJTY2JTc1 JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1JTRDJTY5JTY1 JTZFJTczJTUzJTZGJTYzJTY5JTYxJTc1JTc4JTI4JTI5JTdCJTBBJTA5JTc2JTYxJTcyJTIw JTZDJTY5JTY3JTZFJTY1JTIwJTNEJTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3 JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTZEJTcw JTcyJTY1JTczJTczJTY5JTZGJTZFJTIyJTI5JTNCJTBBJTA5JTY2JTZGJTcyJTI4JTIwJTc2 JTYxJTcyJTIwJTY5JTIwJTNEJTIwJTMwJTNCJTIwJTY5JTIwJTNDJTIwJTZDJTY5JTY3JTZF JTY1JTJFJTYzJTY4JTY5JTZDJTY0JTRFJTZGJTY0JTY1JTczJTJFJTZDJTY1JTZFJTY3JTc0 JTY4JTNCJTIwJTY5JTJCJTJCJTIwJTI5JTdCJTBBJTA5JTA5JTc2JTYxJTcyJTIwJTY2JTY5 JTZDJTczJTIwJTNEJTIwJTZDJTY5JTY3JTZFJTY1JTJFJTYzJTY4JTY5JTZDJTY0JTRFJTZG JTY0JTY1JTczJTVCJTY5JTVEJTNCJTBBJTA5JTA5JTY5JTY2JTI4JTY2JTY5JTZDJTczJTJF JTYzJTZDJTYxJTczJTczJTRFJTYxJTZEJTY1JTIwJTIxJTNEJTIwJTc1JTZFJTY0JTY1JTY2 JTY5JTZFJTY1JTY0JTI5JTdCJTBBJTA5JTA5JTA5JTY5JTY2JTI4JTIyJTZDJTY5JTY1JTZF JTVGJTczJTZGJTYzJTY5JTYxJTZDJTIyJTIwJTNEJTNEJTIwJTY2JTY5JTZDJTczJTJFJTYz JTZDJTYxJTczJTczJTRFJTYxJTZEJTY1JTI5JTdCJTBBJTA5JTA5JTA5JTA5JTY2JTY5JTZD JTczJTJFJTYzJTZDJTYxJTczJTczJTRFJTYxJTZEJTY1JTIwJTNEJTIwJTIyJTIyJTNCJTBB JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTdEJTBBJTA5JTdEJTBBJTdEJTBBJTBBJTNDJTJGJTcz JTYzJTcyJTY5JTcwJTc0JTNFJTBBJTBBJTNDJTczJTc0JTc5JTZDJTY1JTNFJTBBJTA5JTJF JTZDJTY5JTY1JTZFJTVGJTczJTZGJTYzJTY5JTYxJTZDJTdCJTBBJTA5JTA5JTY0JTY5JTcz JTcwJTZDJTYxJTc5JTNBJTZFJTZGJTZFJTY1JTNCJTBBJTA5JTdEJTBBJTNDJTJGJTczJTc0 JTc5JTZDJTY1JTNFJTBBJTBBJTBBJTA5JTNDJTY0JTY5JTc2JTIwJTY5JTY0JTNEJTIyJTYz JTY4JTY1JTZEJTY5JTZFJTIyJTNFJTBBJTIwJTIwJTA5JTBBJTIwJTIwJTA5JTA5JTBBJTIw JTIwJTA5JTA5JTA5JTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ4JTZGJTZEJTY1JTUwJTYxJTY3JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTczJTY5JTc0 JTY1JTIyJTNFJTQxJTYzJTYzJTc1JTY1JTY5JTZDJTNDJTJGJTYxJTNFJTBBJTIwJTIwJTA5 JTA5JTBBJTIwJTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTIwJTA5JTNDJTY0JTY5JTc2JTIw JTY5JTY0JTNEJTIyJTY5JTZEJTcwJTcyJTY1JTczJTczJTY5JTZGJTZFJTIyJTNFJTBBJTIw JTA5JTA5JTNDJTZEJTYxJTcwJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZEJTYxJTcwJTVGJTYx JTYxJTYxJTIyJTNFJTBBJTA5JTA5JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTczJTY4JTYxJTcw JTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTMw JTJDJTMwJTJDJTMxJTMzJTJDJTMxJTM2JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTIzJTMx JTIyJTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTNBJTc0JTYxJTY5JTZDJTZDJTY1JTQ2JTZGJTZFJTc0JTY1JTI4JTI3JTY2 JTZGJTYzJTc1JTczJTQ2JTY5JTYzJTY4JTY1JTI3JTJDJTIwJTI3JTJEJTM1JTI1JTI3JTI5 JTNCJTIyJTIwJTYxJTZDJTc0JTNEJTIyJTUyJUU5JTY0JTc1JTY5JTc0JTIwJTZDJTYxJTIw JTc0JTYxJTY5JTZDJTZDJTY1JTIwJTY0JTY1JTIwJTZDJTYxJTIwJTcwJTZGJTZDJTY5JTYz JTY1JTIyJTIwJTJGJTNFJTBBJTA5JTA5JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTczJTY4JTYx JTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIy JTMxJTM0JTJDJTMwJTJDJTMyJTM3JTJDJTMxJTM2JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIy JTIzJTMyJTIyJTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTZBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTNBJTc0JTYxJTY5JTZDJTZDJTY1JTQ2JTZGJTZFJTc0JTY1JTI4 JTI3JTY2JTZGJTYzJTc1JTczJTQ2JTY5JTYzJTY4JTY1JTI3JTJDJTIwJTI3JTI1JTI3JTJD JTIwJTI3JTY0JTY1JTY2JTYxJTc1JTZDJTc0JTI3JTI5JTNCJTIyJTIwJTYxJTZDJTc0JTNE JTIyJTU0JTYxJTY5JTZDJTZDJTY1JTIwJTY0JTY1JTIwJTZDJTYxJTIwJTcwJTZGJTZDJTY5 JTYzJTY1JTIwJTcwJTYxJTcyJTIwJTY0JUU5JTY2JTYxJTc1JTc0JTIyJTIwJTJGJTNFJTBB JTA5JTA5JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1 JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTMyJTM4JTJDJTMwJTJDJTM0 JTMxJTJDJTMxJTM2JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTIzJTMzJTIyJTIwJTZGJTZF JTYzJTZDJTY5JTYzJTZCJTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNB JTc0JTYxJTY5JTZDJTZDJTY1JTQ2JTZGJTZFJTc0JTY1JTI4JTI3JTY2JTZGJTYzJTc1JTcz JTQ2JTY5JTYzJTY4JTY1JTI3JTJDJTIwJTI3JTM1JTI1JTI3JTI5JTNCJTIyJTIwJTYxJTZD JTc0JTNEJTIyJTQxJTc1JTY3JTZEJTY1JTZFJTc0JTY1JTIwJTZDJTYxJTIwJTc0JTYxJTY5 JTZDJTZDJTY1JTIwJTY0JTY1JTIwJTZDJTYxJTIwJTcwJTZGJTZDJTY5JTYzJTY1JTIyJTIw JTJGJTNFJTBBJTA5JTA5JTNDJTJGJTZEJTYxJTcwJTNFJTBBJTA5JTA5JTBBJTA5JTA5JTBB JTA5JTA5JTBBJTA5JTA5JTNDJTY5JTZEJTY3JTIwJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIy JTc2JTY1JTcyJTc0JTY5JTYzJTYxJTZDJTJEJTYxJTZDJTY5JTY3JTZFJTNBJTZEJTY5JTY0 JTY0JTZDJTY1JTNCJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQx JTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTYzJTczJTczJTJGJTY3 JTY5JTY2JTJGJTYxJTYxJTYxJTJFJTcwJTZFJTY3JTIyJTIwJTc1JTczJTY1JTZEJTYxJTcw JTNEJTIyJTIzJTZEJTYxJTcwJTVGJTYxJTYxJTYxJTIyJTIwJTYxJTZDJTc0JTNEJTIyJTQz JTY4JTYxJTZFJTY3JTY1JTcyJTIwJTZDJTYxJTIwJTc0JTYxJTY5JTZDJTZDJTY1JTIwJTY0 JTc1JTIwJTc0JTY1JTc4JTc0JTY1JTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMw JTIyJTIwJTJGJTNFJTBBJTA5JTA5JTBBJTIwJTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBB JTNDJTIxJTJEJTJEJTIwJTIwJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTZDJTYxJTZFJTY3 JTc1JTYxJTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTIw JTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTIyJTNFJTBBJTA5JTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1JTRDJTY5JTY1 JTZFJTczJTUzJTZGJTYzJTY5JTYxJTc1JTc4JTI4JTI5JTNCJTBBJTNDJTJGJTczJTYzJTcy JTY5JTcwJTc0JTNFJTIwJTJEJTJEJTNFJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTIwJTczJTZC JTY5JTZFJTIwJTQyJTYxJTcyJTcyJTY1JTIwJTYxJTc2JTYxJTZFJTYzJTY1JTIwJTQ1JTZF JTY0JTIwJTY0JTY1JTYyJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNF JTBBJTNDJTIxJTJEJTJEJTIwJTczJTZCJTY5JTZFJTIwJTQyJTYxJTcyJTcyJTY1JTIwJTYx JTc2JTYxJTZFJTYzJTY1JTIwJTQ1JTZFJTY0JTIwJTY2JTY5JTZFJTIwJTJEJTJEJTNFJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTIw JTQzJTY1JTZFJTc0JTcyJTYxJTZDJTY1JTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTIwJTJEJTJEJTNFJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTBBJTNDJTY0JTY5 JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTIyJTNF JTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTczJTc0 JTc5JTZDJTY1JTNFJTBBJTA5JTY4JTc0JTZEJTZDJTNFJTYyJTZGJTY0JTc5JTIwJTIzJTY2 JTZGJTYzJTc1JTczJTQ2JTY5JTYzJTY4JTY1JTIwJTdCJTY2JTZDJTZGJTYxJTc0JTNBJTIw JTZDJTY1JTY2JTc0JTNCJTdEJTBBJTA5JTBBJTA5JTIzJTY2JTZGJTYzJTc1JTczJTQ2JTY5 JTYzJTY4JTY1JTdCJTBBJTA5JTA5JTc3JTY5JTY0JTc0JTY4JTNBJTM3JTM3JTMzJTcwJTc4 JTNCJTBBJTA5JTdEJTBBJTA5JTBBJTA5JTIzJTZDJTZGJTY3JTZGJTdCJTBBJTA5JTA5JTZE JTYxJTcyJTY3JTY5JTZFJTNBJTIwJTMwJTIwJTMwJTIwJTMwJTIwJTMwJTNCJTBBJTA5JTdE JTBBJTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTIwJTBBJTBBJTBBJTBBJTBBJTBBJTIwJTBB JTBBJTNDJTIxJTJEJTJEJTIwJTQxJTY2JTY2JTY5JTYzJTY4JTYxJTY3JTY1JTIwJTY0JTc1 JTIwJTc0JTY5JTc0JTcyJTY1JTIwJTY0JTc1JTIwJTY0JTZGJTczJTczJTY5JTY1JTcyJTIw JTJEJTJEJTNFJTBBJTBBJTNDJTY4JTMxJTNFJTBBJTBBJTA5JTA5JTA5JTBBJTNDJTY0JTY5 JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTc0JTY5JTc0JTcyJTY1JTQ2JTY5JTYzJTY4 JTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTYzJTY1JTZFJTc0JTcyJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTczJTcwJTYxJTZFJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYzJTZGJTZDJTZG JTcyJTNBJTMzJTMzJTMzJTMzJTMzJTMzJTNCJTIyJTNFJTQxJTYzJTYzJTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTY0JTY1JTdBJTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIwJTZD JTI3JTY1JTczJTcwJTYxJTYzJTY1JTBBJTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYz JTc1JTcyJTY5JTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTIwJTY0JTY1JTIwJTQyJTRF JTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTNDJTJGJTczJTcwJTYxJTZF JTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTJGJTY0JTY5JTc2 JTNFJTBBJTBBJTBBJTBBJTBBJTNDJTJGJTY4JTMxJTNFJTBBJTBBJTBBJTBBJTBBJTNDJTIx JTJEJTJEJTIwJTIwJTQxJTY2JTY2JTY5JTYzJTY4JTYxJTY3JTY1JTIwJTY0JTY1JTczJTIw JTYyJTZGJTc1JTc0JTZGJTZFJTczJTIwJTYzJTYxJTZDJTZDJTYyJTYxJTYzJTZCJTJDJTIw JTY0JTY1JTZEJTYxJTZFJTY0JTY1JTIwJTY5JTZFJTY2JTZGJTJDJTIwJTcyJTY1JTZFJTY0 JTY1JTdBJTJEJTc2JTZGJTc1JTczJTIwJTY1JTc0JTIwJTYzJTZGJTZEJTZEJTYxJTZFJTY0 JTY1JTdBJTIwJTJEJTJEJTNFJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTYyJTZDJTZGJTYzJTQxJTYzJTc0JTY5JTZGJTZFJTczJTIyJTNFJTBBJTBBJTNDJTJG JTY0JTY5JTc2JTNFJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTIwJTQxJTY2JTY2JTY5JTYz JTY4JTYxJTY3JTY1JTIwJTY0JTY1JTIwJTZDJTYxJTIwJTZDJTY5JTczJTc0JTY1JTIwJTY0 JTY1JTczJTIwJTY2JTY5JTYzJTY4JTY1JTczJTIwJTYxJTc0JTc0JTYxJTYzJTY4JUU5JTY1 JTczJTIwJTYxJTc1JTIwJTY0JTZGJTczJTczJTY5JTY1JTcyJTIwJTJEJTJEJTNFJTBBJTIw JTA5JTBBJTBBJTBBJTBBJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIy JTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTY0JTY5 JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcwJTYxJTcyJTc0JTY5JTY1JTIyJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTcwJTQzJTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTNDJTc0JTYxJTYyJTZDJTY1 JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYx JTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYz JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcy JTY0JTY1JTcyJTNBJTIwJTMxJTcwJTc4JTIwJTczJTZGJTZDJTY5JTY0JTIwJTIzJTY0JTMx JTY0JTMxJTY0JTMxJTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTMxJTMwJTcw JTc4JTNCJTIwJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTZDJTY1JTY2JTc0JTNBJTIwJTM5JTcw JTc4JTNCJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM5JTM4JTI1JTIyJTNFJTBBJTIw JTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTYz JTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTc0JTcy JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTNDJTYyJTNF JTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYxJTc1JTYyJTY1JTcy JTY3JTY5JTZFJTY1JTIyJTNFJTQ5JTZFJTY2JTZGJTcyJTZEJTYxJTc0JTY5JTZGJTZFJTIw JTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYzJTc1JTcyJTY5JTc0JTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTIwJTNBJTNDJTJGJTczJTcwJTYxJTZFJTNFJTNDJTJGJTYyJTNFJTIw JTNDJTYyJTNFJTc1JTZFJTIwJTZFJTZGJTc1JTc2JTY1JTYxJTc1JTIwJTcwJTY4JTY5JTcz JTY4JTY5JTZFJTY3JTIwJTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTc2JTY5JTc0JTIw JTYzJTY1JTczJTIwJTY0JTY1JTcyJTZFJTY5JTY1JTcyJTczJTIwJTZBJTZGJTc1JTcyJTcz JTNDJTJGJTYyJTNFJTJFJTIwJTBBJTUyJTY1JTc0JTcyJTZGJTc1JTc2JTY1JTdBJTIwJTND JTYyJTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2 JTYxJTZEJTcwJTNCJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUyJTY1 JTY3JTZDJTY1JTczJTVGJTY0JTY1JTVGJTYzJTZGJTZFJTczJTY1JTcyJTc2JTYxJTc0JTY5 JTZGJTZFJTVGJTY0JTY1JTVGJTc2JTZGJTczJTVGJTYzJTZGJTY0JTY1JTczJTVGJTMyJTMw JTMwJTM0JTMwJTMyJTMwJTM1JTMxJTM3JTMxJTM1JTM0JTM0JTIyJTIwJTYzJTZDJTYxJTcz JTczJTNEJTIyJTZFJTZGJTY5JTcyJTIyJTNFJTZDJTY1JTczJTIwJTcyJTI2JTY1JTY3JTcy JTYxJTc2JTY1JTNCJTY3JTZDJTY1JTczJTIwJTY1JTc0JTIwJTZDJTY1JTczJTIwJTYyJTZG JTZFJTZFJTY1JTczJTIwJTcwJTcyJTYxJTc0JTY5JTcxJTc1JTY1JTczJTNDJTJGJTYxJTNF JTNDJTJGJTYyJTNFJTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIwJTYxJTY0JTZGJTcw JTc0JTY1JTcyJTJFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTcyJTNFJTBBJTBBJTBBJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTNDJTYyJTcyJTNF JTBBJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTc2JTY1JTcyJTc0 JTIyJTNFJTNDJTYyJTNFJTQ5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTY1JTdBJTJEJTc2JTZG JTc1JTczJTIwJTNBJTNDJTJGJTYyJTNFJTNDJTJGJTczJTcwJTYxJTZFJTNFJTBBJTNDJTJG JTY0JTY5JTc2JTNFJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTIw JTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcwJTYxJTcy JTc0JTY5JTY1JTIyJTNFJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcw JTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMw JTI1JTIyJTNFJTNDJTc0JTcyJTNFJTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIy JTM2JTM2JTI1JTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZDJTMxJTIyJTNF JTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcwJTQzJTZGJTZFJTc0JTY1 JTZFJTc1JTIyJTNFJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTNDJTUz JTQzJTUyJTQ5JTUwJTU0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZB JTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTBBJTA5JTNDJTIxJTJEJTJEJTIw JTQ3JTY1JTczJTc0JTY5JTZGJTZFJTIwJTY0JTY1JTczJTIwJTczJTc0JTYxJTc0JTY5JTcz JTc0JTY5JTcxJTc1JTY1JTczJTBBJTA5JTY5JTY2JTIwJTI4JTc3JTY1JTYyJTZGJTVGJTZG JTZCJTNEJTNEJTMxJTI5JTdCJTBBJTA5JTA5JTc3JTY1JTYyJTZGJTVGJTYxJTY0JTY0JTUz JTc0JTYxJTc0JTQxJTcyJTY3JTczJTI4JTMxJTMyJTJDJTMxJTMxJTJDJTMxJTI5JTNCJTBB JTA5JTdEJTBBJTA5JTBBJTA5JTJGJTJGJTU3JTUzJTUyJTY1JTcwJTZGJTcyJTc0JTIwJTYz JTY5JTZFJTY1JTZEJTYxJTc0JTY5JTcxJTc1JTY1JTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUy JTUwJTVGJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTIwJTNEJTI3JTQ5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTQ3JTcyJTYxJTcwJTY4JTY5JTcxJTc1JTY1JTI3 JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTUzJTU1JTQyJTUzJTQ1JTQzJTU0 JTQ5JTRGJTRFJTIwJTNEJTI3JTUzJTYxJTY5JTczJTY5JTY1JTIwJTQxJTQ5JTU4JTIwJTRE JTMxJTUwJTMxJTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTQ5JTQ0JTIw JTNEJTMzJTM1JTM0JTM1JTMyJTM4JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVG JTQzJTRGJTRFJTU0JTQ1JTRFJTU1JTIwJTNEJTI3JTQxJTYzJTYzJTc1JTY1JTY5JTZDJTI3 JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTQzJTQ4JTQxJTRFJTRFJTQ1JTRD JTNEJTI3JTMwJTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTQxJTQzJTQz JTNEJTI3JTMwJTI3JTNCJTBBJTA5JTJGJTJGJTYzJTY1JTc0JTc0JTY1JTIwJTc2JTYxJTcy JTY5JTYxJTYyJTZDJTY1JTIwJTczJTY1JTcyJTYxJTIwJTcwJTcyJTY5JTczJTY1JTIwJTY1 JTZFJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTIwJTZDJTZGJTcyJTczJTIwJTY0JTY1JTIwJTZD JTYxJTIwJTZEJTZGJTY0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTIwJTY0JTc1JTIw JTczJTYzJTcyJTY5JTcwJTc0JTIwJTYxJTc2JTY1JTYzJTIwJTZDJTY1JTczJTIwJTY0JTY5 JTY2JTY2JUU5JTcyJTY1JTZFJTc0JTczJTIwJTc0JTc5JTcwJTY1JTczJTIwJTY0JTY1JTIw JTYzJTZGJTZFJTc0JTY1JTZFJTc1JTBBJTA5JTBBJTA5JTA5JTc2JTYxJTcyJTIwJTU3JTUy JTUwJTVGJTQzJTRGJTRFJTU0JTQ1JTRFJTU1JTMyJTIwJTNEJTI3JTI3JTNCJTBBJTA5JTBB JTA5JTBBJTA5JTY5JTY2JTI4JTc3JTcyJTY1JTcwJTZGJTcyJTc0JTVGJTZGJTZCJTNEJTNE JTMxJTI5JTdCJTBBJTA5JTA5JTZEJTYxJTZCJTY1JTVGJTczJTc0JTYxJTc0JTVGJTczJTY5 JTZEJTcwJTZDJTY1JTI4JTU3JTUyJTUwJTVGJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTJDJTU3 JTUyJTUwJTVGJTUzJTU1JTQyJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTJDJTU3JTUyJTUwJTVG JTQ5JTQ0JTJDJTU3JTUyJTUwJTVGJTQxJTQzJTQzJTJDJTU3JTUyJTUwJTVGJTQzJTQ4JTQx JTRFJTRFJTQ1JTRDJTJDJTIwJTU3JTUyJTUwJTVGJTQzJTRGJTRFJTU0JTQ1JTRFJTU1JTJD JTIwJTMwJTJDJTIwJTMxJTJDJTIwJTMwJTJDJTIwJTMwJTJDJTIwJTU3JTUyJTUwJTVGJTQz JTRGJTRFJTU0JTQ1JTRFJTU1JTMyJTI5JTNCJTBBJTA5JTdEJTBBJTA5JTBBJTJGJTJGJTJE JTJEJTNFJTBBJTNDJTJGJTUzJTQzJTUyJTQ5JTUwJTU0JTNFJTBBJTBBJTBBJTBBJTBBJTBB JTNDJTIxJTJEJTJEJTIwJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTYzJTc0JTY5JTZG JTZFJTQ3JTcyJTYxJTcwJTY4JTY5JTcxJTc1JTY1JTIwJTUzJTYxJTY5JTczJTY5JTY1JTJF JTZBJTczJTcwJTIwJTJEJTJEJTNFJTBBJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIw JTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTIyJTNFJTBBJTBBJTBBJTc2JTYxJTcyJTIwJTY0JTY1JTZDJTYxJTY5JTNC JTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1 JTQyJTZGJTc1JTc0JTc0JTZGJTZFJTI4JTI5JTBBJTdCJTBBJTA5JTJGJTJGJTYxJTZDJTY1 JTcyJTc0JTI4JTIyJTY0JTY1JTZDJTYxJTY5JTMxJTNEJTIyJTJCJTY0JTY1JTZDJTYxJTY5 JTI5JTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZD JTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTYxJTYzJTc0JTY5JTc2JTY1JTIy JTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTc2JTY5JTczJTY5JTYyJTY5JTZDJTY5JTc0JTc5 JTNEJTIyJTc2JTY5JTczJTY5JTYyJTZDJTY1JTIyJTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZE JTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0 JTI4JTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1 JTJFJTc2JTY5JTczJTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNEJTIyJTY4JTY5JTY0JTY0JTY1 JTZFJTIyJTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1 JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTYxJTYzJTc0JTY5JTc2JTY1 JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNEJTIy JTYyJTZDJTZGJTYzJTZCJTIyJTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJF JTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTZF JTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5JTcz JTcwJTZDJTYxJTc5JTNEJTIyJTZFJTZGJTZFJTY1JTIyJTNCJTBBJTdEJTBBJTBBJTBBJTY2 JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTY5JTY0JTY1JTcyJTI4JTYyJTZG JTc1JTc0JTZGJTZFJTI5JTIwJTdCJTBBJTA5JTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIy JTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTc2JTY5JTcz JTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTNCJTBB JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1 JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5 JTJFJTczJTc0JTc5JTZDJTY1JTJFJTc2JTY5JTczJTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNE JTIyJTc2JTY5JTczJTY5JTYyJTZDJTY1JTIyJTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1 JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4 JTIyJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5 JTczJTcwJTZDJTYxJTc5JTNEJTIyJTZFJTZGJTZFJTY1JTIyJTNCJTBBJTA5JTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5 JTQ5JTY0JTI4JTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5 JTZDJTY1JTJFJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNEJTIyJTYyJTZDJTZGJTYzJTZCJTIy JTNCJTBBJTA5JTY0JTY1JTZDJTYxJTY5JTIwJTNEJTIwJTczJTY1JTc0JTU0JTY5JTZEJTY1 JTZGJTc1JTc0JTI4JTIyJTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1JTQyJTZGJTc1JTc0JTc0 JTZGJTZFJTI4JTI5JTIyJTJDJTIwJTM1JTMwJTMwJTMwJTI5JTNCJTBBJTA5JTJGJTJGJTYx JTZDJTY1JTcyJTc0JTI4JTIyJTY0JTY1JTZDJTYxJTY5JTMyJTNEJTIyJTJCJTY0JTY1JTZD JTYxJTY5JTI5JTNCJTBBJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZG JTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTYyJTZGJTc1JTc0JTZGJTZF JTJFJTc2JTYxJTZDJTc1JTY1JTNEJTYyJTZGJTc1JTc0JTZGJTZFJTNCJTBBJTA5JTY0JTZG JTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTJFJTYzJTY4JTM1JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTYyJTY5JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1 JTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYz JTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTczJTc1JTYyJTZEJTY5JTc0JTI4JTI5JTNCJTBB JTBBJTdEJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTc2JTYxJTZDJTY5JTY0 JTY1JTcyJTMyJTI4JTI5JTIwJTdCJTBBJTA5JTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIy JTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTc2JTY5JTcz JTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTNCJTBB JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1 JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5 JTJFJTczJTc0JTc5JTZDJTY1JTJFJTc2JTY5JTczJTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNE JTIyJTc2JTY5JTczJTY5JTYyJTZDJTY1JTIyJTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1 JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4 JTIyJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5 JTczJTcwJTZDJTYxJTc5JTNEJTIyJTZFJTZGJTZFJTY1JTIyJTNCJTBBJTA5JTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5 JTQ5JTY0JTI4JTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTI5JTJFJTczJTc0JTc5 JTZDJTY1JTJFJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNEJTIyJTYyJTZDJTZGJTYzJTZCJTIy JTNCJTBBJTA5JTY0JTY1JTZDJTYxJTY5JTIwJTNEJTIwJTczJTY1JTc0JTU0JTY5JTZEJTY1 JTZGJTc1JTc0JTI4JTIyJTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1JTQyJTZGJTc1JTc0JTc0 JTZGJTZFJTI4JTI5JTIyJTJDJTIwJTM1JTMwJTMwJTMwJTI5JTNCJTBBJTBBJTA5JTY0JTZG JTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTJFJTYzJTY4JTM1JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTYyJTY5JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1 JTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYz JTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTczJTc1JTYyJTZEJTY5JTc0JTI4JTI5JTNCJTBB JTdEJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTYxJTc0JTc0JTcyJTY5JTYy JTc1JTc0JTY1JTU2JTYxJTZDJTc1JTY1JTI4JTI5JTIwJTdCJTBBJTA5JTY0JTZGJTYzJTc1 JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTJFJTYzJTY4JTM1JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTY0JTZGJTYzJTc1JTZE JTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYy JTY5JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1JTNCJTBB JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTJFJTYzJTY4JTMxJTJFJTY2JTZGJTYzJTc1JTczJTI4JTI5JTNC JTBBJTdEJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTYxJTZFJTZFJTc1JTZD JTY1JTcyJTI4JTI5JTIwJTdCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZD JTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTcyJTY1JTczJTY1JTc0 JTI4JTI5JTNCJTIwJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3 JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYyJTY5JTczJTJFJTcyJTY1JTczJTY1 JTc0JTI4JTI5JTNCJTBBJTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3 JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTYzJTY4JTM1JTJFJTc2JTYxJTZD JTc1JTY1JTIwJTNEJTIwJTIyJTIyJTNCJTBBJTIwJTIwJTA5JTY0JTZGJTYzJTc1JTZEJTY1 JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYyJTY5 JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIw JTIyJTIyJTNCJTBBJTIwJTIwJTA5JTBBJTIwJTIwJTA5JTYzJTZDJTY1JTYxJTcyJTU0JTY5 JTZEJTY1JTZGJTc1JTc0JTI4JTY0JTY1JTZDJTYxJTY5JTI5JTNCJTBBJTIwJTIwJTA5JTYx JTYzJTc0JTY5JTc2JTYxJTc0JTY1JTQyJTZGJTc1JTc0JTc0JTZGJTZFJTI4JTI5JTNCJTBB JTBBJTA5JTY5JTRFJTYyJTQzJTZDJTY5JTYzJTIwJTNEJTIwJTMwJTNCJTBBJTdEJTBBJTBB JTc2JTYxJTcyJTIwJTY5JTRFJTYyJTQzJTZDJTY5JTYzJTIwJTNEJTIwJTMwJTNCJTBBJTBB JTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIwJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTY5JTQz JTYxJTczJTY1JTI5JTBBJTdCJTBBJTA5JTY5JTY2JTI4JTY5JTRFJTYyJTQzJTZDJTY5JTYz JTIwJTNDJTM2JTI5JTBBJTA5JTdCJTBBJTA5JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0 JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYyJTY5JTczJTJF JTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTY0JTZG JTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTYyJTY5JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYxJTZDJTc1 JTY1JTIwJTJCJTIwJTY5JTQzJTYxJTczJTY1JTNCJTBBJTA5JTA5JTY0JTZGJTYzJTc1JTZE JTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYy JTY5JTczJTJFJTYzJTY4JTMyJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTYyJTY5JTczJTJFJTYzJTY4JTMyJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTJCJTIwJTI3 JTJBJTI3JTNCJTBBJTA5JTA5JTY5JTRFJTYyJTQzJTZDJTY5JTYzJTIwJTJCJTJCJTNCJTBB JTA5JTdEJTBBJTA5JTJGJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3 JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJFJTYzJTY4JTMxJTJFJTY2JTZGJTYz JTc1JTczJTI4JTI5JTNCJTBBJTdEJTBBJTBBJTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTIw JTUyJTY1JTQ5JTZFJTY5JTc0JTI4JTI5JTBBJTdCJTBBJTIwJTIwJTY0JTZGJTYzJTc1JTZE JTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJF JTYzJTY4JTM1JTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTIyJTIyJTNCJTBBJTIwJTIw JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYx JTZDJTZFJTY1JTc0JTYyJTY5JTczJTJFJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTJFJTc2JTYx JTZDJTc1JTY1JTIwJTNEJTIwJTIyJTIyJTNCJTBBJTIwJTIwJTY0JTZGJTYzJTc1JTZEJTY1 JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYyJTY5 JTczJTJFJTYzJTY4JTMyJTJFJTc2JTYxJTZDJTc1JTY1JTIwJTNEJTIwJTIyJTIyJTNCJTBB JTIwJTIwJTBBJTIwJTIwJTYzJTZDJTY1JTYxJTcyJTU0JTY5JTZEJTY1JTZGJTc1JTc0JTI4 JTY0JTY1JTZDJTYxJTY5JTI5JTNCJTBBJTIwJTIwJTYxJTYzJTc0JTY5JTc2JTYxJTc0JTY1 JTQyJTZGJTc1JTc0JTc0JTZGJTZFJTI4JTI5JTNCJTBBJTBBJTIwJTIwJTY5JTRFJTYyJTQz JTZDJTY5JTYzJTIwJTNEJTIwJTMwJTNCJTBBJTdEJTBBJTBBJTA5JTBBJTNDJTJGJTUzJTQz JTUyJTQ5JTUwJTU0JTNFJTBBJTBBJTNDJTczJTc0JTc5JTZDJTY1JTNFJTBBJTJFJTYzJTZG JTY0JTY1JTVGJTY3JTcyJTY1JTY1JTZFJTVGJTc0JTY5JTc0JTZDJTY1JTIwJTdCJTBBJTA5 JTYzJTZGJTZDJTZGJTcyJTNBJTIzJTMwJTMwJTMwJTMwJTMwJTMwJTNCJTBBJTA5JTY2JTZG JTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTMxJTMyJTcwJTc4JTNCJTBBJTA5JTY2JTZGJTZF JTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTM5JTMwJTMwJTNCJTBBJTdEJTBBJTBBJTND JTJGJTczJTc0JTc5JTZDJTY1JTNFJTBBJTBBJTNDJTYzJTY1JTZFJTc0JTY1JTcyJTNFJTBB JTBBJTBBJTBBJTBBJTBBJTA5JTBBJTBBJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTBBJTIwJTIw JTIwJTBBJTA5JTNDJTYyJTcyJTJGJTNFJTBBJTBBJTNDJTREJTQxJTUwJTIwJTZFJTYxJTZE JTY1JTNEJTIyJTREJTYxJTcwJTQ3JTcyJTY5JTZDJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1 JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4 JTI3JTMwJTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2 JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTRE JTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIw JTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1 JTI4JTI3JTMwJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYz JTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTM1JTJDJTM1JTJDJTMyJTM3JTJD JTMyJTM2JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2 JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTMyJTI3JTI5JTIyJTIwJTZG JTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJF JTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2 JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1 JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTMyJTI3JTI5JTdE JTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZG JTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4 JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTMzJTI3JTI5 JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0 JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZG JTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZD JTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTMz JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIw JTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIw JTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMx JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3 JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYz JTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4 JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3 JTMxJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIy JTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTM4JTM2JTJDJTM1JTJDJTMxJTMwJTM4JTJD JTMyJTM2JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2 JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTI3JTI5JTIyJTIwJTZGJTZF JTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYx JTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0 JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcy JTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTI3JTI5JTdEJTIyJTIw JTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0 JTczJTNEJTIyJTMxJTMxJTMzJTJDJTM1JTJDJTMxJTMzJTM1JTJDJTMyJTM2JTIyJTNFJTBB JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZD JTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM2JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5 JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYx JTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0 JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdC JTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM2JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYx JTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIy JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZG JTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM3JTI3JTI5JTIyJTIwJTZGJTZFJTY0 JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcw JTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcw JTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIw JTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3 JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM3JTI3JTI5JTdEJTIyJTIw JTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0 JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1 JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMzJTI3JTI5JTIyJTIwJTZG JTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcy JTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJF JTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2 JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1 JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMzJTI3JTI5JTdEJTIy JTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcy JTY0JTczJTNEJTIyJTM1JTM5JTJDJTMzJTMyJTJDJTM4JTMxJTJDJTM1JTMzJTIyJTNFJTBB JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZD JTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM5JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5 JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYx JTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0 JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdC JTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMwJTM5JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYx JTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIy JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZG JTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM0JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYy JTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcw JTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5 JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5 JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM0JTI3JTI5JTdEJTIyJTIwJTczJTY4 JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNE JTIyJTMxJTMxJTMzJTJDJTMzJTMyJTJDJTMxJTMzJTM1JTJDJTM1JTMzJTIyJTNFJTBBJTA5 JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5 JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5 JTZDJTZDJTY1JTI4JTI3JTM1JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5 JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIw JTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1 JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcy JTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTM1JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNE JTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTMxJTJDJTM1 JTM5JTJDJTMyJTM3JTJDJTM4JTMwJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZF JTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2 JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMxJTMy JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3 JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYz JTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4 JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3 JTMxJTMyJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0 JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1 JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4 JTI3JTMxJTMzJTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNE JTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYx JTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3 JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0 JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZD JTY1JTI4JTI3JTMxJTMzJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcy JTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTND JTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYz JTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZD JTZDJTY1JTI4JTI3JTMxJTM0JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5 JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIw JTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1 JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcy JTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM0JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1 JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNF JTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3 JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM2JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5 JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYx JTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0 JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdC JTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM2JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcw JTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTMx JTMxJTMzJTJDJTM1JTM5JTJDJTMxJTMzJTM1JTJDJTM4JTMwJTIyJTNFJTIwJTIwJTIwJTBB JTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZD JTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM2JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5 JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYx JTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0 JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdC JTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM2JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYx JTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIy JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZG JTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM3JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYy JTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0 JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcw JTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5 JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5 JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTM3JTI3JTI5JTdEJTIyJTIwJTczJTY4 JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNE JTIyJTMzJTMyJTJDJTM4JTM2JTJDJTM1JTM0JTJDJTMxJTMwJTM3JTIyJTNFJTBBJTA5JTND JTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYz JTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZD JTZDJTY1JTI4JTI3JTMxJTM4JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5 JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIw JTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1 JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcy JTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcy JTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM4JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1 JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNF JTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYz JTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3 JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM5JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZD JTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNB JTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRF JTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZF JTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIw JTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMxJTM5JTI3JTI5JTdEJTIyJTIwJTczJTY4 JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNE JTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIw JTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcw JTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTMwJTI3JTI5JTIyJTIwJTZGJTZF JTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYx JTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0 JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcy JTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTMwJTI3JTI5JTdEJTIy JTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcy JTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcy JTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYz JTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTMxJTI3JTI5JTIy JTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZG JTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYzJTcyJTZGJTcz JTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZG JTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTMxJTI3 JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0JTIyJTIwJTYz JTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1JTYxJTIwJTZF JTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYxJTc2 JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3JTMyJTMy JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIyJTRBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3 JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTREJTY5JTYz JTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4 JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1JTI4JTI3 JTMyJTMyJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYzJTc0 JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1 JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4 JTI3JTMyJTMzJTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNE JTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYx JTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3 JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0 JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZD JTY1JTI4JTI3JTMyJTMzJTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcy JTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTIyJTNFJTBBJTA5JTND JTYxJTcyJTY1JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYz JTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZD JTZDJTY1JTI4JTI3JTM4JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYz JTZCJTNEJTIyJTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4 JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNE JTNEJTI3JTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZF JTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5 JTZDJTZDJTY1JTI4JTI3JTM4JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIy JTcyJTY1JTYzJTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTM4JTM2JTJDJTMx JTMxJTMzJTJDJTMxJTMwJTM4JTJDJTMxJTMzJTM0JTIyJTNFJTBBJTA5JTNDJTYxJTcyJTY1 JTYxJTIwJTZFJTZGJTY4JTcyJTY1JTY2JTIwJTZGJTZFJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTQ3JTcyJTY5JTZDJTZDJTY1JTI4 JTI3JTM5JTI3JTI5JTIyJTIwJTZGJTZFJTY0JTYyJTZDJTYzJTZDJTY5JTYzJTZCJTNEJTIy JTRBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTY5JTY2JTIwJTI4JTZFJTYxJTc2 JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTNEJTNEJTI3JTRE JTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIw JTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTI3JTI5JTIwJTdCJTQ3JTcyJTY5JTZDJTZDJTY1 JTI4JTI3JTM5JTI3JTI5JTdEJTIyJTIwJTczJTY4JTYxJTcwJTY1JTNEJTIyJTcyJTY1JTYz JTc0JTIyJTIwJTYzJTZGJTZGJTcyJTY0JTczJTNEJTIyJTMxJTMxJTMzJTJDJTMxJTMxJTMz JTJDJTMxJTMzJTM1JTJDJTMxJTMzJTM0JTIyJTNFJTBBJTNDJTJGJTREJTQxJTUwJTNFJTA5 JTA5JTBBJTA5JTBBJTA5JTA5JTBBJTA5JTBBJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1 JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZD JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcy JTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM0JTM4JTM1JTIyJTIwJTYz JTZDJTYxJTczJTczJTNEJTIyJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5 JTZGJTZFJTIyJTNFJTBBJTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTNDJTc0JTY0JTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTM0JTM4JTM1JTIyJTNFJTBBJTA5JTA5JTA5JTNDJTc0JTYx JTYyJTZDJTY1JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM0JTM4JTM1JTIyJTIwJTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTIyJTNFJTBBJTA5JTA5JTA5 JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZF JTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNE JTIyJTM1JTIyJTNFJTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJE JTJEJTIwJUU5JTc0JTYxJTcwJTY1JTIwJTMxJTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMw JTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIw JTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTc3JTY5 JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTIwJTMxJTcw JTc4JTIwJTIxJTIwJTY5JTZEJTcwJTZGJTcyJTc0JTYxJTZFJTc0JTNCJTIyJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTcyJTZEJTIwJTZEJTY1JTc0 JTY4JTZGJTY0JTNEJTIyJTcwJTZGJTczJTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZD JTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTIyJTIwJTYxJTYzJTc0JTY5 JTZGJTZFJTNEJTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTY4JTYxJTZBJTZBJTYxJTZBJTY5 JTJFJTYzJTY5JTZCJTY5JTJFJTZEJTY1JTJGJTZDJTZGJTZCJTJFJTcwJTY4JTcwJTIyJTIw JTIwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1 JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTc0JTY5JTZEJTY1JTIyJTIwJTc2JTYxJTZD JTc1JTY1JTNEJTIyJTMxJTMzJTM3JTMyJTM4JTM2JTM5JTM5JTM0JTMzJTIyJTJGJTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZFJTcwJTc1JTc0JTIw JTc0JTc5JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIwJTZFJTYxJTZEJTY1 JTNEJTIyJTYxJTYzJTc0JTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTYxJTYzJTc0JTY5 JTZGJTZFJTUwJTYxJTcyJTU2JTYxJTZDJTY5JTY0JTYxJTc0JTY5JTZGJTZFJTQ1JTZFJTc0 JTcyJTY1JTY1JTIyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1 JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZGJTc1JTc0JTY5JTZDJTIyJTIwJTc2JTYx JTZDJTc1JTY1JTNEJTIyJTQ5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZG JTZFJTQ3JTcyJTYxJTcwJTY4JTY5JTcxJTc1JTY1JTIyJTJGJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTY1JTc0 JTYxJTcwJTY1JTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTMxJTIyJTJGJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0 JTc5JTcwJTY1JTNEJTIyJTY4JTY5JTY0JTY0JTY1JTZFJTIyJTIwJTZFJTYxJTZEJTY1JTNE JTIyJTYyJTZGJTc1JTc0JTZGJTZFJTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTY1JTcz JTcwJTY1JTYzJTY1JTIyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTY5JTZFJTcwJTc1JTc0JTIwJTc0JTc5JTcwJTY1JTNEJTY4JTY5JTY0JTY0JTY1 JTZFJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTYz JTY4JTM1JTIyJTJGJTNFJTBBJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIy JTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0 JTY4JTNEJTIyJTM0JTM5JTMwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTMxJTY1JTcy JTY1JTIwJTZDJTY5JTY3JTZFJTY1JTIwJTY4JTYxJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTYzJTZGJTY5JTZFJTIwJTY4JTYxJTc1 JTc0JTIwJTY3JTYxJTc1JTYzJTY4JTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0 JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTNFJTNDJTY5JTZE JTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTM3JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcw JTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZD JTY1JTY2JTc0JTVGJTc0JTZGJTcwJTVGJTYzJTZGJTcyJTZFJTY1JTcyJTJFJTcwJTZFJTY3 JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTY4JTYxJTc1JTc0JTIwJTY3JTYxJTc1JTYzJTY4 JTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5 JTY0JTc0JTY4JTNEJTIyJTM0JTM3JTMxJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYy JTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0 JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYy JTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJG JTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYzJTYx JTY0JTcyJTY1JTVGJTc0JTZGJTcwJTJFJTcwJTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1 JTYxJTc0JTJEJTc4JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1JTIw JTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNCJTIyJTNFJTNDJTJGJTc0JTY0 JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJE JTJEJTIwJTYzJTZGJTY5JTZFJTIwJTY4JTYxJTc1JTc0JTIwJTY0JTcyJTZGJTY5JTc0JTIw JTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0 JTY4JTNEJTIyJTM3JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNE JTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTIwJTYxJTZDJTc0JTNE JTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5 JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5 JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTcyJTY5JTY3JTY4JTc0JTVGJTc0JTZGJTcwJTVG JTYzJTZGJTcyJTZFJTY1JTcyJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTMyJTY1JTZEJTY1JTIwJTZDJTY5JTY3JTZF JTY1JTIwJTYzJTY1JTZFJTc0JTcyJTYxJTZDJTY1JTIwJTYzJTZGJTZFJTc0JTY1JTZFJTYx JTZFJTc0JTIwJTZDJTYxJTIwJTcwJTY4JTcyJTYxJTczJTY1JTIwJTJCJTIwJTZDJTI3JTY5 JTZFJTcwJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTc0JTcyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZC JTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcw JTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTY2JTY5JTcyJTczJTc0 JTVGJTczJTc0JTY1JTcwJTVGJTYyJTY3JTJFJTcwJTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcw JTY1JTYxJTc0JTJEJTc5JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1 JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNCJTIyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTYyJTZGJTcyJTY0JTIwJTY3JTYx JTc1JTYzJTY4JTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0 JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJG JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3 JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTZDJTY1JTY2JTc0JTJFJTY3JTY5JTY2JTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNB JTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJF JTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJF JTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYx JTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTcz JTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZF JTJGJTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTZDJTY1JTY2JTc0JTJFJTcw JTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1JTYxJTc0JTJEJTc5JTIwJTczJTYzJTcyJTZG JTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1 JTZFJTc0JTNCJTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTIxJTJEJTJEJTIwJTYzJTY1JTZFJTc0JTcyJTY1JTIwJTY3JTYxJTc1JTYzJTY4 JTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTZFJTc1JTZEJUU5JTcyJTZGJTIwJTMxJTIwJTJCJTIw JTcwJTY4JTcyJTYxJTczJTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTY4JTY1JTY5JTY3 JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZF JTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNE JTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0 JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMyJTcwJTc4JTNC JTIyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIw JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYx JTYyJTZDJTY1JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTYzJTY1 JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZD JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcy JTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTIw JTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTI1JTIyJTIwJTcz JTc0JTc5JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0 JTNBJTIwJTM4JTcwJTc4JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZEJTY3JTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZD JTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZE JTY3JTczJTJGJTY2JTY5JTcyJTczJTc0JTVGJTczJTc0JTY1JTcwJTJFJTcwJTZFJTY3JTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM2JTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0 JTNEJTIyJTMxJTM2JTIyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTc3JTY5 JTY0JTc0JTY4JTNEJTIyJTM5JTM3JTI1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2 JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIwJTMxJTMxJTcwJTc4JTNCJTIyJTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTI2JTZFJTYyJTczJTcwJTNCJTI2JTZFJTYyJTczJTcwJTNCJTI2JTZFJTYyJTcz JTcwJTNCJTUzJTYxJTY5JTczJTY5JTczJTczJTY1JTdBJTIwJTc2JTZGJTc0JTcyJTY1JTIw JTI2JTZFJTYyJTczJTcwJTNCJTZFJTc1JTZEJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTcy JTZGJTI2JTZFJTYyJTczJTcwJTNCJTYzJTZDJTY5JTY1JTZFJTc0JTI2JTZFJTYyJTczJTcw JTNCJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIwJTZDJTI3JTYxJTY5JTY0JTY1JTIwJTY0 JTc1JTI2JTZFJTYyJTczJTcwJTNCJTYzJTZDJTYxJTc2JTY5JTY1JTcyJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJG JTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJG JTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTIxJTJEJTJEJTIwJTZFJTc1JTZEJUU5JTcyJTZGJTIwJTYzJTZDJTY5JTY1JTZF JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMw JTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcyJTY5JTY3JTY4JTc0JTIyJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2 JTZGJTZFJTc0JTIwJTczJTY5JTdBJTY1JTNEJTIyJTMxJTIyJTIwJTY2JTYxJTYzJTY1JTNE JTIyJTQxJTcyJTY5JTYxJTZDJTJDJTIwJTQ4JTY1JTZDJTc2JTY1JTc0JTY5JTYzJTYxJTJD JTIwJTczJTYxJTZFJTczJTJEJTczJTY1JTcyJTY5JTY2JTIyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYyJTIwJTYz JTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTY0JTY1JTVGJTY3JTcyJTY1JTY1JTZFJTVGJTc0 JTY5JTc0JTZDJTY1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTRFJTc1JTZEJUU5JTcyJTZGJTIwJTYzJTZDJTY5 JTY1JTZFJTc0JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTYyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY2JTZGJTZFJTc0JTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0 JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTIxJTJEJTJEJTIwJTY5JTZFJTcwJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYz JTY1JTZFJTc0JTY1JTcyJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTZFJTc0JTIwJTY2JTYxJTYzJTY1JTNE JTIyJTQxJTcyJTY5JTYxJTZDJTJDJTIwJTQ4JTY1JTZDJTc2JTY1JTc0JTY5JTYzJTYxJTJD JTIwJTczJTYxJTZFJTczJTJEJTczJTY1JTcyJTY5JTY2JTIyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTUzJTQzJTUy JTQ5JTUwJTU0JTIwJTZDJTYxJTZFJTY3JTc1JTYxJTY3JTY1JTNEJTZBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYx JTc0JTZGJTcyJTJFJTYxJTcwJTcwJTRFJTYxJTZEJTY1JTIwJTIxJTNEJTIwJTIyJTREJTY5 JTYzJTcyJTZGJTczJTZGJTY2JTc0JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1 JTc4JTcwJTZDJTZGJTcyJTY1JTcyJTIyJTI5JTIwJTdCJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTY0JTZGJTYzJTc1 JTZEJTY1JTZFJTc0JTJFJTc3JTcyJTY5JTc0JTY1JTI4JTI3JTNDJTQ5JTRFJTUwJTU1JTU0 JTIwJTczJTY5JTdBJTY1JTNEJTIyJTMxJTMwJTIyJTIwJTI3JTI5JTNCJTIwJTdEJTIwJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTY1JTZDJTczJTY1JTIwJTdCJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0 JTJFJTc3JTcyJTY5JTc0JTY1JTI4JTI3JTNDJTQ5JTRFJTUwJTU1JTU0JTIwJTczJTY5JTdB JTY1JTNEJTIyJTMxJTMwJTIyJTIwJTI3JTI5JTNCJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTdEJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTUzJTQz JTUyJTQ5JTUwJTU0JTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTZEJTYxJTc4JTZDJTY1JTZFJTY3JTc0JTY4JTNEJTIy JTMxJTMwJTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTIyJTIwJTZFJTYxJTZEJTY1JTNE JTIyJTYzJTY4JTMxJTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTIyJTI2 JTY3JTc0JTNCJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTJGJTY2JTZGJTZFJTc0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYx JTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJE JTJEJTIwJTYyJTZGJTcyJTY0JTIwJTY0JTcyJTZGJTY5JTc0JTIwJTJEJTJEJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTczJTc0 JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1 JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1 JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1 JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZE JTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5 JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTcyJTY5JTY3JTY4JTc0JTJFJTY3JTY5 JTY2JTI3JTI5JTIwJTcyJTY1JTcwJTY1JTYxJTc0JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIw JTMwJTI1JTIwJTMwJTI1JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNC JTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIw JTZDJTY5JTY3JTZFJTY1JTIwJTY0JTc1JTIwJTYyJTYxJTczJTIwJTJEJTJEJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYz JTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcw JTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZDJTY1JTY2JTc0JTVG JTYzJTZGJTcyJTZFJTY1JTcyJTVGJTYyJTZGJTc0JTc0JTZGJTZEJTJFJTcwJTZFJTY3JTI3 JTI5JTIwJTZFJTZGJTJEJTcyJTY1JTcwJTY1JTYxJTc0JTIwJTczJTYzJTcyJTZGJTZDJTZD JTIwJTMwJTIwJTJEJTMxJTMyJTcwJTc4JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1 JTZFJTc0JTNCJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTM4JTcwJTc4JTNCJTc3JTY5JTY0JTc0 JTY4JTNBJTM3JTcwJTc4JTNCJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4 JTc0JTNEJTIyJTM4JTIyJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNEJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJG JTYzJTYxJTY0JTcyJTY1JTVGJTYyJTZGJTc0JTc0JTZGJTZEJTJFJTcwJTZFJTY3JTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNB JTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4 JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJG JTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTYyJTZGJTc0JTc0JTZGJTZEJTJF JTcwJTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1JTYxJTc0JTJEJTc4JTIwJTczJTYzJTcy JTZGJTZDJTZDJTIwJTMwJTIwJTJEJTMxJTMyJTcwJTc4JTIwJTc0JTcyJTYxJTZFJTczJTcw JTYxJTcyJTY1JTZFJTc0JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIy JTMyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTIyJTIwJTYxJTZDJTc0JTNE JTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5 JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5 JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTc0JTcyJTYxJTZFJTczJTcwJTJFJTY3JTY5JTY2 JTIyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTc1JTcyJTZD JTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJG JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3 JTczJTJGJTcyJTY5JTY3JTY4JTc0JTVGJTYzJTZGJTcyJTZFJTY1JTcyJTVGJTYyJTZGJTc0 JTc0JTZGJTZEJTJFJTcwJTZFJTY3JTI3JTI5JTIwJTZFJTZGJTJEJTcyJTY1JTcwJTY1JTYx JTc0JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIwJTMwJTIwJTJEJTMxJTMyJTcwJTc4JTIwJTc0 JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNCJTY4JTY1JTY5JTY3JTY4JTc0JTNB JTM4JTcwJTc4JTNCJTc3JTY5JTY0JTc0JTY4JTNBJTM3JTcwJTc4JTNCJTIyJTNFJTNDJTJG JTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJG JTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0 JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJG JTY2JTZGJTcyJTZEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY0 JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0 JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTZDJTYxJTIwJTY3JTcyJTY5JTZDJTZDJTY1 JTIwJTJCJTIwJTZDJTI3JTY5JTZFJTcwJTc1JTc0JTIwJTYzJTZGJTY0JTY1JTIwJTczJTY1 JTYzJTcyJTY1JTc0JTIwJTJCJTIwJTZDJTY1JTczJTIwJTYyJTZGJTc1JTc0JTZGJTZFJTcz JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTNDJTc0JTcyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTM0JTM5JTMwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTNDJTIxJTJEJTJEJTIwJTYyJTZGJTcyJTY0JTIwJTY3JTYxJTc1JTYzJTY4JTY1JTIwJTJE JTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNE JTIyJTZDJTY1JTY2JTc0JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2 JTc0JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJE JTcyJTY5JTY3JTY4JTc0JTNBJTIwJTM2JTcwJTc4JTNCJTIyJTIwJTYzJTZGJTZDJTczJTcw JTYxJTZFJTNEJTIyJTMxJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTY3JTcyJTY5JTZDJTZDJTY1JTIw JTJCJTIwJTY5JTZFJTcwJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTND JTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIw JTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTIwJTYzJTZGJTZDJTcz JTcwJTYxJTZFJTNEJTIyJTMxJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0JTY5 JTc2JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTYz JTZDJTYxJTczJTczJTNEJTIyJTcyJTc1JTYyJTcyJTY5JTcxJTc1JTY1JTIyJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTcz JTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0 JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMw JTIyJTIwJTYyJTY3JTYzJTZGJTZDJTZGJTcyJTNEJTIyJTIzJTY2JTY2JTY2JTY2JTY2JTY2 JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMzJTMwJTIyJTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIw JTYyJTZGJTcyJTY0JTc1JTcyJTY1JTIwJTY4JTYxJTc1JTc0JTY1JTIwJTJEJTJEJTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIy JTIwJTYxJTZDJTc0JTNEJTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcw JTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZDJTY1JTY2JTc0JTVG JTc0JTZGJTcwJTVGJTYzJTZGJTcyJTZFJTY1JTcyJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTND JTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIw JTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZG JTc1JTZFJTY0JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4 JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJG JTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTc0JTZGJTcwJTJFJTcwJTZFJTY3 JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMxJTM2JTIyJTIwJTczJTc0JTc5JTZD JTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTc1JTcyJTZDJTI4 JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcy JTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQx JTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTcz JTJGJTYzJTYxJTY0JTcyJTY1JTVGJTc0JTZGJTcwJTJFJTcwJTZFJTY3JTI3JTI5JTIwJTcy JTY1JTcwJTY1JTYxJTc0JTJEJTc4JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIwJTMwJTIwJTMw JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNCJTIyJTNFJTNDJTY5JTZE JTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTMxJTIyJTIwJTYxJTZDJTc0JTNEJTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcw JTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYz JTYxJTY0JTcyJTY1JTVGJTc0JTZGJTcwJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0 JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIy JTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZD JTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZE JTY3JTczJTJGJTcyJTY5JTY3JTY4JTc0JTVGJTc0JTZGJTcwJTVGJTYzJTZGJTcyJTZFJTY1 JTcyJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTY3JTcyJTY5JTZD JTZDJTY1JTIwJTJCJTIwJTY5JTZFJTcwJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTIxJTJEJTJEJTIwJTYzJTZGJTc0JUU5JTIwJTY3JTYxJTc1JTYzJTY4JTY1JTIw JTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYy JTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQx JTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZG JTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYz JTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTZD JTY1JTY2JTc0JTJFJTcwJTZFJTY3JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYx JTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0 JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZF JTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZB JTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0 JTcyJTY1JTVGJTZDJTY1JTY2JTc0JTJFJTcwJTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1 JTYxJTc0JTJEJTc5JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1JTIw JTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNCJTIyJTNFJTI2JTZFJTYyJTcz JTcwJTNCJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTIxJTJEJTJEJTIwJTY3JTcyJTY5JTZDJTZDJTY1JTIwJTJCJTIwJTY5JTZFJTcwJTc1JTc0 JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIw JTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1 JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0 JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYyJTY3JTYzJTZGJTZDJTZGJTcyJTNEJTIyJTIzJTY2 JTY2JTY2JTY2JTY2JTY2JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1 JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJE JTIwJUU5JTc0JTYxJTcwJTY1JTIwJTMyJTIwJTJCJTIwJTcwJTY4JTcyJTYxJTczJTY1JTIw JTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcy JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIw JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTIwJTc2JTYxJTZDJTY5JTY3 JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTIwJTYzJTZGJTZDJTczJTcwJTYxJTZFJTNEJTIyJTMz JTIyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNE JTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMw JTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNE JTIyJTM4JTI1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZF JTY3JTJEJTZDJTY1JTY2JTc0JTNBJTIwJTM4JTcwJTc4JTNCJTIyJTNFJTNDJTY5JTZEJTY3 JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTM2JTIyJTIwJTc3JTY5JTY0JTc0JTY4 JTNEJTIyJTMxJTM2JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQx JTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZG JTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYz JTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTczJTY1JTYzJTZGJTZFJTY0JTJE JTczJTc0JTY1JTcwJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIw JTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTM1JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNE JTIyJTM5JTMyJTI1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJE JTczJTY5JTdBJTY1JTNBJTIwJTMxJTMxJTcwJTc4JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTYx JTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTI2JTZFJTYyJTczJTcwJTNC JTI2JTZFJTYyJTczJTcwJTNCJTI2JTZFJTYyJTczJTcwJTNCJTQzJTZDJTY5JTcxJTc1JTY1 JTdBJTI2JTZFJTYyJTczJTcwJTNCJTcwJTZGJTc1JTcyJTI2JTZFJTYyJTczJTcwJTNCJTYz JTZGJTZEJTcwJTZGJTczJTY1JTcyJTI2JTZFJTYyJTczJTcwJTNCJTZDJTY1JTczJTI2JTZF JTYyJTczJTcwJTNCJTM2JTI2JTZFJTYyJTczJTcwJTNCJTYzJTY4JTY5JTY2JTY2JTcyJTY1 JTczJTI2JTZFJTYyJTczJTcwJTNCJTY0JTY1JTI2JTZFJTYyJTczJTcwJTNCJTc2JTZGJTc0 JTcyJTY1JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJE JTJEJTIwJTY3JTcyJTY5JTZDJTZDJTY1JTIwJTJCJTIwJTY5JTZFJTcwJTc1JTc0JTIwJTJE JTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIw JTY3JTcyJTY5JTZDJTZDJTY1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1 JTY2JTc0JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMzJTMzJTIyJTIwJTc2JTYx JTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIy JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0JTNBJTMxJTMwJTcwJTc4JTNC JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTM2JTcwJTc4JTNCJTIyJTNF JTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc1JTcz JTY1JTZEJTYxJTcwJTNEJTIyJTIzJTREJTYxJTcwJTQ3JTcyJTY5JTZDJTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTY2JTYyJTYzJTY0JTZFJTJEJTcz JTcwJTY4JTZGJTc0JTZGJTczJTJEJTY0JTJEJTYxJTJFJTYxJTZCJTYxJTZEJTYxJTY5JTY4 JTY0JTJFJTZFJTY1JTc0JTJGJTY4JTcwJTY4JTZGJTc0JTZGJTczJTJEJTYxJTZCJTJEJTYx JTczJTY4JTMzJTJGJTcxJTM3JTMxJTJGJTM5JTM5JTMzJTM2JTMyJTMyJTVGJTM2JTMxJTM4 JTM5JTMxJTMxJTM3JTM1JTM0JTM3JTM5JTM0JTMwJTMwJTMxJTVGJTMxJTM2JTMyJTM5JTMx JTM5JTM1JTMzJTM0JTM2JTVGJTZFJTJFJTZBJTcwJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0 JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJE JTIwJTZEJTY5JTZDJTY5JTY1JTc1JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcy JTY5JTY3JTY4JTc0JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM1JTIyJTIwJTc2JTYx JTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTY5JTZF JTcwJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1 JTcyJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMzJTMzJTIyJTIwJTc2JTYxJTZD JTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTcyJTZEJTIwJTZEJTY1JTc0JTY4JTZG JTY0JTNEJTIyJTcwJTZGJTczJTc0JTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTZDJTZGJTY3 JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTYyJTY5JTczJTIyJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZFJTcwJTc1JTc0 JTIwJTc0JTc5JTcwJTY1JTNEJTY4JTY5JTY0JTY0JTY1JTZFJTIwJTc2JTYxJTZDJTc1JTY1 JTNEJTIyJTIyJTIwJTZFJTYxJTZEJTY1JTNEJTIyJTYzJTY4JTM1JTc0JTY1JTZEJTcwJTIy JTJGJTNFJTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYx JTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMw JTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIw JTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIy JTMxJTMzJTMwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZF JTc0JTY1JTcyJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMxJTM2JTIyJTIwJTc2 JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTZFJTc0JTIw JTY2JTYxJTYzJTY1JTNEJTIyJTQxJTcyJTY5JTYxJTZDJTJDJTIwJTQ4JTY1JTZDJTc2JTY1 JTc0JTY5JTYzJTYxJTJDJTIwJTczJTYxJTZFJTczJTJEJTczJTY1JTcyJTY5JTY2JTIyJTIw JTYzJTZDJTYxJTczJTczJTNEJTIyJTY3JTcyJTYxJTczJTIyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY2JTZGJTZF JTc0JTIwJTczJTY5JTdBJTY1JTNEJTIyJTMyJTIyJTNFJTNDJTYyJTIwJTczJTc0JTc5JTZD JTY1JTNEJTIyJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTMwJTMwJTMwJTMwJTMwJTMwJTNCJTY2 JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTMxJTMyJTcwJTc4JTNCJTY2JTZGJTZFJTc0 JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTM5JTMwJTMwJTNCJTIyJTNFJTQzJTZGJTY0JTY1 JTIwJTczJTY1JTYzJTcyJTY1JTc0JTNDJTJGJTYyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTA5JTA5JTNDJTUzJTQzJTUyJTQ5JTUwJTU0JTIwJTZDJTYxJTZFJTY3JTc1JTYxJTY3JTY1 JTNEJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTA5JTA5 JTA5JTY5JTY2JTIwJTI4JTZFJTYxJTc2JTY5JTY3JTYxJTc0JTZGJTcyJTJFJTYxJTcwJTcw JTRFJTYxJTZEJTY1JTIwJTIxJTNEJTIwJTIyJTREJTY5JTYzJTcyJTZGJTczJTZGJTY2JTc0 JTIwJTQ5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTQ1JTc4JTcwJTZDJTZGJTcyJTY1JTcy JTIyJTI5JTIwJTdCJTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTc3JTcyJTY5JTc0 JTY1JTI4JTI3JTNDJTQ5JTRFJTUwJTU1JTU0JTIwJTczJTY5JTdBJTY1JTNEJTIyJTM1JTIy JTIwJTI3JTI5JTNCJTIwJTdEJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTA5JTA5JTY1JTZDJTczJTY1 JTIwJTdCJTIwJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTc3JTcyJTY5JTc0JTY1JTI4 JTI3JTNDJTQ5JTRFJTUwJTU1JTU0JTIwJTczJTY5JTdBJTY1JTNEJTIyJTMxJTMwJTIyJTIw JTI3JTI5JTNCJTIwJTdEJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTA5JTNDJTJGJTUzJTQzJTUyJTQ5 JTUwJTU0JTNFJTNDJTY5JTZFJTcwJTc1JTc0JTIwJTczJTY5JTdBJTY1JTNEJTIyJTM1JTIy JTIwJTZEJTYxJTc4JTZDJTY1JTZFJTY3JTc0JTY4JTNEJTIyJTM2JTIyJTIwJTZFJTYxJTZE JTY1JTNEJTIyJTYzJTY4JTMyJTIyJTIwJTc2JTYxJTZDJTc1JTY1JTNEJTIyJTIyJTIwJTIw JTI2JTY3JTc0JTNCJTNEJTIyJTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTcwJTYxJTczJTcz JTc3JTZGJTcyJTY0JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3 JTcyJTZGJTc1JTZFJTY0JTJEJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTQzJTMwJTQzJTMw JTQzJTMwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY2JTZGJTZF JTc0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYyJTcyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY2JTZGJTZFJTc0JTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTJGJTc0JTY0JTNFJTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIy JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3 JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMxJTM2JTIy JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTM4JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcy JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTRBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTNBJTUyJTY1JTQ5JTZFJTY5JTc0JTI4JTI5JTNCJTIyJTNFJTND JTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM5JTIyJTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYyJTZGJTc0 JTc0JTZGJTZEJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM5JTIyJTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMy JTcwJTc4JTNCJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJG JTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5 JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVG JTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1 JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYx JTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTc4JTYzJTZDJTY1JTYxJTZFJTJFJTcw JTZFJTY3JTIyJTNFJTNDJTJGJTYxJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYxJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIw JTMxJTMwJTcwJTc4JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0 JTY5JTZGJTZFJTNBJTIwJTc1JTZFJTY0JTY1JTcyJTZDJTY5JTZFJTY1JTNCJTIwJTYzJTZG JTZDJTZGJTcyJTNBJTIwJTcyJTY3JTYyJTI4JTMwJTJDJTIwJTMwJTJDJTIwJTMwJTI5JTNC JTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTRB JTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTUyJTY1JTQ5JTZFJTY5JTc0JTI4JTI5 JTNCJTIyJTNFJTIwJTY1JTY2JTY2JTYxJTYzJTY1JTcyJTNDJTJGJTYxJTNFJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0 JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY2JTZGJTcyJTZEJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTIxJTJEJTJEJTIwJTYzJTZGJTc0JUU5JTIwJTY0JTcyJTZGJTY5JTc0JTIwJTJE JTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTczJTc0 JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1 JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1 JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1 JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZE JTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5 JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTcyJTY5JTY3JTY4JTc0JTJFJTcwJTZF JTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1JTYxJTc0JTIwJTczJTYzJTcyJTZGJTZDJTZDJTIw JTMwJTI1JTIwJTMwJTI1JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcyJTY1JTZFJTc0JTNC JTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMy JTMwJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMw JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTIy JTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJF JTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJF JTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYx JTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTcz JTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZF JTJGJTY5JTZEJTY3JTczJTJGJTZDJTY1JTY2JTc0JTVGJTYzJTZGJTcyJTZFJTY1JTcyJTVG JTYyJTZGJTc0JTc0JTZGJTZEJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3 JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0 JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJG JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3 JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTYyJTZGJTc0JTc0JTZGJTZEJTJFJTcwJTZFJTY3 JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZF JTY0JTNBJTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5 JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5 JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYzJTYxJTY0JTcyJTY1JTVGJTYyJTZGJTc0JTc0 JTZGJTZEJTJFJTcwJTZFJTY3JTI3JTI5JTIwJTcyJTY1JTcwJTY1JTYxJTc0JTIwJTczJTYz JTcyJTZGJTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYx JTcyJTY1JTZFJTc0JTNCJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0 JTNEJTIyJTMyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTIyJTIwJTYxJTZD JTc0JTNEJTIyJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJG JTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5 JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVG JTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1 JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYx JTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTc0JTcyJTYxJTZFJTczJTcwJTJFJTY3 JTY5JTY2JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTNF JTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMyJTMwJTIyJTIwJTc3 JTY5JTY0JTc0JTY4JTNEJTIyJTM3JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZD JTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZE JTY3JTczJTJGJTcyJTY5JTY3JTY4JTc0JTVGJTYzJTZGJTcyJTZFJTY1JTcyJTVGJTYyJTZG JTc0JTc0JTZGJTZEJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTND JTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTYyJTZGJTc1 JTc0JTZGJTZFJTczJTIwJTJEJTJEJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIw JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcyJTY5JTY3JTY4JTc0JTIyJTIwJTc2JTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0 JTY5JTc2JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIw JTYzJTZDJTYxJTczJTczJTNEJTIyJTcyJTc1JTYyJTcyJTY5JTcxJTc1JTY1JTIyJTNFJTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTY4JTY1JTY5JTY3 JTY4JTc0JTNEJTIyJTMxJTM5JTM5JTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTc3JTY5 JTY0JTc0JTY4JTNEJTIyJTMxJTM5JTM3JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZE JTYxJTcyJTY3JTY5JTZFJTJEJTZDJTY1JTY2JTc0JTNBJTM2JTcwJTc4JTNCJTZEJTYxJTcy JTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTMyJTcwJTc4JTNCJTIyJTNFJTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYzJTZCJTY3JTcy JTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQx JTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZG JTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYz JTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZDJTZGJTY3JTVGJTYyJTY3JTJF JTcwJTZFJTY3JTI3JTI5JTIwJTZFJTZGJTJEJTcyJTY1JTcwJTY1JTYxJTc0JTIwJTczJTYz JTcyJTZGJTZDJTZDJTIwJTMwJTI1JTIwJTMwJTI1JTIwJTc0JTcyJTYxJTZFJTczJTcwJTYx JTcyJTY1JTZFJTc0JTNCJTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIy JTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTIwJTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3 JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTc0 JTZGJTcwJTIyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZF JTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNE JTIyJTMwJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNE JTIyJTM5JTM1JTI1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTc0JTcyJTNFJTIwJTBBJTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5 JTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMzJTI1JTIyJTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0JTNBJTIw JTM4JTcwJTc4JTNCJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNE JTIyJTMxJTM3JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM3JTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZD JTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZE JTY3JTczJTJGJTc0JTY4JTY5JTcyJTY0JTVGJTczJTc0JTY1JTcwJTJFJTcwJTZFJTY3JTIy JTNFJTNDJTJGJTc0JTY0JTNFJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTA5JTA5 JTA5JTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM5JTM3JTI1JTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIw JTMxJTMxJTcwJTc4JTNCJTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTI2JTZFJTYyJTczJTcw JTNCJTI2JTZFJTYyJTczJTcwJTNCJTQzJTY4JTZGJTY5JTczJTY5JTczJTczJTY1JTdBJTIw JTNBJTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBB JTA5JTA5JTA5JTA5JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTA5JTNDJTJGJTc0 JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTcy JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZD JTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBB JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0JTY5JTc2JTIwJTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTYyJTZDJTZGJTYzJTZCJTNCJTZEJTYxJTcy JTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTM1JTM3JTcwJTc4JTNCJTZEJTYx JTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTMxJTM0JTcwJTc4JTNCJTc2JTY5JTczJTY5 JTYyJTY5JTZDJTY5JTc0JTc5JTNBJTc2JTY5JTczJTY5JTYyJTZDJTY1JTNCJTIyJTIwJTY5 JTY0JTNEJTIyJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTZBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTNBJTc2JTYxJTZDJTY5JTY0JTY1JTcyJTMyJTI4JTI5JTNC JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0 JTZGJTZEJTNBJTIwJTM0JTcwJTc4JTNCJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0 JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZF JTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZB JTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTYxJTYzJTZG JTc1JTZFJTc0JTVGJTYxJTYzJTYzJTY1JTczJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJG JTYxJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYyJTcyJTJGJTNFJTBBJTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTZBJTYx JTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTc2JTYxJTZDJTY5JTY0JTY1JTcyJTI4JTI3 JTc0JTY5JTc0JTcyJTY1JTI3JTI5JTNCJTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcy JTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcy JTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTIwJTM0JTcwJTc4JTNCJTIyJTIw JTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4 JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJG JTY5JTZEJTY3JTczJTJGJTY5JTZFJTc2JTVGJTYxJTYzJTYzJTY1JTczJTJFJTcwJTZFJTY3 JTIyJTJGJTNFJTNDJTJGJTYxJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYyJTcyJTJGJTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTYxJTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTNBJTc2JTYxJTZDJTY5 JTY0JTY1JTcyJTI4JTI3JTZEJTY1JTczJTczJTYxJTY3JTY1JTcyJTY5JTY1JTI3JTI5JTNC JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0 JTZGJTZEJTNBJTIwJTM0JTcwJTc4JTNCJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0 JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZF JTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZB JTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZEJTYxJTY5 JTZDJTVGJTYxJTYzJTYzJTY1JTczJTJFJTcwJTZFJTY3JTIyJTJGJTNFJTNDJTJGJTYxJTNF JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY0JTY5 JTc2JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTY5 JTY0JTNEJTIyJTY5JTZFJTYxJTYzJTc0JTY5JTc2JTY1JTIyJTIwJTczJTc0JTc5JTZDJTY1 JTNEJTIyJTc2JTY5JTczJTY5JTYyJTY5JTZDJTY5JTc0JTc5JTNBJTY4JTY5JTY0JTY0JTY1 JTZFJTNCJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTZFJTZGJTZFJTY1JTNCJTZEJTYxJTcy JTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTM1JTM3JTcwJTc4JTNCJTZEJTYx JTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTMxJTM0JTcwJTc4JTNCJTIyJTNFJTBBJTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5JTZEJTY3JTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNB JTIwJTM0JTcwJTc4JTNCJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIw JTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4 JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJG JTY5JTZEJTY3JTczJTJGJTYxJTYzJTZGJTc1JTZFJTc0JTVGJTYxJTYzJTYzJTY1JTczJTJF JTcwJTZFJTY3JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTND JTYyJTcyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTY5 JTZEJTY3JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYy JTZGJTc0JTc0JTZGJTZEJTNBJTIwJTM0JTcwJTc4JTNCJTIyJTIwJTYyJTZGJTcyJTY0JTY1 JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJG JTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcy JTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQx JTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTczJTcwJTJGJTZG JTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYz JTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTY5JTZFJTc2JTVGJTYxJTYzJTYz JTY1JTczJTJFJTcwJTZFJTY3JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTNDJTYyJTcyJTJGJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTNDJTY5JTZEJTY3JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTZEJTYxJTcyJTY3JTY5 JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTIwJTM0JTcwJTc4JTNCJTIyJTIwJTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcw JTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcw JTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTZBJTcz JTcwJTJGJTZGJTc1JTc0JTY5JTZDJTczJTc4JTZEJTZDJTJGJTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTJGJTY5JTZEJTY3JTczJTJGJTZEJTYxJTY5JTZD JTVGJTYxJTYzJTYzJTY1JTczJTJFJTcwJTZFJTY3JTIyJTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTA5JTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTBBJTA5JTA5 JTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTA5 JTA5JTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJG JTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTA5JTNDJTJGJTY0JTY5JTc2 JTNFJTBBJTA5JTA5JTA5JTA5JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTA5JTA5JTA5JTND JTJGJTc0JTcyJTNFJTBBJTA5JTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTA5 JTA5JTNDJTJGJTc0JTY0JTNFJTBBJTA5JTNDJTJGJTc0JTcyJTNFJTBBJTNDJTJGJTc0JTYx JTYyJTZDJTY1JTNFJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIy JTNFJTBBJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTJFJTYzJTY4JTMxJTJFJTY2JTZGJTYzJTc1JTczJTI4JTI5 JTNCJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTJFJTcyJTY1JTczJTY1JTc0JTI4JTI5JTNCJTBBJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTZDJTZGJTY3JTY5JTZFJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTYyJTY5JTczJTJFJTcyJTY1JTczJTY1JTc0JTI4JTI5JTNCJTBBJTNDJTJGJTczJTYz JTcyJTY5JTcwJTc0JTNFJTBBJTBBJTBBJTBBJTBBJTNDJTJGJTYzJTY1JTZFJTc0JTY1JTcy JTNFJTIwJTNDJTczJTc0JTc5JTZDJTY1JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4 JTc0JTJGJTYzJTczJTczJTIyJTNFJTIzJTc2JTY2JTUwJTZGJTcwJTY5JTZFJTQzJTZGJTZF JTc0JTYxJTY5JTZFJTY1JTcyJTIwJTdCJTIwJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTIw JTZFJTZGJTZFJTY1JTNCJTc3JTY5JTY0JTc0JTY4JTNBJTIwJTM1JTM0JTM1JTcwJTc4JTNC JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTMzJTM1JTMwJTcwJTc4JTNCJTIwJTcwJTZGJTcz JTY5JTc0JTY5JTZGJTZFJTNBJTIwJTYxJTYyJTczJTZGJTZDJTc1JTc0JTY1JTNCJTc0JTZG JTcwJTNBJTIwJTM1JTMwJTI1JTNCJTZDJTY1JTY2JTc0JTNBJTIwJTM1JTMwJTI1JTNCJTdB JTJEJTY5JTZFJTY0JTY1JTc4JTNBJTIwJTMxJTMwJTMwJTNCJTZEJTYxJTcyJTY3JTY5JTZF JTNBJTIwJTJEJTMxJTM3JTM1JTcwJTc4JTIwJTMwJTIwJTMwJTIwJTJEJTMyJTM3JTM1JTcw JTc4JTNCJTdEJTIzJTY5JTY2JTcyJTZEJTIwJTdCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTIw JTM2JTMwJTMwJTcwJTc4JTNCJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTM0JTMyJTMwJTcw JTc4JTNCJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMwJTNCJTIwJTZGJTc2JTY1JTcyJTY2 JTZDJTZGJTc3JTNBJTY4JTY5JTY0JTY0JTY1JTZFJTNCJTYyJTYxJTYzJTZCJTY3JTcyJTZG JTc1JTZFJTY0JTJEJTYzJTZGJTZDJTZGJTcyJTNBJTc0JTcyJTYxJTZFJTczJTcwJTYxJTcy JTY1JTZFJTc0JTNCJTdEJTJGJTJBJTIwJTIwJTZEJTY5JTczJTY1JTIwJTY1JTZFJTIwJTcw JTZDJTYxJTYzJTY1JTIwJTczJTc1JTIwJTc2JTY2JTZEJTYxJTczJTZCJTJBJTJGJTIzJTc2 JTY2JTREJTYxJTczJTZCJTIwJTdCJTIwJTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTYx JTYyJTczJTZGJTZDJTc1JTc0JTY1JTNCJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZF JTY0JTJEJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTY2JTY2JTY2JTNCJTIwJTc0JTZGJTcwJTNB JTMwJTcwJTc4JTNCJTIwJTZDJTY1JTY2JTc0JTNBJTMwJTNCJTIwJTc3JTY5JTY0JTc0JTY4 JTNBJTMxJTMwJTMwJTI1JTNCJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTMxJTMwJTMwJTI1 JTNCJTIwJTZGJTcwJTYxJTYzJTY5JTc0JTc5JTNBJTMwJTJFJTM4JTNCJTIwJTdBJTJEJTY5 JTZFJTY0JTY1JTc4JTNBJTMxJTMwJTNCJTIwJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTZF JTZGJTZFJTY1JTNCJTdEJTJBJTIwJTY4JTc0JTZEJTZDJTIwJTIzJTc2JTY2JTREJTYxJTcz JTZCJTIwJTdCJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTMwJTMwJTMwJTcwJTc4JTNCJTdEJTIz JTc2JTY2JTUwJTZGJTcwJTY5JTZFJTQzJTZGJTZFJTc0JTYxJTY5JTZFJTY1JTcyJTIwJTJF JTc2JTY2JTQzJTZDJTZGJTczJTY1JTIwJTdCJTIwJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTc3 JTY4JTY5JTc0JTY1JTNCJTY2JTZGJTZFJTc0JTJEJTY2JTYxJTZEJTY5JTZDJTc5JTNBJTIw JTI3JTQyJTRFJTUwJTUwJTUzJTYxJTZFJTczJTUyJTY1JTY3JTc1JTZDJTYxJTcyJTI3JTJD JTQxJTcyJTY5JTYxJTZDJTJDJTQ4JTY1JTZDJTc2JTY1JTc0JTY5JTYzJTYxJTJDJTczJTYx JTZFJTczJTJEJTczJTY1JTcyJTY5JTY2JTNCJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1 JTNBJTIwJTMxJTMzJTcwJTc4JTNCJTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTIwJTYx JTYyJTczJTZGJTZDJTc1JTc0JTY1JTNCJTcyJTY5JTY3JTY4JTc0JTNBJTIwJTJEJTMxJTMz JTcwJTc4JTNCJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZF JTNBJTIwJTZFJTZGJTZFJTY1JTNCJTc0JTZGJTcwJTNBJTIwJTM0JTMwJTcwJTc4JTNCJTIw JTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTYyJTZGJTZDJTY0JTNCJTdE JTJBJTIwJTY4JTc0JTZEJTZDJTIwJTIzJTc2JTY2JTUwJTZGJTcwJTY5JTZFJTQzJTZGJTZF JTc0JTYxJTY5JTZFJTY1JTcyJTIwJTJFJTc2JTY2JTQzJTZDJTZGJTczJTY1JTIwJTdCJTIw JTcyJTY5JTY3JTY4JTc0JTNBJTM0JTMwJTcwJTc4JTNCJTc0JTZGJTcwJTNBJTM0JTMwJTcw JTc4JTNCJTdEJTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTIwJTBBJTNDJTY0JTY5JTc2JTIw JTY5JTY0JTNEJTIyJTc2JTY2JTUwJTZGJTcwJTY5JTZFJTQzJTZGJTZFJTc0JTYxJTY5JTZF JTY1JTcyJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTc2JTY2JTQzJTZDJTZGJTczJTY1JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTIzJTIy JTIwJTc0JTY5JTc0JTZDJTY1JTNEJTIyJTQ2JTY1JTcyJTZEJTY1JTcyJTIwJTYzJTY1JTc0 JTc0JTY1JTIwJTY2JTY1JTZFJTc0JTcyJTY1JTIyJTNFJTU4JTNDJTJGJTYxJTNFJTBBJTIw JTIwJTIwJTIwJTNDJTY5JTY2JTcyJTYxJTZEJTY1JTIwJTY2JTcyJTYxJTZEJTY1JTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTY5JTY0JTNEJTIyJTY5JTY2JTcyJTZEJTIy JTIwJTczJTYzJTcyJTZGJTZDJTZDJTY5JTZFJTY3JTNEJTIyJTZFJTZGJTIyJTIwJTczJTcy JTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTZGJTY2JTY2JTcyJTY1JTczJTJE JTczJTcwJTY1JTYzJTY5JTYxJTZDJTY1JTczJTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYy JTYxJTczJTJFJTZFJTY1JTc0JTJGJTc3JTY1JTZDJTYzJTZGJTZEJTY1JTcwJTYxJTYzJTZC JTYyJTZFJTcwJTJGJTcwJTZGJTcwJTY5JTZFJTJFJTY4JTc0JTZEJTZDJTIyJTNFJTNDJTJG JTY5JTY2JTcyJTYxJTZEJTY1JTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTY0JTY5 JTc2JTIwJTY5JTY0JTNEJTIyJTc2JTY2JTREJTYxJTczJTZCJTIyJTNFJTNDJTJGJTY0JTY5 JTc2JTNFJTIwJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTczJTcyJTYzJTNEJTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTcyJTczJTYz JTJGJTUzJTY5JTZEJTc1JTVGJTQ1JTcwJTYxJTcyJTY3JTZFJTY1JTJGJTZBJTcxJTc1JTY1 JTcyJTc5JTJEJTMxJTJFJTM3JTJFJTMxJTJFJTZEJTY5JTZFJTJFJTZBJTczJTIyJTIwJTc0 JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5 JTcwJTc0JTIyJTNFJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTIwJTNDJTczJTYzJTcy JTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2 JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTNDJTIxJTJEJTJEJTBBJTZBJTUxJTc1JTY1 JTcyJTc5JTJFJTZFJTZGJTQzJTZGJTZFJTY2JTZDJTY5JTYzJTc0JTI4JTI5JTNCJTZBJTUx JTc1JTY1JTcyJTc5JTI4JTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTI4JTI0JTI5JTdCJTc2 JTYxJTcyJTIwJTc3JTQ4JTY1JTY5JTY3JTY4JTc0JTIwJTNEJTIwJTI0JTI4JTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTI5JTJFJTY4JTY1JTY5JTY3JTY4JTc0JTI4JTI5JTNCJTI0JTI4 JTI3JTIzJTc2JTY2JTREJTYxJTczJTZCJTI3JTI5JTJFJTYzJTczJTczJTI4JTdCJTI3JTY4 JTY1JTY5JTY3JTY4JTc0JTI3JTNBJTc3JTQ4JTY1JTY5JTY3JTY4JTc0JTJCJTI3JTcwJTc4 JTI3JTJDJTI3JTZGJTcwJTYxJTYzJTY5JTc0JTc5JTI3JTNBJTI3JTMwJTJFJTM4JTI3JTdE JTI5JTNCJTI0JTI4JTI3JTJFJTZGJTcwJTY1JTZFJTUwJTZGJTcwJTY5JTZFJTc2JTY2JTI3 JTI5JTJFJTYzJTZDJTY5JTYzJTZCJTI4JTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTI4JTY1 JTI5JTdCJTY1JTJFJTcwJTcyJTY1JTc2JTY1JTZFJTc0JTQ0JTY1JTY2JTYxJTc1JTZDJTc0 JTNCJTI0JTI4JTI3JTIzJTc2JTY2JTREJTYxJTczJTZCJTJDJTIzJTc2JTY2JTUwJTZGJTcw JTY5JTZFJTQzJTZGJTZFJTc0JTYxJTY5JTZFJTY1JTcyJTI3JTI5JTJFJTY2JTYxJTY0JTY1 JTQ5JTZFJTI4JTMzJTMwJTMwJTI5JTNCJTdEJTI5JTNCJTI0JTI4JTI3JTJFJTc2JTY2JTQz JTZDJTZGJTczJTY1JTJDJTIzJTc2JTY2JTREJTYxJTczJTZCJTI3JTI5JTJFJTYzJTZDJTY5 JTYzJTZCJTI4JTY2JTc1JTZFJTYzJTc0JTY5JTZGJTZFJTI4JTI5JTdCJTI0JTI4JTI3JTIz JTc2JTY2JTREJTYxJTczJTZCJTJDJTIzJTc2JTY2JTUwJTZGJTcwJTY5JTZFJTQzJTZGJTZF JTc0JTYxJTY5JTZFJTY1JTcyJTI3JTI5JTJFJTY4JTY5JTY0JTY1JTI4JTI5JTNCJTdEJTI5 JTNCJTdEJTI5JTNCJTBBJTJGJTJGJTJEJTJEJTNFJTBBJTNDJTJGJTczJTYzJTcyJTY5JTcw JTc0JTNFJTIwJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNB JTJGJTJGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTZFJTY1JTc0JTJFJTczJTZG JTZDJTc1JTc0JTY5JTZGJTZFJTJFJTc3JTY1JTYyJTZGJTcyJTYxJTZEJTYxJTJFJTY2JTcy JTJGJTY2JTYzJTY3JTY5JTJEJTYyJTY5JTZFJTJGJTcwJTY1JTcyJTY2JTZGJTcyJTZEJTYx JTZFJTYzJTY1JTJFJTY2JTYzJTY3JTY5JTNGJTQ5JTQ0JTNEJTMxJTM0JTM0JTMwJTM5JTMy JTI2JTQxJTNEJTMxJTI2JTRDJTNEJTM3JTM3JTM2JTM4JTMyJTM5JTI2JTQzJTNEJTMxJTM1 JTM5JTMwJTMzJTI2JTY2JTNEJTMxJTMzJTI2JTUwJTNEJTM0JTM1JTM0JTMzJTI2JTU0JTNE JTQxJTI2JTU1JTUyJTRDJTIyJTIwJTc0JTY5JTc0JTZDJTY1JTNEJTIyJTQxJTczJTczJTc1 JTcyJTYxJTZFJTYzJTY1JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYxJTZDJTc0JTNEJTIyJTRE JTUyJTQ4JTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTM2JTM1JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMw JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3 JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1 JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJG JTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTM0JTM3JTM5JTc4JTM2 JTM1JTVGJTU2JTQ2JTVGJTREJTUyJTQ4JTVGJTQ4JTUwJTQxJTVGJTMyJTMwJTMxJTMzJTMw JTM2JTMyJTMxJTMwJTM2JTMyJTMyJTMzJTMyJTJFJTY3JTY5JTY2JTIyJTIwJTc2JTczJTcw JTYxJTYzJTY1JTNEJTIyJTMxJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM0JTM3 JTM5JTIyJTNFJTNDJTJGJTYxJTNFJTIwJTBBJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3 JTNEJTIyJTMxJTMwJTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcy JTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNF JTBBJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBB JTBBJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTY0JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJG JTc0JTcyJTNFJTBBJTBBJTBBJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTNDJTJGJTY0 JTY5JTc2JTNFJTNDJTJGJTc0JTY0JTNFJTNDJTc0JTY0JTIwJTc3JTY5JTY0JTc0JTY4JTNE JTIyJTMzJTM0JTI1JTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZDJTMyJTIy JTNFJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY1JTZFJTYzJTYxJTcy JTc0JTQzJTZGJTZDJTU2JTY5JTY0JTY1JTIyJTNFJTNDJTczJTc0JTc5JTZDJTY1JTIwJTc0 JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTNFJTIzJTYzJTZG JTY0JTY1JTczJTIwJTc1JTZDJTJDJTIwJTIzJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5 JTZDJTY5JTc0JTY1JTIwJTc1JTZDJTJDJTIwJTIzJTZEJTZGJTYyJTY5JTZDJTY5JTc0JTY1 JTIwJTc1JTZDJTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIw JTM4JTcwJTc4JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNB JTIwJTMwJTNCJTA5JTBBJTdEJTBBJTBBJTIzJTYzJTZGJTY0JTY1JTczJTIwJTZDJTY5JTJD JTIwJTIzJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTY1JTIwJTZDJTY5 JTJDJTIwJTIzJTZEJTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIwJTZDJTY5JTIwJTdCJTBBJTA5 JTZDJTY5JTczJTc0JTJEJTczJTc0JTc5JTZDJTY1JTNBJTIwJTZFJTZGJTZFJTY1JTNCJTBB JTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0JTNBJTIwJTM0JTcwJTc4 JTNCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTM1JTcwJTc4 JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMwJTcw JTc4JTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcy JTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5 JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMxJTMxJTc4JTMxJTMzJTVG JTYyJTc1JTZDJTZDJTY1JTc0JTVGJTMyJTMwJTMxJTMwJTMxJTMyJTMyJTMyJTMwJTM0JTMx JTM1JTMzJTM4JTJFJTZBJTcwJTY3JTIyJTI5JTIwJTZFJTZGJTJEJTcyJTY1JTcwJTY1JTYx JTc0JTIwJTMwJTIwJTMzJTcwJTc4JTIwJTNCJTBBJTA5JTA5JTA5JTZDJTY5JTZFJTY1JTJE JTY4JTY1JTY5JTY3JTY4JTc0JTNBJTMxJTM1JTMwJTI1JTNCJTBBJTdEJTBBJTBBJTBBJTBB JTIzJTYzJTZGJTY0JTY1JTczJTIwJTZDJTY5JTIwJTYxJTJDJTIwJTIzJTYxJTYzJTYzJTY1 JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTY1JTIwJTZDJTY5JTIwJTYxJTIwJTdCJTBBJTA5 JTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTIwJTYyJTZDJTZGJTYzJTZCJTNCJTBBJTA5JTc3 JTY5JTY0JTc0JTY4JTNBJTIwJTMyJTMwJTMwJTcwJTc4JTNCJTBBJTA5JTA5JTYzJTZGJTZD JTZGJTcyJTNBJTIwJTYyJTZDJTYxJTYzJTZCJTNCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZF JTJEJTc0JTZGJTcwJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZF JTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMyJTcwJTc4JTNCJTBBJTA5JTZEJTYxJTcyJTY3JTY5 JTZFJTJEJTZDJTY1JTY2JTc0JTNBJTIwJTMxJTMwJTcwJTc4JTNCJTBBJTdEJTBBJTIwJTIz JTZEJTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIwJTZDJTY5JTIwJTYxJTIwJTIwJTdCJTBBJTA5 JTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTIwJTYyJTZDJTZGJTYzJTZCJTNCJTBBJTA5JTYz JTZGJTZDJTZGJTcyJTNBJTIwJTYyJTZDJTYxJTYzJTZCJTNCJTBBJTA5JTZEJTYxJTcyJTY3 JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTA5JTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMyJTcwJTc4JTNCJTBBJTA5JTZEJTYxJTcy JTY3JTY5JTZFJTJEJTZDJTY1JTY2JTc0JTNBJTIwJTMxJTMwJTcwJTc4JTNCJTBBJTdEJTBB JTIzJTZEJTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIwJTJFJTc0JTY5JTc0JTcyJTY1JTIwJTdC JTBBJTA5JTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMyJTM0JTM0JTcwJTc4JTNCJTBBJTA5JTY4 JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMzJTM3JTcwJTc4JTNCJTBBJTA5JTBBJTA5JTc0JTY1 JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTYzJTY1JTZFJTc0JTY1JTcyJTNCJTBB JTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZDJTI4JTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1 JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTM0JTMwJTc4JTMyJTY2JTY0JTVGJTY4JTY1 JTYxJTY0JTY1JTcyJTVGJTMyJTMwJTMxJTMxJTMwJTMxJTMyJTM0JTMwJTM5JTM0JTMxJTM0 JTM4JTJFJTY3JTY5JTY2JTIyJTI5JTNCJTA5JTdEJTBBJTIzJTYzJTZGJTY0JTY1JTczJTIw JTJFJTc0JTY5JTc0JTcyJTY1JTIwJTdCJTBBJTA5JTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMy JTM0JTM0JTcwJTc4JTNCJTBBJTA5JTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMzJTM3JTcw JTc4JTNCJTBBJTA5JTBBJTA5JTc0JTY1JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIw JTYzJTY1JTZFJTc0JTY1JTcyJTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZF JTY0JTNBJTIwJTc1JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3 JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYx JTczJTJFJTZFJTY1JTc0JTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYy JTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMy JTM0JTM0JTc4JTMzJTM3JTVGJTY4JTY1JTYxJTY0JTY1JTcyJTVGJTYzJTZGJTY0JTY1JTVG JTMyJTMwJTMxJTMwJTMxJTMyJTMyJTMyJTMwJTM0JTMxJTM2JTMyJTM5JTJFJTZBJTcwJTY3 JTIyJTI5JTNCJTA5JTBBJTdEJTBBJTIzJTYzJTZGJTY0JTY1JTczJTIwJTJFJTc0JTY5JTc0 JTcyJTY1JTIwJTc0JTY0JTIwJTdCJTBBJTA5JTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3 JTY4JTc0JTNBJTIwJTYyJTZGJTZDJTY0JTNCJTA5JTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZF JTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTBBJTdEJTBBJTBBJTIzJTZE JTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIwJTJFJTc0JTY5JTc0JTcyJTY1JTIwJTc0JTY0JTIw JTdCJTBBJTA5JTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTYyJTZG JTZDJTY0JTNCJTA5JTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNB JTIwJTMwJTcwJTc4JTNCJTBBJTBBJTdEJTBBJTBBJTIzJTYxJTYzJTYzJTY1JTczJTczJTY5 JTYyJTY5JTZDJTY5JTc0JTY1JTJDJTBBJTIzJTYzJTZGJTY0JTY1JTczJTJDJTBBJTIzJTZE JTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIwJTdCJTBBJTA5JTY0JTY5JTczJTcwJTZDJTYxJTc5 JTNBJTIwJTYyJTZDJTZGJTYzJTZCJTNCJTBBJTA5JTcwJTZGJTczJTY5JTc0JTY5JTZGJTZF JTNBJTIwJTcyJTY1JTZDJTYxJTc0JTY5JTc2JTY1JTNCJTBBJTA5JTY2JTZDJTZGJTYxJTc0 JTNBJTIwJTZDJTY1JTY2JTc0JTNCJTIwJTBBJTA5JTYzJTZDJTY1JTYxJTcyJTNBJTIwJTYy JTZGJTc0JTY4JTNCJTA5JTBBJTc3JTY5JTY0JTc0JTY4JTIwJTNBJTIwJTMyJTM0JTM0JTcw JTc4JTBBJTdEJTBBJTIzJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTY1 JTIwJTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMxJTMw JTcwJTc4JTNCJTA5JTBBJTdEJTBBJTIzJTYzJTZGJTY0JTY1JTczJTIwJTdCJTBBJTA5JTZE JTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMxJTMwJTcwJTc4JTNCJTA5JTBB JTdEJTBBJTIzJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTY1JTIwJTJF JTc0JTY5JTc0JTcyJTY1JTIwJTdCJTBBJTA5JTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMyJTM0 JTM0JTcwJTc4JTNCJTBBJTA5JTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMzJTM3JTcwJTc4 JTNCJTBBJTA5JTBBJTA5JTc0JTY1JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTZD JTY1JTY2JTc0JTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIw JTc1JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTcz JTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZF JTY1JTc0JTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYz JTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMyJTM0JTM0JTc4 JTMzJTM3JTVGJTY4JTY1JTYxJTY0JTY1JTcyJTVGJTYxJTYzJTYzJTY1JTczJTczJTY5JTYy JTY5JTZDJTY5JTc0JTY1JTVGJTMyJTMwJTMxJTMwJTMxJTMyJTMyJTMyJTMwJTM0JTMxJTM3 JTMwJTM0JTJFJTZBJTcwJTY3JTIyJTI5JTNCJTA5JTBBJTdEJTBBJTIzJTYxJTYzJTYzJTY1 JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTY1JTIwJTJFJTc0JTY5JTc0JTcyJTY1JTIwJTc0 JTY0JTIwJTdCJTBBJTA5JTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTIw JTYyJTZGJTZDJTY0JTNCJTA5JTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZG JTcwJTNBJTIwJTMwJTcwJTc4JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZD JTY1JTY2JTc0JTNBJTIwJTMxJTM1JTcwJTc4JTNCJTBBJTdEJTBBJTBBJTIzJTZEJTZGJTYy JTY5JTZDJTY5JTc0JTY1JTIwJTJFJTc0JTY5JTc0JTcyJTY1JTIwJTc0JTY0JTIwJTdCJTBB JTA5JTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTYyJTZGJTZDJTY0 JTNCJTA5JTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTc0JTZGJTcwJTNBJTIwJTMw JTcwJTc4JTNCJTBBJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0JTNB JTIwJTMxJTM1JTcwJTc4JTNCJTBBJTdEJTBBJTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTQ1 JTZFJTYzJTYxJTcyJTc0JTQ0JTcyJTZGJTY5JTc0JTIwJTdCJTBBJTA5JTY2JTZDJTZGJTYx JTc0JTNBJTIwJTZDJTY1JTY2JTc0JTNCJTBBJTA5JTYzJTZDJTY1JTYxJTcyJTNBJTIwJTYy JTZGJTc0JTY4JTNCJTBBJTA5JTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMyJTM0JTM0JTcwJTc4 JTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIwJTc1JTcyJTZD JTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZD JTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMyJTM0JTM0JTc4JTM5JTVGJTYy JTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTVGJTMyJTMwJTMxJTMwJTMxJTMyJTMyJTMy JTMwJTM0JTMxJTM3JTM0JTM1JTJFJTZBJTcwJTY3JTIyJTI5JTNCJTBBJTA5JTBBJTA5JTY2 JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIwJTMxJTMxJTcwJTc4JTNCJTBBJTdEJTBB JTBBJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTQ1JTZFJTYzJTYxJTcyJTc0JTQ0JTcyJTZGJTY5 JTc0JTIwJTdCJTBBJTA5JTY2JTZDJTZGJTYxJTc0JTNBJTIwJTZDJTY1JTY2JTc0JTNCJTBB JTA5JTYzJTZDJTY1JTYxJTcyJTNBJTIwJTYyJTZGJTc0JTY4JTNCJTBBJTA5JTc3JTY5JTY0 JTc0JTY4JTNBJTIwJTMyJTM0JTM0JTcwJTc4JTNCJTBBJTA5JTY4JTY1JTY5JTY3JTY4JTc0 JTNBJTIwJTM0JTcwJTc4JTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0 JTNBJTIwJTc1JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3 JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZD JTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMyJTM0 JTM0JTc4JTM0JTVGJTY2JTZGJTZGJTc0JTY1JTcyJTVGJTMyJTMwJTMxJTMwJTMxJTMyJTMy JTMyJTMwJTM0JTMxJTM4JTMwJTM4JTJFJTZBJTcwJTY3JTIyJTI5JTNCJTBBJTA5JTZGJTc2 JTY1JTcyJTY2JTZDJTZGJTc3JTNBJTIwJTY4JTY5JTY0JTY0JTY1JTZFJTNCJTBBJTA5JTZD JTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTBBJTdEJTND JTJGJTczJTc0JTc5JTZDJTY1JTNFJTIwJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTcz JTczJTNEJTIyJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZDJTU2JTY5JTY0JTY1JTIyJTNF JTBBJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcy JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIy JTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIy JTIwJTY5JTY0JTNEJTIyJTZEJTZGJTYyJTY5JTZDJTY5JTc0JTY1JTIyJTNFJTBBJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTc0JTY5JTc0JTcyJTY1JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTU2JTZGJTczJTIwJTYzJTZGJTZEJTcwJTc0JTY1 JTczJTIwJTY0JTY1JTcwJTc1JTY5JTczJTIwJTc2JTZGJTc0JTcyJTY1JTIwJTZEJTZGJTYy JTY5JTZDJTY1JTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcy JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTQ1JTZFJTYz JTYxJTcyJTc0JTQ0JTcyJTZGJTY5JTc0JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIy JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIw JTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1 JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTNFJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYz JTZGJTZDJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcyJTY5JTY3JTY4JTc0JTIyJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZG JTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZD JTY1JTY2JTc0JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1 JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcy JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTU2JTZGJTczJTVGJTYz JTZGJTZEJTcwJTc0JTY1JTczJTVGJTczJTc1JTcyJTVGJTREJTZGJTYyJTY5JTZDJTY1JTVG JTMyJTMwJTMxJTMxJTMwJTM2JTMwJTMxJTMwJTM3JTMyJTMxJTMzJTM0JTIyJTNFJTU0JTY1 JTZDJTY1JTYzJTY4JTYxJTcyJTY3JTY1JTdBJTIwJTZDJTI3JTYxJTcwJTcwJTZDJTY5JTIw JTNDJTYyJTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIy JTc2JTY1JTcyJTc0JTIyJTNFJTNDJTYyJTNFJTREJTY1JTczJTIwJTYzJTZGJTZEJTcwJTc0 JTY1JTczJTNDJTJGJTYyJTNFJTNDJTJGJTczJTcwJTYxJTZFJTNFJTIwJTczJTc1JTcyJTIw JTc2JTZGJTc0JTcyJTY1JTBBJTZEJTZGJTYyJTY5JTZDJTY1JTNDJTJGJTYxJTNFJTNDJTJG JTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTZFJTZGJTY5JTcy JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZG JTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTU2 JTZGJTczJTVGJTYzJTZGJTZEJTcwJTc0JTY1JTczJTVGJTczJTc1JTcyJTVGJTREJTZGJTYy JTY5JTZDJTY1JTVGJTMyJTMwJTMxJTMxJTMwJTM2JTMwJTMxJTMwJTM3JTMyJTMxJTMzJTM0 JTI2JTYyJTZDJTZGJTYzJTNEJTY5JTcwJTYxJTY0JTIyJTNFJTU0JTI2JTY1JTYxJTYzJTc1 JTc0JTY1JTNCJTZDJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYzJTY4JTYxJTcyJTY3JTY1 JTdBJTBBJTZDJTI2JTcyJTczJTcxJTc1JTZGJTNCJTYxJTcwJTcwJTZDJTY5JTIwJTNDJTYy JTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTczJTcwJTYxJTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTc2JTY1 JTcyJTc0JTIyJTNFJTNDJTYyJTNFJTREJTY1JTczJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTcz JTNDJTJGJTYyJTNFJTNDJTJGJTczJTcwJTYxJTZFJTNFJTIwJTczJTc1JTcyJTIwJTY5JTUw JTYxJTY0JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJG JTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcyJTY5JTY3 JTY4JTc0JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMw JTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3 JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTcz JTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1 JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJG JTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTM1JTM0JTc4JTM4JTMx JTVGJTQxJTcwJTcwJTZDJTY5JTVGJTQ4JTZGJTZEJTY1JTYzJTZGJTZFJTZFJTY1JTc4JTVG JTMyJTMwJTMxJTMzJTMwJTM1JTMzJTMwJTMwJTM1JTMyJTM3JTM0JTMxJTJFJTZBJTcwJTY3 JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMxJTM0JTIyJTIwJTc2JTczJTcwJTYx JTYzJTY1JTNEJTIyJTM1JTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTcyJTY5JTY3JTY4 JTc0JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTQxJTcwJTcwJTZDJTY5JTIwJTREJTY1JTczJTIw JTQzJTZGJTZEJTcwJTc0JTY1JTczJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM4 JTMxJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTM1JTM0JTIyJTNFJTNDJTJGJTc0JTY0 JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0 JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTY2JTZGJTZGJTc0JTY1JTcyJTQ1JTZFJTYzJTYxJTcyJTc0JTQ0JTcyJTZGJTY5JTc0 JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTIw JTYyJTY3JTYzJTZGJTZDJTZGJTcyJTNEJTIyJTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBB JTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY1JTZFJTYzJTYxJTcyJTc0 JTQzJTZGJTZDJTU2JTY5JTY0JTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYy JTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZD JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcw JTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTY5JTY0JTNEJTIyJTYzJTZGJTY0JTY1 JTczJTIyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIw JTYzJTZDJTYxJTczJTczJTNEJTIyJTc0JTY5JTc0JTcyJTY1JTIyJTNFJTBBJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTU2JTZGJTczJTIw JTYzJTZGJTY0JTY1JTczJTIwJTY0JTI3JTYxJTYzJTYzJTI2JTY1JTY3JTcyJTYxJTc2JTY1 JTNCJTczJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIw JTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTQ1JTZFJTYzJTYx JTcyJTc0JTQ0JTcyJTZGJTY5JTc0JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNE JTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYx JTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2JTY1JTcy JTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2 JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQyJTRFJTUwJTUwJTYxJTcyJTY5 JTYyJTYxJTczJTVGJTZFJTY1JTc0JTVGJTYzJTZGJTZEJTZEJTY1JTZFJTc0JTVGJTczJTY1 JTVGJTYzJTZGJTZFJTZFJTY1JTYzJTc0JTY1JTcyJTVGJTMyJTMwJTMwJTMyJTMxJTMwJTMw JTM3JTMxJTM1JTMzJTM4JTM1JTM3JTIyJTNFJTQzJTZGJTZEJTZEJTY1JTZFJTc0JTIwJTcz JTY1JTIwJTYzJTZGJTZFJTZFJTY1JTYzJTc0JTY1JTcyJTNDJTJGJTYxJTNFJTNDJTJGJTZD JTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTI3JTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIy JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYx JTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5 JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTUwJTY1JTcyJTc0JTY1JTVGJTY0JTY1JTVGJTc2JTZGJTczJTVGJTYz JTZGJTY0JTY1JTczJTVGJTVGJTY0JTVGJTYxJTYzJTYzJTVGJTczJTVGJTMyJTMwJTMwJTMy JTMxJTMwJTMwJTM3JTMxJTM1JTM0JTM2JTM1JTM3JTIyJTNFJTRGJTYyJTc0JTY1JTZFJTY5 JTcyJTIwJTczJTY1JTczJTIwJTYzJTZGJTY0JTY1JTczJTIwJTY0JTI3JTYxJTYzJTYzJTI2 JTY1JTY3JTcyJTYxJTc2JTY1JTNCJTczJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTZFJTZG JTY5JTcyJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNE JTY2JTY5JTYzJTY4JTY1JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNE JTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTVGJTRFJTQ1JTU0JTVGJTVGJTVGJTZD JTY1JTVGJTYzJTZGJTY0JTY1JTVGJTczJTY1JTYzJTcyJTY1JTc0JTVGJTMyJTMwJTMwJTMz JTMxJTMwJTMwJTM5JTMxJTM1JTMyJTMzJTM0JTM0JTIyJTNFJTRDJTY1JTczJTIwJTcyJTI2 JTY1JTY3JTcyJTYxJTc2JTY1JTNCJTY3JTZDJTY1JTczJTIwJTY0JTY1JTIwJTcwJTcyJTZG JTc0JTY1JTYzJTc0JTY5JTZGJTZFJTBBJTY0JTY1JTIwJTczJTY1JTczJTIwJTYzJTZGJTY0 JTY1JTczJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY2JTZGJTZG JTc0JTY1JTcyJTQ1JTZFJTYzJTYxJTcyJTc0JTQ0JTcyJTZGJTY5JTc0JTIyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTNDJTJG JTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNF JTBBJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTNDJTJG JTY0JTY5JTc2JTNFJTBBJTNDJTYyJTcyJTNFJTBBJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZDJTU2JTY5JTY0JTY1JTIy JTNFJTIwJTBBJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0 JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIy JTMwJTIyJTIwJTY5JTY0JTNEJTIyJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5 JTc0JTY1JTIyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcy JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTc0JTY5JTc0JTcyJTY1JTIyJTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTUwJTZGJTc1 JTcyJTIwJTc1JTZFJTY1JTIwJTZEJTY1JTY5JTZDJTZDJTY1JTc1JTcyJTY1JTIwJTYxJTYz JTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNC JTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTQ1JTZFJTYzJTYxJTcyJTc0 JTQ0JTcyJTZGJTY5JTc0JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcz JTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTY4 JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYx JTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZE JTY1JTQzJTZGJTZFJTZFJTY1JTc4JTY5JTZGJTZFJTNGJTc0JTc5JTcwJTY1JTNEJTY4JTZG JTZEJTY1JTYzJTZGJTZFJTZFJTY1JTc4JTI2JTYxJTZEJTcwJTNCJTc0JTc5JTcwJTY1JTQ5 JTY0JTY1JTZFJTc0JTNEJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTZDJTY1JTI2JTYxJTZE JTcwJTNCJTc0JTc5JTcwJTY1JTQ2JTZDJTYxJTczJTY4JTQxJTYzJTYzJTY1JTczJTczJTY5 JTYyJTZDJTY1JTNEJTMyJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZFJTZGJTY5JTcy JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIyJTNFJTQ3JTcyJTY5JTZDJTZDJTY1JTIw JTYzJTZGJTZFJTc0JTcyJTYxJTczJTc0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY1JTIw JTY1JTc0JTBBJTYxJTY3JTcyJTYxJTZFJTY0JTY5JTY1JTIwJTNDJTJGJTYxJTNFJTNDJTJG JTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTQzJTZGJTZF JTZFJTY1JTc4JTY5JTZGJTZFJTNGJTc0JTc5JTcwJTY1JTNEJTY4JTZGJTZEJTY1JTYzJTZG JTZFJTZFJTY1JTc4JTI2JTYxJTZEJTcwJTNCJTc0JTc5JTcwJTY1JTQ5JTY0JTY1JTZFJTc0 JTNEJTYxJTYzJTYzJTY1JTczJTczJTY5JTYyJTZDJTY1JTI2JTYxJTZEJTcwJTNCJTc0JTc5 JTcwJTY1JTQ2JTZDJTYxJTczJTY4JTQxJTYzJTYzJTY1JTczJTczJTY5JTYyJTZDJTY1JTNE JTMxJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTIyJTNFJTQxJTYzJTYzJTZGJTZEJTcwJTYxJTY3JTZFJTY1JTZE JTY1JTZFJTc0JTIwJTc2JTZGJTYzJTYxJTZDJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcy JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTY2JTZGJTZGJTc0JTY1JTcyJTQ1JTZFJTYzJTYxJTcyJTc0JTQ0JTcy JTZGJTY5JTc0JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTY0JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYx JTYyJTZDJTY1JTNFJTIwJTIwJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTYyJTcyJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTJGJTc0 JTY0JTNFJTNDJTJGJTc0JTcyJTNFJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTNDJTJGJTY0 JTY5JTc2JTNFJTBBJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTBBJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTIwJTUzJTZCJTY5JTZFJTIwJTcwJTY5JTY1 JTY0JTIwJTY0JTY1JTIwJTcwJTYxJTY3JTY1JTIwJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTIwJTY0JTY1JTYyJTc1JTc0JTIwJTJEJTJEJTNFJTBBJTNDJTczJTYzJTcy JTY5JTcwJTc0JTIwJTZDJTYxJTZFJTY3JTc1JTYxJTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYx JTczJTYzJTcyJTY5JTcwJTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIwJTIyJTc0JTY1JTc4 JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTBBJTY5JTY2JTI4 JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZF JTc0JTczJTQyJTc5JTRFJTYxJTZEJTY1JTI4JTIyJTREJTYxJTcwJTQ3JTcyJTY5JTZDJTIy JTI5JTVCJTMwJTVEJTIxJTNEJTZFJTc1JTZDJTZDJTI5JTdCJTBBJTA5JTY5JTY2JTI4JTY0 JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0 JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTY0JTQyJTc0JTQ5JTZEJTcwJTcyJTY1JTczJTczJTY5 JTZGJTZFJTIyJTI5JTIxJTNEJTZFJTc1JTZDJTZDJTI5JTdCJTBBJTA5JTA5JTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5 JTQ5JTY0JTI4JTIyJTY5JTY0JTQyJTc0JTQ5JTZEJTcwJTcyJTY1JTczJTczJTY5JTZGJTZF JTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5JTczJTcwJTZDJTYxJTc5JTIwJTNE JTIwJTIyJTZFJTZGJTZFJTY1JTIyJTNCJTBBJTA5JTdEJTBBJTA5JTY5JTY2JTI4JTY0JTZG JTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQy JTc5JTQ5JTY0JTI4JTIyJTY5JTY0JTQyJTc0JTQ5JTZEJTcwJTcyJTY1JTczJTczJTY5JTZG JTZFJTUzJTY1JTcwJTYxJTcyJTYxJTc0JTY1JTc1JTcyJTIyJTI5JTIxJTNEJTZFJTc1JTZD JTZDJTI5JTdCJTBBJTA5JTA5JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTJFJTY3JTY1JTc0 JTQ1JTZDJTY1JTZEJTY1JTZFJTc0JTQyJTc5JTQ5JTY0JTI4JTIyJTY5JTY0JTQyJTc0JTQ5 JTZEJTcwJTcyJTY1JTczJTczJTY5JTZGJTZFJTUzJTY1JTcwJTYxJTcyJTYxJTc0JTY1JTc1 JTcyJTIyJTI5JTJFJTczJTc0JTc5JTZDJTY1JTJFJTY0JTY5JTczJTcwJTZDJTYxJTc5JTIw JTNEJTIwJTIyJTZFJTZGJTZFJTY1JTIyJTNCJTA5JTBBJTA5JTdEJTBBJTdEJTBBJTNDJTJG JTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTBBJTA5JTNDJTY0JTY5JTc2JTIwJTYxJTZDJTY5 JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTc3JTY5JTY0JTc0JTY4JTIwJTNBJTIwJTM3JTM3JTMzJTcwJTc4JTNCJTYzJTZDJTY1 JTYxJTcyJTNBJTYyJTZGJTc0JTY4JTNCJTIyJTIwJTNFJTBBJTBBJTBBJTNDJTIxJTJEJTJE JTIwJTY2JTY5JTZFJTIwJTQyJTY1JTY3JTY5JTZFJTIwJTcwJTY5JTY1JTY0JTIwJTY0JTY1 JTIwJTcwJTYxJTY3JTY1JTIwJTUwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJE JTJEJTNFJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZGJTZFJTc0 JTY1JTZFJTc1JTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTcwJTYxJTcyJTc0JTY5JTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTcwJTQz JTZGJTZFJTc0JTY1JTZFJTc1JTIyJTNFJTNDJTczJTc0JTc5JTZDJTY1JTIwJTc0JTc5JTcw JTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTYzJTczJTczJTIyJTNFJTQ0JTQ5JTU2JTJFJTYz JTZGJTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1 JTYxJTc1JTMxJTNBJTZDJTY5JTZFJTZCJTJDJTBBJTQ0JTQ5JTU2JTJFJTYzJTZGJTZFJTc0 JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYxJTc1JTMx JTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTQ2JTM4JTM5JTMzJTMyJTQzJTNCJTIw JTdEJTIwJTQ0JTQ5JTU2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5 JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYxJTc1JTMyJTNBJTZDJTY5JTZFJTZCJTJDJTBBJTQ0 JTQ5JTU2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1 JTZFJTY5JTc2JTY1JTYxJTc1JTMyJTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTIwJTdCJTYz JTZGJTZDJTZGJTcyJTNBJTIwJTIzJTM4JTYxJTYyJTM3JTM0JTMzJTNCJTIwJTdEJTQ0JTQ5 JTU2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZF JTY5JTc2JTY1JTYxJTc1JTMzJTNBJTZDJTY5JTZFJTZCJTJDJTBBJTQ0JTQ5JTU2JTJFJTYz JTZGJTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1 JTYxJTc1JTMzJTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTIwJTdCJTYzJTZGJTZDJTZGJTcy JTNBJTIwJTIzJTM4JTYxJTYyJTM3JTM0JTMzJTNCJTIwJTdEJTQ0JTQ5JTU2JTJFJTYzJTZG JTZFJTc0JTY1JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYx JTc1JTM0JTNBJTZDJTY5JTZFJTZCJTJDJTBBJTQ0JTQ5JTU2JTJFJTYzJTZGJTZFJTc0JTY1 JTZFJTc1JTIwJTQxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYxJTc1JTM0JTNB JTc2JTY5JTczJTY5JTc0JTY1JTY0JTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTM4 JTYxJTYyJTM3JTM0JTMzJTNCJTIwJTdEJTIwJTc0JTY0JTJFJTUzJTc0JTc5JTZDJTY1JTVG JTZFJTZGJTY5JTcyJTVGJTcwJTY1JTc0JTY5JTc0JTBBJTdCJTY2JTZGJTZFJTc0JTJEJTcz JTY5JTdBJTY1JTNBJTIwJTM3JTM1JTI1JTNCJTdEJTQ0JTQ5JTU2JTJFJTcyJTY1JTc0JTcy JTYxJTY5JTc0JTIwJTdCJTIwJTY2JTZDJTZGJTYxJTc0JTNBJTZFJTZGJTZFJTY1JTdEJTIw JTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTY4JTMxJTIwJTdCJTYzJTZG JTZDJTZGJTcyJTNBJTIzJTMwJTMxJTM2JTQzJTM0JTMyJTNCJTY2JTZGJTZFJTc0JTJEJTcz JTY5JTdBJTY1JTNBJTMxJTM1JTMwJTI1JTNCJTZEJTYxJTcyJTY3JTY5JTZFJTNBJTMwJTIw JTMwJTIwJTM4JTcwJTc4JTNCJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTNCJTdEJTBB JTY4JTMxJTIwJTY0JTY5JTc2JTJFJTc0JTY5JTc0JTcyJTY1JTQ2JTY5JTYzJTY4JTY1JTIw JTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTMwJTMxJTM2JTQzJTM0JTMyJTNCJTY2JTZGJTZF JTc0JTJEJTczJTY5JTdBJTY1JTNBJTMxJTMwJTMwJTI1JTNCJTZEJTYxJTcyJTY3JTY5JTZF JTNBJTMwJTIwJTMwJTIwJTM4JTcwJTc4JTNCJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMw JTNCJTdEJTBBJTY0JTY5JTc2JTJFJTcyJTc1JTYyJTcyJTY5JTcxJTc1JTY1JTIwJTY0JTY5 JTc2JTJFJTcyJTU0JTY5JTc0JTcyJTY1JTJDJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0 JTY1JTZFJTc1JTIwJTY4JTMzJTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTMwJTMxJTM2 JTQzJTM0JTMyJTNCJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTMxJTMzJTMwJTI1 JTNCJTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTYyJTZGJTZDJTY0JTNC JTdEJTBBJTY0JTY5JTc2JTJFJTczJTZGJTc1JTczJTUyJTc1JTYyJTcyJTY5JTcxJTc1JTY1 JTIwJTY0JTY5JTc2JTJFJTczJTU0JTY5JTc0JTcyJTY1JTJDJTIwJTY0JTY5JTc2JTJFJTYz JTZGJTZFJTc0JTY1JTZFJTc1JTIwJTY4JTM0JTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIz JTQ2JTQ2JTM2JTM2JTMwJTMwJTNCJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTMx JTMxJTMwJTI1JTNCJTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTYyJTZG JTZDJTY0JTNCJTdEJTIwJTBBJTY0JTY5JTc2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQxJTYz JTc0JTc1JTIwJTdCJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTYzJTZGJTZD JTZGJTcyJTNBJTIzJTQ0JTQ0JTQ2JTQ2JTQxJTQxJTNCJTYyJTZGJTcyJTY0JTY1JTcyJTNB JTMxJTcwJTc4JTIwJTczJTZGJTZDJTY5JTY0JTIwJTIzJTM5JTM5JTQzJTQzJTMzJTMzJTNC JTZDJTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTMxJTM2JTMwJTI1JTNCJTZE JTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTMxJTMwJTcwJTc4JTNC JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTMyJTMwJTcwJTc4JTNCJTcwJTYx JTY0JTY0JTY5JTZFJTY3JTNBJTM4JTcwJTc4JTNCJTdEJTBBJTJFJTYxJTZFJTZGJTZFJTc5 JTZEJTY1JTIwJTIzJTY5JTY0JTY1JTZFJTc0JTIwJTdCJTYyJTYxJTYzJTZCJTY3JTcyJTZG JTc1JTZFJTY0JTJEJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTY2JTMwJTY2JTMwJTY2JTMwJTNC JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTMwJTcwJTc4 JTNCJTdEJTBBJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTJFJTc2JTY1 JTcyJTc0JTJDJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJF JTc2JTY1JTcyJTc0JTNBJTZDJTY5JTZFJTZCJTJDJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZF JTc0JTY1JTZFJTc1JTIwJTYxJTJFJTc2JTY1JTcyJTc0JTNBJTc2JTY5JTczJTY5JTc0JTY1 JTY0JTJDJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTc2 JTY1JTcyJTc0JTNBJTY4JTZGJTc2JTY1JTcyJTBBJTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNB JTIzJTMwJTMxJTM2JTQzJTM0JTMyJTNCJTdEJTBBJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0 JTY1JTZFJTc1JTIwJTYxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYxJTc1JTMy JTNBJTZDJTY5JTZFJTZCJTJDJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1 JTIwJTYxJTJFJTc0JTY5JTc0JTcyJTY1JTZFJTY5JTc2JTY1JTYxJTc1JTMyJTNBJTc2JTY5 JTczJTY5JTc0JTY1JTY0JTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTMwJTMxJTM2JTQz JTM0JTMyJTNCJTdEJTBBJTJFJTcyJTZGJTczJTY1JTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNB JTIwJTIzJTQ1JTMyJTMxJTM2JTM4JTQ1JTNCJTdEJTBBJTJFJTY2JTc1JTYzJTY4JTczJTY5 JTYxJTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTM5JTM2JTMwJTQ0JTM4JTM1JTNC JTdEJTBBJTJFJTYxJTc1JTYyJTY1JTcyJTY3JTY5JTZFJTY1JTIwJTdCJTYzJTZGJTZDJTZG JTcyJTNBJTIwJTIzJTM0JTQxJTMwJTM0JTM1JTM0JTNCJTdEJTBBJTY0JTY5JTc2JTJFJTYz JTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTYxJTc1JTYyJTY1JTcyJTY3JTY5JTZFJTY1 JTJDJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTYxJTc1JTYy JTY1JTcyJTY3JTY5JTZFJTY1JTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTdCJTYzJTZGJTZD JTZGJTcyJTNBJTIzJTM0JTQxJTMwJTM0JTM1JTM0JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0 JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNBJTZFJTZGJTZFJTY1JTNCJTdEJTIwJTY0 JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTYxJTc1JTYyJTY1JTcy JTY3JTY5JTZFJTY1JTNBJTY4JTZGJTc2JTY1JTcyJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIz JTM0JTQxJTMwJTM0JTM1JTM0JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcy JTYxJTc0JTY5JTZGJTZFJTNBJTc1JTZFJTY0JTY1JTcyJTZDJTY5JTZFJTY1JTNCJTdEJTY0 JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTY2JTc1JTYzJTY4JTcz JTY5JTYxJTJDJTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTY2 JTc1JTYzJTY4JTczJTY5JTYxJTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTdCJTYzJTZGJTZD JTZGJTcyJTNBJTIwJTIzJTM5JTM2JTMwJTQ0JTM4JTM1JTNCJTIwJTc0JTY1JTc4JTc0JTJE JTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNBJTZFJTZGJTZFJTY1JTNCJTdEJTIw JTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTY2JTc1JTYzJTY4 JTczJTY5JTYxJTNBJTY4JTZGJTc2JTY1JTcyJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIz JTM5JTM2JTMwJTQ0JTM4JTM1JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcy JTYxJTc0JTY5JTZGJTZFJTNBJTc1JTZFJTY0JTY1JTcyJTZDJTY5JTZFJTY1JTNCJTdEJTY0 JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTcyJTZGJTczJTY1JTJD JTY0JTY5JTc2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTYxJTJFJTcyJTZGJTczJTY1 JTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIzJTQ1JTMy JTMxJTM2JTM4JTQ1JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0 JTY5JTZGJTZFJTNBJTZFJTZGJTZFJTY1JTNCJTdEJTIwJTY0JTY5JTc2JTJFJTYzJTZGJTZF JTc0JTY1JTZFJTc1JTIwJTYxJTJFJTcyJTZGJTczJTY1JTNBJTY4JTZGJTc2JTY1JTcyJTdC JTYzJTZGJTZDJTZGJTcyJTNBJTIzJTQ1JTMyJTMxJTM2JTM4JTQ1JTNCJTIwJTc0JTY1JTc4 JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNBJTc1JTZFJTY0JTY1JTcy JTZDJTY5JTZFJTY1JTNCJTdEJTBBJTJGJTJBJTIwJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTQ2JTZGJTZGJTc0JTY1JTcyJTIwJTY0JTY1JTYyJTc1JTc0JTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJBJTJGJTBBJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0 JTQxJTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZGJTZFJTZFJTY1JTczJTIwJTdCJTZEJTYxJTcy JTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTM4JTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0 JTY4JTNBJTIwJTM5JTM5JTI1JTNCJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIw JTMxJTMxJTcwJTc4JTNCJTdEJTBBJTQ0JTQ5JTU2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1 JTIwJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTQxJTNBJTZDJTY5JTZFJTZCJTJDJTIwJTQ0 JTQ5JTU2JTJFJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTJFJTY2JTZGJTZGJTc0JTY1JTcy JTIwJTQxJTNBJTc2JTY5JTczJTY5JTc0JTY1JTY0JTJDJTJFJTY2JTZGJTZGJTc0JTY1JTcy JTIwJTJFJTY3JTcyJTY5JTczJTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTM3JTM3 JTM3JTYxJTM3JTY0JTNCJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5 JTZGJTZFJTNBJTIwJTZFJTZGJTZFJTY1JTNCJTdEJTBBJTQ0JTQ5JTU2JTJFJTYzJTZGJTZF JTc0JTY1JTZFJTc1JTIwJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTQxJTNBJTY4JTZGJTc2 JTY1JTcyJTIwJTdCJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTM3JTM3JTM3JTYxJTM3JTY0 JTNCJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNBJTIw JTc1JTZFJTY0JTY1JTcyJTZDJTY5JTZFJTY1JTNCJTdEJTBBJTJFJTY2JTZGJTZGJTc0JTY1 JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZGJTZFJTZFJTY1JTczJTIwJTU0 JTQ0JTIwJTdCJTc0JTY1JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTZDJTY1JTY2 JTc0JTNCJTA5JTc3JTY5JTY0JTc0JTY4JTNBJTIwJTMyJTM1JTI1JTNCJTIwJTc2JTY1JTcy JTc0JTY5JTYzJTYxJTZDJTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTc0JTZGJTcwJTNCJTIw JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTMwJTcwJTc4JTIwJTM4JTcwJTc4JTIwJTMw JTcwJTc4JTIwJTMxJTMwJTcwJTc4JTNCJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5 JTY3JTY4JTc0JTNBJTIwJTIzJTYzJTM5JTYzJTM5JTYzJTM5JTIwJTMxJTcwJTc4JTIwJTcz JTZGJTZDJTY5JTY0JTNCJTA5JTdEJTBBJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0JTQx JTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZGJTZFJTZFJTY1JTczJTIwJTU0JTQ0JTJFJTZDJTYx JTczJTc0JTIwJTdCJTYyJTZGJTcyJTY0JTY1JTcyJTNBJTIwJTZFJTZGJTZFJTY1JTNCJTdE JTBBJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTYzJTZGJTZD JTZGJTZFJTZFJTY1JTczJTIwJTU1JTRDJTJFJTczJTY5JTZEJTcwJTZDJTY1JTIwJTIwJTdC JTIwJTIwJTZEJTYxJTcyJTY3JTY5JTZFJTNBJTIwJTMwJTIwJTMwJTIwJTM4JTcwJTc4JTIw JTMyJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTMwJTNCJTdEJTBB JTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZG JTZFJTZFJTY1JTczJTIwJTRDJTQ5JTIwJTdCJTZDJTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3 JTY4JTc0JTNBJTIwJTMxJTMyJTcwJTc4JTNCJTZDJTY5JTczJTc0JTJEJTczJTc0JTc5JTZD JTY1JTJEJTc0JTc5JTcwJTY1JTNBJTIwJTZFJTZGJTZFJTY1JTNCJTIwJTYyJTYxJTYzJTZC JTY3JTcyJTZGJTc1JTZFJTY0JTJEJTY5JTZEJTYxJTY3JTY1JTIwJTNBJTIwJTc1JTcyJTZD JTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTcz JTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMzJTc4JTM2JTVGJTcwJTc1JTYzJTY1JTVGJTY3 JTcyJTY5JTczJTY1JTVGJTcwJTY5JTY1JTY0JTVGJTY0JTY1JTVGJTcwJTYxJTY3JTY1JTVG JTMyJTMwJTMxJTMwJTMxJTMwJTMxJTMyJTMwJTM3JTMxJTM5JTM0JTM4JTJFJTY3JTY5JTY2 JTI3JTI5JTNCJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcyJTY1JTcwJTY1 JTYxJTc0JTNBJTIwJTZFJTZGJTJEJTcyJTY1JTcwJTY1JTYxJTc0JTNCJTIwJTYyJTYxJTYz JTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTIw JTMwJTIwJTMwJTJFJTMyJTM1JTY1JTZEJTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJE JTZDJTY1JTY2JTc0JTIwJTNBJTIwJTM4JTcwJTc4JTNCJTdEJTBBJTJFJTY2JTZGJTZGJTc0 JTY1JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZGJTZFJTZFJTY1JTczJTIw JTUwJTIwJTdCJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTNBJTIwJTM0JTcwJTc4JTIwJTMwJTIw JTM0JTcwJTc4JTIwJTMwJTNCJTdEJTBBJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0JTQx JTQyJTRDJTQ1JTJFJTYzJTZGJTZDJTZGJTZFJTZFJTY1JTczJTIwJTUwJTIwJTQ5JTREJTQ3 JTIwJTdCJTA5JTc2JTY1JTcyJTc0JTY5JTYzJTYxJTZDJTJEJTYxJTZDJTY5JTY3JTZFJTNB JTIwJTZEJTY5JTY0JTY0JTZDJTY1JTNCJTA5JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTYy JTZGJTc0JTc0JTZGJTZEJTNBJTIwJTMyJTcwJTc4JTNCJTdEJTBBJTJFJTY2JTZGJTZGJTc0 JTY1JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTZDJTY1JTY3JTYxJTZDJTIwJTdCJTA5JTZE JTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMxJTMyJTcwJTc4JTNCJTY2JTZG JTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIwJTM5JTcwJTc4JTNCJTA5JTYzJTZGJTZDJTZG JTcyJTIwJTNBJTIwJTIzJTM3JTM3JTM3JTQxJTM3JTQ0JTdEJTBBJTJFJTY2JTZGJTZGJTc0 JTY1JTcyJTIwJTU0JTQxJTQyJTRDJTQ1JTJFJTZDJTY1JTY3JTYxJTZDJTIwJTU0JTQ0JTIw JTQxJTNBJTZDJTY5JTZFJTZCJTJDJTIwJTJFJTY2JTZGJTZGJTc0JTY1JTcyJTIwJTU0JTQx JTQyJTRDJTQ1JTJFJTZDJTY1JTY3JTYxJTZDJTIwJTU0JTQ0JTIwJTQxJTNBJTc2JTY5JTcz JTY5JTc0JTY1JTY0JTIwJTIwJTdCJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYx JTc0JTY5JTZGJTZFJTNBJTIwJTc1JTZFJTY0JTY1JTcyJTZDJTY5JTZFJTY1JTNCJTdEJTBB JTJGJTJBJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTQ2JTZGJTZGJTc0JTY1 JTcyJTIwJTY2JTY5JTZFJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJBJTJGJTBB JTBBJTBBJTJGJTJBJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTREJTZGJTY0 JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTczJTIwJTY1JTZFJTYzJTYxJTcyJTc0JTcz JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJBJTJGJTBB JTQ0JTQ5JTU2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZDJTQyJTZDJTYxJTZFJTYz JTIwJTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMyJTMw JTcwJTc4JTNCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZE JTNBJTIwJTMxJTMwJTcwJTc4JTNCJTBBJTA5JTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMxJTcw JTc4JTIwJTczJTZGJTZDJTY5JTY0JTIwJTIzJTQyJTMyJTQyJTMyJTQyJTMyJTNCJTBBJTA5 JTZDJTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM2JTMwJTI1JTNC JTBBJTdEJTBBJTBBJTY0JTY5JTc2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZDJTQy JTZDJTYxJTZFJTYzJTIwJTY0JTY5JTc2JTJFJTY1JTYzJTYyJTU0JTY5JTc0JTcyJTY1JTIw JTczJTcwJTYxJTZFJTIwJTdCJTBBJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJE JTYzJTZGJTZDJTZGJTcyJTNBJTIzJTQ2JTQ2JTQ2JTQ2JTQ2JTQ2JTNCJTBBJTYzJTZGJTZD JTZGJTcyJTNBJTIzJTM4JTQ2JTMxJTQyJTM4JTMwJTNCJTBBJTY2JTZGJTZFJTc0JTJEJTcz JTY5JTdBJTY1JTNBJTMxJTMwJTMwJTI1JTNCJTBBJTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5 JTY3JTY4JTc0JTNBJTYyJTZGJTZDJTY0JTNCJTBBJTZDJTY1JTY2JTc0JTNBJTMzJTcwJTc4 JTNCJTBBJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTZDJTY1JTY2JTc0JTNBJTM1JTcwJTc4 JTNCJTBBJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTJEJTcyJTY5JTY3JTY4JTc0JTNBJTM1JTcw JTc4JTNCJTBBJTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTcyJTY1JTZDJTYxJTc0JTY5 JTc2JTY1JTNCJTBBJTc0JTZGJTcwJTNBJTJEJTMxJTM2JTcwJTc4JTNCJTBBJTdEJTBBJTBB JTQ0JTQ5JTU2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTUzJTc0JTYxJTZFJTY0JTYxJTcyJTY0 JTIwJTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMxJTMw JTcwJTc4JTNCJTBBJTA5JTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMxJTcwJTc4JTIwJTczJTZG JTZDJTY5JTY0JTIwJTIzJTQyJTMyJTQyJTMyJTQyJTMyJTNCJTBBJTA5JTZEJTYxJTcyJTY3 JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTIwJTMxJTMwJTcwJTc4JTNCJTBBJTA5 JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTM4JTcwJTc4JTNCJTBBJTA5JTZDJTY5JTZF JTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM2JTMwJTI1JTNCJTBBJTdEJTBB JTBBJTQ0JTQ5JTU2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQ5JTZFJTY2JTZGJTIwJTdCJTBB JTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMyJTMwJTcwJTc4JTNC JTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNBJTMxJTMw JTcwJTc4JTNCJTBBJTA5JTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMxJTcwJTc4JTIwJTczJTZG JTZDJTY5JTY0JTIwJTIzJTQyJTMyJTQyJTMyJTQyJTMyJTNCJTBBJTA5JTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTNBJTIwJTM4JTcwJTc4JTNCJTBBJTA5JTZDJTY5JTZFJTY1JTJEJTY4JTY1 JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM2JTMwJTI1JTNCJTBBJTdEJTBBJTQ0JTQ5JTU2JTJF JTY1JTZFJTYzJTYxJTcyJTc0JTQ5JTZFJTY2JTZGJTUwJTY5JTYzJTc0JTZGJTIwJTQ5JTRE JTQ3JTIwJTdCJTBBJTA5JTcwJTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTIwJTcyJTY1JTZD JTYxJTc0JTY5JTc2JTY1JTNCJTIwJTBBJTA5JTc0JTZGJTcwJTNBJTJEJTMyJTMwJTcwJTc4 JTNCJTIwJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNB JTIwJTJEJTMxJTM2JTcwJTc4JTNCJTBBJTA5JTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMxJTcw JTc4JTIwJTczJTZGJTZDJTY5JTY0JTIwJTIzJTQyJTMyJTQyJTMyJTQyJTMyJTNCJTBBJTdE JTBBJTBBJTBBJTQ0JTQ5JTU2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZDJTMxJTIw JTdCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTc0JTZGJTcwJTNBJTIwJTMyJTMwJTcw JTc4JTNCJTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTJEJTYyJTZGJTc0JTc0JTZGJTZEJTNB JTIwJTMxJTMwJTcwJTc4JTNCJTBBJTA5JTYyJTZGJTcyJTY0JTY1JTcyJTNBJTMxJTcwJTc4 JTIwJTczJTZGJTZDJTY5JTY0JTIwJTIzJTQyJTMyJTQyJTMyJTQyJTMyJTNCJTIwJTBBJTA5 JTZDJTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM2JTMwJTI1JTNC JTBBJTdEJTIwJTBBJTBBJTQ0JTQ5JTU2JTJFJTY1JTZFJTYzJTYxJTcyJTc0JTQzJTZGJTZD JTMxJTIwJTQ0JTQ5JTU2JTJFJTY1JTYzJTMxJTQzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTdC JTBBJTA5JTZEJTYxJTcyJTY3JTY5JTZFJTNBJTIwJTJEJTMxJTM5JTcwJTc4JTIwJTMwJTcw JTc4JTIwJTMwJTcwJTc4JTIwJTMwJTcwJTc4JTNCJTIwJTIwJTBBJTA5JTYyJTZGJTcyJTY0 JTY1JTcyJTNBJTIwJTczJTZGJTZDJTY5JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQ2JTQ2JTQ2 JTQ2JTQ2JTQ2JTNCJTBBJTA5JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTYz JTZGJTZDJTZGJTcyJTNBJTIzJTY2JTMzJTY2JTMzJTY2JTMzJTNCJTBBJTA5JTcwJTYxJTY0 JTY0JTY5JTZFJTY3JTNBJTIwJTM4JTcwJTc4JTIwJTM4JTcwJTc4JTIwJTM4JTcwJTc4JTIw JTM4JTcwJTc4JTNCJTIwJTBBJTA5JTZDJTY5JTZFJTY1JTJEJTY4JTY1JTY5JTY3JTY4JTc0 JTNBJTIwJTMxJTMyJTMwJTI1JTNCJTBBJTA5JTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTMz JTMzJTMzJTMyJTMzJTMwJTNCJTBBJTdEJTBBJTBBJTJGJTJBJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTREJTZGJTY0JTY5JTY2JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTcz JTIwJTUwJTc1JTYzJTY1JTczJTJGJTQyJTc1JTZDJTZDJTY1JTc0JTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJE JTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJEJTJBJTJGJTBBJTBBJTc1JTZDJTJFJTZD JTY5JTczJTc0JTY1JTRFJTY5JTc2JTY1JTYxJTc1JTMyJTIwJTdCJTBBJTYzJTZGJTZDJTZG JTcyJTNBJTIzJTMwJTMwJTMwJTMwJTMwJTMwJTNCJTBBJTY2JTZGJTZFJTc0JTJEJTczJTY5 JTdBJTY1JTNBJTMxJTMwJTMwJTI1JTNCJTBBJTZDJTY5JTczJTc0JTJEJTczJTc0JTc5JTZD JTY1JTJEJTY5JTZEJTYxJTY3JTY1JTNBJTc1JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTcz JTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYz JTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcw JTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZF JTJGJTYyJTc1JTZDJTZDJTY1JTc0JTMyJTMwJTMxJTMxJTVGJTMyJTMwJTMxJTMxJTMwJTM1 JTMxJTM3JTMwJTM2JTMwJTM5JTMwJTMyJTJFJTY3JTY5JTY2JTIyJTI5JTNCJTdEJTBBJTJG JTJBJTIwJTZEJTZGJTY0JTY5JTY2JTIwJTYzJTZGJTZFJTc0JTYxJTYzJTc0JTIwJTREJTQ1 JTQ2JTQ0JTQxJTU2JTIwJTJBJTJGJTBBJTIzJTYzJTYxJTZDJTZDJTYyJTYxJTYzJTZCJTZD JTYxJTc5JTY1JTcyJTREJTQ1JTQ2JTQxJTU2JTJDJTIwJTIzJTYzJTYxJTZDJTZDJTYyJTYx JTYzJTZCJTZDJTYxJTc5JTY1JTcyJTVGJTMwJTJDJTIzJTYzJTYxJTZDJTZDJTYyJTYxJTYz JTZCJTZDJTYxJTc5JTY1JTcyJTVGJTMxJTIwJTIwJTdCJTIwJTc3JTY5JTY0JTc0JTY4JTNB JTM0JTM0JTMwJTcwJTc4JTIwJTIxJTY5JTZEJTcwJTZGJTcyJTc0JTYxJTZFJTc0JTNCJTdE JTBBJTJGJTJBJTYyJTZGJTc1JTc0JTZGJTZFJTczJTJBJTJGJTBBJTJFJTYyJTc0JTZFJTVG JTcyJTZGJTczJTY1JTdCJTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTIwJTYyJTZDJTZGJTYz JTZCJTNCJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM0JTcwJTc4JTNCJTIwJTcw JTYxJTY0JTY0JTY5JTZFJTY3JTNBJTIwJTM2JTcwJTc4JTIwJTMxJTMwJTcwJTc4JTNCJTIw JTc3JTY5JTY0JTc0JTY4JTNBJTYxJTc1JTc0JTZGJTNCJTIwJTY2JTZGJTZFJTc0JTJEJTcz JTY5JTdBJTY1JTNBJTIwJTMxJTMxJTcwJTc4JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1 JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNBJTIwJTZFJTZGJTZFJTY1JTNCJTIwJTYyJTYx JTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIzJTQ1JTM1JTMxJTM3JTM5JTMwJTIwJTc1 JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1 JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1 JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYz JTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZD JTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTYyJTY3JTVGJTczJTZGJTc1JTczJTYz JTcyJTY5JTcwJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMxJTMyJTMwJTMxJTMxJTMwJTMwJTMz JTM1JTM2JTMwJTM0JTJFJTY3JTY5JTY2JTIyJTI5JTIwJTMwJTIwJTMwJTIwJTcyJTY1JTcw JTY1JTYxJTc0JTJEJTc4JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNB JTIwJTYzJTY1JTZFJTc0JTY1JTcyJTNCJTIwJTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTY2 JTY2JTY2JTIwJTIxJTY5JTZEJTcwJTZGJTcyJTc0JTYxJTZFJTc0JTNCJTIwJTY2JTZGJTZF JTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTYyJTZGJTZDJTY0JTNCJTIwJTcyJTY5 JTY3JTY4JTc0JTNBJTMwJTNCJTdEJTBBJTJFJTYyJTc0JTZFJTVGJTcyJTZGJTczJTY1JTNB JTY4JTZGJTc2JTY1JTcyJTdCJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcw JTZGJTczJTY5JTc0JTY5JTZGJTZFJTNBJTIwJTYyJTZGJTc0JTc0JTZGJTZEJTIwJTZDJTY1 JTY2JTc0JTNCJTdEJTBBJTJFJTYyJTc0JTZFJTVGJTY2JTc1JTYzJTY4JTczJTY5JTYxJTdC JTY0JTY5JTczJTcwJTZDJTYxJTc5JTNBJTIwJTYyJTZDJTZGJTYzJTZCJTNCJTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTNBJTIwJTMxJTM0JTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZF JTY3JTNBJTIwJTM2JTcwJTc4JTIwJTMxJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4 JTNBJTYxJTc1JTc0JTZGJTNCJTIwJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTIw JTMxJTMxJTcwJTc4JTNCJTIwJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0 JTY5JTZGJTZFJTNBJTIwJTZFJTZGJTZFJTY1JTNCJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZG JTc1JTZFJTY0JTNBJTIzJTM4JTQ2JTMxJTQyJTM4JTMwJTIwJTc1JTcyJTZDJTI4JTIyJTY4 JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJF JTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcw JTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZF JTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYx JTc0JTY5JTZGJTZFJTJGJTYyJTc0JTZFJTVGJTY2JTc1JTYzJTY4JTczJTY5JTYxJTVGJTMy JTMwJTMxJTMyJTMwJTM0JTMxJTMxJTMxJTMxJTMyJTM1JTM1JTMxJTJFJTY3JTY5JTY2JTIy JTI5JTIwJTMwJTIwJTMwJTIwJTcyJTY1JTcwJTY1JTYxJTc0JTJEJTc4JTNCJTIwJTc0JTY1 JTc4JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTYzJTY1JTZFJTc0JTY1JTcyJTNCJTIw JTYzJTZGJTZDJTZGJTcyJTNBJTIwJTIzJTY2JTY2JTY2JTIwJTIxJTY5JTZEJTcwJTZGJTcy JTc0JTYxJTZFJTc0JTNCJTIwJTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNB JTIwJTYyJTZGJTZDJTY0JTNCJTIwJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTNCJTdEJTBBJTJF JTYyJTc0JTZFJTVGJTY2JTc1JTYzJTY4JTczJTY5JTYxJTNBJTY4JTZGJTc2JTY1JTcyJTdC JTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcwJTZGJTczJTY5JTc0JTY5JTZG JTZFJTNBJTIwJTYyJTZGJTc0JTc0JTZGJTZEJTIwJTZDJTY1JTY2JTc0JTNCJTdEJTBBJTJF JTYyJTc0JTZFJTVGJTYxJTc1JTYyJTY1JTcyJTY3JTY5JTZFJTY1JTIwJTdCJTY0JTY5JTcz JTcwJTZDJTYxJTc5JTNBJTIwJTYyJTZDJTZGJTYzJTZCJTNCJTY4JTY1JTY5JTY3JTY4JTc0 JTNBJTMxJTM0JTcwJTc4JTNCJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTM2JTcwJTc4JTIw JTMxJTMwJTcwJTc4JTNCJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTNBJTMxJTMxJTcw JTc4JTNCJTc0JTY1JTc4JTc0JTJEJTY0JTY1JTYzJTZGJTcyJTYxJTc0JTY5JTZGJTZFJTNB JTIwJTZFJTZGJTZFJTY1JTNCJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTNBJTIz JTM1JTM1JTMwJTQyJTM1JTQ2JTIwJTc1JTcyJTZDJTI4JTIyJTY4JTc0JTc0JTcwJTczJTNB JTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYx JTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUw JTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1 JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1 JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJG JTYyJTY3JTVGJTYyJTc0JTZFJTVGJTYxJTc1JTYyJTY1JTcyJTY3JTY5JTZFJTY1JTVGJTMy JTMwJTMxJTMyJTMwJTMyJTMyJTMzJTMxJTMxJTMzJTM2JTMyJTMwJTJFJTY3JTY5JTY2JTIy JTI5JTIwJTMwJTIwJTMwJTIwJTcyJTY1JTcwJTY1JTYxJTc0JTJEJTc4JTNCJTc0JTY1JTc4 JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTNBJTIwJTYzJTY1JTZFJTc0JTY1JTcyJTNCJTYzJTZG JTZDJTZGJTcyJTNBJTIwJTc3JTY4JTY5JTc0JTY1JTIwJTIxJTY5JTZEJTcwJTZGJTcyJTc0 JTYxJTZFJTc0JTNCJTY2JTZGJTZFJTc0JTJEJTc3JTY1JTY5JTY3JTY4JTc0JTNBJTIwJTYy JTZGJTZDJTY0JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTYxJTc1JTc0JTZGJTNCJTdEJTBB JTJFJTYyJTc0JTZFJTVGJTYxJTc1JTYyJTY1JTcyJTY3JTY5JTZFJTY1JTNBJTY4JTZGJTc2 JTY1JTcyJTdCJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcwJTZGJTczJTY5 JTc0JTY5JTZGJTZFJTNBJTIwJTYyJTZGJTc0JTc0JTZGJTZEJTIwJTZDJTY1JTY2JTc0JTNC JTdEJTBBJTBBJTBBJTNDJTJGJTczJTc0JTc5JTZDJTY1JTNFJTBBJTNDJTczJTYzJTcyJTY5 JTcwJTc0JTIwJTZDJTYxJTZFJTY3JTc1JTYxJTY3JTY1JTNEJTIyJTZBJTYxJTc2JTYxJTcz JTYzJTcyJTY5JTcwJTc0JTIyJTIwJTc0JTc5JTcwJTY1JTNEJTIyJTc0JTY1JTc4JTc0JTJG JTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIyJTNFJTY2JTc1JTZFJTYzJTc0JTY5 JTZGJTZFJTIwJTUyJTZGJTZDJTZDJTRGJTc2JTY1JTcyJTQ5JTZEJTY3JTI4JTYyJTc0JTJD JTczJTc0JTYxJTc0JTY1JTI5JTIwJTdCJTYyJTc0JTJFJTczJTcyJTYzJTIwJTNEJTIwJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcy JTYxJTc0JTY5JTZGJTZFJTJGJTIyJTIwJTJCJTIwJTczJTc0JTYxJTc0JTY1JTNCJTdEJTND JTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBBJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY2JTZGJTZGJTc0JTY1JTcy JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZG JTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZG JTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0 JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZG JTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3 JTNEJTIyJTMwJTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNF JTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcy JTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1 JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYx JTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYz JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTYxJTYz JTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTY5JTZEJTYxJTY3JTY1JTIwJTNBJTIwJTc1JTcy JTZDJTI4JTI3JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYz JTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0 JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYx JTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1 JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMxJTc4JTM0JTMwJTVGJTY2JTZGJTZFJTY0 JTczJTVGJTcwJTY5JTY1JTY0JTczJTVGJTY0JTY1JTVGJTcwJTYxJTY3JTY1JTVGJTMyJTMw JTMxJTMwJTMxJTMwJTMxJTMyJTMwJTM2JTM0JTM0JTMxJTMwJTJFJTY3JTY5JTY2JTI3JTI5 JTIwJTNCJTIwJTYyJTYxJTYzJTZCJTY3JTcyJTZGJTc1JTZFJTY0JTJEJTcyJTY1JTcwJTY1 JTYxJTc0JTIwJTNBJTIwJTcyJTY1JTcwJTY1JTYxJTc0JTJEJTc4JTIwJTNCJTIwJTY4JTY1 JTY5JTY3JTY4JTc0JTIwJTNBJTIwJTM0JTMwJTcwJTc4JTNCJTIyJTIwJTc3JTY5JTY0JTc0 JTY4JTNEJTIyJTM5JTM5JTI1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3 JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZD JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNF JTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMw JTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIw JTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTczJTc0 JTc5JTZDJTY1JTNEJTIyJTY2JTZGJTZFJTc0JTJEJTczJTY5JTdBJTY1JTIwJTNBJTIwJTMx JTMxJTcwJTc4JTNCJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTYzJTZGJTZDJTZDJTYxJTcw JTczJTY1JTIwJTNBJTIwJTYzJTZGJTZDJTZDJTYxJTcwJTczJTY1JTNCJTIwJTc0JTY1JTc4 JTc0JTJEJTYxJTZDJTY5JTY3JTZFJTIwJTNBJTIwJTYzJTY1JTZFJTc0JTY1JTcyJTNCJTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTMwJTI1JTIyJTNFJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3 JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZG JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNF JTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1 JTNEJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTIwJTNBJTIw JTczJTZGJTZDJTY5JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQzJTM5JTQzJTM5JTQzJTM5JTIy JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZG JTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0 JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTYzJTYxJTc0JTY1JTY3 JTZGJTcyJTc5JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTZG JTZFJTc0JTYxJTYzJTc0JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMyJTMwJTMxJTMxJTM1JTM3 JTMyJTM3JTIyJTNFJTNDJTYyJTNFJTQzJTZGJTZFJTc0JTYxJTYzJTc0JTczJTNDJTJGJTYy JTNFJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5 JTZDJTY1JTNEJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTIw JTNBJTIwJTczJTZGJTZDJTY5JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQzJTM5JTQzJTM5JTQz JTM5JTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIw JTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3 JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5 JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYxJTZFJTc0JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTVGJTczJTZGJTc1JTczJTYz JTcyJTY5JTcwJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMxJTMxJTMwJTM5JTMyJTMxJTMxJTMw JTMwJTM5JTMwJTMxJTIyJTNFJTNDJTYyJTNFJTUzJTZGJTc1JTczJTYzJTcyJTY5JTcyJTY1 JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTND JTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIwJTYy JTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTIwJTNBJTIwJTczJTZGJTZDJTY5 JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQzJTM5JTQzJTM5JTQzJTM5JTIyJTNFJTNDJTYxJTIw JTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0 JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5 JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQyJTRFJTUwJTUwJTYxJTcyJTY5JTYy JTYxJTczJTZFJTY1JTc0JTVGJTMyJTMwJTMwJTMyJTMxJTMyJTMyJTM3JTMxJTM1JTMxJTM4 JTMwJTMwJTI2JTYyJTZDJTZGJTYzJTNEJTQ2JTY5JTYzJTY4JTY1JTRDJTY5JTYyJTcyJTY1 JTMwJTM0JTIyJTNFJTNDJTYyJTNFJTQ0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTZEJTZG JTczJTIwJTY0JTY1JTIwJTZFJTZGJTczJTBBJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTND JTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTcz JTc0JTc5JTZDJTY1JTNEJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4 JTc0JTIwJTNBJTIwJTczJTZGJTZDJTY5JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQzJTM5JTQz JTM5JTQzJTM5JTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5 JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0 JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYz JTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2 JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNE JTUyJTY1JTY3JTZDJTY1JTczJTVGJTY0JTY1JTVGJTYzJTZGJTZFJTczJTY1JTcyJTc2JTYx JTc0JTY5JTZGJTZFJTVGJTY0JTY1JTVGJTc2JTZGJTczJTVGJTYzJTZGJTY0JTY1JTczJTVG JTMyJTMwJTMwJTM0JTMwJTMyJTMwJTM1JTMxJTM3JTMxJTM1JTM0JTM0JTIyJTNFJTNDJTYy JTNFJTUzJTY5JTc0JTY1JTIwJTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYzJTc1JTcy JTY5JTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIw JTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTIwJTNBJTIwJTczJTZGJTZD JTY5JTY0JTIwJTMxJTcwJTc4JTIwJTIzJTQzJTM5JTQzJTM5JTQzJTM5JTIyJTNFJTNDJTYx JTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcy JTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2 JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQ5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYzJTYxJTc0JTY5JTZGJTZFJTVGJTQxJTYzJTYzJTY1JTczJTczJTY5JTYyJTZDJTY1 JTVGJTMyJTMwJTMwJTM4JTMwJTMxJTMyJTM0JTMxJTMxJTM0JTMxJTMzJTM4JTIyJTNFJTND JTYyJTNFJTQxJTYzJTYzJTY1JTczJTczJTY5JTYyJTY5JTZDJTY5JTc0JTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBB JTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIwJTYyJTZGJTcyJTY0JTY1JTcy JTJEJTcyJTY5JTY3JTY4JTc0JTIwJTNBJTIwJTczJTZGJTZDJTY5JTY0JTIwJTMxJTcwJTc4 JTIwJTIzJTQzJTM5JTQzJTM5JTQzJTM5JTIyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0 JTc5JTcwJTY1JTNEJTY2JTY5JTYzJTY4JTY1JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTREJTY1JTZFJTc0JTY5JTZGJTZFJTczJTVGJTZDJTY1JTY3JTYxJTZD JTY1JTczJTVGJTMyJTMwJTMwJTM0JTMwJTM2JTMxJTM3JTMxJTMxJTMyJTMyJTMyJTMwJTIy JTNFJTNDJTYyJTNFJTREJTY1JTZFJTc0JTY5JTZGJTZFJTczJTIwJTZDJTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTY3JTYxJTZDJTY1JTczJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTND JTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIyJTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcy JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTYxJTY2JTY2JTY5JTZD JTY5JTYxJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMxJTMxJTMwJTMzJTMxJTM3JTMxJTMxJTMz JTMwJTMxJTMwJTIyJTNFJTNDJTYyJTNFJTQxJTY2JTY2JTY5JTZDJTY5JTYxJTc0JTY5JTZG JTZFJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcy JTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJG JTc0JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJG JTc0JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJG JTc0JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZD JTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcw JTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYx JTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTYzJTZG JTZDJTZGJTZFJTZFJTY1JTczJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIyJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1 JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTc2JTYxJTZD JTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIw JTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0 JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5 JTZFJTY3JTNEJTIyJTMwJTIyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3 JTcyJTZGJTc1JTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZD JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBB JTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1 JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTNDJTYxJTIwJTYz JTZDJTYxJTczJTczJTNEJTI3JTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIwJTY3JTcyJTY5 JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4 JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYx JTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZE JTY1JTUwJTYxJTY3JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTczJTY5JTc0JTY1JTI2JTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUzJTY5JTc0JTY1JTVGJTQzJTYxJTZF JTYxJTZDJTRFJTY1JTc0JTVGJTMyJTMwJTMwJTMyJTMxJTMyJTMwJTM2JTMxJTM0JTMzJTM0 JTMwJTM2JTIyJTNFJTNDJTYyJTNFJTIwJTIwJTQyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZF JTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0 JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4 JTc0JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcw JTZDJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIyJTIwJTY4 JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTZDJTYxJTZFJTY1JTc0 JTYxJTY3JTY1JTZFJTYzJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJF JTZFJTY1JTc0JTJGJTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYx JTZFJTZCJTIyJTNFJTRDJTYxJTIwJTRFJTQ1JTU0JTBBJTYxJTY3JTY1JTZFJTYzJTY1JTND JTJGJTYxJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYxJTIwJTYzJTZD JTYxJTczJTczJTNEJTIyJTZFJTZGJTY5JTcyJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZF JTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTZDJTYx JTZFJTY1JTc0JTYxJTY3JTY1JTZFJTYzJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYy JTYxJTczJTJFJTZFJTY1JTc0JTJGJTZGJTc1JTc2JTcyJTY5JTcyJTJEJTc1JTZFJTJEJTYz JTZGJTZEJTcwJTc0JTY1JTJGJTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYy JTZDJTYxJTZFJTZCJTIyJTNFJTQ0JTY1JTc2JTY1JTZFJTY5JTcyJTIwJTYzJTZDJTY5JTY1 JTZFJTc0JTNDJTJGJTYxJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZD JTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZF JTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcy JTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5 JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4 JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUzJTZGJTc1JTczJTYzJTcyJTY5JTcyJTY1JTVG JTY1JTZFJTVGJTZDJTY5JTY3JTZFJTY1JTVGJTMyJTMwJTMwJTM1JTMwJTM2JTMyJTMzJTMx JTM1JTMwJTM0JTMyJTMxJTIyJTNFJTIwJTIwJTUzJTZGJTc1JTczJTYzJTcyJTY5JTcyJTY1 JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTYxJTYyJTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIy JTIwJTYzJTY1JTZDJTZDJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMwJTIyJTIwJTYz JTY1JTZDJTZDJTczJTcwJTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMwJTIyJTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMyJTMw JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4 JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4JTNC JTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZD JTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTY5JTZEJTY3JTIw JTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0 JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYy JTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJG JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0 JTY5JTZGJTZFJTJGJTMxJTM4JTc4JTMxJTM4JTVGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYy JTYxJTczJTVGJTMyJTMwJTMxJTMwJTMxJTMwJTMxJTMzJTMwJTM4JTMzJTM3JTMxJTM3JTJF JTZBJTcwJTY3JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTIyJTIwJTc2JTczJTcw JTYxJTYzJTY1JTNEJTIyJTIyJTIwJTYxJTZDJTc0JTNEJTIyJTQyJTRFJTUwJTIwJTUwJTYx JTcyJTY5JTYyJTYxJTczJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTM0JTIy JTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM0JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBB JTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJE JTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMx JTM1JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNC JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcy JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTU2JTZGJTczJTVGJTYz JTZGJTZEJTcwJTc0JTY1JTczJTVGJTczJTc1JTcyJTVGJTREJTZGJTYyJTY5JTZDJTY1JTVG JTMyJTMwJTMxJTMxJTMwJTM2JTMwJTMxJTMwJTM3JTMyJTMxJTMzJTM0JTIyJTNFJTQ3JTI2 JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTcyJTY1JTdBJTIwJTc2JTZGJTczJTIwJTYzJTZGJTZE JTcwJTc0JTY1JTczJTBBJTczJTc1JTcyJTIwJTc2JTZGJTc0JTcyJTY1JTIwJTZEJTZGJTYy JTY5JTZDJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIy JTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1JTIy JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3 JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4 JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTNDJTJG JTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1JTIy JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3 JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM0JTMwJTcw JTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTND JTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIw JTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4 JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4JTNC JTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZD JTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTY5JTZEJTY3JTIw JTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0 JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYy JTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJG JTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1 JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0 JTY5JTZGJTZFJTJGJTMxJTM4JTc4JTMxJTM5JTVGJTc0JTc3JTY5JTc0JTc0JTY1JTcyJTVG JTMyJTMwJTMxJTMwJTMwJTM4JTMwJTM5JTMwJTM0JTMyJTM3JTMwJTMyJTJFJTZBJTcwJTY3 JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTc2JTczJTcwJTYxJTYz JTY1JTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2JTc0JTIy JTIwJTYxJTZDJTc0JTNEJTIyJTU0JTc3JTY5JTc0JTc0JTY1JTcyJTIyJTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTMxJTM1JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM0 JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNC JTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM1JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIy JTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4 JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTc0JTc3JTY5JTc0JTc0JTY1JTcyJTJF JTYzJTZGJTZEJTJGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTczJTYxJTc2 JTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNF JTUwJTZGJTczJTY1JTdBJTIwJTc2JTZGJTczJTIwJTcxJTc1JTY1JTczJTc0JTY5JTZGJTZF JTczJTIwJTczJTc1JTcyJTIwJTZFJTZGJTc0JTcyJTY1JTIwJTUzJTQxJTU2JTIwJTU0JTc3 JTY5JTc0JTc0JTY1JTcyJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBB JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZF JTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIy JTM1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcy JTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMw JTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIy JTM1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcy JTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM0 JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIy JTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBB JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcy JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5 JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcw JTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2 JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTY5JTZE JTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIy JTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1 JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcw JTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZD JTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcy JTYxJTc0JTY5JTZGJTZFJTJGJTMxJTM4JTc4JTMxJTM5JTVGJTc0JTc3JTY5JTc0JTc0JTY1 JTcyJTVGJTMyJTMwJTMxJTMwJTMwJTM4JTMwJTM5JTMwJTM0JTMyJTM3JTMwJTMyJTJFJTZB JTcwJTY3JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTc2JTczJTcw JTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZDJTY1JTY2 JTc0JTIyJTIwJTYxJTZDJTc0JTNEJTIyJTU0JTc3JTY5JTc0JTc0JTY1JTcyJTIyJTIwJTY4 JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTMxJTM1JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIy JTMxJTM0JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZD JTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcw JTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM1JTMwJTcwJTc4JTNCJTIwJTcwJTYx JTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZF JTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNE JTIyJTY4JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTc0JTc3JTY5JTc0JTc0JTY1 JTcyJTJFJTYzJTZGJTZEJTJGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTZF JTY1JTc0JTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZC JTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1 JTcyJTQ0JTc5JTZFJTIwJTY4JTZGJTc2JTY1JTcyJTRFJTZGJTIyJTNFJTUyJTY1JTc0JTcy JTZGJTc1JTc2JTY1JTdBJTIwJTZFJTZGJTczJTIwJTYyJTZGJTZFJTczJTIwJTcwJTZDJTYx JTZFJTczJTIwJTczJTc1JTcyJTIwJTU0JTc3JTY5JTc0JTc0JTY1JTcyJTNDJTJGJTYxJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIy JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNC JTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5 JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0 JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNC JTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM0JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNF JTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3 JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIy JTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIw JTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZF JTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5 JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNE JTIyJTMwJTIyJTIwJTczJTcyJTYzJTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3 JTc3JTc3JTJFJTczJTY1JTYzJTc1JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYy JTYxJTczJTJFJTZFJTY1JTc0JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQz JTYxJTZFJTYxJTZDJTZFJTY1JTc0JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZF JTc0JTc1JTZEJTJGJTYzJTYxJTZFJTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5 JTYzJTJGJTQ5JTZDJTZDJTc1JTczJTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTMxJTM5JTc4 JTMxJTM5JTVGJTY2JTYxJTYzJTY1JTYyJTZGJTZGJTZCJTVGJTMyJTMwJTMxJTMwJTMwJTM4 JTMwJTM5JTMwJTM0JTMyJTM3JTMyJTM2JTJFJTZBJTcwJTY3JTIyJTIwJTY4JTczJTcwJTYx JTYzJTY1JTNEJTIyJTMwJTIyJTIwJTc2JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIw JTYxJTZDJTc0JTNEJTIyJTQ2JTYxJTYzJTY1JTYyJTZGJTZGJTZCJTIyJTIwJTY4JTY1JTY5 JTY3JTY4JTc0JTNEJTIyJTMxJTM0JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTM0 JTIyJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTczJTc0JTc5JTZDJTY1JTNE JTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNC JTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM1JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0 JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIy JTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTYxJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4 JTc0JTc0JTcwJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTY2JTYxJTYzJTY1JTYyJTZGJTZGJTZC JTJFJTYzJTZGJTZEJTJGJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1 JTc0JTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIy JTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcy JTQ0JTc5JTZFJTIwJTY4JTZGJTc2JTY1JTcyJTRFJTZGJTIyJTNFJTUyJTY1JTZBJTZGJTY5 JTY3JTZFJTY1JTdBJTJEJTZFJTZGJTc1JTczJTIwJTczJTc1JTcyJTIwJTQ2JTYxJTYzJTY1 JTYyJTZGJTZGJTZCJTNDJTJGJTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNE JTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1 JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5 JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcw JTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNFJTND JTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIyJTM1 JTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5 JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM1JTMw JTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTNF JTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1JTcyJTIy JTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcyJTY5JTY3 JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMyJTMwJTcwJTc4 JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIyJTIwJTc2JTYx JTZDJTY5JTY3JTZFJTNEJTIyJTZEJTY5JTY0JTY0JTZDJTY1JTIyJTNFJTNDJTJGJTc0JTY0 JTNFJTBBJTNDJTc0JTY0JTIwJTYxJTZDJTY5JTY3JTZFJTNEJTIyJTYzJTY1JTZFJTc0JTY1 JTcyJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTYyJTZGJTcyJTY0JTY1JTcyJTJEJTcy JTY5JTY3JTY4JTc0JTNBJTMwJTcwJTc4JTNCJTIwJTc3JTY5JTY0JTc0JTY4JTNBJTMxJTM1 JTMwJTcwJTc4JTNCJTIwJTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNBJTMwJTcwJTc4JTNCJTIy JTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTNDJTYxJTIwJTYz JTZDJTYxJTczJTczJTNEJTI3JTY4JTZGJTc2JTY1JTcyJTRFJTZGJTI3JTIwJTc0JTYxJTcy JTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcy JTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcw JTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTYzJTcwJTVGJTczJTY1JTcyJTc2JTY5JTYzJTY1JTVGJTYzJTZDJTY5JTY1 JTZFJTc0JTVGJTY0JTY1JTVGJTZDJTVGJTYxJTZFJTZFJTY1JTY1JTVGJTMyJTMwJTMxJTMz JTVGJTMyJTMwJTMxJTMyJTMxJTMwJTMxJTM3JTMwJTM1JTM0JTM4JTMxJTMzJTIyJTNFJTND JTY5JTZEJTY3JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTczJTcyJTYz JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNBJTJGJTJGJTc3JTc3JTc3JTJFJTczJTY1JTYzJTc1 JTcyJTY1JTJFJTYyJTZFJTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTUwJTQxJTVGJTQzJTYxJTZFJTYxJTZDJTZFJTY1JTc0 JTQxJTcwJTcwJTJGJTY0JTZGJTYzJTc1JTZEJTY1JTZFJTc0JTc1JTZEJTJGJTYzJTYxJTZF JTYxJTZDJTZFJTY1JTc0JTJGJTcwJTc1JTYyJTZDJTY5JTYzJTJGJTQ5JTZDJTZDJTc1JTcz JTc0JTcyJTYxJTc0JTY5JTZGJTZFJTJGJTZDJTZGJTY3JTZGJTVGJTUzJTY1JTcyJTc2JTY5 JTYzJTY1JTVGJTYzJTZDJTY5JTY1JTZFJTc0JTVGJTcwJTZGJTc1JTcyJTVGJTY2JTZGJTZG JTc0JTY1JTcyJTVGJTMyJTMwJTMxJTMyJTMxJTMwJTMxJTM3JTMwJTM1JTMwJTM4JTMzJTM5 JTJFJTY3JTY5JTY2JTIyJTIwJTY4JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTc2 JTczJTcwJTYxJTYzJTY1JTNEJTIyJTMwJTIyJTIwJTY4JTY1JTY5JTY3JTY4JTc0JTNEJTIy JTM5JTM3JTIyJTIwJTc3JTY5JTY0JTc0JTY4JTNEJTIyJTMxJTMwJTM1JTIyJTNFJTNDJTJG JTYxJTNFJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNF JTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIw JTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTND JTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0 JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTZGJTZEJTcwJTc0JTY1JTczJTVGJTYzJTYxJTcyJTc0 JTY1JTczJTVGJTY1JTc0JTVGJTczJTY1JTcyJTc2JTY5JTYzJTY1JTczJTVGJTMyJTMwJTMw JTM3JTMwJTM3JTMwJTM5JTMwJTMzJTMxJTM5JTMxJTMxJTIyJTNFJTNDJTYyJTNFJTQzJTZG JTZEJTcwJTc0JTY1JTczJTIwJTYzJTYxJTcyJTc0JTY1JTczJTIwJTY1JTc0JTIwJTUzJTY1 JTcyJTc2JTY5JTYzJTY1JTczJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTcwJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1 JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTcz JTczJTNEJTI3JTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2 JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTYxJTcyJTc0JTY1JTVGJTU2 JTY5JTczJTYxJTVGJTYzJTZDJTYxJTczJTczJTY5JTYzJTVGJTMyJTMwJTMwJTMzJTMwJTMx JTMwJTM4JTMwJTM5JTMxJTM3JTMzJTM4JTIyJTNFJTQzJTYxJTcyJTc0JTY1JTIwJTU2JTY5 JTczJTYxJTIwJTQzJTZDJTYxJTczJTczJTY5JTYzJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0 JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYxJTZFJTc0JTNEJTQzJTYxJTcyJTc0JTY1JTVGJTUwJTcyJTY1JTZEJTY5JTY1JTcy JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMwJTMzJTMxJTM0JTMzJTM2JTM1JTM0JTIyJTNFJTQz JTYxJTcyJTc0JTY1JTIwJTUwJTcyJTY1JTZEJTY5JTY1JTcyJTNDJTJGJTYxJTNFJTNDJTJG JTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1 JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTYxJTcyJTc0JTY1JTVGJTYzJTYxJTY0JTY1JTYx JTc1JTVGJTQyJTRFJTUwJTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMxJTM3JTMxJTMwJTMzJTMz JTMxJTM1JTIyJTNFJTQzJTYxJTcyJTc0JTY1JTIwJTQzJTYxJTY0JTY1JTYxJTc1JTNDJTJG JTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYx JTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcy JTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2 JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQxJTVGJTYzJTY4JTYxJTYzJTc1 JTZFJTVGJTczJTZGJTZFJTVGJTY5JTZEJTYxJTY3JTY1JTVGJTMyJTMwJTMwJTM5JTMxJTMy JTMyJTM0JTMxJTMxJTM1JTM4JTMzJTMyJTIyJTNFJTUwJTY1JTcyJTczJTZGJTZFJTZFJTYx JTZDJTY5JTczJTY1JTdBJTIwJTc2JTZGJTc0JTcyJTY1JTBBJTYzJTYxJTcyJTc0JTY1JTIw JTYyJTYxJTZFJTYzJTYxJTY5JTcyJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3 JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcy JTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcy JTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcw JTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTQ2JTQxJTQzJTQ5JTRDJTQ5JTQ0JTRGJTREJTVGJTMyJTMwJTMwJTM4JTMw JTM2JTMxJTMyJTMxJTMxJTMxJTMwJTMwJTM0JTIyJTNFJTQxJTY5JTY0JTY1JTIwJTI2JTYx JTY3JTcyJTYxJTc2JTY1JTNCJTIwJTZDJTYxJTIwJTIwJTY0JTZGJTZEJTY5JTYzJTY5JTZD JTY5JTYxJTc0JTY5JTZGJTZFJTBBJTYyJTYxJTZFJTYzJTYxJTY5JTcyJTY1JTNDJTJGJTYx JTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIw JTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0 JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5 JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRGJTY2JTY2JTcyJTY1JTVGJTUyJTY1 JTZDJTY1JTc2JTY1JTczJTVGJTY1JTZFJTVGJTZDJTY5JTY3JTZFJTY1JTVGJTMyJTMwJTMw JTM5JTMwJTM1JTMwJTM1JTMwJTM1JTM0JTM1JTM1JTMxJTIyJTNFJTRGJTY2JTY2JTcyJTY1 JTIwJTcyJTY1JTZDJTY1JTc2JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTczJTBBJTY1JTZF JTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJG JTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTcwJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3 JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcy JTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQyJTZGJTc1JTcyJTczJTY1JTVGJTMyJTMw JTMwJTM1JTMxJTMwJTMxJTM4JTMxJTM1JTMxJTM1JTMwJTM0JTIyJTNFJTNDJTYyJTNFJTQy JTZGJTc1JTcyJTczJTY1JTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTcwJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIy JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5 JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTYzJTYxJTc0JTY1JTY3JTZGJTcyJTc5 JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRFJTRGJTU0JTVGJTU0 JTZGJTc1JTczJTVGJTZDJTY1JTczJTVGJTYzJTZGJTc1JTcyJTczJTVGJTMyJTMwJTMwJTM1 JTMxJTMwJTMxJTM4JTMxJTM2JTMwJTMxJTMyJTM4JTIyJTNFJTQyJTZGJTc1JTcyJTczJTY1 JTIwJTY1JTZFJTIwJTY0JTY5JTcyJTY1JTYzJTc0JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0 JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2 JTY5JTYxJTZFJTc0JTNEJTQ3JTYxJTZEJTZEJTY1JTVGJTUwJTQ1JTQxJTVGJTQ1JTcxJTc1 JTYxJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMwJTM3JTMxJTM1JTMyJTM4 JTMwJTM4JTIyJTNFJTUwJTQ1JTQxJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3 JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1 JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTQzJTZGJTZEJTcwJTc0JTY1JTVGJTY0JTVGJTQ5JTZFJTczJTc0JTcyJTc1JTZE JTY1JTZFJTc0JTczJTVGJTQ2JTY5JTZFJTYxJTZFJTYzJTY5JTY1JTcyJTczJTVGJTMyJTMw JTMwJTM0JTMwJTMzJTMwJTMyJTMxJTM5JTM1JTM1JTMyJTMxJTIyJTNFJTQzJTZGJTZEJTcw JTc0JTY1JTIwJTY0JTI3JTQ5JTZFJTczJTc0JTcyJTc1JTZEJTY1JTZFJTc0JTczJTIwJTQ2 JTY5JTZFJTYxJTZFJTYzJTY5JTY1JTcyJTczJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5 JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRFJTQ1JTU0JTVGJTQ1JTcw JTYxJTcyJTY3JTZFJTY1JTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM0JTM0JTM5 JTM0JTM2JTIyJTNFJTNDJTYyJTNFJTI2JTQ1JTYxJTYzJTc1JTc0JTY1JTNCJTcwJTYxJTcy JTY3JTZFJTY1JTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTcwJTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1 JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBB JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3 JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcy JTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJG JTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcy JTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcw JTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTRDJTY5JTc2JTcyJTY1JTc0JTVGJTQxJTVGJTMyJTMwJTMwJTM4JTMwJTM3 JTMxJTM3JTMwJTMzJTMxJTMyJTMxJTM4JTIyJTNFJTRDJTY5JTc2JTcyJTY1JTc0JTIwJTQx JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcy JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRDJTY5JTc2JTcyJTY1 JTc0JTVGJTRBJTY1JTc1JTZFJTY1JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMxJTM2JTMxJTM1 JTM0JTM0JTMxJTM1JTIyJTNFJTRDJTY5JTc2JTcyJTY1JTc0JTIwJTRBJTY1JTc1JTZFJTY1 JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcy JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTRGJTQ0JTQ1JTU2 JTQ5JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMwJTM3JTMxJTM0JTM1JTMwJTM1JTM5JTIyJTNF JTRDJTY5JTc2JTcyJTY1JTc0JTIwJTQ0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTc2JTY1 JTZDJTZGJTcwJTcwJTY1JTZEJTY1JTZFJTc0JTBBJTQ0JTc1JTcyJTYxJTYyJTZDJTY1JTND JTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTND JTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1 JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcw JTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTZGJTZEJTcwJTc0JTY1 JTVGJTY0JTVGJTY1JTcwJTYxJTcyJTY3JTZFJTY1JTVGJTMyJTMwJTMwJTMzJTMwJTMyJTMx JTM0JTMxJTM2JTM1JTM3JTM1JTM3JTIyJTNFJTQzJTZGJTZEJTcwJTc0JTY1JTIwJTI2JTY1 JTYxJTYzJTc1JTc0JTY1JTNCJTcwJTYxJTcyJTY3JTZFJTY1JTNDJTJGJTYxJTNFJTNDJTJG JTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1 JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQyJTRFJTUwJTVGJTUwJTYxJTcyJTY5JTYyJTYxJTcz JTVGJTREJTc1JTZDJTc0JTY5JTcwJTZDJTYxJTYzJTY1JTZEJTY1JTZFJTc0JTczJTVGJTMy JTVGJTMyJTMwJTMwJTM1JTMwJTM5JTMxJTM1JTMxJTMwJTMxJTM3JTM0JTM4JTIyJTNFJTQx JTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTIwJTc2JTY5JTY1JTNDJTJGJTYxJTNFJTNDJTJG JTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1 JTNGJTc0JTc5JTcwJTY1JTNEJTYzJTYxJTc0JTY1JTY3JTZGJTcyJTc5JTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQ1JTczJTcwJTYxJTYzJTY1JTVGJTRGJTUw JTQzJTU2JTREJTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM0JTM1JTMzJTM1JTM3 JTIyJTNFJTRGJTUwJTQzJTU2JTREJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNE JTIyJTc0JTZGJTcwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTcz JTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0 JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNE JTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcw JTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5 JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTcyJTY1JTY0JTY5JTc0 JTczJTVGJTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTczJTVGJTMyJTMwJTMwJTM3 JTMwJTM3JTMwJTM5JTMwJTM1JTM0JTMyJTMzJTMxJTIyJTNFJTNDJTYyJTNFJTQ5JTZEJTZE JTZGJTYyJTY5JTZDJTY5JTY1JTcyJTNDJTJGJTYyJTNFJTNDJTJGJTYxJTNFJTNDJTJGJTcw JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZD JTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1 JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0 JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTZGJTZEJTcwJTYxJTc0JTY5JTYyJTZDJTY1JTVG JTZEJTZGJTY0JTc1JTZDJTYxJTYyJTZDJTY1JTVGJTc0JTYxJTc1JTc4JTVGJTY2JTY5JTc4 JTY1JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMxJTM2JTMxJTM2JTM1JTM2JTMyJTMyJTIyJTNF JTUwJTcyJTI2JTY1JTYzJTY5JTcyJTYzJTNCJTc0JTIwJTY5JTZEJTZEJTZGJTYyJTY5JTZD JTY5JTY1JTcyJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTZDJTY5JTNFJTNDJTYxJTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcw JTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUzJTY5JTZEJTc1JTZDJTY1 JTcyJTVGJTUwJTcyJTY1JTc0JTVGJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTVG JTMyJTMwJTMxJTMxJTMwJTMzJTMxJTM0JTMxJTMxJTM1JTMwJTMxJTMxJTIyJTNFJTUzJTY5 JTZEJTc1JTZDJTYxJTc0JTY5JTZGJTZFJTIwJTYzJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1 JTNCJTY0JTY5JTc0JTIwJTY5JTZEJTZEJTZGJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIy JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYx JTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5 JTcwJTY1JTNEJTY2JTY5JTYzJTY4JTY1JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYx JTZFJTc0JTNEJTQ2JTZGJTcyJTZEJTc1JTZDJTYxJTY5JTcyJTY1JTVGJTUwJTcyJTY1JTc0 JTVGJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTVGJTMyJTMwJTMwJTM4JTMwJTMz JTMyJTMwJTMxJTMxJTMwJTMyJTMwJTM0JTIyJTNFJTUwJTcyJTI2JTY1JTYzJTY5JTcyJTYz JTNCJTc0JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZD JTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTYyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4 JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVG JTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5 JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcw JTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTQzJTcyJTY1JTY0JTY5JTc0JTczJTVGJTQzJTZGJTZFJTczJTZGJTZE JTZEJTYxJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM1JTM0 JTMxJTM0JTM2JTIyJTNFJTQzJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0 JTIwJTYzJTZGJTZFJTczJTZGJTZEJTZEJTYxJTc0JTY5JTZGJTZFJTNDJTJGJTYxJTNFJTND JTJGJTYyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTJGJTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5 JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZG JTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0 JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1 JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcyJTY1JTc0 JTVGJTUwJTY1JTcyJTczJTZGJTZFJTZFJTY1JTZDJTVGJTQyJTRFJTUwJTVGJTMyJTMwJTMw JTMzJTMwJTMxJTMwJTM3JTMxJTM0JTM1JTM2JTMyJTMwJTIyJTNFJTQzJTcyJTI2JTY1JTYx JTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0JTIwJTY1JTZFJTBBJTZDJTY5JTY3JTZFJTY1JTND JTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTND JTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1 JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcw JTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2 JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRGJTc1JTc0JTY5JTZDJTcz JTVGJTcwJTcyJTYxJTc0JTY5JTcxJTc1JTY1JTczJTVGJTQzJTcyJTY1JTY0JTY5JTc0JTcz JTVGJTQzJTZGJTZFJTczJTZGJTVGJTMyJTMwJTMwJTM3JTMwJTM5JTMyJTM1JTMwJTM1JTM1 JTMwJTMwJTMxJTIyJTNFJTUzJTY5JTZEJTc1JTZDJTYxJTc0JTY5JTZGJTZFJTIwJTY0JTY1 JTIwJTYzJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0JTNDJTJGJTYxJTNF JTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYz JTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5 JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4 JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYx JTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYz JTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcyJTY1JTc0JTczJTVGJTQzJTZGJTZE JTcwJTYxJTc0JTY5JTYyJTZDJTY1JTczJTVGJTQxJTc1JTc0JTZGJTVGJTMyJTMwJTMwJTMz JTMwJTMxJTMxJTM2JTMxJTM2JTMyJTM0JTMzJTM1JTIyJTNFJTQzJTcyJTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTY0JTY5JTc0JTIwJTc2JTZGJTY5JTc0JTc1JTcyJTY1JTNDJTJGJTYx JTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIw JTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0 JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5 JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0 JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcyJTY1JTc0JTczJTVGJTQzJTZG JTZEJTcwJTYxJTc0JTY5JTYyJTZDJTY1JTczJTVGJTQxJTc1JTc0JTZGJTVGJTMyJTMwJTMw JTMzJTMwJTMxJTMxJTM2JTMxJTM2JTMyJTM0JTMzJTM1JTIyJTNFJTUzJTY5JTZEJTc1JTZD JTYxJTc0JTY5JTZGJTZFJTIwJTYzJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5 JTc0JTBBJTYxJTc1JTc0JTZGJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcy JTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNE JTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNEJTUwJTcyJTY1JTc0JTVGJTU0JTcyJTYxJTc2JTYxJTc1JTc4JTVGJTQxJTZEJTY1JTZF JTYxJTY3JTY1JTZEJTY1JTZFJTc0JTVGJTREJTYxJTY5JTczJTZGJTZFJTVGJTMyJTMwJTMw JTM5JTMwJTMzJTMyJTM1JTMxJTMxJTM1JTMxJTMwJTMzJTIyJTNFJTUwJTcyJTI2JTY1JTYz JTY5JTcyJTYzJTNCJTc0JTIwJTc0JTcyJTYxJTc2JTYxJTc1JTc4JTNDJTJGJTYxJTNFJTND JTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTYyJTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTcz JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0 JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYxJTZFJTc0JTNEJTQxJTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTczJTVGJTY1 JTc0JTVGJTcwJTcyJTZGJTc0JTY1JTYzJTc0JTY5JTZGJTZFJTVGJTMyJTMwJTMwJTM3JTMw JTM3JTMwJTM5JTMwJTMzJTMzJTM0JTMxJTMwJTIyJTNFJTQxJTczJTczJTc1JTcyJTYxJTZF JTYzJTY1JTczJTNDJTJGJTYxJTNFJTNDJTJGJTYyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTcwJTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTc1JTZDJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIy JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYx JTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5 JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTQxJTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTVGJTYxJTc1JTc0JTZG JTVGJTQyJTRFJTUwJTVGJTUwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTMyJTMwJTMwJTMzJTMw JTMxJTMxJTM2JTMxJTM1JTM0JTM1JTM1JTMzJTIyJTNFJTQxJTczJTczJTc1JTcyJTYxJTZF JTYzJTY1JTIwJTQxJTc1JTc0JTZGJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3 JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1 JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTQxJTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTVGJTYxJTc1JTc0JTZGJTVGJTQy JTRFJTUwJTVGJTUwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMx JTM2JTMxJTM1JTM0JTM1JTM1JTMzJTI2JTYyJTZDJTZGJTYzJTNEJTQ2JTY5JTYzJTY4JTY1 JTRDJTY5JTYyJTcyJTY1JTIyJTNFJTQ0JTY1JTc2JTY5JTczJTBBJTYxJTczJTczJTc1JTcy JTYxJTZFJTYzJTY1JTIwJTYxJTc1JTc0JTZGJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNE JTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYx JTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIy JTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYx JTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5 JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTQxJTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTVGJTY4JTYxJTYyJTY5 JTc0JTYxJTc0JTY5JTZGJTZFJTVGJTQyJTRFJTUwJTVGJTUwJTYxJTcyJTY5JTYyJTYxJTcz JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMxJTM2JTMxJTM1JTM0JTMyJTM0JTMzJTIyJTNFJTQx JTczJTczJTc1JTcyJTYxJTZFJTYzJTY1JTIwJTY4JTYxJTYyJTY5JTc0JTYxJTc0JTY5JTZG JTZFJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5 JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZG JTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0 JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJG JTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1 JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1 JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQyJTRFJTUwJTVG JTcwJTcyJTZGJTc0JTY1JTYzJTc0JTY5JTZGJTZFJTVGJTY4JTYxJTYyJTY5JTc0JTYxJTc0 JTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMxJTM2JTMxJTM1JTM1JTMwJTM0JTM3JTIyJTNFJTU0 JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTZDJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTcz JTc1JTcyJTc2JTY1JTY5JTZDJTZDJTYxJTZFJTYzJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZD JTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTNDJTc0JTY0JTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTZDJTYxJTczJTc0JTIyJTIwJTc2JTYxJTZDJTY5JTY3JTZFJTNEJTIy JTc0JTZGJTcwJTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTNDJTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTczJTcwJTYx JTZFJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTY3JTcyJTY5JTczJTIyJTNFJTNDJTYyJTNF JTU2JTZGJTczJTIwJTcwJTcyJTZGJTZBJTY1JTc0JTczJTNDJTJGJTYyJTNFJTNDJTJGJTcz JTcwJTYxJTZFJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTJGJTcwJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc1JTZDJTIwJTYzJTZDJTYxJTcz JTczJTNEJTIyJTczJTY5JTZEJTcwJTZDJTY1JTIyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZD JTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4 JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVG JTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5 JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcw JTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTQ1JTc0JTc1JTY0JTY1JTczJTVGJTMyJTMwJTMxJTMxJTMxJTMxJTMy JTM1JTMwJTM1JTMzJTMzJTM1JTMwJTIyJTNFJTQ1JTc0JTc1JTY0JTY1JTczJTNDJTJGJTYx JTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIw JTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0 JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZG JTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5 JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTU1 JTZFJTVGJTcwJTcyJTZGJTZBJTY1JTc0JTVGJTYxJTc1JTc0JTZGJTVGJTMyJTMwJTMwJTM3 JTMxJTMwJTMxJTMxJTMxJTMwJTMyJTMyJTMyJTMzJTIyJTNFJTQxJTc1JTc0JTZGJTNDJTJG JTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYx JTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcy JTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4 JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZF JTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNE JTQ0JTY1JTVGJTc2JTZGJTc5JTYxJTY3JTY1JTcyJTVGJTVGJTMyJTMwJTMwJTM3JTMxJTMw JTMxJTMxJTMxJTMwJTMyJTM1JTM1JTMxJTIyJTNFJTU2JTYxJTYzJTYxJTZFJTYzJTY1JTcz JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNF JTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2 JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZG JTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcw JTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcy JTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNE JTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTU1JTZFJTVGJTZEJTYxJTcyJTY5JTYxJTY3JTY1JTVGJTMyJTMwJTMwJTM3JTMx JTMwJTMxJTMxJTMxJTMwJTMyJTMzJTMzJTM5JTIyJTNFJTQzJTZGJTc1JTcwJTZDJTY1JTND JTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZDJTY5JTNFJTND JTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1 JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcw JTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJG JTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1 JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0 JTNEJTU2JTZGJTc1JTczJTVGJTY1JTc0JTY1JTczJTVGJTcwJTYxJTcyJTY1JTZFJTc0JTcz JTVGJTY0JTY1JTVGJTZBJTY1JTc1JTZFJTY1JTczJTVGJTY1JTZFJTY2JTYxJTZFJTc0JTcz JTVGJTMyJTMwJTMwJTM3JTMxJTMwJTMyJTM5JTMwJTM0JTMwJTM5JTMxJTM3JTIyJTNFJTQ2 JTYxJTZEJTY5JTZDJTZDJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcy JTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1 JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYx JTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5 JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTcz JTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZF JTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTU1JTZFJTVGJTcwJTcyJTZGJTZBJTY1JTc0JTVG JTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTVGJTVGJTMyJTMwJTMwJTM3JTMxJTMw JTMxJTMxJTMxJTMwJTMwJTM0JTMxJTM2JTIyJTNFJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5 JTY1JTcyJTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTZD JTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4 JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVG JTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5 JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcw JTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5 JTYxJTZFJTc0JTNEJTYzJTcyJTY1JTY1JTcyJTVGJTcyJTY1JTcwJTcyJTY1JTZFJTY0JTcy JTY1JTVGJTc1JTZFJTY1JTVGJTYxJTY2JTY2JTYxJTY5JTcyJTY1JTVGJTMyJTMwJTMxJTMw JTMwJTMxJTMyJTM2JTMxJTMwJTMzJTMwJTMzJTMwJTIyJTNFJTQzJTcyJTI2JTY1JTYxJTYz JTc1JTc0JTY1JTNCJTYxJTc0JTY5JTZGJTZFJTIwJTY0JTI3JTY1JTZFJTc0JTcyJTY1JTcw JTcyJTY5JTczJTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5JTNFJTBBJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTZDJTY5JTNFJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTcz JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0 JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5 JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcyJTZGJTY2JTY5JTZDJTVGJTcyJTY1JTc0JTcyJTYx JTY5JTc0JTY1JTVGJTMyJTMwJTMxJTMxJTMxJTMxJTMyJTM5JTMxJTMwJTM0JTMxJTM1JTMw JTIyJTNFJTUyJTY1JTc0JTcyJTYxJTY5JTc0JTY1JTNDJTJGJTYxJTNFJTNDJTJGJTZDJTY5 JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc1JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTJGJTc0JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTc0JTYxJTYy JTZDJTY1JTIwJTYyJTZGJTcyJTY0JTY1JTcyJTNEJTIyJTMwJTIyJTIwJTYzJTY1JTZDJTZD JTcwJTYxJTY0JTY0JTY5JTZFJTY3JTNEJTIyJTMyJTIyJTIwJTYzJTY1JTZDJTZDJTczJTcw JTYxJTYzJTY5JTZFJTY3JTNEJTIyJTMxJTIyJTIwJTYzJTZDJTYxJTczJTczJTNEJTIyJTZD JTY1JTY3JTYxJTZDJTIyJTIwJTczJTc0JTc5JTZDJTY1JTNEJTIyJTIyJTNFJTBBJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZGJTZDJTY3JTcyJTZGJTc1JTcwJTNF JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTYzJTZG JTZDJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTYzJTZGJTZD JTY3JTcyJTZGJTc1JTcwJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTc0JTcyJTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTNDJTc0JTY0JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTcz JTNEJTIyJTYzJTY1JTZFJTc0JTcyJTY1JTIyJTNFJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQy JTQxJTUzJTJFJTRFJTQ1JTU0JTJDJTIwJTZDJTI3JTYxJTYzJTYzJTI2JTY1JTY3JTcyJTYx JTc2JTY1JTNCJTczJTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIwJTc2JTZGJTc0JTcy JTY1JTIwJTYyJTYxJTZFJTcxJTc1JTY1JTIwJTY1JTZFJTBBJTZDJTY5JTY3JTZFJTY1JTIw JTczJTc1JTcyJTIwJTY5JTZFJTc0JTY1JTcyJTZFJTY1JTc0JTIwJTY1JTc0JTIwJTZEJTZG JTYyJTY5JTZDJTY1JTIwJTNBJTNDJTJGJTY0JTY5JTc2JTNFJTNDJTYxJTIwJTYzJTZDJTYx JTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3 JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1 JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZD JTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1 JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcy JTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRFJTQ1JTU0JTVG JTQ1JTcwJTYxJTcyJTY3JTZFJTY1JTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM0 JTM0JTM5JTM0JTM2JTIyJTNFJTU1JTZFJTIwJTcwJTcyJTZGJTZBJTY1JTc0JTIwJTY0JTI3 JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTcwJTYxJTcyJTY3JTZFJTY1JTIwJTNGJTNDJTJG JTYxJTNFJTIwJTQyJTRFJTUwJTUwJTQxJTUyJTQ5JTQyJTQxJTUzJTJFJTRFJTQ1JTU0JTIw JTc2JTZGJTc1JTczJTIwJTcwJTY1JTcyJTZEJTY1JTc0JTIwJTY0JTI3JTNDJTYxJTIwJTYz JTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1 JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4 JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYx JTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYz JTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTRDJTY5JTc2JTcyJTY1JTc0JTVGJTQxJTVG JTMyJTMwJTMwJTM4JTMwJTM3JTMxJTM3JTMwJTMzJTMxJTMyJTMxJTM4JTIyJTNFJTZGJTc1 JTc2JTcyJTY5JTcyJTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTIwJTc1JTZFJTIwJTZD JTY5JTc2JTcyJTY1JTc0JTIwJTQxJTNDJTJGJTYxJTNFJTJDJTIwJTc1JTZFJTIwJTNDJTYx JTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcy JTU5JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3 JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcy JTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2 JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5 JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTRGJTQ0JTQ1JTU2JTQ5JTVG JTMyJTMwJTMwJTMzJTMwJTMxJTMwJTM3JTMxJTM0JTM1JTMwJTM1JTM5JTIyJTNFJTRDJTY5 JTc2JTcyJTY1JTc0JTIwJTY0JTY1JTBBJTQ0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTc2 JTY1JTZDJTZGJTcwJTcwJTY1JTZEJTY1JTZFJTc0JTIwJTQ0JTc1JTcyJTYxJTYyJTZDJTY1 JTNDJTJGJTYxJTNFJTIwJTY1JTc0JTIwJTY0JTY1JTIwJTcwJTcyJTI2JTY1JTYxJTYzJTc1 JTc0JTY1JTNCJTcwJTYxJTcyJTY1JTcyJTBBJTc2JTZGJTc0JTcyJTY1JTIwJTYxJTc2JTY1 JTZFJTY5JTcyJTIwJTY1JTZFJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3 JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3 JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYy JTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0 JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1 JTNEJTY2JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZF JTc0JTNEJTQyJTRFJTUwJTVGJTUwJTYxJTcyJTY5JTYyJTYxJTczJTVGJTREJTc1JTZDJTc0 JTY5JTcwJTZDJTYxJTYzJTY1JTZEJTY1JTZFJTc0JTczJTVGJTMyJTVGJTMyJTMwJTMwJTM1 JTMwJTM5JTMxJTM1JTMxJTMwJTMxJTM3JTM0JTM4JTIyJTNFJTczJTZGJTc1JTczJTYzJTcy JTY5JTc2JTYxJTZFJTc0JTBBJTc1JTZFJTY1JTIwJTYxJTczJTczJTc1JTcyJTYxJTZFJTYz JTY1JTIwJTc2JTY5JTY1JTNDJTJGJTYxJTNFJTJFJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTcz JTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3JTIw JTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2 JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJG JTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1JTU1JTZF JTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1JTcyJTcz JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTcyJTY1JTY0JTY5 JTc0JTczJTVGJTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTczJTVGJTMyJTMwJTMw JTM3JTMwJTM3JTMwJTM5JTMwJTM1JTM0JTMyJTMzJTMxJTIyJTNFJTU1JTZFJTIwJTcwJTcy JTZGJTZBJTY1JTc0JTIwJTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTIwJTNGJTND JTJGJTYxJTNFJTIwJTRFJTZGJTc1JTczJTIwJTc2JTZGJTc1JTczJTIwJTY5JTZFJTc2JTY5 JTc0JTZGJTZFJTczJTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIwJTYzJTZGJTZFJTcz JTc1JTZDJTc0JTY1JTcyJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcy JTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIwJTY4JTZGJTc2JTY1JTcyJTU5 JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZG JTZEJTY1JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5 JTc2JTY1JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQz JTcyJTY1JTY0JTY5JTc0JTczJTVGJTY5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTcz JTVGJTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM1JTM0JTMyJTMzJTMxJTIyJTNFJTZF JTZGJTc0JTcyJTY1JTIwJTc1JTZFJTY5JTc2JTY1JTcyJTczJTIwJTY5JTZEJTZEJTZGJTYy JTY5JTZDJTY5JTY1JTcyJTNDJTJGJTYxJTNFJTJDJTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1 JTNCJTIwJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTYxJTZDJTY5JTczJTY1JTcyJTIw JTc1JTZFJTY1JTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTcz JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNE JTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcx JTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1 JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTY5 JTYzJTY4JTY1JTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQ2JTZG JTcyJTZEJTc1JTZDJTYxJTY5JTcyJTY1JTVGJTUwJTcyJTY1JTc0JTVGJTQ5JTZEJTZEJTZG JTYyJTY5JTZDJTY5JTY1JTcyJTVGJTMyJTMwJTMwJTM4JTMwJTMzJTMyJTMwJTMxJTMxJTMw JTMyJTMwJTM0JTIyJTNFJTczJTY5JTZEJTc1JTZDJTYxJTc0JTY5JTZGJTZFJTIwJTY0JTY1 JTIwJTYzJTcyJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0JTIwJTY5JTZEJTZE JTZGJTYyJTY5JTZDJTY5JTY1JTcyJTNDJTJGJTYxJTNFJTIwJTY1JTc0JTIwJTNDJTYxJTIw JTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4JTZGJTc2JTY1JTcyJTQ0 JTc5JTZFJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIw JTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0 JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5 JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTY5JTYzJTY4JTY1JTI2JTY5JTY0JTY1 JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQ2JTZGJTcyJTZEJTc1JTZDJTYxJTY5JTcy JTY1JTVGJTUwJTcyJTY1JTc0JTVGJTQ5JTZEJTZEJTZGJTYyJTY5JTZDJTY5JTY1JTcyJTVG JTMyJTMwJTMwJTM4JTMwJTMzJTMyJTMwJTMxJTMxJTMwJTMyJTMwJTM0JTIyJTNFJTY0JTY1 JTZEJTYxJTZFJTY0JTY1JTdBJTIwJTc2JTZGJTc0JTcyJTY1JTIwJTcwJTcyJTI2JTY1JTYz JTY5JTcyJTYzJTNCJTc0JTIwJTY1JTZFJTIwJTZDJTY5JTY3JTZFJTY1JTNDJTJGJTYxJTNF JTJFJTIwJTQ0JTY1JTczJTIwJTY1JTZFJTc2JTY5JTY1JTczJTIwJTY0JTI3JTYxJTYzJTY4 JTYxJTc0JTIwJTNGJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5 JTczJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0 JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZF JTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYz JTc1JTZDJTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2 JTZGJTZDJTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNE JTUwJTcyJTY1JTc0JTczJTVGJTQzJTZGJTZEJTcwJTYxJTc0JTY5JTYyJTZDJTY1JTczJTVG JTQxJTc1JTc0JTZGJTVGJTMyJTMwJTMwJTMzJTMwJTMxJTMxJTM2JTMxJTM2JTMyJTM0JTMz JTM1JTIyJTNFJTUzJTY5JTZEJTc1JTZDJTY1JTdBJTIwJTc2JTZGJTc0JTcyJTY1JTBBJTcw JTcyJTI2JTY1JTYzJTY5JTcyJTYzJTNCJTc0JTIwJTYxJTc1JTc0JTZGJTNDJTJGJTYxJTNF JTJDJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIwJTY4 JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVG JTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1 JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5 JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZDJTY0 JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcyJTY1 JTc0JTVGJTUwJTY1JTcyJTczJTZGJTZFJTZFJTY1JTZDJTVGJTQyJTRFJTUwJTVGJTMyJTMw JTMwJTMzJTMwJTMxJTMwJTM3JTMxJTM0JTM1JTM2JTMyJTMwJTIyJTNFJTYzJTcyJTI2JTY1 JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0JTBBJTcwJTY1JTcyJTczJTZGJTNDJTJGJTYx JTNFJTJDJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTczJTIw JTY4JTZGJTc2JTY1JTcyJTU5JTY1JTczJTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3 JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcyJTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1 JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZD JTY5JTY1JTcyJTJGJTQ2JTY5JTYzJTY4JTY1JTNGJTc0JTc5JTcwJTY1JTNEJTY2JTZGJTZD JTY0JTY1JTcyJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTUwJTcy JTY1JTc0JTVGJTU0JTcyJTYxJTc2JTYxJTc1JTc4JTVGJTQxJTZEJTY1JTZFJTYxJTY3JTY1 JTZEJTY1JTZFJTc0JTVGJTREJTYxJTY5JTczJTZGJTZFJTVGJTMyJTMwJTMwJTM5JTMwJTMz JTMyJTM1JTMxJTMxJTM1JTMxJTMwJTMzJTIyJTNFJTYzJTcyJTI2JTY1JTYxJTYzJTc1JTc0 JTY1JTNCJTY0JTY5JTc0JTBBJTc0JTcyJTYxJTc2JTYxJTc1JTc4JTNDJTJGJTYxJTNFJTJD JTIwJTY1JTc0JTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTI3JTY3JTcyJTY5JTcz JTIwJTY4JTZGJTc2JTY1JTcyJTQ0JTc5JTZFJTIwJTY4JTZGJTc2JTY1JTcyJTU5JTY1JTcz JTI3JTIwJTc0JTYxJTcyJTY3JTY1JTc0JTNEJTI3JTVGJTc0JTZGJTcwJTI3JTIwJTY4JTcy JTY1JTY2JTNEJTIyJTJGJTYyJTYxJTZFJTcxJTc1JTY1JTJGJTcwJTZGJTcyJTc0JTYxJTY5 JTZDJTJGJTcwJTYxJTcyJTc0JTY5JTYzJTc1JTZDJTY5JTY1JTcyJTJGJTQ4JTZGJTZEJTY1 JTU1JTZFJTY5JTc2JTY1JTcyJTczJTNGJTc0JTc5JTcwJTY1JTNEJTc1JTZFJTY5JTc2JTY1 JTcyJTczJTI2JTY5JTY0JTY1JTZFJTc0JTY5JTY2JTY5JTYxJTZFJTc0JTNEJTQzJTcyJTY1 JTY0JTY5JTc0JTczJTVGJTQzJTZGJTZFJTczJTZGJTZEJTZEJTYxJTc0JTY5JTZGJTZFJTVG JTMyJTMwJTMwJTM3JTMwJTM3JTMwJTM5JTMwJTM1JTM0JTMxJTM0JTM2JTIyJTNFJTczJTZG JTc1JTczJTYzJTcyJTY5JTc2JTY1JTdBJTIwJTc2JTZGJTc0JTcyJTY1JTIwJTYzJTcyJTI2 JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY0JTY5JTc0JTBBJTY1JTZFJTIwJTZDJTY5JTY3JTZF JTY1JTNDJTJGJTYxJTNFJTJFJTIwJTQzJTZGJTZEJTZEJTY1JTZFJTc0JTIwJTY0JTY1JTc2 JTY1JTZFJTY5JTcyJTIwJTYzJTZDJTY5JTY1JTZFJTc0JTIwJTQyJTRFJTUwJTIwJTUwJTYx JTcyJTY5JTYyJTYxJTczJTIwJTNGJTIwJTNDJTYxJTIwJTYzJTZDJTYxJTczJTczJTNEJTIy JTY3JTcyJTY5JTczJTIyJTIwJTY4JTcyJTY1JTY2JTNEJTIyJTY4JTc0JTc0JTcwJTczJTNB JTJGJTJGJTZDJTYxJTZFJTY1JTc0JTYxJTY3JTY1JTZFJTYzJTY1JTJFJTYyJTZFJTcwJTcw JTYxJTcyJTY5JTYyJTYxJTczJTJFJTZFJTY1JTc0JTJGJTZGJTc1JTc2JTcyJTY5JTcyJTJE JTc1JTZFJTJEJTYzJTZGJTZEJTcwJTc0JTY1JTJGJTIyJTIwJTc0JTYxJTcyJTY3JTY1JTc0 JTNEJTIyJTVGJTYyJTZDJTYxJTZFJTZCJTIyJTNFJTRGJTc1JTc2JTcyJTY1JTdBJTIwJTc1 JTZFJTIwJTYzJTZGJTZEJTcwJTc0JTY1JTIwJTI2JTYxJTY3JTcyJTYxJTc2JTY1JTNCJTIw JTZDJTYxJTIwJTRFJTY1JTc0JTIwJTQxJTY3JTY1JTZFJTYzJTY1JTNDJTJGJTYxJTNFJTJF JTNDJTYyJTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTNDJTYyJTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTY0JTY5JTc2JTIwJTYzJTZDJTYx JTczJTczJTNEJTIyJTYzJTY1JTZFJTc0JTcyJTY1JTIyJTNFJTU2JTZGJTc0JTcyJTY1JTIw JTQzJTZGJTZFJTczJTY1JTY5JTZDJTZDJTY1JTcyJTIwJTY1JTZFJTIwJTYxJTY3JTY1JTZF JTYzJTY1JTIwJTY1JTczJTc0JTIwJTZBJTZGJTY5JTY3JTZFJTYxJTYyJTZDJTY1JTBBJTcz JTc1JTcyJTIwJTczJTYxJTIwJTZDJTY5JTY3JTZFJTY1JTIwJTY0JTY5JTcyJTY1JTYzJTc0 JTY1JTIwJTI4JTYxJTcwJTcwJTY1JTZDJTIwJTZFJTZGJTZFJTIwJTczJTc1JTcyJTc0JTYx JTc4JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTI5JTJFJTIwJTUzJTY5JTIwJTc2JTZGJTc1 JTczJTIwJTZFJTY1JTIwJTY0JTY5JTczJTcwJTZGJTczJTY1JTdBJTBBJTcwJTYxJTczJTIw JTY0JTY1JTIwJTYzJTY1JTIwJTZFJTc1JTZEJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTcy JTZGJTIwJTY0JTY1JTIwJTc0JTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTZDJTI2JTY1JTYx JTYzJTc1JTc0JTY1JTNCJTcwJTY4JTZGJTZFJTY1JTIwJTY0JTY5JTcyJTY1JTYzJTc0JTJD JTIwJTY1JTZFJTc2JTZGJTc5JTY1JTdBJTJEJTZDJTc1JTY5JTBBJTc1JTZFJTIwJTZEJTY1 JTczJTczJTYxJTY3JTY1JTIwJTcwJTYxJTcyJTIwJTc2JTZGJTc0JTcyJTY1JTIwJTZEJTY1 JTczJTczJTYxJTY3JTY1JTcyJTY5JTY1JTIwJTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNC JTYzJTc1JTcyJTY5JTczJTI2JTY1JTYxJTYzJTc1JTc0JTY1JTNCJTY1JTJDJTIwJTY5JTZD JTIwJTc2JTZGJTc1JTczJTIwJTZDJTY1JTBBJTY0JTZGJTZFJTZFJTY1JTcyJTYxJTIwJTY1 JTZFJTIwJTcyJTY1JTc0JTZGJTc1JTcyJTJFJTIwJTU2JTZGJTc1JTczJTIwJTcwJTZGJTc1 JTc2JTY1JTdBJTIwJTYxJTc1JTczJTczJTY5JTIwJTYzJTZGJTZFJTc0JTYxJTYzJTc0JTY1 JTcyJTIwJTZDJTY1JTIwJTQzJTY1JTZFJTc0JTcyJTY1JTIwJTY0JTY1JTIwJTUyJTY1JTZD JTYxJTc0JTY5JTZGJTZFJTczJTBBJTQzJTZDJTY5JTY1JTZFJTc0JTczJTIwJTYxJTc1JTIw JTMwJTIwJTM4JTMyJTMwJTIwJTM4JTMyJTMwJTIwJTMwJTMwJTMxJTIwJTI4JTMwJTJDJTMx JTMyJTIwJTI2JTY1JTc1JTcyJTZGJTNCJTIwJTU0JTU0JTQzJTJGJTZEJTY5JTZFJTI5JTND JTJGJTY0JTY5JTc2JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTNDJTJGJTc0JTcyJTNFJTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTY0JTNFJTBBJTBBJTIwJTIwJTIw JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0JTcyJTNF JTBBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTc0 JTYxJTYyJTZDJTY1JTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIw JTNDJTYyJTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTND JTYyJTcyJTNFJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNDJTJGJTY0JTY5JTc2JTNF JTBBJTIwJTIwJTIwJTIwJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTNDJTJGJTY0JTY5JTc2 JTNFJTBBJTBBJTBBJTBBJTBBJTNDJTIxJTJEJTJEJTIwJTUzJTZCJTY5JTZFJTIwJTcwJTY5 JTY1JTY0JTIwJTY0JTY1JTIwJTcwJTYxJTY3JTY1JTIwJTQ1JTRFJTQ0JTIwJTY0JTY1JTYy JTc1JTc0JTIwJTJEJTJEJTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTNDJTIxJTJEJTJE JTIwJTcwJTY5JTY1JTY0JTIwJTY0JTY1JTIwJTcwJTYxJTY3JTY1JTIwJTY2JTY5JTZFJTIw JTQ1JTRFJTQ0JTIwJTJEJTJEJTNFJTBBJTBBJTBBJTBBJTA5JTNDJTIxJTJEJTJEJTIwJTQ2 JTY5JTZFJTIwJTY0JTY1JTIwJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTIwJTcwJTZG JTcyJTc0JTYxJTY5JTZDJTIwJTJEJTJEJTNFJTBBJTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBB JTA5JTNDJTIxJTJEJTJEJTIwJTQ2JTY5JTZFJTIwJTY0JTY1JTIwJTY0JTY5JTc2JTIwJTYz JTZDJTYxJTczJTczJTIwJTYzJTZGJTZFJTc0JTY1JTZFJTc1JTIwJTJEJTJEJTNFJTBBJTA5 JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTA5JTNDJTIxJTJEJTJEJTIwJTQ2JTY5JTZFJTIwJTY0 JTY1JTIwJTZDJTYxJTIwJTY0JTY5JTc2JTIwJTYzJTZDJTYxJTczJTczJTIwJTYzJTZGJTcy JTcwJTczJTIwJTJEJTJEJTNFJTBBJTA5JTNDJTJGJTY0JTY5JTc2JTNFJTBBJTBBJTA5JTND JTIxJTJEJTJEJTIwJTQ2JTY5JTZFJTIwJTY0JTY1JTIwJTZDJTYxJTIwJTY0JTY5JTc2JTIw JTY5JTY0JTIwJTcwJTYxJTY3JTY1JTIwJTJEJTJEJTNFJTBBJTA5JTNDJTJGJTY0JTY5JTc2 JTNFJTBBJTA5JTNDJTJGJTc0JTY0JTNFJTBBJTBBJTA5JTNDJTc0JTY0JTIwJTc2JTYxJTZD JTY5JTY3JTZFJTNEJTIyJTc0JTZGJTcwJTIyJTNFJTI2JTZFJTYyJTczJTcwJTNCJTNDJTJG JTc0JTY0JTNFJTBBJTBBJTNDJTIxJTJEJTJEJTIwJTQzJTQ1JTRFJTU0JTUyJTQxJTRDJTQ1 JTIwJTQ0JTRGJTU1JTQyJTRDJTQ1JTIwJTUwJTQxJTUyJTU0JTQ5JTQzJTU1JTRDJTQ5JTQ1 JTUyJTIwJTQ2JTQ5JTRFJTIwJTJEJTJEJTNFJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBBJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTNDJTczJTYzJTcyJTY5JTcwJTc0JTIwJTc0JTc5JTcwJTY1 JTNEJTIyJTc0JTY1JTc4JTc0JTJGJTZBJTYxJTc2JTYxJTczJTYzJTcyJTY5JTcwJTc0JTIy JTNFJTBBJTA5JTNDJTIxJTJEJTJEJTBBJTA5JTU3JTQ1JTQyJTRGJTVGJTUzJTQ1JTUyJTU2 JTQ1JTU1JTUyJTIwJTNEJTIwJTIyJTczJTc0JTYxJTc0JTczJTc3JTY1JTYyJTJFJTYyJTZF JTcwJTcwJTYxJTcyJTY5JTYyJTYxJTczJTJFJTYzJTZGJTZEJTIyJTNCJTBBJTA5JTU3JTQ1 JTQyJTRGJTQ5JTQ0JTIwJTNEJTIwJTMxJTMwJTMwJTNCJTBBJTA5JTU3JTQ1JTQyJTRGJTVG JTVBJTRGJTRFJTQ1JTIwJTNEJTIwJTMwJTNCJTBBJTA5JTU3JTQ1JTQyJTRGJTVGJTUwJTQx JTQ3JTQ1JTIwJTNEJTIwJTMyJTMwJTMxJTMwJTMzJTNCJTBBJTA5JTU3JTQ1JTQyJTRGJTVG JTQxJTUyJTQ3JTMxJTIwJTNEJTIwJTMwJTNCJTBBJTA5JTBBJTA5JTU3JTQ1JTQyJTRGJTVG JTQ2JTQ5JTQzJTQ4JTQ1JTVGJTRGJTRCJTIwJTNEJTIwJTc0JTcyJTc1JTY1JTNCJTBBJTA5 JTU3JTQ1JTQyJTRGJTQ5JTQ0JTVGJTQ2JTQ5JTQzJTQ4JTQ1JTIwJTNEJTIwJTMyJTMwJTM0 JTNCJTBBJTA5JTU3JTQ1JTQyJTRGJTVGJTVBJTRGJTRFJTQ1JTVGJTQ2JTQ5JTQzJTQ4JTQ1 JTIwJTNEJTIwJTMwJTNCJTBBJTA5JTU3JTQ1JTQyJTRGJTVGJTUwJTQxJTQ3JTQ1JTVGJTQ2 JTQ5JTQzJTQ4JTQ1JTIwJTNEJTIwJTMxJTMwJTMyJTM2JTM5JTMwJTNCJTBBJTA5JTU3JTQ1 JTQyJTRGJTVGJTQxJTUyJTQ3JTMxJTVGJTQ2JTQ5JTQzJTQ4JTQ1JTIwJTNEJTIwJTMwJTNC JTBBJTA5JTBBJTBBJTA5JTJGJTJGJTIwJTQ3JTY1JTczJTc0JTY5JTZGJTZFJTIwJTY0JTY1 JTczJTIwJTczJTc0JTYxJTc0JTY5JTczJTc0JTY5JTcxJTc1JTY1JTczJTBBJTA5JTY5JTY2 JTIwJTI4JTc3JTY1JTYyJTZGJTVGJTZGJTZCJTNEJTNEJTMxJTI5JTdCJTc3JTY1JTYyJTZG JTVGJTczJTY5JTc0JTY1JTQxJTcwJTcwJTY1JTZDJTI4JTI5JTNCJTc3JTY1JTYyJTZGJTVG JTY2JTY5JTYzJTY4JTY1JTQxJTcwJTcwJTY1JTZDJTczJTI4JTI5JTNCJTdEJTBBJTA5JTBB JTA5JTBBJTA5JTBBJTA5JTJGJTJGJTJEJTJEJTNFJTBBJTA5JTJGJTJGJTIwJTU3JTUzJTUy JTY1JTcwJTZGJTcyJTc0JTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTQ5JTQ0JTNE JTMzJTM1JTM0JTM1JTMzJTMyJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTUz JTQ1JTQzJTU0JTQ5JTRGJTRFJTVGJTQ3JTUyJTUwJTNEJTI3JTUwJTYxJTcyJTc0JTY5JTYz JTc1JTZDJTY5JTY1JTcyJTczJTI3JTIwJTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUw JTVGJTUzJTU1JTQyJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTVGJTQ3JTUyJTUwJTNEJTI3JTQx JTYzJTYzJTc1JTY1JTY5JTZDJTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVG JTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTNEJTI3JTQ4JTZGJTZEJTY1JTIwJTYzJTZGJTZFJTZF JTY1JTc4JTY5JTZGJTZFJTIwJTcwJTYxJTcyJTc0JTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIw JTU3JTUyJTUwJTVGJTUzJTU1JTQyJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTNEJTI3JTQxJTQ5 JTU4JTIwJTREJTMxJTUwJTMxJTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVG JTQzJTRGJTRFJTU0JTQ1JTRFJTU0JTNEJTI3JTQ4JTZGJTZEJTY1JTIwJTYzJTZGJTZFJTZF JTY1JTc4JTY5JTZGJTZFJTIwJTcwJTYxJTcyJTc0JTI3JTNCJTBBJTA5JTc2JTYxJTcyJTIw JTU3JTUyJTUwJTVGJTQzJTQ4JTQxJTRFJTRFJTQ1JTRDJTNEJTI3JTMwJTI3JTNCJTBBJTA5 JTc2JTYxJTcyJTIwJTU3JTUyJTUwJTVGJTQxJTQzJTQzJTNEJTI3JTMwJTI3JTNCJTBBJTA5 JTBBJTA5JTY5JTY2JTI4JTc3JTcyJTY1JTcwJTZGJTcyJTc0JTVGJTZGJTZCJTNEJTNEJTMx JTI5JTdCJTBBJTA5JTA5JTZEJTYxJTZCJTY1JTVGJTczJTc0JTYxJTc0JTI4JTU3JTUyJTUw JTVGJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTJDJTU3JTUyJTUwJTVGJTUzJTU1JTQyJTUzJTQ1 JTQzJTU0JTQ5JTRGJTRFJTJDJTU3JTUyJTUwJTVGJTQ5JTQ0JTJDJTU3JTUyJTUwJTVGJTQx JTQzJTQzJTJDJTU3JTUyJTUwJTVGJTQzJTQ4JTQxJTRFJTRFJTQ1JTRDJTJDJTU3JTUyJTUw JTVGJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTVGJTQ3JTUyJTUwJTJDJTU3JTUyJTUwJTVGJTUz JTU1JTQyJTUzJTQ1JTQzJTU0JTQ5JTRGJTRFJTVGJTQ3JTUyJTUwJTJDJTIwJTU3JTUyJTUw JTVGJTQzJTRGJTRFJTU0JTQ1JTRFJTU0JTJDJTIwJTMwJTJDJTIwJTMxJTJDJTIwJTMwJTJD JTIwJTMwJTI5JTNCJTBBJTA5JTdEJTBBJTNDJTJGJTczJTYzJTcyJTY5JTcwJTc0JTNFJTBB JTBBJTBBJTBBJTBBJTBBJTBBJTA5JTA5JTNDJTJGJTc0JTcyJTNFJTBBJTA5JTA5JTBBJTBB JTBBJTBBJTNDJTIxJTJEJTJEJTIwJTY4JTYzJTVGJTZGJTZCJTIwJTJEJTJEJTNFJTBBJTIw JTIwJTBBJTIwJTA5JTA5JTA5JTNDJTIxJTJEJTJEJTIwJTRDJTY5JTY3JTZFJTY1JTIwJTY0 JTc1JTIwJTc0JTYxJTYyJTZDJTY1JTYxJTc1JTIwJTY0JTYxJTZFJTczJTIwJTZDJTYxJTcx JTc1JTY1JTZDJTZDJTY1JTIwJTZGJTZFJTIwJTc2JTYxJTIwJTczJTc0JTZGJTYzJTZCJTY1 JTcyJTIwJTZDJTI3JUU5JTc2JTY1JTZFJTc0JTc1JTY1JTZDJTZDJTY1JTIwJTY5JTZEJTYx JTY3JTY1JTIwJTY0JTY1JTIwJTYyJTYxJTczJTIwJTY0JTY1JTIwJTcwJTYxJTY3JTY1JTIw JTJEJTJEJTNFJTBBJTIwJTA5JTA5JTA5JTNDJTc0JTcyJTIwJTY5JTY0JTNEJTIyJTY4JTYx JTYyJTY5JTZDJTZDJTYxJTY3JTY1JTJEJTYyJTZGJTc0JTc0JTZGJTZEJTIyJTNFJTNDJTJG JTc0JTcyJTNFJTBBJTIwJTIwJTA5JTA5JTNDJTIxJTJEJTJEJTIwJTQ2JTY5JTZFJTIwJTY0 JTY1JTIwJTZDJTYxJTIwJTc0JTYxJTYyJTZDJTY1JTIwJTcwJTcyJTY5JTZFJTYzJTY5JTcw JTYxJTZDJTIwJTJEJTJEJTNFJTBBJTA5JTA5JTNDJTJGJTc0JTYxJTYyJTZDJTY1JTNFJTA5 JTIwJTIwJTIwJTIwJTBBJTNDJTIxJTJEJTJEJTIwJTQ2JTY5JTZFJTIwJTY0JTY1JTIwJTZD JTYxJTIwJTY0JTY5JTc2JTIwJTY4JTYxJTYyJTY5JTZDJTZDJTYxJTY3JTY1JTIwJTJEJTJE JTNFJTBBJTNDJTJGJTY0JTY5JTc2JTNFJTBBJTIwJTBBJTNDJTJGJTYyJTZGJTY0JTc5JTNF JTBBJTNDJTJGJTY4JTc0JTZEJTZDJTNFJykpOw0KLy8tLT4NCjwvU2NyaXB0Pg== ------=_NextPart_000_0012_5C4D9F18.C9087EF8-- From lczerner@redhat.com Fri May 16 03:49:14 2014 Return-Path: <lczerner@redhat.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 150387F50 for <xfs@oss.sgi.com>; Fri, 16 May 2014 03:49:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D256C8F8059 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:49:10 -0700 (PDT) X-ASG-Debug-ID: 1400230149-04bdf02b8b574900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mBYLdgEPmBazoTxi for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:49:09 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4G8mjZ6006491 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 16 May 2014 04:48:45 -0400 Received: from dhcp-1-113.brq.redhat.com (dhcp-1-113.brq.redhat.com [10.34.1.113]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4G8mgvr027439 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 16 May 2014 04:48:43 -0400 Date: Fri, 16 May 2014 10:48:42 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= <lczerner@redhat.com> X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig <hch@infradead.org> cc: Dave Chinner <david@fromorbit.com>, fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list In-Reply-To: <20140516054009.GA17647@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400230149 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, 15 May 2014, Christoph Hellwig wrote: > Date: Thu, 15 May 2014 22:40:09 -0700 > From: Christoph Hellwig <hch@infradead.org> > To: Dave Chinner <david@fromorbit.com> > Cc: fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, > linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [ANNOUNCE] xfstests: new mailing list > > On Fri, May 16, 2014 at 02:46:11PM +1000, Dave Chinner wrote: > > Hi folks, > > > > As requested I've created a new mailing list for xfstests > > development and discussion. Reflecting the fact that the test > > harness is not really XFS specific anymore, the list is: > > > > fstests@vger.kernel.org > > Isn't there an "x" missing somewhere? It's intentional and it is "Reflecting the fact that the test harness is not really XFS specific anymore", even though the test suite itself keep the name xfstests. This way it's more obvious to people that this is in fact not xfs specific. -Lukas > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org Fri May 16 03:53:24 2014 Return-Path: <BATV+9c5b58c56354288dc5e0+3918+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A5D047F50 for <xfs@oss.sgi.com>; Fri, 16 May 2014 03:53:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38791AC00C for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:53:24 -0700 (PDT) X-ASG-Debug-ID: 1400230402-04cbb03cc4537fe0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nDQNmSSw1maaHYyY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:53:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9c5b58c56354288dc5e0+3918+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 1WlDtI-0000R3-M2; Fri, 16 May 2014 08:53:20 +0000 Date: Fri, 16 May 2014 01:53:20 -0700 From: Christoph Hellwig <hch@infradead.org> To: Luk?? Czerner <lczerner@redhat.com> Cc: Christoph Hellwig <hch@infradead.org>, Dave Chinner <david@fromorbit.com>, fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140516085320.GA29279@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1400230402 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.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.5852 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 16, 2014 at 10:48:42AM +0200, Luk?? Czerner wrote: > > > As requested I've created a new mailing list for xfstests > > > development and discussion. Reflecting the fact that the test > > > harness is not really XFS specific anymore, the list is: > > > > > > fstests@vger.kernel.org > > > > Isn't there an "x" missing somewhere? > > It's intentional and it is "Reflecting the fact that the test > harness is not really XFS specific anymore", even though the test > suite itself keep the name xfstests. > > This way it's more obvious to people that this is in fact not xfs > specific. Having the name different from the project it is for is stupid. Either rename the test suite, or use the same name for the mailing list. From lczerner@redhat.com Fri May 16 03:55:51 2014 Return-Path: <lczerner@redhat.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 0EAF97F50 for <xfs@oss.sgi.com>; Fri, 16 May 2014 03:55:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E665F8F8059 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:55:50 -0700 (PDT) X-ASG-Debug-ID: 1400230549-04cbb03cc55381f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KzMB6LvHbKBAowW5 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:55:50 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4G8tQN9016238 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 16 May 2014 04:55:26 -0400 Received: from dhcp-1-113.brq.redhat.com (dhcp-1-113.brq.redhat.com [10.34.1.113]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4G8tNVK024531 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 16 May 2014 04:55:24 -0400 Date: Fri, 16 May 2014 10:55:22 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= <lczerner@redhat.com> X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig <hch@infradead.org> cc: Dave Chinner <david@fromorbit.com>, fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list In-Reply-To: <20140516085320.GA29279@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <alpine.LFD.2.00.1405161054280.2099@localhost.localdomain> References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> <20140516085320.GA29279@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400230550 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, 16 May 2014, Christoph Hellwig wrote: > Date: Fri, 16 May 2014 01:53:20 -0700 > From: Christoph Hellwig <hch@infradead.org> > To: Luk?? Czerner <lczerner@redhat.com> > Cc: Christoph Hellwig <hch@infradead.org>, Dave Chinner <david@fromorbit.com>, > fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, > linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [ANNOUNCE] xfstests: new mailing list > > On Fri, May 16, 2014 at 10:48:42AM +0200, Luk?? Czerner wrote: > > > > As requested I've created a new mailing list for xfstests > > > > development and discussion. Reflecting the fact that the test > > > > harness is not really XFS specific anymore, the list is: > > > > > > > > fstests@vger.kernel.org > > > > > > Isn't there an "x" missing somewhere? > > > > It's intentional and it is "Reflecting the fact that the test > > harness is not really XFS specific anymore", even though the test > > suite itself keep the name xfstests. > > > > This way it's more obvious to people that this is in fact not xfs > > specific. > > Having the name different from the project it is for is stupid. Either > rename the test suite, or use the same name for the mailing list. Renaming the test suite is a good option if we can agree on this. -Lukas From sedat.dilek@gmail.com Fri May 16 03:55:54 2014 Return-Path: <sedat.dilek@gmail.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,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 A934C7F60 for <xfs@oss.sgi.com>; Fri, 16 May 2014 03:55:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8F6128F8059 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:55:54 -0700 (PDT) X-ASG-Debug-ID: 1400230552-04cb6c728f559ab0001-NocioJ Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id YEnp5xOTDt4kDTOK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:55:53 -0700 (PDT) X-Barracuda-Envelope-From: sedat.dilek@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wg0-f51.google.com with SMTP id x13so4538513wgg.34 for <xfs@oss.sgi.com>; Fri, 16 May 2014 01:55:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:date:message-id :subject:from:to:cc:content-type:content-transfer-encoding; bh=ioKICZdasjUcKyxjSAovI/qjjlgFGEe9MXob1vm2qgo=; b=MRXb1JF5F7C7OGy5rGuiMXvQrvbukLbePWMq6YAOFuZ3QvK0C/fVBz//Stmz8LlZtS W5zCvYXL5/kFxmcVSnvmlMmbdNvRjViuWG5wdlMIrlbCKdmxTK8ygxPv560sB/b/YCCN fsU8rWjs8h5+AqSdvGaxTdYaPIydJAWaQHnLEUqp9VOgsp4I+AbUMZTJ4HVgLRVdd2En wbjNgXrD+xnVJ02jVoTzk1zjUzGRISUQ03Z53Bo+pOkvmG5u2860hYrSQQgHDfvvVzqn xm0xSpPRBvjVHrCETGGUw26gAvsmuPQ1uoYnlrKNCISskzZcEGf1CZyl84KDe6F2CUc6 1apw== MIME-Version: 1.0 X-Received: by 10.180.92.103 with SMTP id cl7mr12669192wib.26.1400230552199; Fri, 16 May 2014 01:55:52 -0700 (PDT) Received: by 10.216.32.194 with HTTP; Fri, 16 May 2014 01:55:52 -0700 (PDT) Reply-To: sedat.dilek@gmail.com In-Reply-To: <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <alpine.LFD.2.00.1405161047010.2099@localhost.localdomain> Date: Fri, 16 May 2014 10:55:52 +0200 Message-ID: <CA+icZUW9JXTPokJ2Ci0Prq-BTPX4nv9H4tFz_1mx+CQDKuCm6g@mail.gmail.com> Subject: Re: [ANNOUNCE] xfstests: new mailing list From: Sedat Dilek <sedat.dilek@gmail.com> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list To: =?UTF-8?B?THVrw6HFoSBDemVybmVy?= <lczerner@redhat.com> Cc: Christoph Hellwig <hch@infradead.org>, Dave Chinner <david@fromorbit.com>, fstests@vger.kernel.org, linux-fsdevel <linux-fsdevel@vger.kernel.org>, Ext4 Developers List <linux-ext4@vger.kernel.org>, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-wg0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1400230553 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.5852 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 Fri, May 16, 2014 at 10:48 AM, Luk=C3=A1=C5=A1 Czerner <lczerner@redhat.= com> wrote: > On Thu, 15 May 2014, Christoph Hellwig wrote: > >> Date: Thu, 15 May 2014 22:40:09 -0700 >> From: Christoph Hellwig <hch@infradead.org> >> To: Dave Chinner <david@fromorbit.com> >> Cc: fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, >> linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi= .com >> Subject: Re: [ANNOUNCE] xfstests: new mailing list >> >> On Fri, May 16, 2014 at 02:46:11PM +1000, Dave Chinner wrote: >> > Hi folks, >> > >> > As requested I've created a new mailing list for xfstests >> > development and discussion. Reflecting the fact that the test >> > harness is not really XFS specific anymore, the list is: >> > >> > fstests@vger.kernel.org >> >> Isn't there an "x" missing somewhere? > > It's intentional and it is "Reflecting the fact that the test > harness is not really XFS specific anymore", even though the test > suite itself keep the name xfstests. > > This way it's more obvious to people that this is in fact not xfs > specific. > Why not eliminate the "x" entirely? In my testings, I used xfstests-suite for testing Ext4-FS. (My intention is not to hurt any XFS developers...). - Sedat - From toner.chips@pcc-parts.com Fri May 16 07:10:28 2014 Return-Path: <toner.chips@pcc-parts.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 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 A26E57F5D for <xfs@oss.sgi.com>; Fri, 16 May 2014 07:10:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6F0FAC010 for <xfs@oss.sgi.com>; Fri, 16 May 2014 05:10:27 -0700 (PDT) X-ASG-Debug-ID: 1400242219-04cb6c728f569820001-NocioJ Received: from smtpbg345.qq.com (smtpbg345.qq.com [58.250.132.218]) by cuda.sgi.com with SMTP id bu1wArGBa2bcs1eP for <xfs@oss.sgi.com>; Fri, 16 May 2014 05:10:20 -0700 (PDT) X-Barracuda-Envelope-From: toner.chips@pcc-parts.com X-Barracuda-Apparent-Source-IP: 58.250.132.218 X-QQ-mid: bizesmtp1t1400242064t884t064 Received: from PC-20130610DSDO (unknown [140.224.70.8]) by esmtp4.qq.com (ESMTP) with SMTP id 0 for <xfs@oss.sgi.com>; Fri, 16 May 2014 20:07:44 +0800 (CST) X-QQ-SSF: 01300000010000003R12000A0000000 X-QQ-FEAT: HsZsVTEDbcIJtPAUXw5USfqpEwNRX4tqMiU3THhJ9ogwDF6+1E5CdSaRlvXtL E1ql9x+q167PGpUST40bk3+VY8zVvEbxDd9JdgNfQK+wmkzDkZgEKoQsNZ/7gANFpG6Pgxs jbD5e0142SF5o2I18x19CjA29PgLkPvGXWMYYLc= X-QQ-GoodBg: 0 Subject: Re: new toner chip Samsung MLT-D115, Samsung MLT-D116, Samsung MLT-D203, Samsung MLT-D204, Lexmark E260 etc Content-Type: multipart/alternative; charset=UTF-8; boundary="bnHYU2nj7Ip=_dVnbmAaHnrSDxgDUfyCYO" X-ASG-Orig-Subj: Re: new toner chip Samsung MLT-D115, Samsung MLT-D116, Samsung MLT-D203, Samsung MLT-D204, Lexmark E260 etc MIME-Version: 1.0 Date: Fri, 16 May 2014 20:07:39 +0800 From: "pcc-parts" <toner.chips@pcc-parts.com> To: xfs@oss.sgi.com Reply-To: "pcc-parts" <pcc@pcc-online.com.cn> X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbg345.qq.com[58.250.132.218] X-Barracuda-Start-Time: 1400242219 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.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.5855 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: <20140516121027.0C1861296194@cuda.sgi.com> This is a multi-part message in MIME format --bnHYU2nj7Ip=_dVnbmAaHnrSDxgDUfyCYO Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: Quoted-Printable Content-Disposition: inline How are You, Friend? =20 We are PCC from Fuzhou, China,, exporting good quality toner chip for = Samsung, HP, Xerox, Konica minolta, Dell,=20 Epson, Oki, Sharp, Canon, Kyocera, Utax, Toshiba, Ricoh etc. Our new c= hips recent as follows: =20 Chip Lexmark E260-----3.5K, 6K, 9K, 15K, 18K Chip Lexmark T650n----7K, 25K, 36k, 60k Chip Lexmark X463de---3.5K, 6K, 9K, 15K, 18K =20 Chip Dell 2230d/2330d/2330dn/2350d/2350dn Dell 3330dn/3333dn/3335dn Chip IBM&Ricoh Infoprint 1811/1812 Chip IBM&Ricoh Infoprint 1822/1823 Chip IBM&Ricoh Infoprint 1930/1940MFP=20 Chip IBM&Ricoh Infoprint 1832/1852/1872/1892 Chip IBM&Ricoh Infoprint 1850/1860/1870/1880 Chip Lenovo LJ3900=20 Chip Toshiba 430P/530P Chip OKI MB780/790M/790F Chips Samsung MLT-D101 Chips Samsung MLT-D111 Chips Samsung MLT-D115 Chips Samsung MLT-D116 Chips Samsung MLT-D117 Chips Samsung MLT-D203 Chips Samsung MLT-D204 Chips Xerox DocuCentre 550/560=20 Chips Xerox 700i/700 Digital Color Press HP CF214A/X---laserjet enterprise 700 M712DN/M712XH/M725=20 HP CF283A-----LaserJet pro M126/127 =20 HP CE264X/ CF031A/ CF032A/ CF033A=20 Waiting for your news =20 Best Regards ------ Anderson pcc-online(dom)com(dom)cn MSN:printer_chips@hotmail.com Skype: toner_linda ICQ: 697-871-867 --bnHYU2nj7Ip=_dVnbmAaHnrSDxgDUfyCYO Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: Quoted-Printable Content-Disposition: inline <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>lexmark chip-1

How are You, Friend?

 

We are PCC from Fuzhou, China,, exporting good quality toner chip f= or Samsung, HP, Xerox,=20 Konica minolta, Dell,

Epson, Oki, Sharp, Canon, Kyocera, Utax, Toshiba, Ricoh etc. Our ne= w chips=20 recent as follows:

 

Chip Lexmark E260-----3.5K, 6K, 9K, 15K, 18K
Chip Lexmark T650n-= ---7K,=20 25K, 36k, 60k
Chip Lexmark X463de---3.5K, 6K, 9K, 15K, 18K

 

Chip Dell 2230d/2330d/2330dn/2350d/2350dn
Dell 3330dn/3333dn/333= 5dn

Chip IBM&Ricoh Infoprint 1811/1812
Chip IBM&Ricoh Infopr= int=20 1822/1823
Chip IBM&Ricoh Infoprint 1930/1940MFP
Chip IBM&am= p;Ricoh=20 Infoprint 1832/1852/1872/1892
Chip IBM&Ricoh Infoprint=20 1850/1860/1870/1880

Chip Lenovo LJ3900
Chip Toshiba 430P/530P
Chip OKI=20 MB780/790M/790F

Chips Samsung MLT-D101
Chips Samsung MLT-D111
Chips Samsung=20= MLT-D115
Chips Samsung MLT-D116
Chips Samsung MLT-D117
Chips = Samsung=20 MLT-D203
Chips Samsung MLT-D204


Chips Xerox DocuCentre 550/560
Chips Xerox 700i/700 Digital= Color=20 Press

HP CF214A/X---laserjet enterprise 700 M712DN/M712XH/M725
HP=20 CF283A-----LaserJet pro M126/127 
HP CE264X/ CF031A/ CF032A/=20= CF033A 

Waiting for your news

 

Kindly Regards

------

Anderson

pcc-online(dom)com(dom)cn

MSN:printer_chips@hotmail.com

Skype: toner_linda ICQ:=20 697-871-867

--bnHYU2nj7Ip=_dVnbmAaHnrSDxgDUfyCYO-- From calvin.walton@kepstin.ca Fri May 16 09:02:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5FFBC7F5E for ; Fri, 16 May 2014 09:02:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 471AD304032 for ; Fri, 16 May 2014 07:02:16 -0700 (PDT) X-ASG-Debug-ID: 1400248931-04cbb03cc5552e00001-NocioJ Received: from mail-ie0-f174.google.com (mail-ie0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id khkRnRwOWQ2Z9O7n (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 16 May 2014 07:02:11 -0700 (PDT) X-Barracuda-Envelope-From: calvin.walton@kepstin.ca X-Barracuda-Apparent-Source-IP: 209.85.223.174 Received: by mail-ie0-f174.google.com with SMTP id at1so2540750iec.33 for ; Fri, 16 May 2014 07:02:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kepstin.ca; s=google; h=message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version:content-transfer-encoding; bh=0LIRdxLaaYQ7A5yqyOTiBc+An0LXaicpalUvchtMuE8=; b=AQUfxhE3k5MB9VgHYQeYepESFX2SYajnt7idzZu2R+IcJKie/X+CCzlUZdr+hnlHPp mIHwwdxmyPuLYXEn9hsSU48VONfTFgSUeFMP7cahhTmwE8VDKm5REpsT4JsukUm3v0Yw PX/QDveLiI+HUTFrTVS8JnCF9F5QpJdkyoiT4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:content-type:mime-version:content-transfer-encoding; bh=0LIRdxLaaYQ7A5yqyOTiBc+An0LXaicpalUvchtMuE8=; b=QzeSdLWCTDHEjk7RPDLpDwYmGG/8y8MrDi6GJ1JpCmbap7/+sS/ZvCijKwcSMiU1JT VhNna6NSG7jVxBQdQTQkHRUYQGxgIBezPKoHubLWNqGKrgQJdN1CUUeOl7QHBE3ADj4I vx5IXjtju5RzBPhxcAmzmVDaS1JQStJFGtn1qIEH++xPdKfiLqfuc6h4VYn6lI0yYgCM BS6In4p9cQ8+GljzMuIxZWWJK9f0GJ21EGyFuB+MLcmeeIrB0JBXfHs3pQOZ0u8nDciH 9UEIRHGmnLIsAsyP6sHU/gj8p+GQsxIEgG3KAAxlDQDXJyi2TuOPKUW0dT2XJUVkBcZs dfRw== X-Gm-Message-State: ALoCoQkwHzQtrsZPOOaWxvTinIBjFV3xljc1YhJp2t1oJz0qnDrhvNGtWPY4djOPU37o7DX99wWZ X-Received: by 10.50.62.104 with SMTP id x8mr20382519igr.37.1400248930791; Fri, 16 May 2014 07:02:10 -0700 (PDT) Received: from sasami.ottawa.blindsidenetworks.com (OTWAON23-1242490325.sdsl.bell.ca. [74.14.229.213]) by mx.google.com with ESMTPSA id l11sm4779409igt.12.2014.05.16.07.02.08 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 May 2014 07:02:09 -0700 (PDT) Message-ID: <1400248927.979.2.camel@sasami.ottawa.blindsidenetworks.com> Subject: Re: [ANNOUNCE] xfstests: new mailing list From: Calvin Walton X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list To: =?UTF-8?Q?Luk=C3=A1=C5=A1?= Czerner Cc: Christoph Hellwig , Dave Chinner , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 16 May 2014 10:02:07 -0400 In-Reply-To: References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <20140516085320.GA29279@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-ie0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1400248931 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.5857 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 Fri, 2014-05-16 at 10:55 +0200, Lukáš Czerner wrote: > On Fri, 16 May 2014, Christoph Hellwig wrote: > > On Fri, May 16, 2014 at 10:48:42AM +0200, Luk?? Czerner wrote: > > > > > As requested I've created a new mailing list for xfstests > > > > > development and discussion. Reflecting the fact that the test > > > > > harness is not really XFS specific anymore, the list is: > > > > > > > > > > fstests@vger.kernel.org > > > > > > > > Isn't there an "x" missing somewhere? > > > > > > It's intentional and it is "Reflecting the fact that the test > > > harness is not really XFS specific anymore", even though the test > > > suite itself keep the name xfstests. > > > > > > This way it's more obvious to people that this is in fact not xfs > > > specific. > > > > Having the name different from the project it is for is stupid. Either > > rename the test suite, or use the same name for the mailing list. > > Renaming the test suite is a good option if we can agree on this. Instead of renaming the test suite, why not just "backronym" it to mean something different? The letter x is used to mean "cross" in many contexts, so "xfstests" could easily mean "cross-filesystem tests" - a name that fits perfectly! Only kind of joking, Calvin. -- Calvin Walton From tytso@thunk.org Fri May 16 09:05:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 2F32F7F69 for ; Fri, 16 May 2014 09:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14BAB8F8054 for ; Fri, 16 May 2014 07:05:52 -0700 (PDT) X-ASG-Debug-ID: 1400249150-04cbb03cc7553330001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id dfYbMsTplsNr6ig3 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 16 May 2014 07:05:51 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=8YMrACCFNoTzZQfT+kKTQ0YRnBw6138NRnquAthykBo=; b=Pp5FMFFfohDxX1q+O1Nd/KmhG8vJ6dvdt0jY24D4J+Zc1Y7AoixRrbu3olXFK9j3pNyWhkyVmSaZm+HAhiEZ9Embq27z3K1iTmJkjupGoYWDZDjXa+a1Zu2vShrIoJthhfzBN1nnd+oubZh/qrPzAw9KSYXFOcQPWvi9tHNWTBQ=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WlIlI-0000aa-C3; Fri, 16 May 2014 14:05:24 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id D7BD7580210; Fri, 16 May 2014 10:05:23 -0400 (EDT) Date: Fri, 16 May 2014 10:05:23 -0400 From: Theodore Ts'o To: Calvin Walton Cc: =?utf-8?B?THVrw6HFoQ==?= Czerner , Christoph Hellwig , Dave Chinner , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140516140523.GA20683@thunk.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <20140516085320.GA29279@infradead.org> <1400248927.979.2.camel@sasami.ottawa.blindsidenetworks.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400248927.979.2.camel@sasami.ottawa.blindsidenetworks.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1400249151 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5857 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 Fri, May 16, 2014 at 10:02:07AM -0400, Calvin Walton wrote: > > Instead of renaming the test suite, why not just "backronym" it to mean > something different? The letter x is used to mean "cross" in many > contexts, so "xfstests" could easily mean "cross-filesystem tests" - a > name that fits perfectly! Or maybe "extended file system tests", if people really are concerned about the naming. Seriously, is this really that important to folks? - Ted From bfoster@redhat.com Fri May 16 13:12:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A1DEC7F3F for ; Fri, 16 May 2014 13:12:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D477304070 for ; Fri, 16 May 2014 11:12:53 -0700 (PDT) X-ASG-Debug-ID: 1400263968-04cb6c566800010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ltrUV8U7wt8pfNF3 for ; Fri, 16 May 2014 11:12: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 (8.14.4/8.14.4) with ESMTP id s4GICm1h004879 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 16 May 2014 14:12:48 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4GIClZm024473 for ; Fri, 16 May 2014 14:12:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 80CE31248A9; Fri, 16 May 2014 14:12:46 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 0/2] xfs: sysfs attribute support Date: Fri, 16 May 2014 14:12:44 -0400 X-ASG-Orig-Subj: [RFC PATCH 0/2] xfs: sysfs attribute support Message-Id: <1400263966-35541-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: 1400263968 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 is an rfc to get some discussion rolling on sysfs support for XFS. The motivation for this work is here: http://oss.sgi.com/archives/xfs/2014-05/msg00381.html ... and also illustrated by an xfstests test I'll send in conjunction that demonstrates use of the values exported here. This functionality creates a /sys/fs/xfs directory at module initialization time and a per-mount subdirectory for each mounted device. The basic sysfs support code is pretty much borrowed from ext4. I've dumped it in xfs_mount.c for lack of a better place. While the currently exported values are more associated with the log, I'm starting with a flat directory structure here that seemingly aligns with struct xfs_mount. That said, I could drop the code into xfs_stats.c or create an entirely new file if that is preferred. I'm also interested in thoughts about what else might be exported here, if anything. I'm pretty sure we don't want to go and add all kinds of tunables and knobs just for fun. ;) I suppose things like the current AIL target or CIL push sequence could be relevant. There's also opportunity for per-AG data, though that would probably warrant a new subdirectory for AGs and require another child kobject, perhaps embedded in xfs_perag. Dave, I believe you had some ideas along the lines of not just dumping perag data, but having some element of control over an allocation group. Care to elaborate a bit more on that? Thoughts/flames on any or all of this appreciated. Brian P.S., From the looks of it, the attributes we end up creating need to be documented under /Documentation/ABI/testing/, so it's worth thinking about the desired directory structure a bit up front as well. Brian Foster (2): xfs: add basic per-mount sysfs attribute support xfs: sysfs attributes for the current log state fs/xfs/xfs_mount.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_super.c | 12 ++++- 3 files changed, 146 insertions(+), 1 deletion(-) -- 1.8.3.1 From bfoster@redhat.com Fri May 16 13:12:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 390977F3F for ; Fri, 16 May 2014 13:12:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B32F4AC001 for ; Fri, 16 May 2014 11:12:53 -0700 (PDT) X-ASG-Debug-ID: 1400263968-04cb6c566700010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GrdlxanxFsOGNaMl for ; Fri, 16 May 2014 11:12: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4GICmi5014312 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 16 May 2014 14:12:48 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4GIClZb019678 for ; Fri, 16 May 2014 14:12:48 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8DAB5124894; Fri, 16 May 2014 14:12:46 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 1/2] xfs: add basic per-mount sysfs attribute support Date: Fri, 16 May 2014 14:12:45 -0400 X-ASG-Orig-Subj: [RFC PATCH 1/2] xfs: add basic per-mount sysfs attribute support Message-Id: <1400263966-35541-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1400263966-35541-1-git-send-email-bfoster@redhat.com> References: <1400263966-35541-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: 1400263968 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 Initialize/destroy a kset on module init/fini for XFS. The XFS attribute directory is represented as /sys/fs/xfs. Create a subdirectory per-mount based on the system device name. Also add some basic macros to aid in the addition of sysfs attributes. This code is modeled after the equivalent mechanism for ext4. Signed-off-by: Brian Foster --- fs/xfs/xfs_mount.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_super.c | 12 ++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 944f3d9..9ed9dd0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -60,6 +60,9 @@ static DEFINE_MUTEX(xfs_uuid_table_mutex); static int xfs_uuid_table_size; static uuid_t *xfs_uuid_table; +extern struct kset *xfs_kset; +static struct kobj_type xfs_ktype; + /* * See if the UUID is unique among mounted XFS filesystems. * Mount fails if UUID is nil or a FS with the same UUID is already mounted. @@ -955,6 +958,13 @@ xfs_mountfs( "Unable to allocate reserve blocks. Continuing without reserve pool."); } + mp->m_kobject.kset = xfs_kset; + init_completion(&mp->m_kobject_complete); + error = kobject_init_and_add(&mp->m_kobject, &xfs_ktype, NULL, + "%s", mp->m_fsname); + if (error) + goto out_rtunmount; + return 0; out_rtunmount: @@ -986,6 +996,10 @@ xfs_unmountfs( __uint64_t resblks; int error; + kobject_del(&mp->m_kobject); + kobject_put(&mp->m_kobject); + wait_for_completion(&mp->m_kobject_complete); + cancel_delayed_work_sync(&mp->m_eofblocks_work); xfs_qm_unmount_quotas(mp); @@ -2007,3 +2021,68 @@ balance_counter: } #endif + +/* sysfs support */ + +struct xfs_sysfs_attr { + struct attribute attr; + ssize_t (*show)(struct xfs_mount *mp, char *buf); + ssize_t (*store)(struct xfs_mount *mp, const char *buf, size_t count); +}; + +#define XFS_SYSFS_ATTR_RW(name) \ + static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RW(name) +#define XFS_SYSFS_ATTR_RO(name) \ + static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RO(name) + +#define ATTR_LIST(name) &xfs_sysfs_attr_##name.attr + +static struct attribute *xfs_sysfs_attrs[] = { + NULL, +}; + +STATIC ssize_t +xfs_sysfs_show( + struct kobject *kobj, + struct attribute *attr, + char *buf) +{ + struct xfs_mount *mp = container_of(kobj, struct xfs_mount, m_kobject); + struct xfs_sysfs_attr *xfs_attr = container_of(attr, + struct xfs_sysfs_attr, attr); + + return xfs_attr->show ? xfs_attr->show(mp, buf) : 0; +} + +STATIC ssize_t +xfs_sysfs_store( + struct kobject *kobj, + struct attribute *attr, + const char *buf, + size_t count) +{ + struct xfs_mount *mp = container_of(kobj, struct xfs_mount, m_kobject); + struct xfs_sysfs_attr *xfs_attr = container_of(attr, + struct xfs_sysfs_attr, attr); + + return xfs_attr->store ? xfs_attr->store(mp, buf, count) : 0; +} + +static struct sysfs_ops xfs_sysfs_ops = { + .show = xfs_sysfs_show, + .store = xfs_sysfs_store, +}; + +STATIC void +xfs_kobj_release(struct kobject *kobj) +{ + struct xfs_mount *mp = container_of(kobj, struct xfs_mount, m_kobject); + + complete(&mp->m_kobject_complete); +} + +static struct kobj_type xfs_ktype = { + .release = xfs_kobj_release, + .sysfs_ops = &xfs_sysfs_ops, + .default_attrs = xfs_sysfs_attrs, +}; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a466c5e..b7f1cfb 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -172,6 +172,8 @@ typedef struct xfs_mount { on the next remount,rw */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ + struct kobject m_kobject; + struct completion m_kobject_complete; struct workqueue_struct *m_data_workqueue; struct workqueue_struct *m_unwritten_workqueue; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 8f0333b..1766214 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -61,6 +61,7 @@ static const struct super_operations xfs_super_operations; static kmem_zone_t *xfs_ioend_zone; mempool_t *xfs_ioend_pool; +struct kset *xfs_kset; #define MNTOPT_LOGBUFS "logbufs" /* number of XFS log buffers */ #define MNTOPT_LOGBSIZE "logbsize" /* size of XFS log buffers */ @@ -1761,9 +1762,15 @@ init_xfs_fs(void) if (error) goto out_cleanup_procfs; + xfs_kset = kset_create_and_add("xfs", NULL, fs_kobj); + if (!xfs_kset) { + error = -ENOMEM; + goto out_sysctl_unregister;; + } + error = xfs_qm_init(); if (error) - goto out_sysctl_unregister; + goto out_kset_unregister; error = register_filesystem(&xfs_fs_type); if (error) @@ -1772,6 +1779,8 @@ init_xfs_fs(void) out_qm_exit: xfs_qm_exit(); + out_kset_unregister: + kset_unregister(xfs_kset); out_sysctl_unregister: xfs_sysctl_unregister(); out_cleanup_procfs: @@ -1793,6 +1802,7 @@ exit_xfs_fs(void) { xfs_qm_exit(); unregister_filesystem(&xfs_fs_type); + kset_unregister(xfs_kset); xfs_sysctl_unregister(); xfs_cleanup_procfs(); xfs_buf_terminate(); -- 1.8.3.1 From bfoster@redhat.com Fri May 16 13:12:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3318D7F51 for ; Fri, 16 May 2014 13:12:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0FE59304043 for ; Fri, 16 May 2014 11:12:52 -0700 (PDT) X-ASG-Debug-ID: 1400263968-04cb6c566900010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tgCVhD6AvOhE5NWD for ; Fri, 16 May 2014 11:12: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4GICmVN014310 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 16 May 2014 14:12:48 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4GIClxQ027833 for ; Fri, 16 May 2014 14:12:48 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9A1BB1248BB; Fri, 16 May 2014 14:12:46 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state Date: Fri, 16 May 2014 14:12:46 -0400 X-ASG-Orig-Subj: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state Message-Id: <1400263966-35541-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1400263966-35541-1-git-send-email-bfoster@redhat.com> References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400263968 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 Create sysfs attributes to export the current runtime state of the log to userspace. Note that the filesystem should be frozen for best accuracy/consistency when reading these values, but is not required. This is for testing and debug purposes only. Create the following per-mount attributes: log_head_lsn, log_tail_lsn, reserve_head_lsn and write_head_lsn. These represent the physical log head, tail and reserve and write grant heads respectively. All values are exported as raw log sequence numbers (LSN). Note that the grant heads are in units of bytes while other LSNs are in units of basic blocks. Signed-off-by: Brian Foster --- fs/xfs/xfs_mount.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 9ed9dd0..d0d0617 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -42,6 +42,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_dinode.h" +#include "xfs_log_priv.h" #ifdef HAVE_PERCPU_SB @@ -2037,7 +2038,60 @@ struct xfs_sysfs_attr { #define ATTR_LIST(name) &xfs_sysfs_attr_##name.attr +/* sysfs attributes */ + +STATIC ssize_t +log_head_lsn_show( + struct xfs_mount *mp, + char *buf) +{ + struct xlog *log = mp->m_log; + int ret; + + spin_lock(&log->l_icloglock); + ret = snprintf(buf, PAGE_SIZE, "0x%llx\n", + xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block)); + spin_unlock(&log->l_icloglock); + + return ret; +} +XFS_SYSFS_ATTR_RO(log_head_lsn); + +STATIC ssize_t +log_tail_lsn_show( + struct xfs_mount *mp, + char *buf) +{ + return snprintf(buf, PAGE_SIZE, "0x%lx\n", + atomic64_read(&mp->m_log->l_tail_lsn)); +} +XFS_SYSFS_ATTR_RO(log_tail_lsn); + +STATIC ssize_t +reserve_head_lsn_show( + struct xfs_mount *mp, + char *buf) +{ + return snprintf(buf, PAGE_SIZE, "0x%lx\n", + atomic64_read(&mp->m_log->l_reserve_head.grant)); +} +XFS_SYSFS_ATTR_RO(reserve_head_lsn); + +STATIC ssize_t +write_head_lsn_show( + struct xfs_mount *mp, + char *buf) +{ + return snprintf(buf, PAGE_SIZE, "0x%lx\n", + atomic64_read(&mp->m_log->l_write_head.grant)); +} +XFS_SYSFS_ATTR_RO(write_head_lsn); + static struct attribute *xfs_sysfs_attrs[] = { + ATTR_LIST(log_head_lsn), + ATTR_LIST(log_tail_lsn), + ATTR_LIST(reserve_head_lsn), + ATTR_LIST(write_head_lsn), NULL, }; -- 1.8.3.1 From bfoster@redhat.com Fri May 16 13:13:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 709B37F3F for ; Fri, 16 May 2014 13:13:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4BE428F8035 for ; Fri, 16 May 2014 11:13:09 -0700 (PDT) X-ASG-Debug-ID: 1400263987-04cb6c566600060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iJxsVhE7MMZoRsYN for ; Fri, 16 May 2014 11:13: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 (8.14.4/8.14.4) with ESMTP id s4GID78S014448 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 16 May 2014 14:13:07 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4GID7s6019756 for ; Fri, 16 May 2014 14:13:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 44FBF1248A9; Fri, 16 May 2014 14:13:06 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH] xfstests: create a test for xfs log grant head leak detection Date: Fri, 16 May 2014 14:13:06 -0400 X-ASG-Orig-Subj: [RFC PATCH] xfstests: create a test for xfs log grant head leak detection Message-Id: <1400263986-35627-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: 1400263987 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 Changes in the XFS logging code have lead to small leaks in the log grant heads that consume log space slowly over time. Such problems have gone undetected for an unnecessarily long time due to code complexity and potential for very subtle problems. Losing only a few bytes per logged item on a reasonably large enough fs (10s of GB) means only the most continuously stressful workloads will cause a severe enough failure (deadlock due to log reservation exhaustion) quickly enough to indicate something is seriously wrong. Recent changes in XFS export the state of the various log heads through sysfs to aid in userspace/runtime analysis of the log. This test runs a workload against an XFS filesystem, quiesces the fs and verifies that the log reserve and write grant heads have not leaked any space with respect to the current head of the physical log. Signed-off-by: Brian Foster --- tests/xfs/011 | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/011.out | 11 +++++ tests/xfs/group | 1 + 3 files changed, 146 insertions(+) create mode 100755 tests/xfs/011 create mode 100644 tests/xfs/011.out diff --git a/tests/xfs/011 b/tests/xfs/011 new file mode 100755 index 0000000..ed15164 --- /dev/null +++ b/tests/xfs/011 @@ -0,0 +1,134 @@ +#!/bin/bash +# FS QA Test No. xfs/011 +# +# Test the xfs log reservation mechanism for leaks. Run a short fsstress +# workload to include a variety of fs operations, freeze the filesystem and +# verify that there are no oustanding reservations against the log. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_cleanup() +{ + killall -9 fsstress 2>/dev/null + wait + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# Determine the system device name for a particular block device. The device +# name is how the block dev is referenced under sysfs. +_get_device_name() +{ + devpath=$1 + + # check for a symlink (i.e., device mapper) + if [ -L $devpath ] + then + devpath=`readlink -f $devpath` + fi + + # grab the major minor and convert from hex to decimal + major=$((0x`stat -c %t $devpath`)) + minor=$((0x`stat -c %T $devpath`)) + + # refer to sysfs by major minor + basename `readlink /sys/dev/block/$major:$minor` +} + +# Use the information exported by XFS to sysfs to determine whether the log has +# active reservations after a filesystem freeze. +_check_scratch_log_state() +{ + devname=`_get_device_name $SCRATCH_DEV` + attrpath="/sys/fs/xfs/$devname" + + # freeze the fs to ensure data is synced and the log is flushed. this + # means no outstanding transactions, and thus no outstanding log + # reservations, should exist + xfs_freeze -f $SCRATCH_MNT + + # the log head is exported in basic blocks and the log grant heads in + # bytes. convert the log head to bytes for precise comparison + log_head_lsn=`cat $attrpath/log_head_lsn` + log_head_cycle=$((log_head_lsn >> 32)) + log_head_bytes=$(((log_head_lsn & 0xffffffff) * 512)) + + for attr in "reserve_head_lsn" "write_head_lsn" + do + + lsn=`cat $attrpath/$attr` + cycle=$((lsn >> 32)) + bytes=$((lsn & 0xffffffff)) + + if [ $cycle != $log_head_cycle ] || + [ $bytes != $log_head_bytes ] + then + echo "$attr ($lsn) does not match log_head_lsn" \ + "($log_head_lsn), possible leak detected." + else + echo "$attr matches log_head_lsn" + fi + done + + xfs_freeze -u $SCRATCH_MNT +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_freeze +# TODO: _requre_xfs_sysfs +if [ ! -e /sys/fs/xfs ] +then + _notrun "no kernel support for XFS sysfs attributes" +fi + +rm -f $seqres.full + +_scratch_mkfs_xfs | _filter_mkfs 2>> $seqres.full +_scratch_mount + +_check_scratch_log_state + +$FSSTRESS_PROG -d $SCRATCH_MNT/fsstress -n 1000 -p 2 -S t \ + >> $seqres.full 2>&1 + +_check_scratch_log_state + +umount $SCRATCH_MNT + +status=0 +exit diff --git a/tests/xfs/011.out b/tests/xfs/011.out new file mode 100644 index 0000000..e1d11e4 --- /dev/null +++ b/tests/xfs/011.out @@ -0,0 +1,11 @@ +QA output created by 011 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +reserve_head_lsn matches log_head_lsn +write_head_lsn matches log_head_lsn +reserve_head_lsn matches log_head_lsn +write_head_lsn matches log_head_lsn diff --git a/tests/xfs/group b/tests/xfs/group index 19fd968..99bf0e1 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -8,6 +8,7 @@ 008 rw ioctl auto quick 009 rw ioctl auto prealloc quick 010 auto quick repair +011 auto quick freeze 012 rw auto quick 013 auto metadata stress 016 rw auto quick -- 1.8.3.1 From david@fromorbit.com Fri May 16 17:19:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9C5737F3F for ; Fri, 16 May 2014 17:19:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85CA130405F for ; Fri, 16 May 2014 15:19:40 -0700 (PDT) X-ASG-Debug-ID: 1400278774-04cb6c5d0d13040001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id isDo8ASIhTeSUdKf for ; Fri, 16 May 2014 15:19:35 -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: AnNBAKaOdlN5LL1sPGdsb2JhbABZgwaqdwaURoVkAYEUFwMBAQEBODWCJQEBBTocGAsQCAMOCgklDwUlAwcaE4hA0hQXFoU/iHoHgyuBFQSZV5ZjKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 07:49:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WlQTS-0004q5-T6; Sat, 17 May 2014 08:19:30 +1000 Date: Sat, 17 May 2014 08:19:30 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Luk?? Czerner , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140516221930.GA8554@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <20140516085320.GA29279@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140516085320.GA29279@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: 1400278774 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.5867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 16, 2014 at 01:53:20AM -0700, Christoph Hellwig wrote: > On Fri, May 16, 2014 at 10:48:42AM +0200, Luk?? Czerner wrote: > > > > As requested I've created a new mailing list for xfstests > > > > development and discussion. Reflecting the fact that the test > > > > harness is not really XFS specific anymore, the list is: > > > > > > > > fstests@vger.kernel.org > > > > > > Isn't there an "x" missing somewhere? > > > > It's intentional and it is "Reflecting the fact that the test > > harness is not really XFS specific anymore", even though the test > > suite itself keep the name xfstests. > > > > This way it's more obvious to people that this is in fact not xfs > > specific. > > Having the name different from the project it is for is stupid. Either > rename the test suite, or use the same name for the mailing list. Renaming the test suite take a lot more work - .e.g renaming/moving source trees and a fixing all the documentation that points to it... So, small steps. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Fri May 16 18:01:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7376B7F3F for ; Fri, 16 May 2014 18:01:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 478B18F8054 for ; Fri, 16 May 2014 16:01:03 -0700 (PDT) X-ASG-Debug-ID: 1400281260-04cb6c5d0b15f20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id XxD2OdJwTKnw6D2u for ; Fri, 16 May 2014 16:01:00 -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: Am5IAAOYdlN5LL1sPGdsb2JhbABZgwZPqgsCGwabPhcDAQEBATg1gwI7gQIDB4htDp4GtASFVYcBghaEKgSuMoIIKzA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004wq-GH for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007ww-F9 for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/5 V2] xfs: sanitise superblock feature bit support Date: Sat, 17 May 2014 09:00:47 +1000 X-ASG-Orig-Subj: [PATCH 0/5 V2] xfs: sanitise superblock feature bit support Message-Id: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281260 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is a followup series that addresses the review comments made for this version: http://oss.sgi.com/pipermail/xfs/2014-May/036025.html The main change is to the NLINK/inode version handling (patch 3) where xfs_iread() now unconditionally converts inodes to v2 format in memory, so that if they are logged and written back they always get converted to v2 format. This means there is no more bumping of inode versions when link counts change, and xfs_iflush_int() no longer writes v1 inodes at all. Comments, testing, etc all welcome. Version 2: - rework inode version handling - remove fetaure bit template comment in xfs_sb.h From dave@fromorbit.com Fri May 16 18:01:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1F0597F51 for ; Fri, 16 May 2014 18:01:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06E4330406B for ; Fri, 16 May 2014 16:01:03 -0700 (PDT) X-ASG-Debug-ID: 1400281260-04cb6c5d0b15f20002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BRF5PiW8Le6HVDQF for ; Fri, 16 May 2014 16:01:02 -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: AvVAAAOYdlN5LL1sPGdsb2JhbABZgwaqdwabPhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0hiFVYkXhCoEsDor Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004wv-IW for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007xJ-Hr for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: remove shared supberlock feature checking Date: Sat, 17 May 2014 09:00:52 +1000 X-ASG-Orig-Subj: [PATCH 5/5] xfs: remove shared supberlock feature checking Message-Id: <1400281252-29638-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400281252-29638-1-git-send-email-david@fromorbit.com> References: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281261 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We reject any filesystem that is mounted with this feature bit set, so we don't need to check for it anywhere else. Remove the function for checking if the feature bit is set and any code that uses it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Jie Liu --- fs/xfs/xfs_fsops.c | 2 -- fs/xfs/xfs_sb.c | 3 ++- fs/xfs/xfs_sb.h | 17 ++++------------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index b099799..97886a7 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -84,8 +84,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_IALIGN : 0) | (xfs_sb_version_hasdalign(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_DALIGN : 0) | - (xfs_sb_version_hasshared(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_SHARED : 0) | (xfs_sb_version_hasextflgbit(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | (xfs_sb_version_hassector(&mp->m_sb) ? diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index de16dd5..c3453b1 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -291,7 +291,8 @@ xfs_mount_validate_sb( (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || sbp->sb_dblocks == 0 || sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || - sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp) || + sbp->sb_shared_vn != 0)) { xfs_notice(mp, "SB sanity check failed"); return XFS_ERROR(EFSCORRUPTED); } diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 2344825..c43c2d6 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -51,11 +51,12 @@ struct xfs_trans; /* * Supported feature bit list is just all bits in the versionnum field because - * we've used them all up and understand them all. + * 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. */ #define XFS_SB_VERSION_OKBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_ALLFBITS) + ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ + ~XFS_SB_VERSION_SHAREDBIT) /* * There are two words to hold XFS "feature" bits: the original @@ -341,10 +342,6 @@ static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) return false; - /* We don't support shared superblocks - nobody knows what it is */ - if (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) - return false; - return true; } @@ -397,12 +394,6 @@ static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } -static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); -} - static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || -- 1.9.0 From dave@fromorbit.com Fri May 16 18:01:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DB31D7F51 for ; Fri, 16 May 2014 18:01:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1F8D304075 for ; Fri, 16 May 2014 16:01:07 -0700 (PDT) X-ASG-Debug-ID: 1400281260-04cb6c5d0b15f20004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id jEmbqyLbwFQM1kHs for ; Fri, 16 May 2014 16:01:05 -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: Av9AAAOYdlN5LL1sPGdsb2JhbABZgwaqdwaaKoEUFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDSGIVViG+EUgSwOis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004wt-Hg for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007x9-Gs for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: turn NLINK feature on by default Date: Sat, 17 May 2014 09:00:50 +1000 X-ASG-Orig-Subj: [PATCH 3/5] xfs: turn NLINK feature on by default Message-Id: <1400281252-29638-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400281252-29638-1-git-send-email-david@fromorbit.com> References: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281264 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner mkfs has turned on the XFS_SB_VERSION_NLINKBIT feature bit by default since November 2007. It's about time we simply made the kernel code turn it on by default and so always convert v1 inodes to v2 inodes when reading them in from disk or allocating them. This This removes needless version checks and modification when bumping link counts on inodes, and will take code out of a few common code paths. text data bss dec hex filename 783251 100867 616 884734 d7ffe fs/xfs/xfs.o.orig 782664 100867 616 884147 d7db3 fs/xfs/xfs.o.patched Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_ialloc.c | 4 +- fs/xfs/xfs_inode.c | 111 +++++------------------------------------------- fs/xfs/xfs_inode.h | 1 - fs/xfs/xfs_inode_buf.c | 17 ++++---- fs/xfs/xfs_inode_item.c | 32 +------------- fs/xfs/xfs_ioctl.c | 9 +--- fs/xfs/xfs_mount.c | 6 +++ fs/xfs/xfs_sb.h | 10 ----- 9 files changed, 30 insertions(+), 164 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 3445ead..2a03f2d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -74,11 +74,9 @@ xfs_fs_geometry( } if (new_version >= 3) { geo->version = XFS_FSOP_GEOM_VERSION; - geo->flags = + geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | (xfs_sb_version_hasattr(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_ATTR : 0) | - (xfs_sb_version_hasnlink(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_NLINK : 0) | (xfs_sb_version_hasquota(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_QUOTA : 0) | (xfs_sb_version_hasalign(&mp->m_sb) ? diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 6ac0c29..c89a53a 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -280,10 +280,8 @@ xfs_ialloc_inode_init( if (tp) xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, mp->m_sb.sb_inodesize, length, gen); - } else if (xfs_sb_version_hasnlink(&mp->m_sb)) + } else version = 2; - else - version = 1; for (j = 0; j < nbufs; j++) { /* diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 6d6b44a..a6115fe 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -681,6 +681,14 @@ xfs_ialloc( return error; ASSERT(ip != NULL); + /* + * We always convert v1 inodes to v2 now - we only support filesystems + * with >= v2 inode capability, so there is no reason for ever leaving + * an inode in v1 format. + */ + if (ip->i_d.di_version == 1) + ip->i_d.di_version = 2; + ip->i_d.di_mode = mode; ip->i_d.di_onlink = 0; ip->i_d.di_nlink = nlink; @@ -690,27 +698,6 @@ xfs_ialloc( xfs_set_projid(ip, prid); memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - /* - * If the superblock version is up to where we support new format - * inodes and this is currently an old format inode, then change - * the inode version number now. This way we only do the conversion - * here rather than here and in the flush/logging code. - */ - if (xfs_sb_version_hasnlink(&mp->m_sb) && - ip->i_d.di_version == 1) { - ip->i_d.di_version = 2; - /* - * We've already zeroed the old link count, the projid field, - * and the pad field. - */ - } - - /* - * Project ids won't be stored on disk if we are using a version 1 inode. - */ - if ((prid != 0) && (ip->i_d.di_version == 1)) - xfs_bump_ino_vers2(tp, ip); - if (pip && XFS_INHERIT_GID(pip)) { ip->i_d.di_gid = pip->i_d.di_gid; if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) { @@ -1056,40 +1043,6 @@ xfs_droplink( } /* - * This gets called when the inode's version needs to be changed from 1 to 2. - * Currently this happens when the nlink field overflows the old 16-bit value - * or when chproj is called to change the project for the first time. - * As a side effect the superblock version will also get rev'd - * to contain the NLINK bit. - */ -void -xfs_bump_ino_vers2( - xfs_trans_t *tp, - xfs_inode_t *ip) -{ - xfs_mount_t *mp; - - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(ip->i_d.di_version == 1); - - ip->i_d.di_version = 2; - ip->i_d.di_onlink = 0; - memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - mp = tp->t_mountp; - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - spin_lock(&mp->m_sb_lock); - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - xfs_sb_version_addnlink(&mp->m_sb); - spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp, XFS_SB_VERSIONNUM); - } else { - spin_unlock(&mp->m_sb_lock); - } - } - /* Caller must log the inode */ -} - -/* * Increment the link count on an inode & log the change. */ int @@ -1099,22 +1052,10 @@ xfs_bumplink( { xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG); + ASSERT(ip->i_d.di_version > 1); ASSERT(ip->i_d.di_nlink > 0 || (VFS_I(ip)->i_state & I_LINKABLE)); ip->i_d.di_nlink++; inc_nlink(VFS_I(ip)); - if ((ip->i_d.di_version == 1) && - (ip->i_d.di_nlink > XFS_MAXLINK_1)) { - /* - * The inode has increased its number of links beyond - * what can fit in an old format inode. It now needs - * to be converted to a version 2 inode with a 32 bit - * link count. If this is the first inode in the file - * system to do this, then we need to bump the superblock - * version number as well. - */ - xfs_bump_ino_vers2(tp, ip); - } - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); return 0; } @@ -3249,6 +3190,7 @@ xfs_iflush_int( ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK)); ASSERT(iip != NULL && iip->ili_fields != 0); + ASSERT(ip->i_d.di_version > 1); /* set *dip = inode's place in the buffer */ dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); @@ -3309,7 +3251,7 @@ xfs_iflush_int( } /* - * Inode item log recovery for v1/v2 inodes are dependent on the + * Inode item log recovery for v2 inodes are dependent on the * di_flushiter count for correct sequencing. We bump the flush * iteration count so we can detect flushes which postdate a log record * during recovery. This is redundant as we now log every change and @@ -3332,37 +3274,6 @@ xfs_iflush_int( if (ip->i_d.di_flushiter == DI_MAX_FLUSH) ip->i_d.di_flushiter = 0; - /* - * If this is really an old format inode and the superblock version - * has not been updated to support only new format inodes, then - * convert back to the old inode format. If the superblock version - * has been updated, then make the conversion permanent. - */ - ASSERT(ip->i_d.di_version == 1 || xfs_sb_version_hasnlink(&mp->m_sb)); - if (ip->i_d.di_version == 1) { - if (!xfs_sb_version_hasnlink(&mp->m_sb)) { - /* - * Convert it back. - */ - ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - dip->di_onlink = cpu_to_be16(ip->i_d.di_nlink); - } else { - /* - * The superblock version has already been bumped, - * so just make the conversion to the new inode - * format permanent. - */ - ip->i_d.di_version = 2; - dip->di_version = 2; - ip->i_d.di_onlink = 0; - dip->di_onlink = 0; - memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - memset(&(dip->di_pad[0]), 0, - sizeof(dip->di_pad)); - ASSERT(xfs_get_projid(ip) == 0); - } - } - xfs_iflush_fork(ip, dip, iip, XFS_DATA_FORK); if (XFS_IFORK_Q(ip)) xfs_iflush_fork(ip, dip, iip, XFS_ATTR_FORK); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 13aea54..f72bffa 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -377,7 +377,6 @@ int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t, struct xfs_inode **, int *); int xfs_droplink(struct xfs_trans *, struct xfs_inode *); int xfs_bumplink(struct xfs_trans *, struct xfs_inode *); -void xfs_bump_ino_vers2(struct xfs_trans *, struct xfs_inode *); /* from xfs_file.c */ int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index 24e9939..cb35ae4 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -437,17 +437,16 @@ xfs_iread( } /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. + * Automatically convert version 1 inode formats in memory to version 2 + * inode format. If the inode is modified, it will get logged and + * rewritten as a version 2 inode. We can do this because we set the + * superblock feature bit for v2 inodes unconditionally during mount + * and it means the reast of the code can assume the inode version is 2 + * or higher. */ if (ip->i_d.di_version == 1) { + ip->i_d.di_version = 2; + memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); ip->i_d.di_nlink = ip->i_d.di_onlink; ip->i_d.di_onlink = 0; xfs_set_projid(ip, 0); diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 686889b..a640137 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -145,34 +145,6 @@ xfs_inode_item_size( xfs_inode_item_attr_fork_size(iip, nvecs, nbytes); } -/* - * If this is a v1 format inode, then we need to log it as such. This means - * that we have to copy the link count from the new field to the old. We - * don't have to worry about the new fields, because nothing trusts them as - * long as the old inode version number is there. - */ -STATIC void -xfs_inode_item_format_v1_inode( - struct xfs_inode *ip) -{ - if (!xfs_sb_version_hasnlink(&ip->i_mount->m_sb)) { - /* - * Convert it back. - */ - ASSERT(ip->i_d.di_nlink <= XFS_MAXLINK_1); - ip->i_d.di_onlink = ip->i_d.di_nlink; - } else { - /* - * The superblock version has already been bumped, - * so just make the conversion to the new inode - * format permanent. - */ - ip->i_d.di_version = 2; - ip->i_d.di_onlink = 0; - memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad)); - } -} - STATIC void xfs_inode_item_format_data_fork( struct xfs_inode_log_item *iip, @@ -370,6 +342,8 @@ xfs_inode_item_format( struct xfs_inode_log_format *ilf; struct xfs_log_iovec *vecp = NULL; + ASSERT(ip->i_d.di_version > 1); + ilf = xlog_prepare_iovec(lv, &vecp, XLOG_REG_TYPE_IFORMAT); ilf->ilf_type = XFS_LI_INODE; ilf->ilf_ino = ip->i_ino; @@ -380,8 +354,6 @@ xfs_inode_item_format( ilf->ilf_size = 2; /* format + core */ xlog_finish_iovec(lv, vecp, sizeof(struct xfs_inode_log_format)); - if (ip->i_d.di_version == 1) - xfs_inode_item_format_v1_inode(ip); xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ICORE, &ip->i_d, xfs_icdinode_size(ip->i_d.di_version)); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 2d8f4fd..55724c8 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1228,15 +1228,8 @@ xfs_ioctl_setattr( olddquot = xfs_qm_vop_chown(tp, ip, &ip->i_pdquot, pdqp); } + ASSERT(ip->i_d.di_version > 1); xfs_set_projid(ip, fa->fsx_projid); - - /* - * We may have to rev the inode as well as - * the superblock version number since projids didn't - * exist before DINODE_VERSION_2 and SB_VERSION_NLINK. - */ - if (ip->i_d.di_version == 1) - xfs_bump_ino_vers2(tp, ip); } } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 944f3d9..3f09782 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -697,6 +697,12 @@ xfs_mountfs( mp->m_update_flags |= XFS_SB_VERSIONNUM; } + /* always use v2 inodes by default now */ + if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) { + mp->m_sb.sb_versionnum |= XFS_SB_VERSION_NLINKBIT; + mp->m_update_flags |= XFS_SB_VERSIONNUM; + } + /* * Check if sb_agblocks is aligned at stripe boundary * If sb_agblocks is NOT aligned turn off m_dalign since diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 9e6a3d5..b5e7d0a 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -376,16 +376,6 @@ static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; } -static inline bool xfs_sb_version_hasnlink(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); -} - -static inline void xfs_sb_version_addnlink(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; -} - static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) { return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); -- 1.9.0 From dave@fromorbit.com Fri May 16 18:01:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0919E7F53 for ; Fri, 16 May 2014 18:01:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C4A9C8F8052 for ; Fri, 16 May 2014 16:01:07 -0700 (PDT) X-ASG-Debug-ID: 1400281262-04bdf056b815870001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 8QeGx2V6HpNaAZxT for ; Fri, 16 May 2014 16:01:02 -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: AvVAAAOYdlN5LL1sPGdsb2JhbABZgwaqdwabPhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0hiFVYkXhCoEsDor Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004wu-IG for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007xE-HI for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: don't need dirv2 checks anymore Date: Sat, 17 May 2014 09:00:51 +1000 X-ASG-Orig-Subj: [PATCH 4/5] xfs: don't need dirv2 checks anymore Message-Id: <1400281252-29638-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400281252-29638-1-git-send-email-david@fromorbit.com> References: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281262 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If the the V2 directory feature bit is not set in the superblock feature mask the filesystem will fail the good version check. Hence we don't need any other version checking on the dir2 feature bit in the code as the filesystem will not mount without it set. Remove the checking code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_fsops.c | 3 +-- fs/xfs/xfs_sb.c | 9 --------- fs/xfs/xfs_sb.h | 6 ------ 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index e365c98..93fcebd 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -92,7 +92,7 @@ xfs_dir_mount( int nodehdr_size; - ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); + ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= XFS_MAX_BLOCKSIZE); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 2a03f2d..b099799 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -75,6 +75,7 @@ xfs_fs_geometry( if (new_version >= 3) { geo->version = XFS_FSOP_GEOM_VERSION; geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK | + XFS_FSOP_GEOM_FLAGS_DIRV2 | (xfs_sb_version_hasattr(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_ATTR : 0) | (xfs_sb_version_hasquota(&mp->m_sb) ? @@ -87,8 +88,6 @@ xfs_fs_geometry( XFS_FSOP_GEOM_FLAGS_SHARED : 0) | (xfs_sb_version_hasextflgbit(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_EXTFLG : 0) | - (xfs_sb_version_hasdirv2(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_DIRV2 : 0) | (xfs_sb_version_hassector(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_SECTOR : 0) | (xfs_sb_version_hasasciici(&mp->m_sb) ? diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index 8baf61a..de16dd5 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -333,15 +333,6 @@ xfs_mount_validate_sb( xfs_warn(mp, "Offline file system operation in progress!"); return XFS_ERROR(EFSCORRUPTED); } - - /* - * Version 1 directory format has never worked on Linux. - */ - if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { - xfs_warn(mp, "file system using version 1 directory format"); - return XFS_ERROR(ENOSYS); - } - return 0; } diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index b5e7d0a..2344825 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -403,12 +403,6 @@ static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } -static inline bool xfs_sb_version_hasdirv2(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); -} - static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || -- 1.9.0 From dave@fromorbit.com Fri May 16 18:01:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0E37C7F51 for ; Fri, 16 May 2014 18:01:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8FC7AAC001 for ; Fri, 16 May 2014 16:01:05 -0700 (PDT) X-ASG-Debug-ID: 1400281260-04cb6c5d0b15f20003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id iOpiPpgqQKuAbW0Y for ; Fri, 16 May 2014 16:01:03 -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: AvVAAAOYdlN5LL1sPGdsb2JhbABZgwaqdwabPhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0hiFVYkXhCoEpGmLUSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004ws-HF for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007x4-GO for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 Date: Sat, 17 May 2014 09:00:49 +1000 X-ASG-Orig-Subj: [PATCH 2/5] xfs: keep sb_bad_features2 the same a sb_features2 Message-Id: <1400281252-29638-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400281252-29638-1-git-send-email-david@fromorbit.com> References: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281263 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Whenever we update sb_features2, we need to update sb_bad_features2 so that they remain identical on disk. This prevents future mounts or userspace utilities from getting confused over which features the filesystem supports. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_sb.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index c750126..9e6a3d5 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -468,11 +468,13 @@ static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; } static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; } -- 1.9.0 From dave@fromorbit.com Fri May 16 18:01:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3B9BF7F57 for ; Fri, 16 May 2014 18:01:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B78BAC005 for ; Fri, 16 May 2014 16:01:07 -0700 (PDT) X-ASG-Debug-ID: 1400281264-04cb6c5d0c15f30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BnK9BgJtitg83RO1 for ; Fri, 16 May 2014 16:01:04 -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: AvVAAAOYdlN5LL1sPGdsb2JhbABZgwaqdwabPhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA0hiFVY1BBLA6Kw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:30:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR7Z-0004wr-Gh for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR7Z-0007wz-Ft for xfs@oss.sgi.com; Sat, 17 May 2014 09:00:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: make superblock version checks reflect reality Date: Sat, 17 May 2014 09:00:48 +1000 X-ASG-Orig-Subj: [PATCH 1/5] xfs: make superblock version checks reflect reality Message-Id: <1400281252-29638-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400281252-29638-1-git-send-email-david@fromorbit.com> References: <1400281252-29638-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281264 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We only support filesystems that have v2 directory support, and than means all the checking and handling of superblock versions prior to this support being added is completely unnecessary overhead. Strip out all the version 1-3 support, sanitise the good version checking to reflect the supported versions, update all the feature supported functions and clean up all the support bit definitions to reflect the fact that we no longer care about Irix bootloader flag regions for v4 feature bits. Also, convert the return values to boolean types and remove typedefs from function declarations to clean up calling conventions, too. Because the feature bit checking is all inline code, this relatively small cleanup has a noticable impact on code size: text data bss dec hex filename 785195 100867 616 886678 d8796 fs/xfs/xfs.o.orig 783595 100867 616 885078 d8156 fs/xfs/xfs.o.patched i.e. it reduces it by 1600 bytes. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_sb.h | 220 ++++++++++++++++++++------------------------------------ 1 file changed, 76 insertions(+), 144 deletions(-) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 950d1ea..c750126 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -36,8 +36,6 @@ struct xfs_trans; #define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 -#define XFS_SB_VERSION_SASHFBITS 0xf000 -#define XFS_SB_VERSION_REALFBITS 0x0ff0 #define XFS_SB_VERSION_ATTRBIT 0x0010 #define XFS_SB_VERSION_NLINKBIT 0x0020 #define XFS_SB_VERSION_QUOTABIT 0x0040 @@ -50,24 +48,14 @@ struct xfs_trans; #define XFS_SB_VERSION_DIRV2BIT 0x2000 #define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ #define XFS_SB_VERSION_MOREBITSBIT 0x8000 -#define XFS_SB_VERSION_OKSASHFBITS \ - (XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT | \ - XFS_SB_VERSION_BORGBIT) -#define XFS_SB_VERSION_OKREALFBITS \ - (XFS_SB_VERSION_ATTRBIT | \ - XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_QUOTABIT | \ - XFS_SB_VERSION_ALIGNBIT | \ - XFS_SB_VERSION_DALIGNBIT | \ - XFS_SB_VERSION_SHAREDBIT | \ - XFS_SB_VERSION_LOGV2BIT | \ - XFS_SB_VERSION_SECTORBIT | \ - XFS_SB_VERSION_MOREBITSBIT) -#define XFS_SB_VERSION_OKREALBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_OKREALFBITS | \ - XFS_SB_VERSION_OKSASHFBITS) + +/* + * Supported feature bit list is just all bits in the versionnum field because + * we've used them all up and understand them all. + */ +#define XFS_SB_VERSION_OKBITS \ + (XFS_SB_VERSION_NUMBITS | \ + XFS_SB_VERSION_ALLFBITS) /* * There are two words to hold XFS "feature" bits: the original @@ -76,7 +64,6 @@ struct xfs_trans; * * These defines represent bits in sb_features2. */ -#define XFS_SB_VERSION2_REALFBITS 0x00ffffff /* Mask: features */ #define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 #define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ #define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 @@ -86,16 +73,11 @@ struct xfs_trans; #define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ #define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ -#define XFS_SB_VERSION2_OKREALFBITS \ +#define XFS_SB_VERSION2_OKBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ XFS_SB_VERSION2_PROJID32BIT | \ XFS_SB_VERSION2_FTYPE) -#define XFS_SB_VERSION2_OKSASHFBITS \ - (0) -#define XFS_SB_VERSION2_OKREALBITS \ - (XFS_SB_VERSION2_OKREALFBITS | \ - XFS_SB_VERSION2_OKSASHFBITS ) /* * Superblock - in core version. Must match the ondisk version below. @@ -345,214 +327,164 @@ typedef enum { #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) -static inline int xfs_sb_good_version(xfs_sb_t *sbp) +/* + * The first XFS version we support is a v4 superblock with V2 directories. + */ +static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) { - /* We always support version 1-3 */ - if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && - sbp->sb_versionnum <= XFS_SB_VERSION_3) - return 1; + if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) + return false; - /* We support version 4 if all feature bits are supported */ - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { - if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) - return 0; + /* check for unknown features in the fs */ + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) + return false; - if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) - return 0; - return 1; - } - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) - return 1; + /* We don't support shared superblocks - nobody knows what it is */ + if (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) + return false; - return 0; + return true; +} + +static inline bool xfs_sb_good_version(struct xfs_sb *sbp) +{ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return true; + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + return xfs_sb_good_v4_features(sbp); + return false; } /* * Detect a mismatched features2 field. Older kernels read/wrote * this into the wrong slot, so to be safe we keep them in sync. */ -static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) -{ - return (sbp->sb_bad_features2 != sbp->sb_features2); -} - -static inline unsigned xfs_sb_version_tonew(unsigned v) +static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp) { - if (v == XFS_SB_VERSION_1) - return XFS_SB_VERSION_4; - - if (v == XFS_SB_VERSION_2) - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; - - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT | - XFS_SB_VERSION_NLINKBIT; + return sbp->sb_bad_features2 != sbp->sb_features2; } -static inline unsigned xfs_sb_version_toold(unsigned v) +static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp) { - if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) - return 0; - if (v & XFS_SB_VERSION_NLINKBIT) - return XFS_SB_VERSION_3; - if (v & XFS_SB_VERSION_ATTRBIT) - return XFS_SB_VERSION_2; - return XFS_SB_VERSION_1; + return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); } -static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) +static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_2 || - sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; } -static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasnlink(struct xfs_sb *sbp) { - if (sbp->sb_versionnum == XFS_SB_VERSION_1) - sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; - else - sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; + return (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); } -static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) +static inline void xfs_sb_version_addnlink(struct xfs_sb *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; } -static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) { - if (sbp->sb_versionnum <= XFS_SB_VERSION_2) - sbp->sb_versionnum = XFS_SB_VERSION_3; - else - sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; + return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } -static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) +static inline void xfs_sb_version_addquota(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; } -static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp) { - if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; - else - sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | - XFS_SB_VERSION_QUOTABIT; -} - -static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } -static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } -static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasshared(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT); } -static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasdirv2(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); } -static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); } -static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); } -static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } -static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); + return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } -static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); } /* * sb_features2 bit version macros. - * - * For example, for a bit defined as XFS_SB_VERSION2_FUNBIT, has a macro: - * - * SB_VERSION_HASFUNBIT(xfs_sb_t *sbp) - * ((xfs_sb_version_hasmorebits(sbp) && - * ((sbp)->sb_features2 & XFS_SB_VERSION2_FUNBIT) */ - -static inline int xfs_sb_version_haslazysbcount(xfs_sb_t *sbp) +static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); } -static inline int xfs_sb_version_hasattr2(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); } -static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) +static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; } -static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) +static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; } -static inline int xfs_sb_version_hasprojid32bit(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (xfs_sb_version_hasmorebits(sbp) && (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); } -static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) +static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; @@ -625,12 +557,12 @@ xfs_sb_has_incompat_log_feature( /* * V5 superblock specific feature checks */ -static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) +static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } -static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) +static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } -- 1.9.0 From dave@fromorbit.com Fri May 16 18:01:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8F3AA7F53 for ; Fri, 16 May 2014 18:01:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 567C530406B for ; Fri, 16 May 2014 16:01:32 -0700 (PDT) X-ASG-Debug-ID: 1400281290-04bdf056b6158d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id TezXZjYl6I2lPhAg for ; Fri, 16 May 2014 16:01:30 -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: AvBAAAOYdlN5LL1sPGdsb2JhbABZgwaqdwabPhcDAQEBATg1giUBLS87GGoDBy2IQJ4UtASFVYkXhCoEpGmLUSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 08:31:30 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WlR84-0004xS-Ti for xfs@oss.sgi.com; Sat, 17 May 2014 09:01:28 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WlR84-0007z0-Sb for xfs@oss.sgi.com; Sat, 17 May 2014 09:01:28 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: remove redundant checks from xfs_da_read_buf Date: Sat, 17 May 2014 09:01:28 +1000 X-ASG-Orig-Subj: [PATCH] xfs: remove redundant checks from xfs_da_read_buf Message-Id: <1400281288-30652-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1400281290 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner All of the verification checks of magic numbers are now done by verifiers, so ther eis no need to check them again once the buffer has been successfully read. If the magic number is bad, it won't even get to that code to verify it so it really serves no purpose at all anymore. Remove it. Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_btree.c | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 9eec594..4db5102 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2624,47 +2624,6 @@ xfs_da_read_buf( xfs_buf_set_ref(bp, XFS_ATTR_BTREE_REF); else xfs_buf_set_ref(bp, XFS_DIR_BTREE_REF); - - /* - * This verification code will be moved to a CRC verification callback - * function so just leave it here unchanged until then. - */ - { - xfs_dir2_data_hdr_t *hdr = bp->b_addr; - xfs_dir2_free_t *free = bp->b_addr; - xfs_da_blkinfo_t *info = bp->b_addr; - uint magic, magic1; - struct xfs_mount *mp = dp->i_mount; - - magic = be16_to_cpu(info->magic); - magic1 = be32_to_cpu(hdr->magic); - if (unlikely( - XFS_TEST_ERROR((magic != XFS_DA_NODE_MAGIC) && - (magic != XFS_DA3_NODE_MAGIC) && - (magic != XFS_ATTR_LEAF_MAGIC) && - (magic != XFS_ATTR3_LEAF_MAGIC) && - (magic != XFS_DIR2_LEAF1_MAGIC) && - (magic != XFS_DIR3_LEAF1_MAGIC) && - (magic != XFS_DIR2_LEAFN_MAGIC) && - (magic != XFS_DIR3_LEAFN_MAGIC) && - (magic1 != XFS_DIR2_BLOCK_MAGIC) && - (magic1 != XFS_DIR3_BLOCK_MAGIC) && - (magic1 != XFS_DIR2_DATA_MAGIC) && - (magic1 != XFS_DIR3_DATA_MAGIC) && - (free->hdr.magic != - cpu_to_be32(XFS_DIR2_FREE_MAGIC)) && - (free->hdr.magic != - cpu_to_be32(XFS_DIR3_FREE_MAGIC)), - mp, XFS_ERRTAG_DA_READ_BUF, - XFS_RANDOM_DA_READ_BUF))) { - trace_xfs_da_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR("xfs_da_do_buf(2)", - XFS_ERRLEVEL_LOW, mp, info); - error = XFS_ERROR(EFSCORRUPTED); - xfs_trans_brelse(trans, bp); - goto out_free; - } - } *bpp = bp; out_free: if (mapp != &map) -- 1.9.0 From ats@offog.org Fri May 16 18:02:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 412A97F4E for ; Fri, 16 May 2014 18:02:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5A8AAC005 for ; Fri, 16 May 2014 16:02:24 -0700 (PDT) X-ASG-Debug-ID: 1400281341-04cb6c5d0b16060001-NocioJ Received: from a.painless.aa.net.uk (a.painless.aa.net.uk [81.187.30.51]) by cuda.sgi.com with ESMTP id 5m3OqqMToWlCAANJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 16 May 2014 16:02:22 -0700 (PDT) X-Barracuda-Envelope-From: ats@offog.org X-Barracuda-Apparent-Source-IP: 81.187.30.51 Received: from cartman.offog.org ([2001:8b0:83b:b53f::a]) by a.painless.aa.net.uk with esmtps (TLSv1:AES128-SHA:128) (Exim 4.77) (envelope-from ) id 1WlR8q-0008FN-Lr; Sat, 17 May 2014 00:02:20 +0100 Received: from ats by cartman.offog.org with local (Exim 4.82) (envelope-from ) id 1WlR8p-0002D1-B2; Sat, 17 May 2014 00:02:15 +0100 From: Adam Sampson To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! Organization: I'll send this message down the wire and hope that someone wise is listening X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@dastard> Date: Sat, 17 May 2014 00:02:15 +0100 In-Reply-To: <20140516055650.GF26353@dastard> (Dave Chinner's message of "Fri, 16 May 2014 15:56:50 +1000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: Adam Sampson X-Barracuda-Connect: a.painless.aa.net.uk[81.187.30.51] X-Barracuda-Start-Time: 1400281342 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.5868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner writes: > It is my pleasure to announce the release of v3.2.0 of the xfsprogs > package. If this is built with DEBUG= (i.e. not defaulting to DEBUG=-NDEBUG), several source files fail to compile -- it looks like there are a number of assertions that haven't been updated for changes in the code: logitem.c:53:24: error: 'struct xfs_buf' has no member named 'b_map_count' ASSERT(blip->bli_buf->b_map_count == nmaps); ^ trans.c:52:12: error: 'struct xfs_log_item' has no member named 'li_ailp' ASSERT(lip->li_ailp == tp->t_mountp->m_ail); ^ trans.c:52:37: error: 'xfs_mount_t' has no member named 'm_ail' ASSERT(lip->li_ailp == tp->t_mountp->m_ail); ^ util.c:253:40: error: 'mp' undeclared (first use in this function) ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); ^ util.c:401:33: error: 'xfs_ifork_t' has no member named 'if_ext_max' ip->i_d.di_nextents > ip->i_df.if_ext_max); ^ xfs_btree.c:545:2: warning: implicit declaration of function 'xfs_buf_geterror' [-Wimplicit-function-declaration] ASSERT(!xfs_buf_geterror(bp)); ^ xfs_btree.c:2052:21: error: 'const struct xfs_btree_ops' has no member named 'keys_inorder' ASSERT(cur->bc_ops->keys_inorder(cur, ^ xfs_btree.c:2064:21: error: 'const struct xfs_btree_ops' has no member named 'recs_inorder' ASSERT(cur->bc_ops->recs_inorder(cur, ^ xfs_btree.c:2240:21: error: 'const struct xfs_btree_ops' has no member named 'keys_inorder' ASSERT(cur->bc_ops->keys_inorder(cur, rkp, ^ xfs_btree.c:2259:21: error: 'const struct xfs_btree_ops' has no member named 'recs_inorder' ASSERT(cur->bc_ops->recs_inorder(cur, rrp, ^ xfs_dir2_node.c:1053:36: error: 'oldstale' undeclared (first use in this function) ASSERT(hdr1.stale + hdr2.stale == oldstale); ^ xfs_inode_fork.c:728:2: warning: implicit declaration of function 'xfs_isilocked' [-Wimplicit-function-declaration] ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); ^ xfs_inode_fork.c:728:42: error: 'XFS_ILOCK_SHARED' undeclared (first use in this function) ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); ^ (Errors from current Git, built with GCC 4.9. You also get a good crop of warnings if you build it with clang 3.4.1's scan-build, which'd be worth checking out in case there's anything serious there.) > A signed gzipped-tar archive of the source code is available here: It's signed with a different key from the previous release -- it'd be useful to mention the key ID in the announcement so that it can be verified. Cheers, -- Adam Sampson From david@fromorbit.com Fri May 16 19:23:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2DA6E7F3F for ; Fri, 16 May 2014 19:23:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 10FA38F804B for ; Fri, 16 May 2014 17:23:17 -0700 (PDT) X-ASG-Debug-ID: 1400286192-04cb6c5d0b1ae90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id qGqSkRprLWDN2yyu for ; Fri, 16 May 2014 17:23:12 -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: AnNBAMmqdlN5LL1sPGdsb2JhbABZgwaqdwaURoVkAYEMFwMBAQEBODWCJQEBBAE6HCMQCAMOCgklDwUlAwcaE4g5B9F0FxaFP4h6B4MrgRUEmVeWYys Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 17 May 2014 09:53:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WlSP7-00058D-AM; Sat, 17 May 2014 10:23:09 +1000 Date: Sat, 17 May 2014 10:23:09 +1000 From: Dave Chinner To: Adam Sampson Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! Message-ID: <20140517002309.GA18954@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@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: 1400286192 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.5870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 12:02:15AM +0100, Adam Sampson wrote: > Dave Chinner writes: > > > It is my pleasure to announce the release of v3.2.0 of the xfsprogs > > package. > > If this is built with DEBUG= (i.e. not defaulting to DEBUG=-NDEBUG), > several source files fail to compile -- it looks like there are a number > of assertions that haven't been updated for changes in the code: Can't say I've ever built xfsprogs with "DEBUG=". I'm not sure there's really any benefit in doing so - it's preferable to have things like xfs_repair abort when it comes across an inconsistency it can't handle than to continue blindly along and making a bigger mess of the filesystem it's supposed to be fixing... Anyway, we'll look to fix it for 3.2.1. > (Errors from current Git, built with GCC 4.9. You also get a good crop > of warnings if you build it with clang 3.4.1's scan-build, which'd be > worth checking out in case there's anything serious there.) ISTR that was done recently by Eric, and I've run clang recently, too. > > A signed gzipped-tar archive of the source code is available here: > > It's signed with a different key from the previous release -- it'd be > useful to mention the key ID in the announcement so that it can be > verified. Should be obvious, yes? Especially with the release announcement being signed, too. As it is, release tarballs have always been signed with the current maintainer's key, so when the maintainer changes so does the signing key.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri May 16 20:01:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D68C87F3F for ; Fri, 16 May 2014 20:01:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5CF26AC001 for ; Fri, 16 May 2014 18:01:09 -0700 (PDT) X-ASG-Debug-ID: 1400288467-04cbb006da1c8a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mVbZWT7WKqFCAPkq for ; Fri, 16 May 2014 18:01:07 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7E44A63C6059; Fri, 16 May 2014 20:01:07 -0500 (CDT) Message-ID: <5376B4D7.1000006@sandeen.net> Date: Fri, 16 May 2014 20:01:11 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner , Adam Sampson CC: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@dastard> <20140517002309.GA18954@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! In-Reply-To: <20140517002309.GA18954@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1400288467 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.5871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/16/14, 7:23 PM, Dave Chinner wrote: > On Sat, May 17, 2014 at 12:02:15AM +0100, Adam Sampson wrote: >> Dave Chinner writes: >> >>> It is my pleasure to announce the release of v3.2.0 of the xfsprogs >>> package. >> >> If this is built with DEBUG= (i.e. not defaulting to DEBUG=-NDEBUG), >> several source files fail to compile -- it looks like there are a number >> of assertions that haven't been updated for changes in the code: > > Can't say I've ever built xfsprogs with "DEBUG=". I'm not sure > there's really any benefit in doing so - it's preferable to have > things like xfs_repair abort when it comes across an inconsistency > it can't handle than to continue blindly along and making a bigger > mess of the filesystem it's supposed to be fixing... > > Anyway, we'll look to fix it for 3.2.1. -NDEBUG is only default for libxfs/ AFAIK: # grep -B1 NDEBUG libxfs/Makefile # don't try linking xfs_repair with a debug libxfs. DEBUG = -DNDEBUG For everything else, default should be -DDEBUG: configure: DEBUG=${DEBUG:-'-DDEBUG'} debug_build="$DEBUG" so default is -DDEBUG for everything except libxfs, with -NDEBUG; I'm not sure what '' does - break, apparently. Seems like maybe just a bit of a makefile mess and maybe old crufty code. Patches accepted and all that. :) But maybe it's time to remove it as an option, and just DTRT everywhere. >> (Errors from current Git, built with GCC 4.9. You also get a good crop >> of warnings if you build it with clang 3.4.1's scan-build, which'd be >> worth checking out in case there's anything serious there.) > > ISTR that was done recently by Eric, and I've run clang recently, > too. Some, yeah. I don't claim to have gotten it all cleaned up yet, though. We also keep track of what Coverity finds, chipping away at a backlog of potential defects... Thanks for the report, though, there's always more to do... -Eric From ats@offog.org Sat May 17 05:54:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7486A7F3F for ; Sat, 17 May 2014 05:54:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11408AC001 for ; Sat, 17 May 2014 03:54:03 -0700 (PDT) X-ASG-Debug-ID: 1400324040-04bdf056b5377a0001-NocioJ Received: from b.painless.aa.net.uk (b.painless.aa.net.uk [81.187.30.52]) by cuda.sgi.com with ESMTP id RdhJ4FdiiiggRR2x (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 17 May 2014 03:54:01 -0700 (PDT) X-Barracuda-Envelope-From: ats@offog.org X-Barracuda-Apparent-Source-IP: 81.187.30.52 Received: from cartman.offog.org ([2001:8b0:83b:b53f::a]) by b.painless.aa.net.uk with esmtps (TLSv1:AES128-SHA:128) (Exim 4.72) (envelope-from ) id 1WlcFY-00065e-Gz; Sat, 17 May 2014 11:54:00 +0100 Received: from ats by cartman.offog.org with local (Exim 4.82) (envelope-from ) id 1WlcEm-0003Vg-ES; Sat, 17 May 2014 11:53:08 +0100 From: Adam Sampson To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! Organization: I'll send this message down the wire and hope that someone wise is listening X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@dastard> <20140517002309.GA18954@dastard> Date: Sat, 17 May 2014 11:53:08 +0100 In-Reply-To: <20140517002309.GA18954@dastard> (Dave Chinner's message of "Sat, 17 May 2014 10:23:09 +1000") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: Adam Sampson X-Barracuda-Connect: b.painless.aa.net.uk[81.187.30.52] X-Barracuda-Start-Time: 1400324041 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.5881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner writes: > [...] it's preferable to have things like xfs_repair abort when it > comes across an inconsistency it can't handle than to continue blindly > along and making a bigger mess of the filesystem it's supposed to be > fixing... Yes -- that's why I was building with DEBUG= on previous releases (i.e. I want assertions enabled). doc/INSTALL says that DEBUG=-DNDEBUG disables assertions, so packagers are quite likely to have DEBUG= in their build process. > Anyway, we'll look to fix it for 3.2.1. Cheers. :) -- Adam Sampson From llovthmukuru@gmail.com Sat May 17 06:36:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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_FONT_SIZE_LARGE,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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D5DD37F3F for ; Sat, 17 May 2014 06:36:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AF8178F80CE for ; Sat, 17 May 2014 04:36:34 -0700 (PDT) X-ASG-Debug-ID: 1400326593-04cbb006d939ce0001-NocioJ Received: from mail-vc0-f193.google.com (mail-vc0-f193.google.com [209.85.220.193]) by cuda.sgi.com with ESMTP id 1GBQClHUKMDqvbqq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 17 May 2014 04:36:33 -0700 (PDT) X-Barracuda-Envelope-From: llovthmukuru@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.193 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.193] Received: by mail-vc0-f193.google.com with SMTP id hu19so1797844vcb.8 for ; Sat, 17 May 2014 04:36:33 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.193] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.193] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=nEtCd7suk7Lfhokv8PXXN1HJUV8XyNq/61VznzAJMGA=; b=yHG90b9Ay1v9rNvH8RKcXDp0wOtSmMQPaLFiNkwun/ior+LOxhOjrzorp/IWujk8Dx iVCWdPhTAOtkci3xgo6UtTg0ppWwdimW0f6RTNHWFGXS4Phucwd7vOrQRWpYUqgkEexc sL1afM06vHkBhahwUWQUfVFRg2/5ZCDipQ1/X33ilyj8pvPFNxNu/LU8sCAyGvTi+Mna f4ptDInQ3ZPsFpIYHFSKaeCXf48CCu+IRQA0yTVwzKpTb1E8f1/wusAssWmwazczHnSh dz2borXf1G4IGjPikQ6ojtdaWLRfLl3E8J95Vq5/VGn9RbD/+TVQER6l7Emd3tQLY8iP H6aw== MIME-Version: 1.0 X-Received: by 10.58.13.104 with SMTP id g8mr19427916vec.16.1400326592985; Sat, 17 May 2014 04:36:32 -0700 (PDT) Sender: llovthmukuru@gmail.com Received: by 10.52.138.199 with HTTP; Sat, 17 May 2014 04:36:32 -0700 (PDT) Date: Sat, 17 May 2014 12:36:32 +0100 X-Google-Sender-Auth: yQI96Lz4yKAsKQmlX2ZDWXFfBs8 Message-ID: Subject: hello From: llovth mukuru X-ASG-Orig-Subj: hello To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7b2e738625036104f996f1b5 X-Barracuda-Connect: mail-vc0-f193.google.com[209.85.220.193] X-Barracuda-Start-Time: 1400326593 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_FONT_SIZE_LARGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5882 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_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b2e738625036104f996f1b5 Content-Type: text/plain; charset=UTF-8 -- My dear, am loveth mukuru, please i have important things to discourse with and i need your help , i do Waite for you respond then i can open up to tall you all and send you my photo ,hope to hear from you --047d7b2e738625036104f996f1b5 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


--
<= div style=3D"margin:0px;padding:0px;line-height:15.59375px;outline:none;zoo= m:1;color:rgb(0,0,0);font-family:Helvetica,Arial,sans-serif">My dear, am loveth mukuru, plea= se i have important things to discourse with
=C2=A0and i need your help , i= do Waite for you respond then i can open up to
=C2=A0tall you all and =C2=A0s= end you my photo ,hope to hear from you
--047d7b2e738625036104f996f1b5-- From BATV+1a846e67d3349442f829+3919+infradead.org+hch@bombadil.srs.infradead.org Sat May 17 06:54:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5885F7F3F for ; Sat, 17 May 2014 06:54:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 20EC28F80FB for ; Sat, 17 May 2014 04:54:28 -0700 (PDT) X-ASG-Debug-ID: 1400327666-04cb6c5d0c3f230001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id V0dF7hemTrbS36cZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 17 May 2014 04:54:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+1a846e67d3349442f829+3919+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 1WldC5-00037m-VY; Sat, 17 May 2014 11:54:25 +0000 Date: Sat, 17 May 2014 04:54:25 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: turn NLINK feature on by default Message-ID: <20140517115425.GA10470@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: turn NLINK feature on by default References: <1400281252-29638-1-git-send-email-david@fromorbit.com> <1400281252-29638-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400281252-29638-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1400327666 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.5882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 944f3d9..3f09782 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -697,6 +697,12 @@ xfs_mountfs( > mp->m_update_flags |= XFS_SB_VERSIONNUM; > } > > + /* always use v2 inodes by default now */ > + if (!(mp->m_sb.sb_versionnum & XFS_SB_VERSION_NLINKBIT)) { > + mp->m_sb.sb_versionnum |= XFS_SB_VERSION_NLINKBIT; > + mp->m_update_flags |= XFS_SB_VERSIONNUM; > + } This probably should print a message for the user. Otherwise looks fine, Reviewed-by: Christoph Hellwig From BATV+1a846e67d3349442f829+3919+infradead.org+hch@bombadil.srs.infradead.org Sat May 17 06:54:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E75C37F3F for ; Sat, 17 May 2014 06:54:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 70C3DAC03B for ; Sat, 17 May 2014 04:54:51 -0700 (PDT) X-ASG-Debug-ID: 1400327690-04cbb006d93ad70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id G9mCsx3v3focLsUN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 17 May 2014 04:54:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+1a846e67d3349442f829+3919+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 1WldCU-00038p-0o; Sat, 17 May 2014 11:54:50 +0000 Date: Sat, 17 May 2014 04:54:50 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove redundant checks from xfs_da_read_buf Message-ID: <20140517115450.GB10470@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove redundant checks from xfs_da_read_buf References: <1400281288-30652-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400281288-30652-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1400327690 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.5882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 09:01:28AM +1000, Dave Chinner wrote: > From: Dave Chinner > > All of the verification checks of magic numbers are now done by > verifiers, so ther eis no need to check them again once the buffer > has been successfully read. If the magic number is bad, it won't > even get to that code to verify it so it really serves no purpose at > all anymore. Remove it. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From debbugs@buxtehude.debian.org Sat May 17 13:03:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9F6657F3F for ; Sat, 17 May 2014 13:03:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BBEA304039 for ; Sat, 17 May 2014 11:03:19 -0700 (PDT) X-ASG-Debug-ID: 1400349794-04cb6c5d0a55d30001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id xG5MpDtwJmhJF9rO (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 17 May 2014 11:03:14 -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.80) (envelope-from ) id 1Wliwx-0002UV-VN; Sat, 17 May 2014 18:03:11 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#748483: xfsprogs: Let's add a watch file Reply-To: Vincent Blut , 748483@bugs.debian.org X-ASG-Orig-Subj: Bug#748483: xfsprogs: Let's add a watch file Resent-From: Vincent Blut Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sat, 17 May 2014 18:03:07 +0000 Resent-Message-ID: X-Debian-PR-Message: report 748483 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.14003496038004 (code B); Sat, 17 May 2014 18:03:07 +0000 Received: (at submit) by bugs.debian.org; 17 May 2014 18:00:03 +0000 Received: from smtp2-g21.free.fr ([212.27.42.2]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1Wlitv-00024p-LI for submit@bugs.debian.org; Sat, 17 May 2014 18:00:03 +0000 Received: from [127.0.1.1] (unknown [82.250.193.13]) by smtp2-g21.free.fr (Postfix) with ESMTP id 47DCA4B0045; Sat, 17 May 2014 19:58:26 +0200 (CEST) Content-Type: multipart/mixed; boundary="===============8774757689455281661==" MIME-Version: 1.0 From: Vincent Blut To: Debian Bug Tracking System Message-ID: <20140517175957.5232.71552.reportbug@lamella> X-Mailer: reportbug 6.5.0 Date: Sat, 17 May 2014 19:59:57 +0200 Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400349794 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: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580C, BSF_RULE_7580D X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5888 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580C Custom Rule 7580C 0.75 BSF_RULE_7580D Custom Rule 7580D This is a multi-part MIME message sent by reportbug. --===============8774757689455281661== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Source: xfsprogs Version: 3.1.9 Severity: wishlist Hey guys, Even if it doesn't necessarily improve your workflow, the watch file could improve some Debian tools that check it (e.g. UDD). Could you please apply the attached one in your next upload? Good day, Vincent -- System Information: Debian Release: jessie/sid APT prefers testing APT policy: (990, 'testing'), (500, 'stable-updates'), (500, 'unstable'), (500, 'stable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 3.14-1-amd64 (SMP w/4 CPU cores) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash --===============8774757689455281661== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="watch" version=3 opts=uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \ ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-(.+)\.tar\.gz --===============8774757689455281661==-- From joanne.babael@fami.com.ph Sun May 18 03:43:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DFBDE7F3F for ; Sun, 18 May 2014 03:43:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B912730405F for ; Sun, 18 May 2014 01:43:54 -0700 (PDT) X-ASG-Debug-ID: 1400402632-04cb6c5d0b81620001-NocioJ Received: from server.fami.com.ph (server.fami.com.ph [192.163.255.13]) by cuda.sgi.com with ESMTP id qy1nA363vXXZcZI5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 18 May 2014 01:43:53 -0700 (PDT) X-Barracuda-Envelope-From: joanne.babael@fami.com.ph X-Barracuda-Apparent-Source-IP: 192.163.255.13 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=fami.com.ph; s=default; h=Reply-To:Date:From:To:Subject:Content-Description:Content-Transfer-Encoding:MIME-Version:Content-Type; bh=Vdreoozk5u4d+rQd3L7i7g/I6bKgt27NWWP+H/jbaSo=; b=eO/dAZ3tELSZeMBWT+DPlAphkCFV7p30E2Yyzoh2X1QvfXS3aPT2ZpFDxRBzgAWpmCux+pgmgmzypzL2+RBMh1QciIYsFFlns3ikT2zLbOaai5SR2NvLqjdbv+2FfyO4; Received: from [41.203.67.147] (port=40098 helo=[10.187.32.189]) by server.fami.com.ph with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.82) (envelope-from ) id 1Wlwgs-0006R6-Nc; Sun, 18 May 2014 08:43:31 +0000 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: =?utf-8?b?VsOhxb5lbsO9IHXFvml2YXRlbGkg?= To: Recipients X-ASG-Orig-Subj: =?utf-8?b?VsOhxb5lbsO9IHXFvml2YXRlbGkg?= From: ADMIN Date: Sun, 18 May 2014 09:43:14 +0100 Reply-To: 647812717@qq.com X-Antivirus: avast! (VPS 140517-1, 05/17/2014), Outbound message X-Antivirus-Status: Clean X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.fami.com.ph X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - fami.com.ph X-Get-Message-Sender-Via: server.fami.com.ph: authenticated_id: joanne.babael@fami.com.ph X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: server.fami.com.ph[192.163.255.13] X-Barracuda-Start-Time: 1400402633 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: 2.14 X-Barracuda-Spam-Status: No, SCORE=2.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0141, DKIM_SIGNED, DKIM_VERIFIED, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5902 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 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2.00 BSF_SC0_MV0141 Custom rule MV0141 Message-Id: <20140518084354.7761A129619A@cuda.sgi.com> V=C3=A1=C5=BEen=C3=BD u=C5=BEivateli = V=C3=A1=C5=A1 e-mail byl prekrocen 2GB vytvoril webmaster, kter=C3=BD v sou= casn=C3=A9 dobe be=C5=BE=C3=AD na 2,30 GB, kter=C3=A9 nemohou odes=C3=ADlat= nebo prij=C3=ADmat novou zpr=C3=A1vu v pr=C3=AD=C5=A1t=C3=ADm 24 hodin, do= kud zkontrolujte, zda e-mailov=C3=A9 schr=C3=A1nce. = Pros=C3=ADm, zadejte sv=C3=A9 =C3=BAdaje n=C3=AD=C5=BEe pro overen=C3=AD = =C3=BActu: = (1) E-mail: = (2) N=C3=A1zev: = (3): Heslo: = (4) Potvrdit heslo: = dekuji = System Administrator From david@fromorbit.com Sun May 18 21:56:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CD7CF7F3F for ; Sun, 18 May 2014 21:56:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88448F8039 for ; Sun, 18 May 2014 19:56:01 -0700 (PDT) X-ASG-Debug-ID: 1400468159-04cb6c5d0dbdb50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 1WOv6DPBcNAC69yR for ; Sun, 18 May 2014 19:55:59 -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: AhJPABhyeVN5LL1sPGdsb2JhbABYgwaDQYUKoi8BAQEBAQEGmisBgQkXAwEBAQE4NYIlAQEEATocIxAIAw4KCSUPBSUDBxoTiDkH0EIXFoU/iHsHgyuBFQSZWZZvKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 19 May 2014 12:25:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmDk1-0001wa-K0; Mon, 19 May 2014 12:55:53 +1000 Date: Mon, 19 May 2014 12:55:53 +1000 From: Dave Chinner To: Adam Sampson Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! Message-ID: <20140519025553.GB8554@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@dastard> <20140517002309.GA18954@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: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400468159 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.5923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 11:53:08AM +0100, Adam Sampson wrote: > Dave Chinner writes: > > > [...] it's preferable to have things like xfs_repair abort when it > > comes across an inconsistency it can't handle than to continue blindly > > along and making a bigger mess of the filesystem it's supposed to be > > fixing... > > Yes -- that's why I was building with DEBUG= on previous releases > (i.e. I want assertions enabled). doc/INSTALL says that DEBUG=-DNDEBUG > disables assertions, so packagers are quite likely to have DEBUG= in > their build process. Hmmm - so, not being an everyday userspace programmer, it didn't even occur to me that "-DNDEBUG" actually changes libc header behaviour, not anything to do with the XFS code. $ man assert ..... BUGS assert() is implemented as a macro; if the expression tested has side-effects, program behavior will be different depending on whether NDEBUG is defined. This may create Heisenbugs which go away when debugging is turned on. Yup, it's oh so obvious now that "NDEBUG" is something owned by system library code, not the xfsprogs package... > > Anyway, we'll look to fix it for 3.2.1. Or maybe not. The intent of always turning off the asserts is that code like xfs_repair shouldn't assert fail when stuff it detected as out of bounds in a library function. IOWs, you're quite likely to unintentionally break repair by removing the NDEBUG define to re-instate the library asserts... The control of the assert statements in the xfs_repair code itself is handled by the -DDEBUG macro, which is configurable. i.e. you can chose whether or not to have asserts in the repair code itself for it to fail when an inconsistency it can't handle is detected, but repair defines "inconsistent and cannot continue" very differently to the libxfs library code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Mon May 19 04:27:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 83D3B7F4E for ; Mon, 19 May 2014 04:27:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5E16AC008 for ; Mon, 19 May 2014 02:27:04 -0700 (PDT) X-ASG-Debug-ID: 1400491619-04cbb006dbc9dc0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id of7pGc860AeDIxKb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 19 May 2014 02:27:00 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4J9Qwj5030153 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 19 May 2014 09:26:58 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4J9QuJu008842 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 19 May 2014 09:26:57 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4J9Quc1020542 for ; Mon, 19 May 2014 09:26:56 GMT Received: from [192.168.1.101] (/60.215.179.104) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 19 May 2014 02:26:55 -0700 Message-ID: <5379CE58.8010603@oracle.com> Date: Mon, 19 May 2014 17:26:48 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v4] xfs: fix infinite loop at xfs_vm_writepage on 32bit system Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v4] xfs: fix infinite loop at xfs_vm_writepage on 32bit system Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1400491620 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Jie Liu Write to a file with an offset greater than 16TB on 32-bit system and then trigger page write-back via sync(1) will cause task hang. # block_size=4096 # offset=$(((2**32 - 1) * $block_size)) # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file # sync INFO: task sync:2590 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sync D c1064a28 0 2590 2097 0x00000000 ..... Call Trace: [] ? ttwu_do_wakeup+0x18/0x130 [] ? try_to_wake_up+0x1ce/0x220 [] ? wake_up_process+0x1f/0x40 [] ? wake_up_worker+0x1e/0x30 [] schedule+0x23/0x60 [] schedule_timeout+0x18d/0x1f0 [] ? do_raw_spin_unlock+0x4e/0x90 [] ? __queue_delayed_work+0x91/0x150 [] ? do_raw_spin_lock+0x3f/0x100 [] ? do_raw_spin_unlock+0x4e/0x90 [] wait_for_completion+0x7d/0xc0 [] ? try_to_wake_up+0x220/0x220 [] sync_inodes_sb+0x92/0x180 [] sync_inodes_one_sb+0x15/0x20 [] iterate_supers+0xb8/0xc0 [] ? fdatawrite_one_bdev+0x20/0x20 [] sys_sync+0x31/0x80 [] sysenter_do_call+0x12/0x28 This issue can be triggered via xfstests/generic/308. The reason is that the end_index is unsigned long with maximum value '2^32-1=4294967295' on 32-bit platform, and the given offset cause it wrapped to 0, so that the following codes will repeat again and again until the task schedule time out: end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; if (page->index >= end_index) { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* * Just skip the page if it is fully outside i_size, e.g. due * to a truncate operation that is in progress. */ if (page->index >= end_index + 1 || offset_into_page == 0) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unlock_page(page); return 0; } In order to check if a page is fully outsids i_size or not, we can fix the code logic as below: if (page->index > end_index || (page->index == end_index && offset_into_page == 0)) Secondly, there still has another similar issue when calculating the end offset for mapping the filesystem blocks to the file blocks for delalloc. With the same tests to above, run unmount(8) will cause kernel panic if CONFIG_XFS_DEBUG is enabled: XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 kernel BUG at fs/xfs/xfs_message.c:108! invalid opcode: 0000 [#1] SMP task: edddc100 ti: ec6ee000 task.ti: ec6ee000 EIP: 0060:[] EFLAGS: 00010296 CPU: 1 EIP is at assfail+0x2b/0x30 [xfs] .............. Call Trace: [] xfs_fs_destroy_inode+0x74/0x120 [xfs] [] destroy_inode+0x31/0x50 [] evict+0xef/0x170 [] dispose_list+0x32/0x40 [] evict_inodes+0xca/0xe0 [] generic_shutdown_super+0x46/0xd0 [] kill_block_super+0x29/0x70 [] deactivate_locked_super+0x44/0x70 [] deactivate_super+0x47/0x60 [] mntput_no_expire+0xcd/0x120 [] SyS_umount+0xa8/0x370 [] SyS_oldumount+0x1e/0x20 [] sysenter_do_call+0x12/0x28 That because the end_offset is evaluated to 0 which is the same reason to above, hence the mapping and covertion for dealloc file blocks to file system blocks did not happened. This patch just fixed both issues. Reported-by: Michael L. Semon Signed-off-by: Jie Liu --- v4: s/dead loop/infinite loop/, as the latter is more meaningful v3: Add code comments to reflect this change. http://oss.sgi.com/archives/xfs/2013-09/msg00688.html v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset check up strategy to avoid the potential overflow. http://oss.sgi.com/archives/xfs/2013-07/msg00339.html v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html fs/xfs/xfs_aops.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 0479c32..8ec41dd 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -982,7 +982,32 @@ xfs_vm_writepage( offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; - if (page->index >= end_index) { + + /* + * The page index is less than the end_index, adjust the end_offset + * to the highest offset that this page should represent. + * ----------------------------------------------------- + * | file mapping | | + * ----------------------------------------------------- + * | Page ... | Page N-2 | Page N-1 | Page N | | + * ^--------------------------------^----------|-------- + * | desired writeback range | see else | + * ---------------------------------^------------------| + */ + if (page->index < end_index) + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; + else { + /* + * Check whether the page to write out is beyond or straddles + * i_size or not. + * ------------------------------------------------------- + * | file mapping | | + * ------------------------------------------------------- + * | Page ... | Page N-2 | Page N-1 | Page N | Beyond | + * ^--------------------------------^-----------|--------- + * | | Straddles | + * ---------------------------------^-----------|--------| + */ unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* @@ -990,24 +1015,36 @@ xfs_vm_writepage( * truncate operation that is in progress. We must redirty the * page so that reclaim stops reclaiming it. Otherwise * xfs_vm_releasepage() is called on it and gets confused. + * + * Note that the end_index is unsigned long, it would overflow + * if the given offset is greater than 16TB on 32-bit system + * and if we do check the page is fully outside i_size or not + * via "if (page->index >= end_index + 1)" as "end_index + 1" + * will be evaluated to 0. Hence this page will be redirtied + * and be written out repeatedly which would result in an + * infinite loop, the user program that perform this operation + * will hang. Instead, we can verify this situation by checking + * if the page to write is totally beyond the i_size or if it's + * offset is just equal to the EOF. */ - if (page->index >= end_index + 1 || offset_into_page == 0) + if (page->index > end_index || + (page->index == end_index && offset_into_page == 0)) goto redirty; /* * The page straddles i_size. It must be zeroed out on each * and every writepage invocation because it may be mmapped. * "A file is mapped in multiples of the page size. For a file - * that is not a multiple of the page size, the remaining + * that is not a multiple of the page size, the remaining * memory is zeroed when mapped, and writes to that region are * not written out to the file." */ zero_user_segment(page, offset_into_page, PAGE_CACHE_SIZE); + + /* Adjust the end_offset to the end of file */ + end_offset = offset; } - end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, - offset); len = 1 << inode->i_blkbits; bh = head = page_buffers(page); -- 1.8.3.2 From prvs=1216fcab72=i.putri@geologinternational.com Mon May 19 05:11:30 2014 Return-Path: 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=HTML_MESSAGE,URI_NOVOWEL 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 0D48E7F4E for ; Mon, 19 May 2014 05:11:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF29D304064 for ; Mon, 19 May 2014 03:11:26 -0700 (PDT) X-ASG-Debug-ID: 1400494283-04cbb006dbcd820001-NocioJ Received: from esa.geolog.it (esa.geologinternational.com [77.93.226.202]) by cuda.sgi.com with ESMTP id NLFhHQAAnJyiaf1M; Mon, 19 May 2014 03:11:24 -0700 (PDT) X-Barracuda-Envelope-From: prvs=1216fcab72=i.putri@geologinternational.com X-Barracuda-Apparent-Source-IP: 77.93.226.202 Received: from esa.geolog.it (127.0.0.1) id hf7cco0171sq; Mon, 19 May 2014 11:30:50 +0200 (envelope-from ) Received: from mbx2.geolog.it ([192.168.0.37]) by esa.geolog.it (Geolog) with ESMTP id 201405190930490123736; Mon, 19 May 2014 11:30:50 +0200 Received: from mbx.geolog.local ([169.254.1.15]) by mbx2.geolog.local ([192.168.0.37]) with mapi; Mon, 19 May 2014 11:30:02 +0200 From: "Indah Putri (Geolog, Indonesia)" Date: Mon, 19 May 2014 11:30:02 +0200 Subject: =?iso-8859-1?Q?Brevl=E5da_meddelande!?= Thread-Topic: =?iso-8859-1?Q?Brevl=E5da_meddelande!?= X-ASG-Orig-Subj: =?iso-8859-1?Q?Brevl=E5da_meddelande!?= Thread-Index: AQHPc0TpN2ej1KfYZEyytVFdbLXKZg== Message-ID: Accept-Language: en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_AFADB407211CB146ACC70EB3BB33FA24017B485C51D5MBXgeologlo_" MIME-Version: 1.0 X-Mlf-Version: 7.4.5.1395 X-Mlf-UniqueId: o201405190930490123736 X-Barracuda-Connect: esa.geologinternational.com[77.93.226.202] X-Barracuda-Start-Time: 1400494283 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-BRTS-Evidence: 6a3a29c4bf1c8a540a5dfd199fd4c0b3-1687-htm X-Barracuda-Spam-Score: 2.23 X-Barracuda-Spam-Status: No, SCORE=2.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA578_CH, HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE, URI_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 1.21 MISSING_HEADERS Missing To: header 0.50 URI_NOVOWEL URI: URI hostname has long non-vowel sequence 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH To: undisclosed-recipients:; --_000_AFADB407211CB146ACC70EB3BB33FA24017B485C51D5MBXgeologlo_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Brevl=E5da meddelande! Ditt l=F6senord g=E5r ut om tre dagar Klicka p=E5 Personal-och fakultets Cl= ickHere att bekr=E4fta din e-post. ITS helpdesk ADMIN TEAM ________________________________ "This communication and any attachments may be privileged or confidential. = If you are not the intended recipient, you have received this in error and = any review, distribution or copying of this communication is strictly prohi= bited. In such an event, please notify us immediately by reply email and im= mediately delete this message and all attachments." --_000_AFADB407211CB146ACC70EB3BB33FA24017B485C51D5MBXgeologlo_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Brevl=E5da meddelande!

Ditt l=F6senord g=E5r ut om<= /span> tre dagar Klicka p=E5 Personal-och fakultets ClickHere att bekr=E4fta din e-post.

ITS helpdesk
ADMIN TEAM


“This communication an= d any attachments may be privileged or confidential. If you are not the int= ended recipient, you have received this in error and any review, distributi= on or copying of this communication is strictly prohibited. In such an event, please notify us immediately by reply email = and immediately delete this message and all attachments.”
--_000_AFADB407211CB146ACC70EB3BB33FA24017B485C51D5MBXgeologlo_-- From BATV+eaf5dca088044019e0ee+3921+infradead.org+hch@bombadil.srs.infradead.org Mon May 19 09:55:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 105F37F4E for ; Mon, 19 May 2014 09:55:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5872304066 for ; Mon, 19 May 2014 07:55:51 -0700 (PDT) X-ASG-Debug-ID: 1400511346-04bdf056b5f2680001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id CmmzE97yiMAM2K5l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 19 May 2014 07:55:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+eaf5dca088044019e0ee+3921+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 1WmOyb-000159-Kb; Mon, 19 May 2014 14:55:41 +0000 Date: Mon, 19 May 2014 07:55:41 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Luk?? Czerner , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140519145541.GA32055@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <20140516085320.GA29279@infradead.org> <20140516221930.GA8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140516221930.GA8554@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1400511347 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.5936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 08:19:30AM +1000, Dave Chinner wrote: > Renaming the test suite take a lot more work - .e.g renaming/moving > source trees and a fixing all the documentation that points to it... In that case please call the list xfstests - a name different by a single character is utterly confusing. And I defintively see some merit to the suggestion that we'll just keep the x and allow people to come up with a nice backronym for it if they care enough. From david@fromorbit.com Mon May 19 16:25:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 AF40B7F4E for ; Mon, 19 May 2014 16:25:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90BB3304081 for ; Mon, 19 May 2014 14:25:49 -0700 (PDT) X-ASG-Debug-ID: 1400534746-04bdf056b5118360001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 3qJT0XPgsCKVgmlT for ; Mon, 19 May 2014 14:25: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: AjgHAIJ2elN5LL1s/2dsb2JhbABZgwaDQac7AQEBAQEBBpopAYEcF3SCJQEBBTocGAsQCAMOCgklDwUlAyETiEDSVxcWhT+IegeDK4EVBJlZkxuDSSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 06:55:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmV3h-0004oD-AG; Tue, 20 May 2014 07:25:21 +1000 Date: Tue, 20 May 2014 07:25:21 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Luk?? Czerner , fstests@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfstests: new mailing list Message-ID: <20140519212521.GC8554@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfstests: new mailing list References: <20140516044611.GA8206@dastard> <20140516054009.GA17647@infradead.org> <20140516085320.GA29279@infradead.org> <20140516221930.GA8554@dastard> <20140519145541.GA32055@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519145541.GA32055@infradead.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: 1400534746 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.5944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 19, 2014 at 07:55:41AM -0700, Christoph Hellwig wrote: > On Sat, May 17, 2014 at 08:19:30AM +1000, Dave Chinner wrote: > > Renaming the test suite take a lot more work - .e.g renaming/moving > > source trees and a fixing all the documentation that points to it... > > In that case please call the list xfstests - a name different by a > single character is utterly confusing. And I defintively see some merit > to the suggestion that we'll just keep the x and allow people to come up > with a nice backronym for it if they care enough. What is important is that we have a separate list for the filesystem test suite we use, not whether the name has an "x" in or not. Arguing about whether there should or should not be an 'x' in the mailing list name is just a waste of time - it's not going to make me change the name of the list.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 19 16:57:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BF8317F51 for ; Mon, 19 May 2014 16:57:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A330E304075 for ; Mon, 19 May 2014 14:57:17 -0700 (PDT) X-ASG-Debug-ID: 1400536631-04bdf056b511a800001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7t2vcUBOfYuYJ6Ou for ; Mon, 19 May 2014 14:57:11 -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: AjgHAIl9elN5LL1s/2dsb2JhbABZgwaDQac7AQEBAQEBBpopAYEcF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQNJXFxaFP4h6B4MrgRUEmVmTG4NJKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 07:27:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmVYI-0004wE-44; Tue, 20 May 2014 07:56:58 +1000 Date: Tue, 20 May 2014 07:56:58 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state Message-ID: <20140519215658.GD8554@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> <1400263966-35541-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400263966-35541-3-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: 1400536631 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.5944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 16, 2014 at 02:12:46PM -0400, Brian Foster wrote: > Create sysfs attributes to export the current runtime state of the log > to userspace. Note that the filesystem should be frozen for best > accuracy/consistency when reading these values, but is not required. > This is for testing and debug purposes only. > > Create the following per-mount attributes: log_head_lsn, log_tail_lsn, > reserve_head_lsn and write_head_lsn. These represent the physical log Reserve and write heads are not log sequence numbers (LSNs). A LSN is a cycle:block count tuple, while a grant head is a cycle:byte count tuple.... Calling the reserve_grant_head/write_grant_head would make more sense, I think, as would splitting them into cycle/byte output pairs. Splitting them make sense because if we increase the log size beyond 2GB we're going to need a different in-memory representation for the grant heads (i.e. need more than 32 bits for byte count), so we should probably handle that up front in the sysfs API... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 19 17:32:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 ACFC67F4E for ; Mon, 19 May 2014 17:32:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F53730407B for ; Mon, 19 May 2014 15:32:33 -0700 (PDT) X-ASG-Debug-ID: 1400538750-04cb6c5d0a123020001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id tcejrbX2A2VZnxF6 for ; Mon, 19 May 2014 15:32: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: AjgHAOeFelN5LL1s/2dsb2JhbABZgwaDQac7AQEBAQEBBpopAYEYF3SCJQEBBScTHCMQCAMVAwklDwUNGAMhE4gtAxDMHw2GLxcWhT+GZYFMSQeDK4EVBJVeggiBc4sSgh2FbINJK4Ey Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 08:02:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmW6T-00051m-1R; Tue, 20 May 2014 08:32:17 +1000 Date: Tue, 20 May 2014 08:32:17 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v4] xfs: fix infinite loop at xfs_vm_writepage on 32bit system Message-ID: <20140519223216.GE8554@dastard> X-ASG-Orig-Subj: Re: [PATCH v4] xfs: fix infinite loop at xfs_vm_writepage on 32bit system References: <5379CE58.8010603@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5379CE58.8010603@oracle.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: 1400538751 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On Mon, May 19, 2014 at 05:26:48PM +0800, Jeff Liu wrote: > From: Jie Liu > > Write to a file with an offset greater than 16TB on 32-bit system and > then trigger page write-back via sync(1) will cause task hang. > > # block_size=4096 > # offset=$(((2**32 - 1) * $block_size)) > # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file > # sync > > INFO: task sync:2590 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > sync D c1064a28 0 2590 2097 0x00000000 > ..... > Call Trace: > [] ? ttwu_do_wakeup+0x18/0x130 > [] ? try_to_wake_up+0x1ce/0x220 > [] ? wake_up_process+0x1f/0x40 > [] ? wake_up_worker+0x1e/0x30 > [] schedule+0x23/0x60 > [] schedule_timeout+0x18d/0x1f0 > [] ? do_raw_spin_unlock+0x4e/0x90 > [] ? __queue_delayed_work+0x91/0x150 > [] ? do_raw_spin_lock+0x3f/0x100 > [] ? do_raw_spin_unlock+0x4e/0x90 > [] wait_for_completion+0x7d/0xc0 > [] ? try_to_wake_up+0x220/0x220 > [] sync_inodes_sb+0x92/0x180 > [] sync_inodes_one_sb+0x15/0x20 > [] iterate_supers+0xb8/0xc0 > [] ? fdatawrite_one_bdev+0x20/0x20 > [] sys_sync+0x31/0x80 > [] sysenter_do_call+0x12/0x28 > > This issue can be triggered via xfstests/generic/308. > > The reason is that the end_index is unsigned long with maximum value > '2^32-1=4294967295' on 32-bit platform, and the given offset cause it > wrapped to 0, so that the following codes will repeat again and again > until the task schedule time out: > > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > if (page->index >= end_index) { > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > /* > * Just skip the page if it is fully outside i_size, e.g. due > * to a truncate operation that is in progress. > */ > if (page->index >= end_index + 1 || offset_into_page == 0) { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > unlock_page(page); > return 0; > } > > In order to check if a page is fully outsids i_size or not, we can fix > the code logic as below: > if (page->index > end_index || > (page->index == end_index && offset_into_page == 0)) > > Secondly, there still has another similar issue when calculating the > end offset for mapping the filesystem blocks to the file blocks for > delalloc. With the same tests to above, run unmount(8) will cause > kernel panic if CONFIG_XFS_DEBUG is enabled: > > XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ > ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 > > kernel BUG at fs/xfs/xfs_message.c:108! > invalid opcode: 0000 [#1] SMP > task: edddc100 ti: ec6ee000 task.ti: ec6ee000 > EIP: 0060:[] EFLAGS: 00010296 CPU: 1 > EIP is at assfail+0x2b/0x30 [xfs] > .............. > Call Trace: > [] xfs_fs_destroy_inode+0x74/0x120 [xfs] > [] destroy_inode+0x31/0x50 > [] evict+0xef/0x170 > [] dispose_list+0x32/0x40 > [] evict_inodes+0xca/0xe0 > [] generic_shutdown_super+0x46/0xd0 > [] kill_block_super+0x29/0x70 > [] deactivate_locked_super+0x44/0x70 > [] deactivate_super+0x47/0x60 > [] mntput_no_expire+0xcd/0x120 > [] SyS_umount+0xa8/0x370 > [] SyS_oldumount+0x1e/0x20 > [] sysenter_do_call+0x12/0x28 > > That because the end_offset is evaluated to 0 which is the same reason > to above, hence the mapping and covertion for dealloc file blocks to > file system blocks did not happened. > > This patch just fixed both issues. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu Fix looks good. Thanks for resending this, Jeff! Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 19 18:00:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F0CD87F4E for ; Mon, 19 May 2014 18:00:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA8698F8039 for ; Mon, 19 May 2014 16:00:00 -0700 (PDT) X-ASG-Debug-ID: 1400540398-04cbb006db11da00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id zbYPIdLX25b4V9Zw for ; Mon, 19 May 2014 15:59:58 -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: AiYHAJWLelN5LL1s/2dsb2JhbABZgwaDQVGmagEBAQEBB5opAYEXF3SCJQEBBSMPASMjEAgBAhgCAgUhAgIPBSUDIROIQJFbnCCkYxcWgRSEK4VsAYMNB4J1NoEVBJlZkxuDSSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 08:29:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmWX2-00056x-RX; Tue, 20 May 2014 08:59:44 +1000 Date: Tue, 20 May 2014 08:59:44 +1000 From: Dave Chinner To: Roger Willcocks Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix compile error when libxfs header used in C++ code Message-ID: <20140519225944.GF8554@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix compile error when libxfs header used in C++ code References: <1399908138.4857.28.camel@montana.filmlight.ltd.uk> <5370E964.50805@sandeen.net> <3EEEF4AD-A192-4A5B-A81A-5FC38F5CF95F@filmlight.ltd.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <3EEEF4AD-A192-4A5B-A81A-5FC38F5CF95F@filmlight.ltd.uk> 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: 1400540398 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.5946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 12, 2014 at 06:52:34PM +0100, Roger Willcocks wrote: > xfs_ialloc.h:102: error: expected ‘,’ or ‘...’ before ‘delete' > > Simple parameter rename, no changes to behaviour. > > Signed-off-by: Roger Willcocks Looks good. Reviewed-by: Dave Chinner The merge into the for-next branch conflicted with the finobt changes, but I think I cleaned that up fine. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 19 19:45:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3E96C7F4E for ; Mon, 19 May 2014 19:45:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2DF2A30407B for ; Mon, 19 May 2014 17:45:09 -0700 (PDT) X-ASG-Debug-ID: 1400546703-04cb6c5d0d12be30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id LDZ5aN9N1c7VDwfG for ; Mon, 19 May 2014 17:45:04 -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: AjkHAHGkelN5LL1s/2dsb2JhbABZgwaDQac7AQEBAQEBBpopAYEYF3SCJQEBBAEnExwjBQsIAw4DAwECAQklDwUlAxMOE4g5B9JIFxaFP4h6B4MrgRUEmVmLEogJg0krgTEk Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 10:15:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmYAj-0005Lr-Jg; Tue, 20 May 2014 10:44:49 +1000 Date: Tue, 20 May 2014 10:44:49 +1000 From: Dave Chinner To: Tetsuo Handa Cc: riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-ID: <20140520004449.GE18954@dastard> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> 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: 1400546703 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.5947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc xfs@oss.sgi.com] On Mon, May 19, 2014 at 11:40:46PM +0900, Tetsuo Handa wrote: > >From f016db5d7f84d6321132150b13c5888ef67d694f Mon Sep 17 00:00:00 2001 > From: Tetsuo Handa > Date: Mon, 19 May 2014 23:24:11 +0900 > Subject: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). > > I can observe that commit 35cd7815 "vmscan: throttle direct reclaim when > too many pages are isolated already" causes RHEL7 environment to stall with > 0% CPU usage when a certain type of memory pressure is given. > > Upon memory pressure, kswapd calls xfs_vm_writepage() from shrink_page_list(). > xfs_vm_writepage() eventually calls wait_for_completion() which waits for > xfs_bmapi_allocate_worker(). > > Then, a kernel worker thread calls xfs_bmapi_allocate_worker() and > xfs_bmapi_allocate_worker() eventually calls xfs_btree_lookup_get_block(). > xfs_btree_lookup_get_block() eventually calls alloc_page(). > alloc_page() eventually calls shrink_inactive_list(). > > The stack trace showed that the kernel worker thread which the kswapd is > waiting for was looping at a while loop in shrink_inactive_list(). [snip stack traces indicating XFS is deferring allocation work to the allocation workqueue on behalf of kswapd] > Since the kernel worker thread needs to escape from the while loop so that > alloc_page() can allocate memory (and eventually allow xfs_vm_writepage() > to release memory), I think that we should not block forever. This patch > introduces 30 seconds timeout for userspace processes and 5 seconds timeout > for kernel processes. That's like trying to swat a fly with a runaway train. Eventually you'll hit the fly with the train.... Q: What is missing from the workqueue context that results in the workqueue being blocked in memory reclaim on congestion? Hint: XFS is deferring allocation on behalf of kswapd to a workqueue. A: PF_KSWAPD. shrink_inactive_list() has this guard: /* * Stall direct reclaim for IO completions if underlying BDIs or zone * is congested. Allow kswapd to continue until it starts encountering * unqueued dirty pages or cycling through the LRU too quickly. */ if (!sc->hibernation_mode && !current_is_kswapd()) wait_iff_congested(zone, BLK_RW_ASYNC, HZ/10); So, XFS should be passing kswapd context to the workqueue allocation context. The patch below does this. Tetsuo-san, when it comes to problems involving XFS, you should really CC xfs@oss.sgi.com because very few people really know how XFS works and even fewer still know how it is supposed to interact with memory reclaim.... Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: block allocation work needs to be kswapd aware From: Dave Chinner Upon memory pressure, kswapd calls xfs_vm_writepage() from shrink_page_list(). This can result in delayed allocation occurring and that gets deferred to the the allocation workqueue. The allocation then runs outside kswapd context, which means if it needs memory (and it does to demand page metadata from disk) it can block in shrink_inactive_list() waiting for IO congestion. These blocking waits are normally avoiding in kswapd context, so under memory pressure writeback from kswapd can be arbitrarily delayed by memory reclaim. To avoid this, pass the kswapd context to the allocation being done by the workqueue, so that memory reclaim understands correctly that the work is being done for kswapd and therefore it is not blocked and does not delay memory reclaim. Reported-by: Tetsuo Handa Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 16 +++++++++++++--- fs/xfs/xfs_bmap_util.h | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 057f671..703b3ec 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( struct xfs_bmalloca *args = container_of(work, struct xfs_bmalloca, work); unsigned long pflags; + unsigned long new_pflags = PF_FSTRANS; - /* we are in a transaction context here */ - current_set_flags_nested(&pflags, PF_FSTRANS); + /* + * we are in a transaction context here, but may also be doing work + * in kswapd context, and hence we may need to inherit that state + * temporarily to ensure that we don't block waiting for memory reclaim + * in any way. + */ + if (args->kswapd) + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; + + current_set_flags_nested(&pflags, new_pflags); args->result = __xfs_bmapi_allocate(args); complete(args->done); - current_restore_flags_nested(&pflags, PF_FSTRANS); + current_restore_flags_nested(&pflags, new_pflags); } /* @@ -284,6 +293,7 @@ xfs_bmapi_allocate( args->done = &done; + args->kswapd = current_is_kswapd(); INIT_WORK_ONSTACK(&args->work, xfs_bmapi_allocate_worker); queue_work(xfs_alloc_wq, &args->work); wait_for_completion(&done); diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..d227f9d 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -56,6 +56,7 @@ struct xfs_bmalloca { char aeof; /* allocated space at eof */ char conv; /* overwriting unwritten extents */ char stack_switch; + char kswapd; /* allocation in kswapd context */ int flags; struct completion *done; struct work_struct work; From dak-unpriv@franck.debian.org Mon May 19 22:31:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DCADA7F4E for ; Mon, 19 May 2014 22:31:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A4DAAC009 for ; Mon, 19 May 2014 20:31:02 -0700 (PDT) X-ASG-Debug-ID: 1400556660-04bdf056b512f480001-NocioJ Received: from muffat.debian.org (muffat.debian.org [206.12.19.146]) by cuda.sgi.com with ESMTP id UANyzjf2F229cqdT (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 19 May 2014 20:31:00 -0700 (PDT) X-Barracuda-Envelope-From: dak-unpriv@franck.debian.org X-Barracuda-Apparent-Source-IP: 206.12.19.146 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 muffat.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1WmalX-0006EW-8C for xfs@oss.sgi.com; Tue, 20 May 2014 03:30:59 +0000 Received: from dak-unpriv by franck.debian.org with local (Exim 4.80) (envelope-from ) id 1WmalW-0001QN-5C for xfs@oss.sgi.com; Tue, 20 May 2014 03:30:58 +0000 To: xfs@oss.sgi.com From: Debian FTP Masters Subject: Processing of xfsprogs_3.2.0_i386.changes Date: Tue, 20 May 2014 03:30:58 +0000 X-ASG-Orig-Subj: Processing of xfsprogs_3.2.0_i386.changes X-Debian: DAK X-DAK: DAK Precedence: bulk Auto-Submitted: auto-generated X-Debian-Package: xfsprogs Message-Id: Sender: unprivileged ftp-master role account X-Barracuda-Connect: muffat.debian.org[206.12.19.146] X-Barracuda-Start-Time: 1400556660 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.5951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfsprogs_3.2.0_i386.changes uploaded successfully to localhost along with the files: xfsprogs_3.2.0_i386.deb xfslibs-dev_3.2.0_i386.deb xfsprogs-udeb_3.2.0_i386.udeb xfsprogs_3.2.0.dsc xfsprogs_3.2.0.tar.gz Greetings, Your Debian queue daemon (running on host franck.debian.org) From envelope@ftp-master.debian.org Mon May 19 22:35:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BE6737F54 for ; Mon, 19 May 2014 22:35:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8AAA8F8039 for ; Mon, 19 May 2014 20:35:18 -0700 (PDT) X-ASG-Debug-ID: 1400556916-04cbb006d912e010001-NocioJ Received: from muffat.debian.org (muffat.debian.org [206.12.19.146]) by cuda.sgi.com with ESMTP id eaH5Ln5RkqVMNd5u (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 19 May 2014 20:35:17 -0700 (PDT) X-Barracuda-Envelope-From: envelope@ftp-master.debian.org X-Barracuda-Apparent-Source-IP: 206.12.19.146 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 muffat.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1Wmapf-0006UP-MO; Tue, 20 May 2014 03:35:15 +0000 Received: from dak by franck.debian.org with local (Exim 4.80) (envelope-from ) id 1Wmape-0002Gz-E9; Tue, 20 May 2014 03:35:14 +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.0_i386.changes ACCEPTED into unstable Message-Id: X-ASG-Orig-Subj: xfsprogs_3.2.0_i386.changes ACCEPTED into unstable Sender: Archive Administrator Date: Tue, 20 May 2014 03:35:14 +0000 X-Barracuda-Connect: muffat.debian.org[206.12.19.146] X-Barracuda-Start-Time: 1400556917 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.5951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Accepted: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Format: 1.8 Date: Sat, 03 May 2014 15:59:55 +1000 Source: xfsprogs Binary: xfsprogs xfslibs-dev xfsprogs-udeb Architecture: source i386 Version: 3.2.0 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) Closes: 725971 Changes: xfsprogs (3.2.0) unstable; urgency=low . * New upstream release * Add dh-autoreconf invocation (closes: #725971) Checksums-Sha1: 3904d254c33d3188aa50f8ec3a2def7de14ca46b 1154 xfsprogs_3.2.0.dsc b17b19e09acf84918410511cc3066d96691df7a3 1475505 xfsprogs_3.2.0.tar.gz 9d4fba1bc045ee7ec2798a714fd5e4e0b0947b9e 715846 xfsprogs_3.2.0_i386.deb 0bea595db0b5fd5694fa00fc0ebf85b80b1e96e2 31688 xfslibs-dev_3.2.0_i386.deb 913118e221529719fc8b2f74f6cdb696f51ecd07 144454 xfsprogs-udeb_3.2.0_i386.udeb Checksums-Sha256: 7eb8ed25b68d7010ed8bfbd14ad7f28e7906754021b4803859f3f19c21c0e1e2 1154 xfsprogs_3.2.0.dsc 2fc7e7eeb62d75dd75591ff0b12332ab5c5a401e7124d45348d8cb50f02190ea 1475505 xfsprogs_3.2.0.tar.gz 20c6a4bb1892d4f20f8104c686f09d2bfde4646b1e359aeccdbcffbbbc3c49fc 715846 xfsprogs_3.2.0_i386.deb c39d46510bb5fa2f1727817eebe0d0c439d5f88e9828c58da0fc3e099e53f47b 31688 xfslibs-dev_3.2.0_i386.deb 895a39751d0bc473a87640a2ed4bbcb065334d2f3e7e94c70937463aabb86aa5 144454 xfsprogs-udeb_3.2.0_i386.udeb Files: 02eb7572d6021b9dfa66829f5c09b76a 715846 admin optional xfsprogs_3.2.0_i386.deb ccadbf82194fcd782bb00fbfccf5cd12 31688 libdevel extra xfslibs-dev_3.2.0_i386.deb db69bbf7b3d16d7d9eefa8c83fdb6b55 144454 debian-installer optional xfsprogs-udeb_3.2.0_i386.udeb 41293c850dec5d78a4d487425206606a 1154 admin optional xfsprogs_3.2.0.dsc 9f81cdc305dfe6957da74df8a42eb8b2 1475505 admin optional xfsprogs_3.2.0.tar.gz Package-Type: udeb -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlN5fpYACgkQm8fl3HSIa2N1kwCePahqgf5eVqKoiwu6/9DsfFMU SnMAn3LqkbZOMIn49maH6pVFTDPo5u0c =julc -----END PGP SIGNATURE----- Thank you for your contribution to Debian. From debbugs@buxtehude.debian.org Mon May 19 22:39:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A83597F55 for ; Mon, 19 May 2014 22:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C42F30407B for ; Mon, 19 May 2014 20:39:16 -0700 (PDT) X-ASG-Debug-ID: 1400557154-04cb6c5d0c135630001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id tEQQZF97z73P450U (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 19 May 2014 20:39:15 -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.80) (envelope-from ) id 1WmatR-0005le-2x; Tue, 20 May 2014 03:39:09 +0000 MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) X-Loop: owner@bugs.debian.org From: owner@bugs.debian.org (Debian Bug Tracking System) To: Nathan Scott Subject: Bug#725971: marked as done (xfsprogs: run dh-autoreconf to update config.{sub,guess} and {libtool,aclocal}.m4) Message-ID: X-ASG-Orig-Subj: Bug#725971: marked as done (xfsprogs: run dh-autoreconf to update config.{sub,guess} and {libtool,aclocal}.m4) References: <20131010133811.GK32337@riva.ucam.org> X-Debian-PR-Message: closed 725971 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: patch X-Debian-PR-Source: xfsprogs Date: Tue, 20 May 2014 03:39:09 +0000 Content-Type: multipart/mixed; boundary="----------=_1400557149-22106-0" Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400557154 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.5950 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format... ------------=_1400557149-22106-0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Your message dated Tue, 20 May 2014 03:35:14 +0000 with message-id and subject line Bug#725971: fixed in xfsprogs 3.2.0 has caused the Debian Bug report #725971, regarding xfsprogs: run dh-autoreconf to update config.{sub,guess} and {lib= tool,aclocal}.m4 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 725971: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D725971 Debian Bug Tracking System Contact owner@bugs.debian.org with problems ------------=_1400557149-22106-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by bugs.debian.org; 10 Oct 2013 13:38:18 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-9.7 required=4.0 tests=BAYES_00,FOURLA,HAS_PACKAGE, MURPHY_DRUGS_REL8,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 19; hammy, 151; neutral, 118; spammy, 0. spammytokens: hammytokens:0.000-+--H*F:D*ubuntu.com, 0.000-+--Usertags, 0.000-+--H*u:1.5.21, 0.000-+--H*UA:1.5.21, 0.000-+--H*u:2010-09-15 Return-path: Received: from chiark.greenend.org.uk ([212.13.197.229] ident=Debian-exim) by buxtehude.debian.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1VUGRV-0005NM-EP for submit@bugs.debian.org; Thu, 10 Oct 2013 13:38:17 +0000 Received: from [172.20.153.9] (helo=riva.pelham.vpn.ucam.org) by chiark.greenend.org.uk (Debian Exim 4.72 #1) with esmtps (return-path cjwatson@ubuntu.com) id 1VUGRR-0007bI-KE for submit@bugs.debian.org; Thu, 10 Oct 2013 14:38:13 +0100 Received: from ns1.pelham.vpn.ucam.org ([172.20.153.2] helo=riva.ucam.org) by riva.pelham.vpn.ucam.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1VUGRQ-0006bv-Pp for submit@bugs.debian.org; Thu, 10 Oct 2013 14:38:12 +0100 Date: Thu, 10 Oct 2013 14:38:11 +0100 From: Colin Watson To: submit@bugs.debian.org Subject: xfsprogs: config.guess/config.sub out of date for arm64 Message-ID: <20131010133811.GK32337@riva.ucam.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Delivered-To: submit@bugs.debian.org Package: xfsprogs Version: 3.1.9 Severity: important Tags: patch User: debian-arm@lists.debian.org Usertags: arm64 xfsprogs' config.guess/config.sub are out of date for the forthcoming arm64 port. The attached patch sets things up so that you don't have to be bothered by this type of bug for future ports. * Use the autotools-dev dh addon to update config.guess/config.sub for arm64. diff -Nru xfsprogs-3.1.9/debian/control xfsprogs-3.1.9ubuntu1/debian/control --- xfsprogs-3.1.9/debian/control 2012-12-12 23:21:22.000000000 +0000 +++ xfsprogs-3.1.9ubuntu1/debian/control 2013-10-10 14:25:31.000000000 +0100 @@ -3,7 +3,7 @@ Priority: optional Maintainer: XFS Development Team Uploaders: Nathan Scott , Anibal Monsalve Salazar -Build-Depends: uuid-dev, autoconf, debhelper (>= 5), gettext, libtool, libreadline-gplv2-dev | libreadline5-dev, libblkid-dev (>= 2.17), linux-libc-dev +Build-Depends: uuid-dev, autoconf, debhelper (>= 5), gettext, libtool, libreadline-gplv2-dev | libreadline5-dev, libblkid-dev (>= 2.17), linux-libc-dev, autotools-dev Standards-Version: 3.9.1 Homepage: http://oss.sgi.com/projects/xfs/ diff -Nru xfsprogs-3.1.9/debian/rules xfsprogs-3.1.9ubuntu1/debian/rules --- xfsprogs-3.1.9/debian/rules 2010-08-18 04:53:43.000000000 +0100 +++ xfsprogs-3.1.9ubuntu1/debian/rules 2013-10-10 14:26:47.000000000 +0100 @@ -35,6 +35,7 @@ .census: @echo "== dpkg-buildpackage: configure" 1>&2 $(checkdir) + dh_autotools-dev_updateconfig $(options) $(MAKE) include/platform_defs.h touch .census @@ -57,6 +58,8 @@ $(MAKE) distclean -rm -rf $(dirme) $(dirdev) $(dirdi) -rm -f debian/*substvars debian/files* debian/*.debhelper + dh_autotools-dev_restoreconfig + dh_clean binary-indep: Thanks, -- Colin Watson [cjwatson@ubuntu.com] ------------=_1400557149-22106-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 725971-close) by bugs.debian.org; 20 May 2014 03:35:16 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-12.9 required=4.0 tests=BAYES_00,DIGITS_LETTERS, FROMDEVELOPER,FVGT_m_MULTI_ODD,HAS_BUG_NUMBER,PGPSIGNATURE,RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 43; hammy, 151; neutral, 128; spammy, 0. spammytokens: hammytokens:0.000-+--HX-Debian:DAK, 0.000-+--H*rp:D*ftp-master.debian.org, 0.000-+--HX-DAK:process-upload, 0.000-+--H*MI:franck, 0.000-+--H*m:franck Return-path: Received: from muffat.debian.org ([206.12.19.146]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=muffat.debian.org,EMAIL=hostmaster@muffat.debian.org (verified) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1Wmapg-0005Rb-9o for 725971-close@bugs.debian.org; Tue, 20 May 2014 03:35:16 +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 muffat.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1Wmapf-0006UQ-MK; Tue, 20 May 2014 03:35:15 +0000 Received: from dak by franck.debian.org with local (Exim 4.80) (envelope-from ) id 1Wmape-0002HA-GX; Tue, 20 May 2014 03:35:14 +0000 From: Nathan Scott To: 725971-close@bugs.debian.org X-DAK: dak process-upload X-Debian: DAK X-Debian-Package: xfsprogs MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Subject: Bug#725971: fixed in xfsprogs 3.2.0 Message-Id: Sender: Archive Administrator Date: Tue, 20 May 2014 03:35:14 +0000 Source: xfsprogs Source-Version: 3.2.0 We believe that the bug you reported is fixed in the latest version of xfsprogs, which is due to be installed in the Debian FTP archive. A summary of the changes between this version and the previous one is attached. Thank you for reporting the bug, which will now be closed. If you have further comments please address them to 725971@bugs.debian.org, and the maintainer will reopen the bug report if appropriate. Debian distribution maintenance software pp. Nathan Scott (supplier of updated xfsprogs package) (This message was generated automatically at their request; if you believe that there is a problem with it please contact the archive administrators by mailing ftpmaster@ftp-master.debian.org) -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Format: 1.8 Date: Sat, 03 May 2014 15:59:55 +1000 Source: xfsprogs Binary: xfsprogs xfslibs-dev xfsprogs-udeb Architecture: source i386 Version: 3.2.0 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) Closes: 725971 Changes: xfsprogs (3.2.0) unstable; urgency=low . * New upstream release * Add dh-autoreconf invocation (closes: #725971) Checksums-Sha1: 3904d254c33d3188aa50f8ec3a2def7de14ca46b 1154 xfsprogs_3.2.0.dsc b17b19e09acf84918410511cc3066d96691df7a3 1475505 xfsprogs_3.2.0.tar.gz 9d4fba1bc045ee7ec2798a714fd5e4e0b0947b9e 715846 xfsprogs_3.2.0_i386.deb 0bea595db0b5fd5694fa00fc0ebf85b80b1e96e2 31688 xfslibs-dev_3.2.0_i386.deb 913118e221529719fc8b2f74f6cdb696f51ecd07 144454 xfsprogs-udeb_3.2.0_i386.udeb Checksums-Sha256: 7eb8ed25b68d7010ed8bfbd14ad7f28e7906754021b4803859f3f19c21c0e1e2 1154 xfsprogs_3.2.0.dsc 2fc7e7eeb62d75dd75591ff0b12332ab5c5a401e7124d45348d8cb50f02190ea 1475505 xfsprogs_3.2.0.tar.gz 20c6a4bb1892d4f20f8104c686f09d2bfde4646b1e359aeccdbcffbbbc3c49fc 715846 xfsprogs_3.2.0_i386.deb c39d46510bb5fa2f1727817eebe0d0c439d5f88e9828c58da0fc3e099e53f47b 31688 xfslibs-dev_3.2.0_i386.deb 895a39751d0bc473a87640a2ed4bbcb065334d2f3e7e94c70937463aabb86aa5 144454 xfsprogs-udeb_3.2.0_i386.udeb Files: 02eb7572d6021b9dfa66829f5c09b76a 715846 admin optional xfsprogs_3.2.0_i386.deb ccadbf82194fcd782bb00fbfccf5cd12 31688 libdevel extra xfslibs-dev_3.2.0_i386.deb db69bbf7b3d16d7d9eefa8c83fdb6b55 144454 debian-installer optional xfsprogs-udeb_3.2.0_i386.udeb 41293c850dec5d78a4d487425206606a 1154 admin optional xfsprogs_3.2.0.dsc 9f81cdc305dfe6957da74df8a42eb8b2 1475505 admin optional xfsprogs_3.2.0.tar.gz Package-Type: udeb -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlN5fpYACgkQm8fl3HSIa2N1kwCePahqgf5eVqKoiwu6/9DsfFMU SnMAn3LqkbZOMIn49maH6pVFTDPo5u0c =julc -----END PGP SIGNATURE----- ------------=_1400557149-22106-0-- From penguin-kernel@i-love.sakura.ne.jp Mon May 19 22:56:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 602F27F53 for ; Mon, 19 May 2014 22:56:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2AACAC009 for ; Mon, 19 May 2014 20:56:00 -0700 (PDT) X-ASG-Debug-ID: 1400558157-04bdf056b6130890001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id JFeqXRF3QJbsiEUR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 19 May 2014 20:55:58 -0700 (PDT) X-Barracuda-Envelope-From: penguin-kernel@i-love.sakura.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from www262.sakura.ne.jp (ksav55.sakura.ne.jp [219.94.192.135]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4K3sUWx057463; Tue, 20 May 2014 12:54:30 +0900 (JST) (envelope-from penguin-kernel@i-love.sakura.ne.jp) X-Nat-Received: from [202.181.97.72]:54800 [ident-empty] by smtp-proxy.isp with TPROXY id 1400558070.13671 Received: from www262.sakura.ne.jp (localhost [127.0.0.1]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4K3sT4q057459; Tue, 20 May 2014 12:54:30 +0900 (JST) (envelope-from penguin-kernel@i-love.sakura.ne.jp) Received: (from i-love@localhost) by www262.sakura.ne.jp (8.14.5/8.14.5/Submit) id s4K3sTUx057458; Tue, 20 May 2014 12:54:29 +0900 (JST) (envelope-from penguin-kernel@i-love.sakura.ne.jp) Message-Id: <201405200354.s4K3sTUx057458@www262.sakura.ne.jp> X-Authentication-Warning: www262.sakura.ne.jp: i-love set sender to penguin-kernel@i-love.sakura.ne.jp using -f Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). From: Tetsuo Handa X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). To: Dave Chinner Cc: riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Date: Tue, 20 May 2014 12:54:29 +0900 References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> In-Reply-To: <20140520004449.GE18954@dastard> Content-Type: text/plain; charset="ISO-2022-JP" X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 20052014 #7957577, status: clean X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1400558158 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=ISO2022JP_CHARSET X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 ISO2022JP_CHARSET ISO-2022-JP message Dave Chinner wrote: > So, XFS should be passing kswapd context to the workqueue allocation > context. The patch below does this. > > Tetsuo-san, when it comes to problems involving XFS, you should > really CC xfs@oss.sgi.com because very few people really know how > XFS works and even fewer still know how it is supposed to interact > with memory reclaim.... Thank you for the patch, but ... #define PF_KSWAPD 0x00040000 /* I am kswapd */ static inline int current_is_kswapd(void) { return current->flags & PF_KSWAPD; } I think ((char) (current->flags & 0x00040000)) == 0. Your patch wants -args->kswapd = current_is_kswapd(); +args->kswapd = (current_is_kswapd() != 0); From david@fromorbit.com Tue May 20 00:25:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1AD917F54 for ; Tue, 20 May 2014 00:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EBBA98F8049 for ; Mon, 19 May 2014 22:25:08 -0700 (PDT) X-ASG-Debug-ID: 1400563506-04cb6c5d0a13c5f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GPLD3mZf1dg6AiPE for ; Mon, 19 May 2014 22:25: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: AsgGAHvmelN5LL1s/2dsb2JhbABZgwarBwEBAQaaKQGBFBd0giUBAQQBJxMcIwULCAMOCgklDwUlAyETG4geB9JaFxaFP4h5B4RAAQOZX4sTiAuDSis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 14:55:05 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmcXk-0005sK-64; Tue, 20 May 2014 15:24:52 +1000 Date: Tue, 20 May 2014 15:24:52 +1000 From: Dave Chinner To: Tetsuo Handa Cc: riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-ID: <20140520052452.GG18954@dastard> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <201405200354.s4K3sTUx057458@www262.sakura.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201405200354.s4K3sTUx057458@www262.sakura.ne.jp> 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: 1400563506 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.5952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 20, 2014 at 12:54:29PM +0900, Tetsuo Handa wrote: > Dave Chinner wrote: > > So, XFS should be passing kswapd context to the workqueue allocation > > context. The patch below does this. > > > > Tetsuo-san, when it comes to problems involving XFS, you should > > really CC xfs@oss.sgi.com because very few people really know how > > XFS works and even fewer still know how it is supposed to interact > > with memory reclaim.... > > Thank you for the patch, but ... > > #define PF_KSWAPD 0x00040000 /* I am kswapd */ > > static inline int current_is_kswapd(void) > { > return current->flags & PF_KSWAPD; > } > I think ((char) (current->flags & 0x00040000)) == 0. > Your patch wants > > -args->kswapd = current_is_kswapd(); > +args->kswapd = (current_is_kswapd() != 0); Thanks for pointing that out, but I think: -static inline int current_is_kswapd(void) +static inline bool current_is_kswapd(void) is a better solution. It can only be true or false. But regardless, I need to change the boolean options in that XFS structure to be, well, booleans. Cheers, dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Tue May 20 00:40:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id DC0797F59; Tue, 20 May 2014 00:40:53 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-feature-bit-cleanup, created. xfs-for-linus-3.15-rc5-1271-gab3e57b X-Git-Refname: refs/heads/xfs-feature-bit-cleanup X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: ab3e57b53f549ad51cbdf85e846ca4eaf0f3be30 Message-Id: <20140520054053.DC0797F59@oss.sgi.com> Date: Tue, 20 May 2014 00:40:53 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-feature-bit-cleanup has been created at ab3e57b53f549ad51cbdf85e846ca4eaf0f3be30 (commit) - Log ----------------------------------------------------------------- commit ab3e57b53f549ad51cbdf85e846ca4eaf0f3be30 Author: Dave Chinner Date: Tue May 20 07:47:05 2014 +1000 xfs: remove shared supberlock feature checking We reject any filesystem that is mounted with this feature bit set, so we don't need to check for it anywhere else. Remove the function for checking if the feature bit is set and any code that uses it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Jie Liu Signed-off-by: Dave Chinner commit 5d074a4f8005b988c9d48d29250e36ad64083252 Author: Dave Chinner Date: Tue May 20 07:46:55 2014 +1000 xfs: don't need dirv2 checks anymore If the the V2 directory feature bit is not set in the superblock feature mask the filesystem will fail the good version check. Hence we don't need any other version checking on the dir2 feature bit in the code as the filesystem will not mount without it set. Remove the checking code. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 263997a6842b27a49f42bd795c5dd12242917b22 Author: Dave Chinner Date: Tue May 20 07:46:40 2014 +1000 xfs: turn NLINK feature on by default mkfs has turned on the XFS_SB_VERSION_NLINKBIT feature bit by default since November 2007. It's about time we simply made the kernel code turn it on by default and so always convert v1 inodes to v2 inodes when reading them in from disk or allocating them. This This removes needless version checks and modification when bumping link counts on inodes, and will take code out of a few common code paths. text data bss dec hex filename 783251 100867 616 884734 d7ffe fs/xfs/xfs.o.orig 782664 100867 616 884147 d7db3 fs/xfs/xfs.o.patched Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 32bf1deae15b67839a2f0cb233254125be73fc78 Author: Dave Chinner Date: Tue May 20 07:41:43 2014 +1000 xfs: keep sb_bad_features2 the same a sb_features2 Whenever we update sb_features2, we need to update sb_bad_features2 so that they remain identical on disk. This prevents future mounts or userspace utilities from getting confused over which features the filesystem supports. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit f68a373525d26d1cd7920f9d5dbf0d3aa1b9b889 Author: Dave Chinner Date: Tue May 20 07:41:16 2014 +1000 xfs: make superblock version checks reflect reality We only support filesystems that have v2 directory support, and than means all the checking and handling of superblock versions prior to this support being added is completely unnecessary overhead. Strip out all the version 1-3 support, sanitise the good version checking to reflect the supported versions, update all the feature supported functions and clean up all the support bit definitions to reflect the fact that we no longer care about Irix bootloader flag regions for v4 feature bits. Also, convert the return values to boolean types and remove typedefs from function declarations to clean up calling conventions, too. Because the feature bit checking is all inline code, this relatively small cleanup has a noticable impact on code size: text data bss dec hex filename 785195 100867 616 886678 d8796 fs/xfs/xfs.o.orig 783595 100867 616 885078 d8156 fs/xfs/xfs.o.patched i.e. it reduces it by 1600 bytes. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Tue May 20 00:41:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id EBFD17F5F; Tue, 20 May 2014 00:41:09 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-misc-fixes-2-for-3.16, created. xfs-for-linus-3.15-rc5-1271-g376c2f3 X-Git-Refname: refs/heads/xfs-misc-fixes-2-for-3.16 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 376c2f3a5f0706868b08ccf043bf3532936a03b1 Message-Id: <20140520054109.EBFD17F5F@oss.sgi.com> Date: Tue, 20 May 2014 00:41:09 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-misc-fixes-2-for-3.16 has been created at 376c2f3a5f0706868b08ccf043bf3532936a03b1 (commit) - Log ----------------------------------------------------------------- commit 376c2f3a5f0706868b08ccf043bf3532936a03b1 Author: Roger Willcocks Date: Tue May 20 08:52:21 2014 +1000 xfs: fix compile error when libxfs header used in C++ code xfs_ialloc.h:102: error: expected ',' or '...' before 'delete' Simple parameter rename, no changes to behaviour. Signed-off-by: Roger Willcocks Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 8695d27ec34b19c58a0dc25bfcce3f2c6cf0699d Author: Jie Liu Date: Tue May 20 08:24:26 2014 +1000 xfs: fix infinite loop at xfs_vm_writepage on 32bit system Write to a file with an offset greater than 16TB on 32-bit system and then trigger page write-back via sync(1) will cause task hang. # block_size=4096 # offset=$(((2**32 - 1) * $block_size)) # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file # sync INFO: task sync:2590 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sync D c1064a28 0 2590 2097 0x00000000 ..... Call Trace: [] ? ttwu_do_wakeup+0x18/0x130 [] ? try_to_wake_up+0x1ce/0x220 [] ? wake_up_process+0x1f/0x40 [] ? wake_up_worker+0x1e/0x30 [] schedule+0x23/0x60 [] schedule_timeout+0x18d/0x1f0 [] ? do_raw_spin_unlock+0x4e/0x90 [] ? __queue_delayed_work+0x91/0x150 [] ? do_raw_spin_lock+0x3f/0x100 [] ? do_raw_spin_unlock+0x4e/0x90 [] wait_for_completion+0x7d/0xc0 [] ? try_to_wake_up+0x220/0x220 [] sync_inodes_sb+0x92/0x180 [] sync_inodes_one_sb+0x15/0x20 [] iterate_supers+0xb8/0xc0 [] ? fdatawrite_one_bdev+0x20/0x20 [] sys_sync+0x31/0x80 [] sysenter_do_call+0x12/0x28 This issue can be triggered via xfstests/generic/308. The reason is that the end_index is unsigned long with maximum value '2^32-1=4294967295' on 32-bit platform, and the given offset cause it wrapped to 0, so that the following codes will repeat again and again until the task schedule time out: end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; if (page->index >= end_index) { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* * Just skip the page if it is fully outside i_size, e.g. due * to a truncate operation that is in progress. */ if (page->index >= end_index + 1 || offset_into_page == 0) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unlock_page(page); return 0; } In order to check if a page is fully outsids i_size or not, we can fix the code logic as below: if (page->index > end_index || (page->index == end_index && offset_into_page == 0)) Secondly, there still has another similar issue when calculating the end offset for mapping the filesystem blocks to the file blocks for delalloc. With the same tests to above, run unmount(8) will cause kernel panic if CONFIG_XFS_DEBUG is enabled: XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 kernel BUG at fs/xfs/xfs_message.c:108! invalid opcode: 0000 [#1] SMP task: edddc100 ti: ec6ee000 task.ti: ec6ee000 EIP: 0060:[] EFLAGS: 00010296 CPU: 1 EIP is at assfail+0x2b/0x30 [xfs] .............. Call Trace: [] xfs_fs_destroy_inode+0x74/0x120 [xfs] [] destroy_inode+0x31/0x50 [] evict+0xef/0x170 [] dispose_list+0x32/0x40 [] evict_inodes+0xca/0xe0 [] generic_shutdown_super+0x46/0xd0 [] kill_block_super+0x29/0x70 [] deactivate_locked_super+0x44/0x70 [] deactivate_super+0x47/0x60 [] mntput_no_expire+0xcd/0x120 [] SyS_umount+0xa8/0x370 [] SyS_oldumount+0x1e/0x20 [] sysenter_do_call+0x12/0x28 That because the end_offset is evaluated to 0 which is the same reason to above, hence the mapping and covertion for dealloc file blocks to file system blocks did not happened. This patch just fixed both issues. Reported-by: Michael L. Semon Signed-off-by: Jie Liu Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 7c166350b15cbec4ed9357563461b6e1d2a44ea9 Author: Dave Chinner Date: Tue May 20 08:23:06 2014 +1000 xfs: remove redundant checks from xfs_da_read_buf All of the verification checks of magic numbers are now done by verifiers, so ther eis no need to check them again once the buffer has been successfully read. If the magic number is bad, it won't even get to that code to verify it so it really serves no purpose at all anymore. Remove it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 110dc24ad2ae4e9b94b08632fe1eb2fcdff83045 Author: Dave Chinner Date: Tue May 20 08:18:09 2014 +1000 xfs: log vector rounding leaks log space The addition of direct formatting of log items into the CIL linear buffer added alignment restrictions that the start of each vector needed to be 64 bit aligned. Hence padding was added in xlog_finish_iovec() to round up the vector length to ensure the next vector started with the correct alignment. This adds a small number of bytes to the size of the linear buffer that is otherwise unused. The issue is that we then use the linear buffer size to determine the log space used by the log item, and this includes the unused space. Hence when we account for space used by the log item, it's more than is actually written into the iclogs, and hence we slowly leak this space. This results on log hangs when reserving space, with threads getting stuck with these stack traces: Call Trace: [] schedule+0x29/0x70 [] xlog_grant_head_wait+0xa2/0x1a0 [] xlog_grant_head_check+0xbd/0x140 [] xfs_log_reserve+0x103/0x220 [] xfs_trans_reserve+0x2f5/0x310 ..... The 4 bytes is significant. Brain Foster did all the hard work in tracking down a reproducable leak to inode chunk allocation (it went away with the ikeep mount option). His rough numbers were that creating 50,000 inodes leaked 11 log blocks. This turns out to be roughly 800 inode chunks or 1600 inode cluster buffers. That works out at roughly 4 bytes per cluster buffer logged, and at that I started looking for a 4 byte leak in the buffer logging code. What I found was that a struct xfs_buf_log_format structure for an inode cluster buffer is 28 bytes in length. This gets rounded up to 32 bytes, but the vector length remains 28 bytes. Hence the CIL ticket reservation is decremented by 32 bytes (via lv->lv_buf_len) for that vector rather than 28 bytes which are written into the log. The fix for this problem is to separately track the bytes used by the log vectors in the item and use that instead of the buffer length when accounting for the log space that will be used by the formatted log item. Again, thanks to Brian Foster for doing all the hard work and long hours to isolate this leak and make finding the bug relatively simple. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit ce576f1c5688caade085ae9bba729e886b7ab1d9 Author: Namjae Jeon Date: Tue May 20 08:15:57 2014 +1000 xfs: remove XFS_TRANS_RESERVE in collapse range There is no need to dip into reserve pool. Reserve pool is used for much more important things. And xfs_trans_reserve will never return ENOSPC because punch hole is already done. If we get ENOSPC, collapse range will be simply failed. Cc: Brian Foster Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Tue May 20 00:41:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id B4CA37F63; Tue, 20 May 2014 00:41:34 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-3.15-rc6-69-gb70f14e X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 2d6dcc6d7e95cc83046b2f97e179e6bbb7921245 X-Git-Newrev: b70f14e1ffbb47369b1cc2cdf558c3468ae9e484 Message-Id: <20140520054134.B4CA37F63@oss.sgi.com> Date: Tue, 20 May 2014 00:41:34 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated b70f14e Merge branch 'xfs-feature-bit-cleanup' into for-next 0d907a3 Merge branch 'xfs-misc-fixes-2-for-3.16' into for-next 376c2f3 xfs: fix compile error when libxfs header used in C++ code 8695d27 xfs: fix infinite loop at xfs_vm_writepage on 32bit system 7c16635 xfs: remove redundant checks from xfs_da_read_buf 110dc24 xfs: log vector rounding leaks log space ce576f1 xfs: remove XFS_TRANS_RESERVE in collapse range ab3e57b xfs: remove shared supberlock feature checking 5d074a4 xfs: don't need dirv2 checks anymore 263997a xfs: turn NLINK feature on by default 32bf1de xfs: keep sb_bad_features2 the same a sb_features2 f68a373 xfs: make superblock version checks reflect reality from 2d6dcc6d7e95cc83046b2f97e179e6bbb7921245 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b70f14e1ffbb47369b1cc2cdf558c3468ae9e484 Merge: 0d907a3 ab3e57b Author: Dave Chinner Date: Tue May 20 08:57:02 2014 +1000 Merge branch 'xfs-feature-bit-cleanup' into for-next Conflicts: fs/xfs/xfs_inode.c commit 0d907a3bb4a77cffebebd17c323e898048301aa3 Merge: 2d6dcc6 376c2f3 Author: Dave Chinner Date: Tue May 20 08:56:00 2014 +1000 Merge branch 'xfs-misc-fixes-2-for-3.16' into for-next Conflicts: fs/xfs/xfs_ialloc.c ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 49 +++++++++-- fs/xfs/xfs_bmap_util.c | 2 - fs/xfs/xfs_da_btree.c | 41 --------- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_fsops.c | 9 +- fs/xfs/xfs_ialloc.c | 14 ++- fs/xfs/xfs_ialloc.h | 2 +- fs/xfs/xfs_inode.c | 111 +++--------------------- fs/xfs/xfs_inode.h | 1 - fs/xfs/xfs_inode_buf.c | 17 ++-- fs/xfs/xfs_inode_item.c | 32 +------ fs/xfs/xfs_ioctl.c | 9 +- fs/xfs/xfs_log.h | 19 ++-- fs/xfs/xfs_log_cil.c | 7 +- fs/xfs/xfs_mount.c | 6 ++ fs/xfs/xfs_sb.c | 12 +-- fs/xfs/xfs_sb.h | 225 ++++++++++++++---------------------------------- 17 files changed, 167 insertions(+), 391 deletions(-) hooks/post-receive -- XFS development tree From akpm@linux-foundation.org Tue May 20 00:59:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 95AC17F5E for ; Tue, 20 May 2014 00:59:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7A02630407A for ; Mon, 19 May 2014 22:59:43 -0700 (PDT) X-ASG-Debug-ID: 1400565577-04bdf056b71373f0001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id u3XWPbPzSXtuT7eN for ; Mon, 19 May 2014 22:59:37 -0700 (PDT) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from localhost (c-67-161-9-76.hsd1.ca.comcast.net [67.161.9.76]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 5F6344D3; Tue, 20 May 2014 05:59:36 +0000 (UTC) Date: Mon, 19 May 2014 22:59:15 -0700 From: Andrew Morton To: Dave Chinner Cc: Tetsuo Handa , riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-Id: <20140519225915.3370328d.akpm@linux-foundation.org> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). In-Reply-To: <20140520004449.GE18954@dastard> References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1400565577 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.5953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, 20 May 2014 10:44:49 +1000 Dave Chinner wrote: > @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( > struct xfs_bmalloca *args = container_of(work, > struct xfs_bmalloca, work); > unsigned long pflags; > + unsigned long new_pflags = PF_FSTRANS; > > - /* we are in a transaction context here */ > - current_set_flags_nested(&pflags, PF_FSTRANS); > + /* > + * we are in a transaction context here, but may also be doing work > + * in kswapd context, and hence we may need to inherit that state > + * temporarily to ensure that we don't block waiting for memory reclaim > + * in any way. > + */ > + if (args->kswapd) > + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; So current_is_kswapd() returns true for a thread which is not kswapd. That's a bit smelly. Should this thread really be incrementing KSWAPD_INODESTEAL instead of PGINODESTEAL, for example? current_is_kswapd() does a range of things, only one(?) of which you actually want. It would be cleaner to create a new PF_ flag to select just that behavior. That's a better model than telling the world "I am magic and special". But we're awfully close to running out of PF_ space and I don't know if this ugly justifies consuming a flag. From akpm@linux-foundation.org Tue May 20 01:03:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 672D37F5E for ; Tue, 20 May 2014 01:03:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 377B78F8049 for ; Mon, 19 May 2014 23:03:33 -0700 (PDT) X-ASG-Debug-ID: 1400565812-04bdf056b6137720001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id mFFTSjdbaUuGhULc for ; Mon, 19 May 2014 23:03:32 -0700 (PDT) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from localhost (c-67-161-9-76.hsd1.ca.comcast.net [67.161.9.76]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 3A0158FA; Tue, 20 May 2014 06:03:32 +0000 (UTC) Date: Mon, 19 May 2014 23:03:11 -0700 From: Andrew Morton To: Dave Chinner , Tetsuo Handa , riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-Id: <20140519230311.583f762c.akpm@linux-foundation.org> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). In-Reply-To: <20140519225915.3370328d.akpm@linux-foundation.org> References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1400565812 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.5953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 19 May 2014 22:59:15 -0700 Andrew Morton wrote: > On Tue, 20 May 2014 10:44:49 +1000 Dave Chinner wrote: > > > @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( > > struct xfs_bmalloca *args = container_of(work, > > struct xfs_bmalloca, work); > > unsigned long pflags; > > + unsigned long new_pflags = PF_FSTRANS; > > > > - /* we are in a transaction context here */ > > - current_set_flags_nested(&pflags, PF_FSTRANS); > > + /* > > + * we are in a transaction context here, but may also be doing work > > + * in kswapd context, and hence we may need to inherit that state > > + * temporarily to ensure that we don't block waiting for memory reclaim > > + * in any way. > > + */ > > + if (args->kswapd) > > + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; > > So current_is_kswapd() returns true for a thread which is not kswapd. > That's a bit smelly. > > Should this thread really be incrementing KSWAPD_INODESTEAL instead of > PGINODESTEAL, for example? current_is_kswapd() does a range of things, > only one(?) of which you actually want. > > It would be cleaner to create a new PF_ flag to select just that > behavior. That's a better model than telling the world "I am magic and > special". Or a new __GFP_FLAG. > But we're awfully close to running out of PF_ space and I don't know if > this ugly justifies consuming a flag. > From david@fromorbit.com Tue May 20 01:30:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A57737F63 for ; Tue, 20 May 2014 01:30:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C5AC30407F for ; Mon, 19 May 2014 23:30:41 -0700 (PDT) X-ASG-Debug-ID: 1400567438-04bdf056b8138e50001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id w4FHGUXSSyuUZDKF for ; Mon, 19 May 2014 23:30: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: AsgGAML1elN5LL1s/2dsb2JhbABZgwarBwEBAQaaKQGBFRd0giUBAQQBJxMcIwULCAMOCgklDwUlAyETiDkH0mAXFoU/iHkHhEABA5lfixOIC4NKK4ExJA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 16:00:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmdZA-00061d-Vq; Tue, 20 May 2014 16:30:25 +1000 Date: Tue, 20 May 2014 16:30:24 +1000 From: Dave Chinner To: Andrew Morton Cc: Tetsuo Handa , riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-ID: <20140520063024.GH18954@dastard> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519225915.3370328d.akpm@linux-foundation.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: 1400567438 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.5954 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 19, 2014 at 10:59:15PM -0700, Andrew Morton wrote: > On Tue, 20 May 2014 10:44:49 +1000 Dave Chinner wrote: > > > @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( > > struct xfs_bmalloca *args = container_of(work, > > struct xfs_bmalloca, work); > > unsigned long pflags; > > + unsigned long new_pflags = PF_FSTRANS; > > > > - /* we are in a transaction context here */ > > - current_set_flags_nested(&pflags, PF_FSTRANS); > > + /* > > + * we are in a transaction context here, but may also be doing work > > + * in kswapd context, and hence we may need to inherit that state > > + * temporarily to ensure that we don't block waiting for memory reclaim > > + * in any way. > > + */ > > + if (args->kswapd) > > + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; > > So current_is_kswapd() returns true for a thread which is not kswapd. > That's a bit smelly. > > Should this thread really be incrementing KSWAPD_INODESTEAL instead of > PGINODESTEAL, for example? current_is_kswapd() does a range of things, > only one(?) of which you actually want. It's doing work on behalf of kswapd under kswapd constraints, so it should both behave and be accounted as if kswapd was executing the work directly. > It would be cleaner to create a new PF_ flag to select just that > behavior. That's a better model than telling the world "I am magic and > special". However, it is magic and special because of who the work needs to be done for. > But we're awfully close to running out of PF_ space and I don't know if > this ugly justifies consuming a flag. I don't really care enough argue over what mechanism should be used. I'll push this patch through the XFS tree, and when a new flag or generic mechanism for pushing task contexts to kworker threads is provided, I'll change the XFS code to use that.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 20 01:33:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D76FC7F67 for ; Tue, 20 May 2014 01:33:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65A96AC00C for ; Mon, 19 May 2014 23:33:52 -0700 (PDT) X-ASG-Debug-ID: 1400567629-04cb6c5d0b140200001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id I12Aw1XQTxjLJ3W4 for ; Mon, 19 May 2014 23:33: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: AsgGAOr2elN5LL1s/2dsb2JhbABZgwarBwEBAQaaKQGBFRd0giUBAQUnExwjEAgDDgoJJQ8FJQMhE4hA0mIXFoU/iHkHhEABA480iiuLE4gLg0orgTEk Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 16:03:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmdcA-00062N-Bi; Tue, 20 May 2014 16:33:30 +1000 Date: Tue, 20 May 2014 16:33:30 +1000 From: Dave Chinner To: Andrew Morton Cc: Tetsuo Handa , riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-ID: <20140520063330.GI18954@dastard> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> <20140519230311.583f762c.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519230311.583f762c.akpm@linux-foundation.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: 1400567629 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.5953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 19, 2014 at 11:03:11PM -0700, Andrew Morton wrote: > On Mon, 19 May 2014 22:59:15 -0700 Andrew Morton wrote: > > > On Tue, 20 May 2014 10:44:49 +1000 Dave Chinner wrote: > > > > > @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( > > > struct xfs_bmalloca *args = container_of(work, > > > struct xfs_bmalloca, work); > > > unsigned long pflags; > > > + unsigned long new_pflags = PF_FSTRANS; > > > > > > - /* we are in a transaction context here */ > > > - current_set_flags_nested(&pflags, PF_FSTRANS); > > > + /* > > > + * we are in a transaction context here, but may also be doing work > > > + * in kswapd context, and hence we may need to inherit that state > > > + * temporarily to ensure that we don't block waiting for memory reclaim > > > + * in any way. > > > + */ > > > + if (args->kswapd) > > > + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; > > > > So current_is_kswapd() returns true for a thread which is not kswapd. > > That's a bit smelly. > > > > Should this thread really be incrementing KSWAPD_INODESTEAL instead of > > PGINODESTEAL, for example? current_is_kswapd() does a range of things, > > only one(?) of which you actually want. > > > > It would be cleaner to create a new PF_ flag to select just that > > behavior. That's a better model than telling the world "I am magic and > > special". > > Or a new __GFP_FLAG. Sure - and with that XFS will need another PF_ flag to tell the memory allocator to set the new __GFP_FLAG on every allocation done in that kworker task context, just like it uses PF_FSTRANS to ensure that __GFP_NOFS is set for all the allocations in that kworker context.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+0b8d1926a1c90034be34+3922+infradead.org+hch@bombadil.srs.infradead.org Tue May 20 02:21:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 888ED7F6A for ; Tue, 20 May 2014 02:21:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 81A7F8F8049 for ; Tue, 20 May 2014 00:21:11 -0700 (PDT) X-ASG-Debug-ID: 1400570469-04cb6c5d0d1434f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 9wQ2VvUe4ApHPww3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 20 May 2014 00:21:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0b8d1926a1c90034be34+3922+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 1WmeM5-00039i-ME; Tue, 20 May 2014 07:20:57 +0000 Date: Tue, 20 May 2014 00:20:57 -0700 From: Christoph Hellwig To: Andrew Morton Cc: Dave Chinner , Tetsuo Handa , riel@redhat.com, kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Message-ID: <20140520072057.GA4952@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519225915.3370328d.akpm@linux-foundation.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400570470 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.5954 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, May 19, 2014 at 10:59:15PM -0700, Andrew Morton wrote: > So current_is_kswapd() returns true for a thread which is not kswapd. > That's a bit smelly. > > Should this thread really be incrementing KSWAPD_INODESTEAL instead of > PGINODESTEAL, for example? current_is_kswapd() does a range of things, > only one(?) of which you actually want. Actually we want all of them. The allocation workqueue is a workaround for the incredible stack usage in the Linux I/O path. If it is called by kswapd it should act as if it were kswapd for all purposes. From david@fromorbit.com Tue May 20 03:27:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2149E7F5F for ; Tue, 20 May 2014 03:27:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C9A3AC008 for ; Tue, 20 May 2014 01:27:48 -0700 (PDT) X-ASG-Debug-ID: 1400574457-04cb6c5d0d148580001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oFbUt2h0SO6Y85jr for ; Tue, 20 May 2014 01:27:38 -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: AsgGAOsQe1N5LL1s/2dsb2JhbABZgwarBwEBAQaaKQGBFhd0giUBAQU6HCMQCAMOCgklDwUlAyETiEDSQBcWhT+IeQeEQASZX5Meg0or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 17:57:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmfOO-0006IP-38; Tue, 20 May 2014 18:27:24 +1000 Date: Tue, 20 May 2014 18:27:24 +1000 From: Dave Chinner To: Adam Sampson Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! Message-ID: <20140520082724.GJ18954@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs: v3.2.0 released! References: <20140516055650.GF26353@dastard> <20140517002309.GA18954@dastard> <20140519025553.GB8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519025553.GB8554@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: 1400574458 X-Barracuda-URL: http://192.48.176.15: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.5955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 19, 2014 at 12:55:53PM +1000, Dave Chinner wrote: > On Sat, May 17, 2014 at 11:53:08AM +0100, Adam Sampson wrote: > > Dave Chinner writes: > > > > > [...] it's preferable to have things like xfs_repair abort when it > > > comes across an inconsistency it can't handle than to continue blindly > > > along and making a bigger mess of the filesystem it's supposed to be > > > fixing... > > > > Yes -- that's why I was building with DEBUG= on previous releases > > (i.e. I want assertions enabled). doc/INSTALL says that DEBUG=-DNDEBUG > > disables assertions, so packagers are quite likely to have DEBUG= in > > their build process. > > Hmmm - so, not being an everyday userspace programmer, it didn't > even occur to me that "-DNDEBUG" actually changes libc header > behaviour, not anything to do with the XFS code. > > $ man assert > ..... > BUGS > assert() is implemented as a macro; if the expression > tested has side-effects, program behavior will be different > depending on whether NDEBUG is defined. This may create > Heisenbugs which go away when debugging is turned on. > > Yup, it's oh so obvious now that "NDEBUG" is something owned by > system library code, not the xfsprogs package... > > > > > > Anyway, we'll look to fix it for 3.2.1. > > Or maybe not. The intent of always turning off the asserts is that > code like xfs_repair shouldn't assert fail when stuff it detected as > out of bounds in a library function. IOWs, you're quite likely to > unintentionally break repair by removing the NDEBUG define to > re-instate the library asserts... And it's not straight forward, either, because some of the ASSERT()s have code in them that is only present when the libxfs code is built with -DDEBUG, so compiling in the asserts without enabling -DDEBUG is not going to work. And, well, compiling with -DDEBUG itself deosn't work nor with -DNDEBUG -DDEBUG because -DDEBUG enables code that has unhandled kernelisms in it. So, right now, don't remove -NDEBUG from the libxfs/Makefile. It's there for a good reason right now. i.e. removing it requires some non-trivial work, and even if we do make it compile the resultant code will probably not work (i.e. assert fail unnecessarily) given the requirements that userspace has for tolerance of inconsistent on-disk states. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 20 03:36:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 772357F6C for ; Tue, 20 May 2014 03:36:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 479B5304067 for ; Tue, 20 May 2014 01:36:41 -0700 (PDT) X-ASG-Debug-ID: 1400574998-04bdf056b81420d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id nTpArPXLC7TBgdvh for ; Tue, 20 May 2014 01:36:38 -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: AtQGAAsTe1N5LL1s/2dsb2JhbABZgwYeM6o2AQEBBpJuiFIXdIMCOyQ0BSUDNIhAnj20HxaFP4kWgh4PRIE5BJlfkx6BQYIJKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 20 May 2014 18:06:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmfX7-0006M8-4v for xfs@oss.sgi.com; Tue, 20 May 2014 18:36:25 +1000 Date: Tue, 20 May 2014 18:36:25 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 2c35010 Message-ID: <20140520083625.GK18954@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 2c35010 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Q68bSM7Ycu6FN28Q" 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: 1400574998 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.5956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Q68bSM7Ycu6FN28Q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. If I missed any patches that had been delayed for the 3.2.0 release in this sweep, please point them out to me so I can pick them up. I plan to pull in the free inode btree patches in the next couple of days, and then stabilise for a 3.2.1 release by the middle of June. The new head of the master branch is commit: 2c35010 xfs_repair: don't let bplist index go negative in prefetch New Commits: Eric Sandeen (2): [bfc541e] xfsprogs: remove xfs_check [2c35010] xfs_repair: don't let bplist index go negative in prefetch Junxiao Bi (1): [2277ce3] xfs_copy: use exit() to replace killall() Mark Tinguely (2): [dd2c21d] libxfs: remove unused argument in trans_iput [260c85e] libxfs: dont free xfs_inode until complete Roger Willcocks (1): [6626020] libxfs: fix compile error when libxfs header used in C++ co= de Code Diffstat: copy/xfs_copy.c | 30 +------ db/Makefile | 3 +- db/attrset.c | 4 +- db/xfs_check.sh | 42 ---------- include/libxfs.h | 7 +- include/xfs_ialloc.h | 2 +- libxfs/init.c | 4 +- libxfs/rdwr.c | 2 +- libxfs/trans.c | 60 ++------------ libxfs/util.c | 1 - libxfs/xfs.h | 1 - libxfs/xfs_ialloc.c | 6 +- man/man8/xfs_check.8 | 203 -------------------------------------------= ---- man/man8/xfs_db.8 | 68 +++++++++++++--- man/man8/xfs_mdrestore.8 | 1 - man/man8/xfs_ncheck.8 | 7 +- man/man8/xfs_repair.8 | 1 - mkfs/proto.c | 18 +---- repair/phase6.c | 15 ++-- repair/phase7.c | 2 +- repair/prefetch.c | 2 +- 21 files changed, 88 insertions(+), 391 deletions(-) delete mode 100755 db/xfs_check.sh delete mode 100644 man/man8/xfs_check.8 --=20 Dave Chinner david@fromorbit.com --Q68bSM7Ycu6FN28Q Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTexQIAAoJEK3oKUf0dfodHp0QAJe3/mrAATuzAZWzccB1ZAds iW+SoU+mN4QaXnkAK8oKJNLAxNXCWjYUjTqvCii5VkzO7m3wAYTnzqURUCsFcbbW 7Ar8QgpNXdqlJhD0WXskeJU5PRgKSm6tRCrYVb5rFrdYqQjCtStgxvKVCDyn9eYk 60JaSxfuJHkvA8Z86FPjTXbMhiPmNfwkgBPWIRscUxTsZ9MGN3VafwRREiDu4GS5 ATmt29MZkLdYnRS6BNp6Zewf3phwM7EykCZqqz6q+PEi/MUHkwpFxdzmcreeryDL cywxj0A1V2RWQVNc4O5M8ZtWRQU8Vcr1gjdIS1CZzJVEAM9uLD3XZ35XI5U8yXbo gDylwbEKAniQin5FoyatyeOOvXorgoMFaaSS0QiYSrJEGPwa1oX3i1Yq4d+BjE8b grdToZIFfo6OPRs9q7exaL9AMK8nAmGTU4Qi7IxUnLKWnclz3INaybwzYd9gViW5 Rfzg4nlQJraUXou3nK89Lhkdj8xTNjgJZTJaXcK6Dw04OopPQiVxE0NLyFS6WLsD QSxq/0Nc24a4/0zww9xMpZTUCCfbyneO1TitZO1e3q1F9LqoK0R85ifuRWgzsXP4 0lbABV6PPIa7bPSwjOEKZEKydjLiQQf8UciOQSZ/4vdcVT67e2iS800pG2yz/ep6 eUBGK3ICAdmcSGFrMFd0 =Kr6h -----END PGP SIGNATURE----- --Q68bSM7Ycu6FN28Q-- From bfoster@redhat.com Tue May 20 06:22:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 975357F73 for ; Tue, 20 May 2014 06:22:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90BE38F8040 for ; Tue, 20 May 2014 04:22:07 -0700 (PDT) X-ASG-Debug-ID: 1400584926-04cb6c5d0a156c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SpSZfyv7I0CShVHd for ; Tue, 20 May 2014 04:22:06 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4KBLx9q020617 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 20 May 2014 07:22:00 -0400 Received: from laptop.bfoster (vpn-54-176.rdu2.redhat.com [10.10.54.176]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4KBLxKf012369; Tue, 20 May 2014 07:21:59 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 4508A120AC1; Tue, 20 May 2014 07:17:08 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4KBH7ba003574; Tue, 20 May 2014 07:17:07 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 20 May 2014 07:17:06 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state Message-ID: <20140520111706.GA3124@laptop.bfoster> X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> <1400263966-35541-3-git-send-email-bfoster@redhat.com> <20140519215658.GD8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140519215658.GD8554@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400584926 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, May 20, 2014 at 07:56:58AM +1000, Dave Chinner wrote: > On Fri, May 16, 2014 at 02:12:46PM -0400, Brian Foster wrote: > > Create sysfs attributes to export the current runtime state of the log > > to userspace. Note that the filesystem should be frozen for best > > accuracy/consistency when reading these values, but is not required. > > This is for testing and debug purposes only. > > > > Create the following per-mount attributes: log_head_lsn, log_tail_lsn, > > reserve_head_lsn and write_head_lsn. These represent the physical log > > Reserve and write heads are not log sequence numbers (LSNs). A LSN > is a cycle:block count tuple, while a grant head is a cycle:byte > count tuple.... > Yeah, I suppose that's some terminology abuse... ;) > Calling the reserve_grant_head/write_grant_head would make more > sense, I think, as would splitting them into cycle/byte output > pairs. Splitting them make sense because if we increase the log size > beyond 2GB we're going to need a different in-memory representation > for the grant heads (i.e. need more than 32 bits for byte count), so > we should probably handle that up front in the sysfs API... > Ok. reserve_grant_head and write_grant_head in the decimal format of "cycle:bytes" it is. I'll leave the names of the others and convert them to a similar "cycle:blocks" format. Thanks! Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Tue May 20 06:52:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 092277F4E for ; Tue, 20 May 2014 06:52:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C64BAC008 for ; Tue, 20 May 2014 04:52:35 -0700 (PDT) X-ASG-Debug-ID: 1400586752-04cb6c5d0b159a20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JCYtWAe45teEHduB for ; Tue, 20 May 2014 04:52:33 -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: AldKAPdAe1N5LL1sPGdsb2JhbABZgwaIS6I+AQEBBpopAYEYFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEDSfhcWhT+IeQeEQASZX5ZoKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 20 May 2014 21:22:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wmiar-0006qQ-Of; Tue, 20 May 2014 21:52:29 +1000 Date: Tue, 20 May 2014 21:52:29 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state Message-ID: <20140520115229.GG8554@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/2] xfs: sysfs attributes for the current log state References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> <1400263966-35541-3-git-send-email-bfoster@redhat.com> <20140519215658.GD8554@dastard> <20140520111706.GA3124@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140520111706.GA3124@laptop.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: 1400586752 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.5959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 20, 2014 at 07:17:06AM -0400, Brian Foster wrote: > On Tue, May 20, 2014 at 07:56:58AM +1000, Dave Chinner wrote: > > On Fri, May 16, 2014 at 02:12:46PM -0400, Brian Foster wrote: > > > Create sysfs attributes to export the current runtime state of the log > > > to userspace. Note that the filesystem should be frozen for best > > > accuracy/consistency when reading these values, but is not required. > > > This is for testing and debug purposes only. > > > > > > Create the following per-mount attributes: log_head_lsn, log_tail_lsn, > > > reserve_head_lsn and write_head_lsn. These represent the physical log > > > > Reserve and write heads are not log sequence numbers (LSNs). A LSN > > is a cycle:block count tuple, while a grant head is a cycle:byte > > count tuple.... > > > > Yeah, I suppose that's some terminology abuse... ;) > > > Calling the reserve_grant_head/write_grant_head would make more > > sense, I think, as would splitting them into cycle/byte output > > pairs. Splitting them make sense because if we increase the log size > > beyond 2GB we're going to need a different in-memory representation > > for the grant heads (i.e. need more than 32 bits for byte count), so > > we should probably handle that up front in the sysfs API... > > > > Ok. reserve_grant_head and write_grant_head in the decimal format of > "cycle:bytes" it is. I'll leave the names of the others and convert them > to a similar "cycle:blocks" format. Thanks! FWIW, I think all the sysfs code should be in it's own file, not in xfs_mount.c... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 20 07:16:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 253967F4E for ; Tue, 20 May 2014 07:16:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ECBF88F8049 for ; Tue, 20 May 2014 05:16:52 -0700 (PDT) X-ASG-Debug-ID: 1400588209-04bdf056b61573f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6MkFDeBBgylZQoxz for ; Tue, 20 May 2014 05:16: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: AtpKAAZHe1N5LL1sPGdsb2JhbABZgwaIS6I7AQEBAQEBBposAYEZFwMBAQEBODWCJQEBBScTHCMQCAMOCgklDwUlAwcaE4hA0wYXFoU/iBUXTQeEQASZZ5ZrK4ExAR8 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 20 May 2014 21:46:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmiyN-0006uJ-NH; Tue, 20 May 2014 22:16:47 +1000 Date: Tue, 20 May 2014 22:16:47 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 1/2] xfs: add basic per-mount sysfs attribute support Message-ID: <20140520121647.GH8554@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 1/2] xfs: add basic per-mount sysfs attribute support References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> <1400263966-35541-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400263966-35541-2-git-send-email-bfoster@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: 1400588209 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.5959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 16, 2014 at 02:12:45PM -0400, Brian Foster wrote: > Initialize/destroy a kset on module init/fini for XFS. The XFS attribute > directory is represented as /sys/fs/xfs. Create a subdirectory per-mount > based on the system device name. > > Also add some basic macros to aid in the addition of sysfs attributes. > This code is modeled after the equivalent mechanism for ext4. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_mount.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_mount.h | 2 ++ > fs/xfs/xfs_super.c | 12 ++++++++- > 3 files changed, 92 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 944f3d9..9ed9dd0 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -60,6 +60,9 @@ static DEFINE_MUTEX(xfs_uuid_table_mutex); > static int xfs_uuid_table_size; > static uuid_t *xfs_uuid_table; > > +extern struct kset *xfs_kset; > +static struct kobj_type xfs_ktype; > + > /* > * See if the UUID is unique among mounted XFS filesystems. > * Mount fails if UUID is nil or a FS with the same UUID is already mounted. > @@ -955,6 +958,13 @@ xfs_mountfs( > "Unable to allocate reserve blocks. Continuing without reserve pool."); > } > > + mp->m_kobject.kset = xfs_kset; > + init_completion(&mp->m_kobject_complete); > + error = kobject_init_and_add(&mp->m_kobject, &xfs_ktype, NULL, > + "%s", mp->m_fsname); > + if (error) > + goto out_rtunmount; > + I think this should be wrapped in a helper, same for the destruction code. It shoul dalso be called earlier rather than later, because we are going to want to add children to this object (e.g. per-ag sysfs attribute directories), and we probably want to isolate information from different subsystems to different subdirectories under this. e.g; /sysfs/fs/xfs/vda/.... /vdb/log/... /trans/... /ag/0/sb/.... /agf/.... /agi/.... /agfl/.... /1/sb/... ... /n/agfl/.... /quota/.... Dumping everything in the root directory is probably not a good idea, and hence we shoul dbe creating the heirarchy as we initialise subsystems during mount, and freeing them as we tear them down from unmount... Cheers, Dave. -- Dave Chinner david@fromorbit.com From hch@lst.de Tue May 20 09:40:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 32E277F4E for ; Tue, 20 May 2014 09:40:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F13F8F8049 for ; Tue, 20 May 2014 07:40:49 -0700 (PDT) X-ASG-Debug-ID: 1400596847-04cb6c5d0a16c600001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Zw2CXXP9yBkU8AC4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 20 May 2014 07:40:48 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id A2A7413F4A; Tue, 20 May 2014 16:40:46 +0200 (CEST) Date: Tue, 20 May 2014 16:40:46 +0200 From: Christoph Hellwig To: nickkrause@sympatico.ca, sandeen@redhat.com Cc: xfs@oss.sgi.com Subject: Re: [xfs-masters] [Bug 48651] [TRIVIAl]'xfs_uuid_table' allocated in xfs_uuid_mount() is never freed Message-ID: <20140520144046.GA17616@lst.de> X-ASG-Orig-Subj: Re: [xfs-masters] [Bug 48651] [TRIVIAl]'xfs_uuid_table' allocated in xfs_uuid_mount() is never freed 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.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1400596847 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.5961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 20, 2014 at 04:01:20AM +0000, bugzilla-daemon@bugzilla.kernel.org wrote: > https://bugzilla.kernel.org/show_bug.cgi?id=48651 > --- Comment #2 from Eric Sandeen --- > Freeing it when the module is unloaded should be sufficient. > > In normal use, unmounting a filesystem creates a hole in the table, which the > next mount can fill. > > If you mount a lot of unique UUID filesystems without unmounting any in > between, the table will grow accordingly, and unmounting won't shrink it - i.e. > the table only grows as the number of concurrently mounted filesystem grows, > but that doesn't seem like a particularly critical problem to fix. If anyonereally cares about this he or she should just kill the uuid table entirely. We can simple walk a list of mounted xfs filesystems and check their uuids. The VFS even keeps a list already, which we probably could use if we are careful. Bonus points for implementing this in a way so that other filesystems could share the code. From penguin-kernel@i-love.sakura.ne.jp Tue May 20 09:59:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3C1427F4E for ; Tue, 20 May 2014 09:59:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 36A89304043 for ; Tue, 20 May 2014 07:59:10 -0700 (PDT) X-ASG-Debug-ID: 1400597947-04cbb006d9161430001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id IMuY1kXS0oGP5GH8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 20 May 2014 07:59:08 -0700 (PDT) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from www262.sakura.ne.jp (ksav31.sakura.ne.jp [210.224.165.211]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4KEwXK6008123; Tue, 20 May 2014 23:58:33 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) X-Nat-Received: from [202.181.97.72]:28281 [ident-empty] by smtp-proxy.isp with TPROXY id 1400597912.10224 Received: from CLAMP (KD175108057186.ppp-bb.dion.ne.jp [175.108.57.186]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4KEwWDW008118; Tue, 20 May 2014 23:58:32 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: david@fromorbit.com, riel@redhat.com Cc: kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, akpm@linux-foundation.org, hch@infradead.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). From: Tetsuo Handa X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> <20140520063024.GH18954@dastard> In-Reply-To: <20140520063024.GH18954@dastard> Message-Id: <201405202358.ADF10119.SMOFOQLFtOVHJF@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Tue, 20 May 2014 23:58:29 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 20052014 #7960777, status: clean X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1400597948 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.5962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today I discussed with Kosaki-san at LinuxCon Japan 2014 about this issue. He does not like the idea of adding timeout to throttle loop. As Dave posted a patch that fixes a bug in XFS delayed allocation, I updated my patch accordingly. Although the bug in XFS was fixed by Dave's patch, other kernel code would have bugs which would fall into this infinite throttle loop. But to keep the possibility of triggering OOM killer minimum, can we agree with this updated patch (and in the future adding some warning mechanism like /proc/sys/kernel/hung_task_timeout_secs for detecting memory allocation stall)? Dave, if you are OK with this updated patch, please let me know commit ID of your patch. Regards. ---------- >From 408e65d9025e8e24838e7bf6ac9066ba8a9391a6 Mon Sep 17 00:00:00 2001 From: Tetsuo Handa Date: Tue, 20 May 2014 23:34:34 +0900 Subject: [PATCH] mm/vmscan: Do not throttle kswapd at shrink_inactive_list(). I can observe that commit 35cd7815 "vmscan: throttle direct reclaim when too many pages are isolated already" causes RHEL7 environment to stall with 0% CPU usage when a certain type of memory pressure is given. This is because nobody can reclaim memory due to rules listed below. (a) XFS uses a kernel worker thread for delayed allocation (b) kswapd wakes up the kernel worker thread for delayed allocation (c) the kernel worker thread is throttled due to commit 35cd7815 This patch and commit XXXXXXXX "xfs: block allocation work needs to be kswapd aware" will solve rule (c). Signed-off-by: Tetsuo Handa --- mm/vmscan.c | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 32c661d..5c6960e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1460,12 +1460,22 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, struct zone *zone = lruvec_zone(lruvec); struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; - while (unlikely(too_many_isolated(zone, file, sc))) { - congestion_wait(BLK_RW_ASYNC, HZ/10); + /* + * Throttle only direct reclaimers. Allocations by kswapd (and + * allocation workqueue on behalf of kswapd) should not be + * throttled here; otherwise memory allocation will deadlock. + */ + if (!sc->hibernation_mode && !current_is_kswapd()) { + while (unlikely(too_many_isolated(zone, file, sc))) { + congestion_wait(BLK_RW_ASYNC, HZ/10); - /* We are about to die and free our memory. Return now. */ - if (fatal_signal_pending(current)) - return SWAP_CLUSTER_MAX; + /* + * We are about to die and free our memory. + * Return now. + */ + if (fatal_signal_pending(current)) + return SWAP_CLUSTER_MAX; + } } lru_add_drain(); -- 1.7.1 From weber@zbfmail.de Tue May 20 10:33:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DDDB17F4E for ; Tue, 20 May 2014 10:33:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BFEF98F8049 for ; Tue, 20 May 2014 08:33:23 -0700 (PDT) X-ASG-Debug-ID: 1400600000-04bdf056b816d4b0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id Ga5BtTPHHB88ex47 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 20 May 2014 08:33: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 A33A172EE9 for ; Tue, 20 May 2014 17:33:15 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de A33A172EE9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1400599999; bh=CuLdP4M0/sSOcZDXcBd9ru8++7OYCJStptK2WCo++Xg=; h=Date:From:To:Subject:Reply-To; b=GeoYObFHOimVFTO6UoBd8EBrKYVw4VEbkRzd2gYKH0BS0gUf0C+htwcAy15pkgFHr xh5aMSj3rrwJ6xx0c181lJkrbUFG481zwr9Svu5enUPQFDWJKRuIXH1pw12Vv9WAqS EW16BmfBF3X/jcEQCJDA/CN6ppHqiOQYaYovBE+I= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 20 May 2014 17:33:15 +0200 From: Marko Weber|8000 To: Xfs Subject: a maybe silly question about xfsdump Organization: zbf mail X-ASG-Orig-Subj: a maybe silly question about xfsdump Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <33dfdd6d469a5be58f79cbf0f0222c51@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-INFN-TO-Metrics: mailserver 1233; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1400600001 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.5963 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, again me ;-) i use at runtime this command to backup root partition of a server: xfsdump -f /var/backup/root2.dump -l 0 -p 5 -L rootdump -M rootdump / i googled around alot, cause a question wont get out of my mind: is this backup consistent? And what about consistency when i backup a mysql partition at runtime? but my most wondering is abot this: bunka ~ # df -h Filesystem Size Used Avail Use% Mounted on /dev/root 135G 11G 125G 8% / but the saved dump shows: bunka ~ # ls -lh /var/backup/ -rw-r--r-- 1 root root 8.4G May 20 17:29 root2.dump why is there such a great difference between df -h and the stored dump? can you give me some enlightment? thank you marko -- zbfmail - Mittendrin statt nur Datei! OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver From Motohiro.Kosaki@us.fujitsu.com Tue May 20 11:13:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 78E647F4E for ; Tue, 20 May 2014 11:13:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 264BDAC00A for ; Tue, 20 May 2014 09:13:35 -0700 (PDT) X-ASG-Debug-ID: 1400602413-04bdf056b7171630001-NocioJ Received: from fujitsu25.fnanic.fujitsu.com ([192.240.6.15]) by cuda.sgi.com with ESMTP id 9qxgd68kZaOMCXiD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 20 May 2014 09:13:33 -0700 (PDT) X-Barracuda-Envelope-From: Motohiro.Kosaki@us.fujitsu.com X-Barracuda-Apparent-Source-IP: 192.240.6.15 Received: from pps.filterd (fujitsu25 [127.0.0.1]) by fujitsu25.fnanic.fujitsu.com (8.14.4/8.14.4) with SMTP id s4KG78fi027627; Tue, 20 May 2014 09:12:58 -0700 Received: from fujitsu7i.fnanic.fujitsu.com ([133.164.253.7]) by fujitsu25.fnanic.fujitsu.com with ESMTP id 1m08g503xb-1; Tue, 20 May 2014 09:12:58 -0700 Received: from G05USEXSUYA05.g05.fujitsu.local (localhost [127.0.0.1]) by fujitsu7i.fnanic.fujitsu.com (8.13.8/8.13.8) with ESMTP id s4KGCsCL004879; Tue, 20 May 2014 09:12:56 -0700 (PDT) Received: from sv-hub2.Corp.FC.LOCAL (10.159.216.15) by G05USEXSUYA05.g05.fujitsu.local (10.159.165.151) with Microsoft SMTP Server (TLS) id 14.3.181.6; Tue, 20 May 2014 09:12:55 -0700 Received: from sv-exchange1.Corp.FC.LOCAL ([fe80::918:9db1:ceff:7ab5]) by sv-hub2.Corp.FC.LOCAL ([fe80::54e9:17ab:278e:7f60%11]) with mapi; Tue, 20 May 2014 09:12:08 -0700 From: Motohiro Kosaki To: Tetsuo Handa , "david@fromorbit.com" , "riel@redhat.com" CC: Motohiro Kosaki JP , "fengguang.wu@intel.com" , "kamezawa.hiroyu@jp.fujitsu.com" , "akpm@linux-foundation.org" , "hch@infradead.org" , "linux-kernel@vger.kernel.org" , "xfs@oss.sgi.com" Date: Tue, 20 May 2014 09:12:07 -0700 Subject: RE: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Thread-Topic: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). X-ASG-Orig-Subj: RE: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_list(). Thread-Index: Ac90PBjBis44RDgCTnaBUDFH5AOokQACcNNg Message-ID: <6B2BA408B38BA1478B473C31C3D2074E31D59D8673@SV-EXCHANGE1.Corp.FC.LOCAL> References: <201405192340.FCD48964.OFQHOOJLVSFFMt@I-love.SAKURA.ne.jp> <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> <20140520063024.GH18954@dastard> <201405202358.ADF10119.SMOFOQLFtOVHJF@I-love.SAKURA.ne.jp> In-Reply-To: <201405202358.ADF10119.SMOFOQLFtOVHJF@I-love.SAKURA.ne.jp> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.96,1.0.14,0.0.0000 definitions=2014-05-20_04:2014-05-20,2014-05-20,1970-01-01 signatures=0 X-Barracuda-Connect: UNKNOWN[192.240.6.15] X-Barracuda-Start-Time: 1400602413 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.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > -----Original Message----- > From: Tetsuo Handa [mailto:penguin-kernel@I-love.SAKURA.ne.jp] > Sent: Tuesday, May 20, 2014 11:58 PM > To: david@fromorbit.com; riel@redhat.com > Cc: Motohiro Kosaki JP; fengguang.wu@intel.com; kamezawa.hiroyu@jp.fujits= u.com; akpm@linux-foundation.org; > hch@infradead.org; linux-kernel@vger.kernel.org; xfs@oss.sgi.com > Subject: Re: [PATCH] mm/vmscan: Do not block forever at shrink_inactive_l= ist(). >=20 > Today I discussed with Kosaki-san at LinuxCon Japan 2014 about this issue= . > He does not like the idea of adding timeout to throttle loop. As Dave pos= ted a patch that fixes a bug in XFS delayed allocation, I > updated my patch accordingly. >=20 > Although the bug in XFS was fixed by Dave's patch, other kernel code woul= d have bugs which would fall into this infinite throttle loop. > But to keep the possibility of triggering OOM killer minimum, can we agre= e with this updated patch (and in the future adding some > warning mechanism like /proc/sys/kernel/hung_task_timeout_secs for detect= ing memory allocation stall)? >=20 > Dave, if you are OK with this updated patch, please let me know commit ID= of your patch. >=20 > Regards. > ---------- > >From 408e65d9025e8e24838e7bf6ac9066ba8a9391a6 Mon Sep 17 00:00:00 2001 > From: Tetsuo Handa > Date: Tue, 20 May 2014 23:34:34 +0900 > Subject: [PATCH] mm/vmscan: Do not throttle kswapd at shrink_inactive_lis= t(). >=20 > I can observe that commit 35cd7815 "vmscan: throttle direct reclaim when = too many pages are isolated already" causes RHEL7 > environment to stall with 0% CPU usage when a certain type of memory pres= sure is given. > This is because nobody can reclaim memory due to rules listed below. >=20 > (a) XFS uses a kernel worker thread for delayed allocation > (b) kswapd wakes up the kernel worker thread for delayed allocation > (c) the kernel worker thread is throttled due to commit 35cd7815 >=20 > This patch and commit XXXXXXXX "xfs: block allocation work needs to be ks= wapd aware" will solve rule (c). >=20 > Signed-off-by: Tetsuo Handa > --- > mm/vmscan.c | 20 +++++++++++++++----- > 1 files changed, 15 insertions(+), 5 deletions(-) >=20 > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 32c661d..5c6960e 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -1460,12 +1460,22 @@ shrink_inactive_list(unsigned long nr_to_scan, st= ruct lruvec *lruvec, > struct zone *zone =3D lruvec_zone(lruvec); > struct zone_reclaim_stat *reclaim_stat =3D &lruvec->reclaim_stat; >=20 > - while (unlikely(too_many_isolated(zone, file, sc))) { > - congestion_wait(BLK_RW_ASYNC, HZ/10); > + /* > + * Throttle only direct reclaimers. Allocations by kswapd (and > + * allocation workqueue on behalf of kswapd) should not be > + * throttled here; otherwise memory allocation will deadlock. > + */ > + if (!sc->hibernation_mode && !current_is_kswapd()) { > + while (unlikely(too_many_isolated(zone, file, sc))) { > + congestion_wait(BLK_RW_ASYNC, HZ/10); >=20 > - /* We are about to die and free our memory. Return now. */ > - if (fatal_signal_pending(current)) > - return SWAP_CLUSTER_MAX; > + /* > + * We are about to die and free our memory. > + * Return now. > + */ > + if (fatal_signal_pending(current)) > + return SWAP_CLUSTER_MAX; > + } > } Acked-by: KOSAKI Motohiro Dave, I don't like Tetsuo's first patch because this too_many_isolated exis= t to prevent false oom-kill. So, simple timeout resurrect it. Please let me know if you need further MM enhancement to solv= e XFS issue. I'd like join and assist this. Thanks. From david@fromorbit.com Tue May 20 16:07:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5567C7F4E for ; Tue, 20 May 2014 16:07:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 241F2304087 for ; Tue, 20 May 2014 14:07:41 -0700 (PDT) X-ASG-Debug-ID: 1400620055-04bdf056b818fc60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id FKLDKlZAUM3vnNwW for ; Tue, 20 May 2014 14:07:36 -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: AnVfAAbDe1N5LL1sPGdsb2JhbABZgwaDQYUKokIBAQEBAQEGmiwBgR0XAwEBAQE4NYIlAQEEATocIwULCAMYCSUPBSUDBy2IOQfUQRcWhT+IDmsHFoQqBJlnlmsr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 21 May 2014 06:37:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmrG0-0008HB-Ks; Wed, 21 May 2014 07:07:32 +1000 Date: Wed, 21 May 2014 07:07:32 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: a maybe silly question about xfsdump Message-ID: <20140520210732.GI8554@dastard> X-ASG-Orig-Subj: Re: a maybe silly question about xfsdump References: <33dfdd6d469a5be58f79cbf0f0222c51@zbfmail.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <33dfdd6d469a5be58f79cbf0f0222c51@zbfmail.de> 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: 1400620056 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.5970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 20, 2014 at 05:33:15PM +0200, Marko Weber|8000 wrote: > > hello, again me ;-) > > i use at runtime this command to backup root partition of a server: > > xfsdump -f /var/backup/root2.dump -l 0 -p 5 -L rootdump -M rootdump / > > > i googled around alot, cause a question wont get out of my mind: > is this backup consistent? > And what about consistency when i backup a mysql partition at runtime? First, define consistent.... If you define consistent as a point in time snapshot where everything is from the same point in time, then xfsdump does not provide you with that. You need to quiese mysql and snapshot the filesystem, then backup the snapshot to get a consistent point in time backup of the filesytem from the application data all the way down to the filesystem metadata. That's no different to any other backup process - even if you are using btrfs you still need to quiesce the application to get a consistent snapshot of the application data in the filesystem snapshot that you are backing up.... > but my most wondering is abot this: > > bunka ~ # df -h > Filesystem Size Used Avail Use% Mounted on > /dev/root 135G 11G 125G 8% / > > > but the saved dump shows: > > > bunka ~ # ls -lh /var/backup/ > > -rw-r--r-- 1 root root 8.4G May 20 17:29 root2.dump xfsdump stores information in a more compact form than the filesystem does on disk. It doesn't need all the metadata the filesystem has on disk to reference all the data you are backing up... Also, they may be some files maked as "no dump" that will be skipped, and other files that (e.g. iopen, unlinked tmpfiles) can't be found via a directory traversal and so aren't backed up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 20 17:34:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BE1AF7F4E for ; Tue, 20 May 2014 17:34:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5591BAC002 for ; Tue, 20 May 2014 15:34:41 -0700 (PDT) X-ASG-Debug-ID: 1400625275-04cb6c5d0b1988c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id n0bBzAjXoHJmC1uV for ; Tue, 20 May 2014 15:34:36 -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: AndfAOPXe1N5LL1sPGdsb2JhbABZgwaDQYUKokcBAQEBAQEGmiwBgR0XAwEBAQE4NYIlAQEEATocIwULCAMOCgklDwUlAwcaE4g5B9RYFxaFP4h5B4RABJlnixOLWCs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 21 May 2014 08:04:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wmsbd-00005T-MP; Wed, 21 May 2014 08:33:57 +1000 Date: Wed, 21 May 2014 08:33:57 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks Message-ID: <20140520223357.GJ8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 18/18] xfs: add xfs_da_geometry to inode forks References: <1399537188-26509-1-git-send-email-david@fromorbit.com> <1399537188-26509-19-git-send-email-david@fromorbit.com> <20140509073127.GC7882@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140509073127.GC7882@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: 1400625275 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.5972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 09, 2014 at 12:31:27AM -0700, Christoph Hellwig wrote: > On Thu, May 08, 2014 at 06:19:48PM +1000, Dave Chinner wrote: > > While this might seem wasteful to burn a pointer in the data fork > > for all files, consider that the geometry information > > for data allocation can be abstracted from the xfs_mount in exactly > > the same way as has been done for the directory geometry. > > Effectively it's a hook to carry allocation policy around in.... > > > > So, add the geometry pointer to the inode fork, and initialise is > > appropriately and use it for all the directory and attribute > > operation setup instead ofthe xfs_mount version. > > A definitively NAK to bloating the inode without actually making > use of this. I can see where you might want to go with this, but > until we actuall support different dir block sizes per inodes or > similar, and it actually proves to be useful this is not something > that should go in. Yeah, that's fine. it's more just a demonstration of where this takes us. That said, it's pretty trivial to add directory block size config to the on-disk format. We can use the high bits of the extent size hint field so we don't take any more sapce. That is, di_extsize is a 32 bit field that holds a log2 value of the hint. The hint is set in bytes via a u32 in the ioctl structure, so at most can have a value that represents an extent size of 4GB. That's an ondisk value range of 0-25, which only requires the lower 5 bits of the di_extsize field on disk. For directories, we currently set the value only with the XFS_XFLAG_EXTSZINHERIT flag to indicate that the di_extsize hint field contains the value new children should inherit. If we allow the XFS_XFLAG_EXTSZ to also be set and use the upper 16 bits of the di_extsize field to indicate the directory block size, then we have a method for configuring per-directory block sizes without needing to add any new userspace interfaces.... > The rest of the series looks okay as long as we don't touch the > inode, but I'll have to do a slightly more detailed review. I need to clean it up and make it work properly before that. Wait for the resend. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 20 19:23:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 20AF57F4E for ; Tue, 20 May 2014 19:23:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFD2E304048 for ; Tue, 20 May 2014 17:23:15 -0700 (PDT) X-ASG-Debug-ID: 1400631793-04cb6c5d0c19fa60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qenh1LXnZdXrFynW for ; Tue, 20 May 2014 17:23:13 -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: AnVfAMjwe1N5LL1sPGdsb2JhbABZgwaDQYUKoksBAQEBAQEGmiwBgRYXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQNRRFxaFP4h5B4RABJlnlmsr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 21 May 2014 09:50:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WmuGr-0000J3-78; Wed, 21 May 2014 10:20:37 +1000 Date: Wed, 21 May 2014 10:20:37 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfstests: fixes for the free inode btree Message-ID: <20140521002037.GL18954@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/5] xfstests: fixes for the free inode btree References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> <20140502234831.GG26353@dastard> <20140505113443.GA11622@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140505113443.GA11622@laptop.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: 1400631793 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.26 X-Barracuda-Spam-Status: No, SCORE=2.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, SARE_STILLSINGLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.66 SARE_STILLSINGLE BODY: Contains phrasing used by spammers 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, May 05, 2014 at 07:34:43AM -0400, Brian Foster wrote: > On Sat, May 03, 2014 at 09:48:31AM +1000, Dave Chinner wrote: > > On Fri, May 02, 2014 at 01:13:57PM -0400, Brian Foster wrote: > > > Hi all, > > > > > > This series is a few xfstests fixes and addons for the finobt. Patch 1 > > > fixes xfs/030 to work correctly on finobt-enabled filesystems. Patches 2 > > > and 3 add support for finobt-oriented tests via require functions and > > > repair filter updates. Patch 4 adds a new test for targeted repair of > > > finobt filesystems. Patch 5 adds a stress test that creates/modifies a > > > sparsely allocated set of inodes to effectively exercise the finobt in > > > conjunction with an fsstress workload. > > > > > > xfs/010 runs very quickly. xfs/013 runs for 5-10 minutes on my smallish > > > VM running against a single spindle, so I've been back and forth on > > > whether it should be part of the auto group. Thoughts, reviews, flames > > > appreciated... > > > > 5-10 minutes is probably right at the edge for auto, but I think > > that most people won't be testing this any time soon. Hence I'd > > include it by default in the auto group, and if people complain > > about the runtime when they start testing it, we can revist that > > choice. FWIW, I'd also include it in the metadata group so that it > > gets exercised when people run that group.... > > > > Ok, sounds good. It actually runs closer to 5 minutes than 10 when I > simply move to a separate (still single) spindle, so it's probably not > that bad. IIRC, it's still probably not the longest running test I've > seen in auto. I believe you have an SSD test setup, so I'm curious how > the workload looks if you get a a chance to run it there. :) FWIW, just running xfs/013 on 2 sata drives in hw RAID1 takes 80-90s to run xfs/013, so this is fine. However, it runs out of disk space on a 4GB ramdisk, so it still might need some tweaking... Cheers, Dave. -- Dave Chinner david@fromorbit.com From austin@peloton-tech.com Wed May 21 01:23:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 90BEF7F4E for ; Wed, 21 May 2014 01:23:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 61F188F8039 for ; Tue, 20 May 2014 23:23:42 -0700 (PDT) X-ASG-Debug-ID: 1400653419-04bdf056b81b1550001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id rULX3Hz2648R4hLm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 20 May 2014 23:23:40 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.175 Received: by mail-ig0-f175.google.com with SMTP id uq10so5828913igb.8 for ; Tue, 20 May 2014 23:23:39 -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=wFdlKd0gpi9ooD/X4dGfXSD1/FSOAriXSEssOdIOmPg=; b=ZdpP/eIxS0Cm8qzqsylnChj029gMkhnu8EBJIZzTZcR2CphRq7n4j6flpp2cmdfaQ5 ZPbPLP6+ODGTL4MkdbLkUtkvmXsrPOsfWR3kPNO7rBP7Nss0ppESRk7iprI2KWq/VbjA mJYAtb6ktM0amCMEzCPtIC1yYcpqKoAI01Ls6Ln4rz6NIaTmJJBbGUXpIuYkLKohpE/2 9qyOB3RY7yd9vkhXdJYIBu0t1NaKEeYruIMoeY8Na1fKuxtpqcOgqbxWXjyiOXZqdPzA DR2O3k/xQk+RKBZmtFFb3dlvb9nsI61r0wVi03JTdQi8SGNR9zQZjhqdxYWKMlgzHuXu APZA== X-Gm-Message-State: ALoCoQnQASs88OwUo/NNg+QlSHOtq2RVCaIzCyh4xfYO+UVbbFlZPgrBUJNRrDgoC2NfygZZLOT3 MIME-Version: 1.0 X-Received: by 10.42.35.198 with SMTP id r6mr46460263icd.45.1400653419552; Tue, 20 May 2014 23:23:39 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Tue, 20 May 2014 23:23:39 -0700 (PDT) In-Reply-To: References: Date: Tue, 20 May 2014 23:23:39 -0700 Message-ID: Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT From: Austin Schuh X-ASG-Orig-Subj: Re: Filesystem lockup with CONFIG_PREEMPT_RT To: linux-kernel@vger.kernel.org Cc: xfs Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1400653420 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, May 13, 2014 at 7:29 PM, Austin Schuh wrote: > Hi, > > I am observing a filesystem lockup with XFS on a CONFIG_PREEMPT_RT > patched kernel. I have currently only triggered it using dpkg. Dave > Chinner on the XFS mailing list suggested that it was a rt-kernel > workqueue issue as opposed to a XFS problem after looking at the > kernel messages. > > The only modification to the kernel besides the RT patch is that I > have applied tglx's "genirq: Sanitize spurious interrupt detection of > threaded irqs" patch. I upgraded to 3.14.3-rt4, and the problem still persists. I turned on event tracing and tracked it down further. I'm able to lock it up by scping a new kernel debian package to /tmp/ on the machine. scp is locking the inode, and then scheduling xfs_bmapi_allocate_worker in the work queue. The work then never gets run. The kworkers then lock up waiting for the inode lock. Here are the relevant events from the trace. ffff8803e9f10288 (blk_delay_work) gets run later on in the trace, but ffff8803b4c158d0 (xfs_bmapi_allocate_worker) never does. The kernel then warns about blocked tasks 120 seconds later. scp-5393 [001] ....1.. 148.883383: xfs_writepage: dev 8:5 ino 0xd8e pgoff 0x4a3e000 size 0x16af02b0 offset 0 length 0 delalloc 1 unwritten 0 scp-5393 [001] ....1.. 148.883383: xfs_ilock_nowait: dev 8:5 ino 0xd8e flags ILOCK_SHARED caller xfs_map_blocks scp-5393 [001] ....1.. 148.883384: xfs_iunlock: dev 8:5 ino 0xd8e flags ILOCK_SHARED caller xfs_map_blocks scp-5393 [001] ....1.. 148.883386: xfs_log_reserve: dev 8:5 type STRAT_WRITE t_ocnt 2 t_cnt 2 t_curr_res 112332 t_unit_res 112332 t_flags XLOG_TIC_INITED|XLOG_TIC_PERM_RESERV reserveq empty writeq empty grant_reserve_cycle 57 grant_reserve_bytes 9250852 grant_write_cycle 57 grant_write_bytes 9250852 curr_cycle 57 curr_block 18031 tail_cycle 57 tail_block 17993 scp-5393 [001] ....1.. 148.883386: xfs_log_reserve_exit: dev 8:5 type STRAT_WRITE t_ocnt 2 t_cnt 2 t_curr_res 112332 t_unit_res 112332 t_flags XLOG_TIC_INITED|XLOG_TIC_PERM_RESERV reserveq empty writeq empty grant_reserve_cycle 57 grant_reserve_bytes 9475516 grant_write_cycle 57 grant_write_bytes 9475516 curr_cycle 57 curr_block 18031 tail_cycle 57 tail_block 17993 scp-5393 [001] ....1.. 148.883386: xfs_ilock: dev 8:5 ino 0xd8e flags ILOCK_EXCL caller xfs_iomap_write_allocate scp-5393 [001] ....1.3 148.883390: workqueue_queue_work: work struct=ffff8803b4c158d0 function=xfs_bmapi_allocate_worker workqueue=ffff8803ea85dc00 req_cpu=512 cpu=1 scp-5393 [001] ....1.3 148.883390: workqueue_activate_work: work struct ffff8803b4c158d0 scp-5393 [001] ....1.4 148.883396: workqueue_queue_work: work struct=ffff8803e9f10288 function=blk_delay_work workqueue=ffff8803ecf96200 req_cpu=512 cpu=1 scp-5393 [001] ....1.4 148.883396: workqueue_activate_work: work struct ffff8803e9f10288 scp-5393 [001] dN..3.4 148.883399: sched_wakeup: comm=kworker/1:1H pid=573 prio=100 success=1 target_cpu=001 scp-5393 [001] dN..3.4 148.883400: sched_stat_runtime: comm=scp pid=5393 runtime=32683 [ns] vruntime=658862317 [ns] scp-5393 [001] d...3.4 148.883400: sched_switch: prev_comm=scp prev_pid=5393 prev_prio=120 prev_state=R+ ==> next_comm=kworker/1:1H next_pid=573 next_prio=100 irq/44-ahci-273 [000] d...3.5 148.883647: sched_wakeup: comm=kworker/0:2 pid=732 prio=120 success=1 target_cpu=000 irq/44-ahci-273 [000] d...3.. 148.883667: sched_switch: prev_comm=irq/44-ahci prev_pid=273 prev_prio=49 prev_state=S ==> next_comm=kworker/0:2 next_pid=732 next_prio=120 kworker/0:2-732 [000] ....1.. 148.883674: workqueue_execute_start: work struct ffff8800aea30cb8: function xfs_end_io kworker/0:2-732 [000] ....1.. 148.883674: xfs_ilock: dev 8:5 ino 0xd8e flags ILOCK_EXCL caller xfs_setfilesize kworker/0:2-732 [000] d...3.. 148.883677: sched_stat_runtime: comm=kworker/0:2 pid=732 runtime=11392 [ns] vruntime=46907654869 [ns] kworker/0:2-732 [000] d...3.. 148.883679: sched_switch: prev_comm=kworker/0:2 prev_pid=732 prev_prio=120 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120 kworker/1:1-99 [001] ....1.. 148.884208: workqueue_execute_start: work struct ffff8800aea30c20: function xfs_end_io kworker/1:1-99 [001] ....1.. 148.884208: xfs_ilock: dev 8:5 ino 0xd8e flags ILOCK_EXCL caller xfs_setfilesize kworker/1:1-99 [001] d...3.. 148.884210: sched_stat_runtime: comm=kworker/1:1 pid=99 runtime=36705 [ns] vruntime=48354424724 [ns] kworker/1:1-99 [001] d...3.. 148.884211: sched_switch: prev_comm=kworker/1:1 prev_pid=99 prev_prio=120 prev_state=R+ ==> next_comm=swapper/1 next_pid=0 next_prio=120 kworker/u16:4-296 [001] ....1.. 151.560358: workqueue_execute_start: work struct ffff8803e9f10660: function bdi_writeback_workfn kworker/u16:4-296 [001] ....1.. 151.560389: workqueue_execute_end: work struct ffff8803e9f10660 kworker/u16:4-296 [001] d...3.. 151.560398: sched_stat_runtime: comm=kworker/u16:4 pid=296 runtime=51174 [ns] vruntime=48345513312 [ns] kworker/u16:4-296 [001] d...3.. 151.560403: sched_switch: prev_comm=kworker/u16:4 prev_pid=296 prev_prio=120 prev_state=R+ ==> next_comm=swapper/1 next_pid=0 next_prio=120 I have a peak_pci can card in the machine that is consuming about 1.5 CPU cores because it is not connected to a CAN bus and gets error interrupts every time it tries to send and resend. If I disable the card (ifconfig can0 down; ifconfig can1 down), I have a lot more trouble reproducing the lockup. Any ideas why the scheduled work is never getting run? Thanks, Austin From richard.weinberger@gmail.com Wed May 21 02:33:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 BDB107F4E for ; Wed, 21 May 2014 02:33:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D515304081 for ; Wed, 21 May 2014 00:33:52 -0700 (PDT) X-ASG-Debug-ID: 1400657630-04cb6c5d0d1b73d0001-NocioJ Received: from mail-ve0-f180.google.com (mail-ve0-f180.google.com [209.85.128.180]) by cuda.sgi.com with ESMTP id lZEk05cdWpi9DYea (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 00:33:50 -0700 (PDT) X-Barracuda-Envelope-From: richard.weinberger@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] Received: by mail-ve0-f180.google.com with SMTP id db12so1991596veb.39 for ; Wed, 21 May 2014 00:33:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.180] 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=ob0dDFUFdwnwbA3/vzO24dPpH0OJKy+xblWCl7NMaUM=; b=Ah9RQmAcOtXuy9hzAkjWay3TYsEI/zcTIpv2EA/Y1CdPVrYr1NfB6HQtVwG0ojhpP3 3+xLJWKN5QgPrTnSTKIysaY2ZvSjkVxSRJRARiDYWhIelACSrQDq56/BGZu582fBL8EK cDlZnf6cET163svqh+ySTDD3R4tBq1RUiSMn5kp57+Za9bY+O4DZrfqGCUfiGxtkFvVQ lv5hcAiGZHnzCdUB3RYXVxSjSNJwBQdZY5MZBuDmoEXHObV5IQO6REbfYP7pHl65PVF7 HM3r7uWwV/EAiGfeK5/zwRbile8kSly2ImH/zO6yFuS8Xf8t3aJrHdw/76Qk13CRdRxE VM2Q== MIME-Version: 1.0 X-Received: by 10.220.92.135 with SMTP id r7mr8321677vcm.11.1400657629310; Wed, 21 May 2014 00:33:49 -0700 (PDT) Received: by 10.52.188.41 with HTTP; Wed, 21 May 2014 00:33:49 -0700 (PDT) In-Reply-To: References: Date: Wed, 21 May 2014 09:33:49 +0200 Message-ID: Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT From: Richard Weinberger X-ASG-Orig-Subj: Re: Filesystem lockup with CONFIG_PREEMPT_RT To: Austin Schuh Cc: LKML , xfs , rt-users Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ve0-f180.google.com[209.85.128.180] X-Barracuda-Start-Time: 1400657630 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.5983 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 CC'ing RT folks On Wed, May 21, 2014 at 8:23 AM, Austin Schuh wrote: > On Tue, May 13, 2014 at 7:29 PM, Austin Schuh wrote: >> Hi, >> >> I am observing a filesystem lockup with XFS on a CONFIG_PREEMPT_RT >> patched kernel. I have currently only triggered it using dpkg. Dave >> Chinner on the XFS mailing list suggested that it was a rt-kernel >> workqueue issue as opposed to a XFS problem after looking at the >> kernel messages. >> >> The only modification to the kernel besides the RT patch is that I >> have applied tglx's "genirq: Sanitize spurious interrupt detection of >> threaded irqs" patch. > > I upgraded to 3.14.3-rt4, and the problem still persists. > > I turned on event tracing and tracked it down further. I'm able to > lock it up by scping a new kernel debian package to /tmp/ on the > machine. scp is locking the inode, and then scheduling > xfs_bmapi_allocate_worker in the work queue. The work then never gets > run. The kworkers then lock up waiting for the inode lock. > > Here are the relevant events from the trace. ffff8803e9f10288 > (blk_delay_work) gets run later on in the trace, but ffff8803b4c158d0 > (xfs_bmapi_allocate_worker) never does. The kernel then warns about > blocked tasks 120 seconds later. > > > scp-5393 [001] ....1.. 148.883383: xfs_writepage: dev > 8:5 ino 0xd8e pgoff 0x4a3e000 size 0x16af02b0 offset 0 length 0 > delalloc 1 unwritten 0 > scp-5393 [001] ....1.. 148.883383: xfs_ilock_nowait: > dev 8:5 ino 0xd8e flags ILOCK_SHARED caller xfs_map_blocks > scp-5393 [001] ....1.. 148.883384: xfs_iunlock: dev > 8:5 ino 0xd8e flags ILOCK_SHARED caller xfs_map_blocks > scp-5393 [001] ....1.. 148.883386: xfs_log_reserve: > dev 8:5 type STRAT_WRITE t_ocnt 2 t_cnt 2 t_curr_res 112332 t_unit_res > 112332 t_flags XLOG_TIC_INITED|XLOG_TIC_PERM_RESERV reserveq empty > writeq empty grant_reserve_cycle 57 grant_reserve_bytes 9250852 > grant_write_cycle 57 grant_write_bytes 9250852 curr_cycle 57 > curr_block 18031 tail_cycle 57 tail_block 17993 > scp-5393 [001] ....1.. 148.883386: > xfs_log_reserve_exit: dev 8:5 type STRAT_WRITE t_ocnt 2 t_cnt 2 > t_curr_res 112332 t_unit_res 112332 t_flags > XLOG_TIC_INITED|XLOG_TIC_PERM_RESERV reserveq empty writeq empty > grant_reserve_cycle 57 grant_reserve_bytes 9475516 grant_write_cycle > 57 grant_write_bytes 9475516 curr_cycle 57 curr_block 18031 tail_cycle > 57 tail_block 17993 > scp-5393 [001] ....1.. 148.883386: xfs_ilock: dev 8:5 > ino 0xd8e flags ILOCK_EXCL caller xfs_iomap_write_allocate > scp-5393 [001] ....1.3 148.883390: > workqueue_queue_work: work struct=ffff8803b4c158d0 > function=xfs_bmapi_allocate_worker workqueue=ffff8803ea85dc00 > req_cpu=512 cpu=1 > scp-5393 [001] ....1.3 148.883390: > workqueue_activate_work: work struct ffff8803b4c158d0 > scp-5393 [001] ....1.4 148.883396: > workqueue_queue_work: work struct=ffff8803e9f10288 > function=blk_delay_work workqueue=ffff8803ecf96200 req_cpu=512 cpu=1 > scp-5393 [001] ....1.4 148.883396: > workqueue_activate_work: work struct ffff8803e9f10288 > scp-5393 [001] dN..3.4 148.883399: sched_wakeup: > comm=kworker/1:1H pid=573 prio=100 success=1 target_cpu=001 > scp-5393 [001] dN..3.4 148.883400: sched_stat_runtime: > comm=scp pid=5393 runtime=32683 [ns] vruntime=658862317 [ns] > scp-5393 [001] d...3.4 148.883400: sched_switch: > prev_comm=scp prev_pid=5393 prev_prio=120 prev_state=R+ ==> > next_comm=kworker/1:1H next_pid=573 next_prio=100 > > irq/44-ahci-273 [000] d...3.5 148.883647: sched_wakeup: > comm=kworker/0:2 pid=732 prio=120 success=1 target_cpu=000 > irq/44-ahci-273 [000] d...3.. 148.883667: sched_switch: > prev_comm=irq/44-ahci prev_pid=273 prev_prio=49 prev_state=S ==> > next_comm=kworker/0:2 next_pid=732 next_prio=120 > kworker/0:2-732 [000] ....1.. 148.883674: > workqueue_execute_start: work struct ffff8800aea30cb8: function > xfs_end_io > kworker/0:2-732 [000] ....1.. 148.883674: xfs_ilock: dev 8:5 > ino 0xd8e flags ILOCK_EXCL caller xfs_setfilesize > kworker/0:2-732 [000] d...3.. 148.883677: sched_stat_runtime: > comm=kworker/0:2 pid=732 runtime=11392 [ns] vruntime=46907654869 [ns] > kworker/0:2-732 [000] d...3.. 148.883679: sched_switch: > prev_comm=kworker/0:2 prev_pid=732 prev_prio=120 prev_state=D ==> > next_comm=swapper/0 next_pid=0 next_prio=120 > > kworker/1:1-99 [001] ....1.. 148.884208: > workqueue_execute_start: work struct ffff8800aea30c20: function > xfs_end_io > kworker/1:1-99 [001] ....1.. 148.884208: xfs_ilock: dev 8:5 > ino 0xd8e flags ILOCK_EXCL caller xfs_setfilesize > kworker/1:1-99 [001] d...3.. 148.884210: sched_stat_runtime: > comm=kworker/1:1 pid=99 runtime=36705 [ns] vruntime=48354424724 [ns] > kworker/1:1-99 [001] d...3.. 148.884211: sched_switch: > prev_comm=kworker/1:1 prev_pid=99 prev_prio=120 prev_state=R+ ==> > next_comm=swapper/1 next_pid=0 next_prio=120 > > kworker/u16:4-296 [001] ....1.. 151.560358: > workqueue_execute_start: work struct ffff8803e9f10660: function > bdi_writeback_workfn > kworker/u16:4-296 [001] ....1.. 151.560389: > workqueue_execute_end: work struct ffff8803e9f10660 > kworker/u16:4-296 [001] d...3.. 151.560398: sched_stat_runtime: > comm=kworker/u16:4 pid=296 runtime=51174 [ns] vruntime=48345513312 > [ns] > kworker/u16:4-296 [001] d...3.. 151.560403: sched_switch: > prev_comm=kworker/u16:4 prev_pid=296 prev_prio=120 prev_state=R+ ==> > next_comm=swapper/1 next_pid=0 next_prio=120 > > > I have a peak_pci can card in the machine that is consuming about 1.5 > CPU cores because it is not connected to a CAN bus and gets error > interrupts every time it tries to send and resend. If I disable the > card (ifconfig can0 down; ifconfig can1 down), I have a lot more > trouble reproducing the lockup. > > Any ideas why the scheduled work is never getting run? > > Thanks, > Austin > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Thanks, //richard From bfoster@redhat.com Wed May 21 06:31:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 74AFB7F3F for ; Wed, 21 May 2014 06:31:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4ABC230408B for ; Wed, 21 May 2014 04:31:45 -0700 (PDT) X-ASG-Debug-ID: 1400671904-04cb6c5d0a1c8d80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Hm4tIH7zgtelSt2I for ; Wed, 21 May 2014 04:31: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4LBVZFG026489 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 21 May 2014 07:31:35 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4LBVZKN025861; Wed, 21 May 2014 07:31:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F7931248A9; Wed, 21 May 2014 07:31:34 -0400 (EDT) Date: Wed, 21 May 2014 07:31:34 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfstests: fixes for the free inode btree Message-ID: <20140521113134.GA56375@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/5] xfstests: fixes for the free inode btree References: <1399050842-19633-1-git-send-email-bfoster@redhat.com> <20140502234831.GG26353@dastard> <20140505113443.GA11622@laptop.bfoster> <20140521002037.GL18954@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140521002037.GL18954@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400671904 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, May 21, 2014 at 10:20:37AM +1000, Dave Chinner wrote: > On Mon, May 05, 2014 at 07:34:43AM -0400, Brian Foster wrote: > > On Sat, May 03, 2014 at 09:48:31AM +1000, Dave Chinner wrote: > > > On Fri, May 02, 2014 at 01:13:57PM -0400, Brian Foster wrote: > > > > Hi all, > > > > > > > > This series is a few xfstests fixes and addons for the finobt. Patch 1 > > > > fixes xfs/030 to work correctly on finobt-enabled filesystems. Patches 2 > > > > and 3 add support for finobt-oriented tests via require functions and > > > > repair filter updates. Patch 4 adds a new test for targeted repair of > > > > finobt filesystems. Patch 5 adds a stress test that creates/modifies a > > > > sparsely allocated set of inodes to effectively exercise the finobt in > > > > conjunction with an fsstress workload. > > > > > > > > xfs/010 runs very quickly. xfs/013 runs for 5-10 minutes on my smallish > > > > VM running against a single spindle, so I've been back and forth on > > > > whether it should be part of the auto group. Thoughts, reviews, flames > > > > appreciated... > > > > > > 5-10 minutes is probably right at the edge for auto, but I think > > > that most people won't be testing this any time soon. Hence I'd > > > include it by default in the auto group, and if people complain > > > about the runtime when they start testing it, we can revist that > > > choice. FWIW, I'd also include it in the metadata group so that it > > > gets exercised when people run that group.... > > > > > > > Ok, sounds good. It actually runs closer to 5 minutes than 10 when I > > simply move to a separate (still single) spindle, so it's probably not > > that bad. IIRC, it's still probably not the longest running test I've > > seen in auto. I believe you have an SSD test setup, so I'm curious how > > the workload looks if you get a a chance to run it there. :) > > FWIW, just running xfs/013 on 2 sata drives in hw RAID1 takes 80-90s > to run xfs/013, so this is fine. However, it runs out of disk space > on a 4GB ramdisk, so it still might need some tweaking... > Noted, I'll look into it. Thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dan.carpenter@oracle.com Wed May 21 07:28:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D41917F3F for ; Wed, 21 May 2014 07:28:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A46E98F8049 for ; Wed, 21 May 2014 05:28:05 -0700 (PDT) X-ASG-Debug-ID: 1400675281-04cbb006da1bdc40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id R3ectJZ6lVP9WvYp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 21 May 2014 05:28:01 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4LCRoQg022943 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 21 May 2014 12:27:51 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4LCRoOw009995 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 21 May 2014 12:27:50 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4LCRods023388; Wed, 21 May 2014 12:27:50 GMT Received: from mwanda (/197.157.0.25) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 21 May 2014 05:27:49 -0700 Date: Wed, 21 May 2014 15:27:46 +0300 From: Dan Carpenter To: Dave Chinner Cc: xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: [patch] [XFS] indent an if statement Message-ID: <20140521122746.GD23396@mwanda> X-ASG-Orig-Subj: [patch] [XFS] indent an if statement 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: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1400675281 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.5989 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The "n += 32;" goes with the if statement on the line before so it should be indented. Signed-off-by: Dan Carpenter diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h index f1e3c90..f685942 100644 --- a/fs/xfs/xfs_bit.h +++ b/fs/xfs/xfs_bit.h @@ -67,7 +67,7 @@ static inline int xfs_lowbit64(__uint64_t v) } else { /* upper bits */ w = (__uint32_t)(v >> 32); if (w && (n = ffs(w))) - n += 32; + n += 32; } return n - 1; } From sandeen@sandeen.net Wed May 21 07:44:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 91C8C7F3F for ; Wed, 21 May 2014 07:44:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AEFCAC00A for ; Wed, 21 May 2014 05:44:12 -0700 (PDT) X-ASG-Debug-ID: 1400676249-04cb6c5d0c1cfa40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id lUpW93qiG1KzgVa9 for ; Wed, 21 May 2014 05:44:10 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5966661F88A9; Wed, 21 May 2014 07:44:09 -0500 (CDT) Message-ID: <537C9F98.8020306@sandeen.net> Date: Wed, 21 May 2014 07:44:08 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dan Carpenter , Dave Chinner CC: kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> X-ASG-Orig-Subj: Re: [patch] [XFS] indent an if statement In-Reply-To: <20140521122746.GD23396@mwanda> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1400676250 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.5988 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/21/14, 7:27 AM, Dan Carpenter wrote: > The "n += 32;" goes with the if statement on the line before so it > should be indented. > > Signed-off-by: Dan Carpenter Easy one ;) Wow, it's been this way ever since 79071eb0 in 2008. Reviewed-by: Eric Sandeen > diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h > index f1e3c90..f685942 100644 > --- a/fs/xfs/xfs_bit.h > +++ b/fs/xfs/xfs_bit.h > @@ -67,7 +67,7 @@ static inline int xfs_lowbit64(__uint64_t v) > } else { /* upper bits */ > w = (__uint32_t)(v >> 32); > if (w && (n = ffs(w))) > - n += 32; > + n += 32; > } > return n - 1; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+c3cd47d9722ee81ce546+3923+infradead.org+hch@bombadil.srs.infradead.org Wed May 21 09:29:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 163197F4E for ; Wed, 21 May 2014 09:29:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF2B88F8035 for ; Wed, 21 May 2014 07:29:22 -0700 (PDT) X-ASG-Debug-ID: 1400682557-04cbb006da1cba70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id GugDKmao8OR4J7C9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 21 May 2014 07:29:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c3cd47d9722ee81ce546+3923+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 1Wn7W1-0008H8-RV; Wed, 21 May 2014 14:29:09 +0000 Date: Wed, 21 May 2014 07:29:09 -0700 From: Christoph Hellwig To: Dan Carpenter Cc: Dave Chinner , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement Message-ID: <20140521142909.GA22281@infradead.org> X-ASG-Orig-Subj: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140521122746.GD23396@mwanda> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1400682558 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.5991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 21, 2014 at 03:27:46PM +0300, Dan Carpenter wrote: > The "n += 32;" goes with the if statement on the line before so it > should be indented. > > Signed-off-by: Dan Carpenter > > diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h > index f1e3c90..f685942 100644 > --- a/fs/xfs/xfs_bit.h > +++ b/fs/xfs/xfs_bit.h > @@ -67,7 +67,7 @@ static inline int xfs_lowbit64(__uint64_t v) > } else { /* upper bits */ > w = (__uint32_t)(v >> 32); > if (w && (n = ffs(w))) > - n += 32; > + n += 32; If we want to clean up this stuff let's do it properly: if (w) { n = ffs(w); if (n) n += 32; } From dan.carpenter@oracle.com Wed May 21 09:36:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 361237F4E for ; Wed, 21 May 2014 09:36:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0C4DAC003 for ; Wed, 21 May 2014 07:36:34 -0700 (PDT) X-ASG-Debug-ID: 1400682993-04cb6c5d0b1dc720001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id OUqy6oYN5XeiRoCK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 21 May 2014 07:36:33 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4LEa2hr023939 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 21 May 2014 14:36:03 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4LEZxDF005890 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 21 May 2014 14:36:01 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4LEZxpi028996; Wed, 21 May 2014 14:35:59 GMT Received: from mwanda (/197.157.0.25) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 21 May 2014 07:35:58 -0700 Date: Wed, 21 May 2014 17:35:50 +0300 From: Dan Carpenter To: Christoph Hellwig Cc: Dave Chinner , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement Message-ID: <20140521143550.GC15585@mwanda> X-ASG-Orig-Subj: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> <20140521142909.GA22281@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140521142909.GA22281@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1400682993 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.5990 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, May 21, 2014 at 07:29:09AM -0700, Christoph Hellwig wrote: > On Wed, May 21, 2014 at 03:27:46PM +0300, Dan Carpenter wrote: > > The "n += 32;" goes with the if statement on the line before so it > > should be indented. > > > > Signed-off-by: Dan Carpenter > > > > diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h > > index f1e3c90..f685942 100644 > > --- a/fs/xfs/xfs_bit.h > > +++ b/fs/xfs/xfs_bit.h > > @@ -67,7 +67,7 @@ static inline int xfs_lowbit64(__uint64_t v) > > } else { /* upper bits */ > > w = (__uint32_t)(v >> 32); > > if (w && (n = ffs(w))) > > - n += 32; > > + n += 32; > > If we want to clean up this stuff let's do it properly: > > if (w) { > n = ffs(w); > if (n) > n += 32; > } > Sure. I will resend. regards, dan carpenter From BATV+c3cd47d9722ee81ce546+3923+infradead.org+hch@bombadil.srs.infradead.org Wed May 21 09:49:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8D0A27F4E for ; Wed, 21 May 2014 09:49:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 513378F8037 for ; Wed, 21 May 2014 07:49:06 -0700 (PDT) X-ASG-Debug-ID: 1400683739-04bdf056b51dee10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nNIcz17IBosjeD07 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 21 May 2014 07:48:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c3cd47d9722ee81ce546+3923+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 1Wn7pD-0001U3-6d; Wed, 21 May 2014 14:48:59 +0000 Date: Wed, 21 May 2014 07:48:59 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/2] xfs: sysfs attribute support Message-ID: <20140521144859.GB3580@infradead.org> X-ASG-Orig-Subj: Re: [RFC PATCH 0/2] xfs: sysfs attribute support References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400263966-35541-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400683739 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: 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.5991 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 Fri, May 16, 2014 at 02:12:44PM -0400, Brian Foster wrote: > Hi all, > > This is an rfc to get some discussion rolling on sysfs support for XFS. > The motivation for this work is here: > > http://oss.sgi.com/archives/xfs/2014-05/msg00381.html All the sysfs magic for this looks pretty ugly. Why can't we just dump it into debugfs given that it's very much a debug only feature anyway? It would also be really nitfy to have a tool to fronted it in the style of xfs_db and xfs_io.. From debbugs@buxtehude.debian.org Wed May 21 10:06:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 127B67F4E for ; Wed, 21 May 2014 10:06:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C04D98F804B for ; Wed, 21 May 2014 08:06:09 -0700 (PDT) X-ASG-Debug-ID: 1400684767-04bdf056b51e0cb0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id WEHbedRL6pzSREwo (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 08:06:08 -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.80) (envelope-from ) id 1Wn85l-0001Bz-9W; Wed, 21 May 2014 15:06:05 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#748483: xfsprogs: Let's add a watch file Reply-To: Vincent Blut , 748483@bugs.debian.org X-ASG-Orig-Subj: Bug#748483: xfsprogs: Let's add a watch file Resent-From: Vincent Blut Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 21 May 2014 15:06:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 748483 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.14006846383354 (code B); Wed, 21 May 2014 15:06:02 +0000 Received: (at submit) by bugs.debian.org; 21 May 2014 15:03:58 +0000 Received: from smtp3-g21.free.fr ([212.27.42.3]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1Wn83h-0000rm-U8; Wed, 21 May 2014 15:03:58 +0000 Received: from lamella.local (unknown [82.65.115.127]) (Authenticated sender: vincent.debian) by smtp3-g21.free.fr (Postfix) with ESMTPA id 77376A621D; Wed, 21 May 2014 17:02:19 +0200 (CEST) Message-ID: <1400684630.4058.0.camel@lamella> From: Vincent Blut To: Christoph Hellwig Cc: 748483@bugs.debian.org, Debian Bug Tracking System Date: Wed, 21 May 2014 17:03:50 +0200 In-Reply-To: <20140521144701.GA3580@infradead.org> References: <20140517175957.5232.71552.reportbug@lamella> <20140521144701.GA3580@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.2-1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400684768 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.5991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le mercredi 21 mai 2014 à 07:47 -0700, Christoph Hellwig a écrit : > On Sat, May 17, 2014 at 07:59:57PM +0200, Vincent Blut wrote: > > Source: xfsprogs > > Version: 3.1.9 > > Severity: wishlist > > > > Hey guys, > > > > Even if it doesn't necessarily improve your workflow, the watch file could > > improve some Debian tools that check it (e.g. UDD). > > Could you please apply the attached one in your next upload? > > I'll assume this should go into debian/watch? Indeed! > > It's probably best if you simply submit a patch that adds it with > proper From:, Subject: and Signed-off-by: tags so it can be applied > as-is. > Will do. From debbugs@buxtehude.debian.org Wed May 21 10:06:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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=unavailable 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 DFA737F54 for ; Wed, 21 May 2014 10:06:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67330AC005 for ; Wed, 21 May 2014 08:06:12 -0700 (PDT) X-ASG-Debug-ID: 1400684770-04cbb006db1cf840001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id f7RiyIQkwrqHa78M (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 08:06:11 -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.80) (envelope-from ) id 1Wn85o-0001CW-Hd; Wed, 21 May 2014 15:06:08 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#748483: xfsprogs: Let's add a watch file Reply-To: Vincent Blut , 748483@bugs.debian.org X-ASG-Orig-Subj: Bug#748483: xfsprogs: Let's add a watch file Resent-From: Vincent Blut Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 21 May 2014 15:06:05 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 748483 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 748483-submit@bugs.debian.org id=B748483.14006846383363 (code B ref 748483); Wed, 21 May 2014 15:06:05 +0000 Received: (at 748483) by bugs.debian.org; 21 May 2014 15:03:58 +0000 Received: from smtp3-g21.free.fr ([212.27.42.3]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1Wn83h-0000rm-U8; Wed, 21 May 2014 15:03:58 +0000 Received: from lamella.local (unknown [82.65.115.127]) (Authenticated sender: vincent.debian) by smtp3-g21.free.fr (Postfix) with ESMTPA id 77376A621D; Wed, 21 May 2014 17:02:19 +0200 (CEST) Message-ID: <1400684630.4058.0.camel@lamella> From: Vincent Blut To: Christoph Hellwig Cc: 748483@bugs.debian.org, Debian Bug Tracking System Date: Wed, 21 May 2014 17:03:50 +0200 In-Reply-To: <20140521144701.GA3580@infradead.org> References: <20140517175957.5232.71552.reportbug@lamella> <20140521144701.GA3580@infradead.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.2-1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-CrossAssassin-Score: 2 Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400684771 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.5991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le mercredi 21 mai 2014 à 07:47 -0700, Christoph Hellwig a écrit : > On Sat, May 17, 2014 at 07:59:57PM +0200, Vincent Blut wrote: > > Source: xfsprogs > > Version: 3.1.9 > > Severity: wishlist > > > > Hey guys, > > > > Even if it doesn't necessarily improve your workflow, the watch file could > > improve some Debian tools that check it (e.g. UDD). > > Could you please apply the attached one in your next upload? > > I'll assume this should go into debian/watch? Indeed! > > It's probably best if you simply submit a patch that adds it with > proper From:, Subject: and Signed-off-by: tags so it can be applied > as-is. > Will do. From debbugs@buxtehude.debian.org Wed May 21 10:12:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7C47D7F4E for ; Wed, 21 May 2014 10:12:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 021E7AC003 for ; Wed, 21 May 2014 08:12:07 -0700 (PDT) X-ASG-Debug-ID: 1400685126-04cbb006dc1d0050001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id Q0PRFFobHB6IhF7S (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 08:12: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.80) (envelope-from ) id 1Wn8BY-0001pN-55; Wed, 21 May 2014 15:12:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#748483: xfsprogs: Let's add a watch file Reply-To: Christoph Hellwig , 748483@bugs.debian.org X-ASG-Orig-Subj: Bug#748483: xfsprogs: Let's add a watch file Resent-From: Christoph Hellwig Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 21 May 2014 15:12:01 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 748483 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.14006849045275 (code B); Wed, 21 May 2014 15:12:01 +0000 Received: (at submit) by bugs.debian.org; 21 May 2014 15:08:24 +0000 Received: from bombadil.infradead.org ([198.137.202.9] ident=exim) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1Wn880-0001Mr-4a; Wed, 21 May 2014 15:08:24 +0000 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wn7nJ-00019I-6g; Wed, 21 May 2014 14:47:01 +0000 Date: Wed, 21 May 2014 07:47:01 -0700 From: Christoph Hellwig To: Vincent Blut , 748483@bugs.debian.org Cc: Debian Bug Tracking System Message-ID: <20140521144701.GA3580@infradead.org> References: <20140517175957.5232.71552.reportbug@lamella> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140517175957.5232.71552.reportbug@lamella> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Greylist: delayed 1277 seconds by postgrey-1.34 at buxtehude; Wed, 21 May 2014 15:08:24 UTC Delivered-To: submit@bugs.debian.org Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400685126 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.5991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 07:59:57PM +0200, Vincent Blut wrote: > Source: xfsprogs > Version: 3.1.9 > Severity: wishlist > > Hey guys, > > Even if it doesn't necessarily improve your workflow, the watch file could > improve some Debian tools that check it (e.g. UDD). > Could you please apply the attached one in your next upload? I'll assume this should go into debian/watch? It's probably best if you simply submit a patch that adds it with proper From:, Subject: and Signed-off-by: tags so it can be applied as-is. From debbugs@buxtehude.debian.org Wed May 21 10:12:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A64C7F4E for ; Wed, 21 May 2014 10:12:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 887D6AC003 for ; Wed, 21 May 2014 08:12:21 -0700 (PDT) X-ASG-Debug-ID: 1400685139-04cb6c5d0d1dfea0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id jiXa6WWmJSuhsAXR (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 08:12:20 -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.80) (envelope-from ) id 1Wn8Bl-0001qd-Lb; Wed, 21 May 2014 15:12:17 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#748483: xfsprogs: Let's add a watch file Reply-To: Christoph Hellwig , 748483@bugs.debian.org X-ASG-Orig-Subj: Bug#748483: xfsprogs: Let's add a watch file Resent-From: Christoph Hellwig Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 21 May 2014 15:12:14 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 748483 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 748483-submit@bugs.debian.org id=B748483.14006849045284 (code B ref 748483); Wed, 21 May 2014 15:12:14 +0000 Received: (at 748483) by bugs.debian.org; 21 May 2014 15:08:24 +0000 Received: from bombadil.infradead.org ([198.137.202.9] ident=exim) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1Wn880-0001Mr-4a; Wed, 21 May 2014 15:08:24 +0000 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wn7nJ-00019I-6g; Wed, 21 May 2014 14:47:01 +0000 Date: Wed, 21 May 2014 07:47:01 -0700 From: Christoph Hellwig To: Vincent Blut , 748483@bugs.debian.org Cc: Debian Bug Tracking System Message-ID: <20140521144701.GA3580@infradead.org> References: <20140517175957.5232.71552.reportbug@lamella> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140517175957.5232.71552.reportbug@lamella> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Greylist: delayed 1277 seconds by postgrey-1.34 at buxtehude; Wed, 21 May 2014 15:08:24 UTC X-CrossAssassin-Score: 2 Resent-Sender: Debian BTS X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1400685140 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.5991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 17, 2014 at 07:59:57PM +0200, Vincent Blut wrote: > Source: xfsprogs > Version: 3.1.9 > Severity: wishlist > > Hey guys, > > Even if it doesn't necessarily improve your workflow, the watch file could > improve some Debian tools that check it (e.g. UDD). > Could you please apply the attached one in your next upload? I'll assume this should go into debian/watch? It's probably best if you simply submit a patch that adds it with proper From:, Subject: and Signed-off-by: tags so it can be applied as-is. From fdmanana@gmail.com Wed May 21 10:30:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 461597F4E for ; Wed, 21 May 2014 10:30:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 298D3304084 for ; Wed, 21 May 2014 08:30:34 -0700 (PDT) X-ASG-Debug-ID: 1400686231-04cbb006da1d19a0001-NocioJ Received: from mail-wg0-f43.google.com (mail-wg0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id ocy3atOOeBzJ68jx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 08:30:31 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wg0-f43.google.com with SMTP id l18so2129423wgh.26 for ; Wed, 21 May 2014 08:30:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=+6UZtLwdV08khtZnbRpUFh5IvIIaX0zmnduqBcF1INA=; b=NSfjs4YrpjNWu8MYEBx8RswgH++I/Zjy8tWQIpgJS+K3/1ScR0PDdpCAhYDvQCKhOe b7bGjHRRp06jHgHQdo+TyBJ5vurSvEVHDTsxmqPbxy8f01MeSYLbbsZZobjtDgiGUgny r6cMu/NIe8v2IA7JyLk29SBUh0Y89PePXNfwqJr8JwVDJsjfVhEwZL2cShE7irRsFGbt gXH2v9Y5zshpGDDZnV4j97TmE33le+HqlwIuZPK1IRy0YUYuAgvdBOvqRMgrf5Z62SGe pBJot2nchB+kp7JZQ70mbFs73WxiDu5MTN3tLTE/hjoXfYJikrHSAs608iMX+A1UBlb/ u0Mg== X-Received: by 10.194.133.100 with SMTP id pb4mr2701130wjb.39.1400686230816; Wed, 21 May 2014 08:30:30 -0700 (PDT) Received: from debian-vm3.lan (bl10-252-12.dsl.telepac.pt. [85.243.252.12]) by mx.google.com with ESMTPSA id l2sm2845642wix.13.2014.05.21.08.30.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 21 May 2014 08:30:30 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, Filipe David Borba Manana Subject: [PATCH] xfstests: add test for btrfs send with long paths Date: Wed, 21 May 2014 17:30:18 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: add test for btrfs send with long paths Message-Id: <1400689818-14400-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.9.1 X-Barracuda-Connect: mail-wg0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1400686231 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.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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.5992 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.40 BSF_SC0_SA085b Custom Rule SA085b Regression test for btrfs send where long paths (exceeding 230 characters) made send produce paths with random characters from a memory buffer returned by kmalloc, as send forgot to populate the new buffer with the path string. This issue is fixed by the following linux kernel btrfs patch: Btrfs: send, fix corrupted path strings for long paths Signed-off-by: Filipe David Borba Manana --- tests/btrfs/051 | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/051.out | 1 + tests/btrfs/group | 1 + 3 files changed, 87 insertions(+) create mode 100755 tests/btrfs/051 create mode 100644 tests/btrfs/051.out diff --git a/tests/btrfs/051 b/tests/btrfs/051 new file mode 100755 index 0000000..53df664 --- /dev/null +++ b/tests/btrfs/051 @@ -0,0 +1,85 @@ +#! /bin/bash +# FS QA Test No. btrfs/051 +# +# Regression test for btrfs send where long paths (exceeding 230 characters) +# made send produce paths with random characters from a memory buffer returned +# by kmalloc, as send forgot to populate the new buffer with the path string. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: send, fix corrupted path strings for long paths +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. 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" + +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +TEST_PATH="$SCRATCH_MNT/fdmanana/.config/google-chrome-mysetup/Default/Pepper_Data/Shockwave_Flash/WritableRoot/#SharedObjects/JSHJ4ZKN/s.wsj.net/[[IMPORT]]/players.edgesuite.net/flash/plugins/osmf/advanced-streaming-plugin/v2.7/osmf1.6/Ak#" + +mkdir -p $TEST_PATH +echo "hello world" > $TEST_PATH/amaiAdvancedStreamingPlugin.txt + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap + +_scratch_unmount +_check_scratch_fs + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +run_check $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/051.out b/tests/btrfs/051.out new file mode 100644 index 0000000..636dcef --- /dev/null +++ b/tests/btrfs/051.out @@ -0,0 +1 @@ +QA output created by 051 diff --git a/tests/btrfs/group b/tests/btrfs/group index 69a80e0..0673449 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -53,3 +53,4 @@ 048 auto quick 049 auto quick 050 auto +051 auto quick -- 1.9.1 From wharms@bfs.de Wed May 21 11:51:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8FA3D7F4E for ; Wed, 21 May 2014 11:51:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B834AC004 for ; Wed, 21 May 2014 09:51:06 -0700 (PDT) X-ASG-Debug-ID: 1400691059-04cb6c5d0d1e94e0001-NocioJ Received: from mx01-fr.bfs.de (mx01-fr.bfs.de [193.174.231.67]) by cuda.sgi.com with ESMTP id vMZT6YoNMokvoLQG for ; Wed, 21 May 2014 09:51:00 -0700 (PDT) X-Barracuda-Envelope-From: wharms@bfs.de X-Barracuda-Apparent-Source-IP: 193.174.231.67 Received: from localhost (localhost [127.0.0.1]) by mx01-fr.bfs.de (Postfix) with ESMTP id D04DF205B2; Wed, 21 May 2014 18:50:53 +0200 (CEST) X-Virus-Scanned: amavisd-new at bfs.de Received: from mx01-fr.bfs.de ([127.0.0.1]) by localhost (mx01-fr.bfs.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id OMM8llJy_u-N; Wed, 21 May 2014 18:50:49 +0200 (CEST) Received: from mail-fr.bfs.de (mail-fr.bfs.de [10.177.18.200]) by mx01-fr.bfs.de (Postfix) with ESMTP; Wed, 21 May 2014 18:50:49 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail-fr.bfs.de (Postfix) with ESMTP id C18F7612E3; Wed, 21 May 2014 18:50:54 +0200 (CEST) X-Virus-Scanned: by amavisd-new-2.6.4 (20090625) (Debian) at bfs.de Received: from mail-fr.bfs.de ([127.0.0.1]) by localhost (mail-fr.bfs.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3Tt4417NqgcX; Wed, 21 May 2014 18:50:54 +0200 (CEST) Received: from [134.92.181.33] (unknown [134.92.181.33]) by mail-fr.bfs.de (Postfix) with ESMTPSA id D83076128E; Wed, 21 May 2014 18:50:53 +0200 (CEST) Message-ID: <537CD96D.2090901@bfs.de> Date: Wed, 21 May 2014 18:50:53 +0200 From: walter harms Reply-To: wharms@bfs.de User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.16) Gecko/20101125 SUSE/3.0.11 Thunderbird/3.0.11 MIME-Version: 1.0 To: Dan Carpenter CC: Christoph Hellwig , Dave Chinner , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> <20140521142909.GA22281@infradead.org> <20140521143550.GC15585@mwanda> X-ASG-Orig-Subj: Re: [patch] [XFS] indent an if statement In-Reply-To: <20140521143550.GC15585@mwanda> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mx01-fr.bfs.de[193.174.231.67] X-Barracuda-Start-Time: 1400691060 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.5993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Am 21.05.2014 16:35, schrieb Dan Carpenter: > On Wed, May 21, 2014 at 07:29:09AM -0700, Christoph Hellwig wrote: >> On Wed, May 21, 2014 at 03:27:46PM +0300, Dan Carpenter wrote: >>> The "n += 32;" goes with the if statement on the line before so it >>> should be indented. >>> >>> Signed-off-by: Dan Carpenter >>> >>> diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h >>> index f1e3c90..f685942 100644 >>> --- a/fs/xfs/xfs_bit.h >>> +++ b/fs/xfs/xfs_bit.h >>> @@ -67,7 +67,7 @@ static inline int xfs_lowbit64(__uint64_t v) >>> } else { /* upper bits */ >>> w = (__uint32_t)(v >> 32); >>> if (w && (n = ffs(w))) >>> - n += 32; >>> + n += 32; >> >> If we want to clean up this stuff let's do it properly: >> >> if (w) { >> n = ffs(w); >> if (n) >> n += 32; >> } >> > This looks like a ffsll() maybe there are other implemantions and we can make a generic version (acualy i found only a ffsll() in nouvou, NTL). just my 2 cents, re, wh > Sure. I will resend. > > regards, > dan carpenter > > > -- > To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From John.Blackwood@ccur.com Wed May 21 14:30:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 412A17F4E for ; Wed, 21 May 2014 14:30:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD4DBAC003 for ; Wed, 21 May 2014 12:30:30 -0700 (PDT) X-ASG-Debug-ID: 1400700624-04bdf056b51fd5d0001-NocioJ Received: from flmx07.ccur.com (flmx07.ccur.com [173.221.59.12]) by cuda.sgi.com with ESMTP id Fu7ZhRjF5fj8R139 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Wed, 21 May 2014 12:30:25 -0700 (PDT) X-Barracuda-Envelope-From: John.Blackwood@ccur.com X-Barracuda-Apparent-Source-IP: 173.221.59.12 Received: from [10.134.5.52] (10.134.5.52) by FLMX07.iccur.com (10.134.60.34) with Microsoft SMTP Server (TLS) id 8.2.255.0; Wed, 21 May 2014 15:30:24 -0400 Message-ID: <537CFECF.9070701@ccur.com> Date: Wed, 21 May 2014 14:30:23 -0500 From: John Blackwood User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Richard Weinberger , Austin Schuh CC: , , Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT Content-Type: text/plain; charset="ISO-8859-1"; format=flowed X-ASG-Orig-Subj: Re: Filesystem lockup with CONFIG_PREEMPT_RT Content-Transfer-Encoding: 7bit X-Barracuda-Connect: flmx07.ccur.com[173.221.59.12] X-Barracuda-Start-Time: 1400700625 X-Barracuda-Encrypted: RC4-MD5 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.6001 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > Date: Wed, 21 May 2014 03:33:49 -0400 > From: Richard Weinberger > To: Austin Schuh > CC: LKML , xfs , rt-users > > Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT > > CC'ing RT folks > > On Wed, May 21, 2014 at 8:23 AM, Austin Schuh wrote: > > > On Tue, May 13, 2014 at 7:29 PM, Austin Schuh wrote: > >> >> Hi, > >> >> > >> >> I am observing a filesystem lockup with XFS on a CONFIG_PREEMPT_RT > >> >> patched kernel. I have currently only triggered it using dpkg. Dave > >> >> Chinner on the XFS mailing list suggested that it was a rt-kernel > >> >> workqueue issue as opposed to a XFS problem after looking at the > >> >> kernel messages. > >> >> > >> >> The only modification to the kernel besides the RT patch is that I > >> >> have applied tglx's "genirq: Sanitize spurious interrupt detection of > >> >> threaded irqs" patch. > > > > > > I upgraded to 3.14.3-rt4, and the problem still persists. > > > > > > I turned on event tracing and tracked it down further. I'm able to > > > lock it up by scping a new kernel debian package to /tmp/ on the > > > machine. scp is locking the inode, and then scheduling > > > xfs_bmapi_allocate_worker in the work queue. The work then never gets > > > run. The kworkers then lock up waiting for the inode lock. > > > > > > Here are the relevant events from the trace. ffff8803e9f10288 > > > (blk_delay_work) gets run later on in the trace, but ffff8803b4c158d0 > > > (xfs_bmapi_allocate_worker) never does. The kernel then warns about > > > blocked tasks 120 seconds later. Austin and Richard, I'm not 100% sure that the patch below will fix your problem, but we saw something that sounds pretty familiar to your issue involving the nvidia driver and the preempt-rt patch. The nvidia driver uses the completion support to create their own driver's notion of an internally used semaphore. Some tasks were failing to ever wakeup from wait_for_completion() calls due to a race in the underlying do_wait_for_common() routine. This is the patch that we used to fix this issue: ------------------- ------------------- Fix a race in the PRT wait for completion simple wait code. A wait_for_completion() waiter task can be awoken by a task calling complete(), but fail to consume the 'done' completion resource if it looses a race with another task calling wait_for_completion() just as it is waking up. In this case, the awoken task will call schedule_timeout() again without being in the simple wait queue. So if the awoken task is unable to claim the 'done' completion resource, check to see if it needs to be re-inserted into the wait list before waiting again in schedule_timeout(). Fix-by: John Blackwood Index: b/kernel/sched/core.c =================================================================== --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3529,11 +3529,19 @@ static inline long __sched do_wait_for_common(struct completion *x, long (*action)(long), long timeout, int state) { + int again = 0; + if (!x->done) { DEFINE_SWAITER(wait); swait_prepare_locked(&x->wait, &wait); do { + /* Check to see if we lost race for 'done' and are + * no longer in the wait list. + */ + if (unlikely(again) && list_empty(&wait.node)) + swait_prepare_locked(&x->wait, &wait); + if (signal_pending_state(state, current)) { timeout = -ERESTARTSYS; break; @@ -3542,6 +3550,7 @@ do_wait_for_common(struct completion *x, raw_spin_unlock_irq(&x->wait.lock); timeout = action(timeout); raw_spin_lock_irq(&x->wait.lock); + again = 1; } while (!x->done && timeout); swait_finish_locked(&x->wait, &wait); if (!x->done) From austin@peloton-tech.com Wed May 21 16:59:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A69577F3F for ; Wed, 21 May 2014 16:59:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B562304067 for ; Wed, 21 May 2014 14:59:35 -0700 (PDT) X-ASG-Debug-ID: 1400709570-04bdf056b520af30001-NocioJ Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by cuda.sgi.com with ESMTP id 7HvRoaEXg00CP3an (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 21 May 2014 14:59:31 -0700 (PDT) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.176 Received: by mail-ig0-f176.google.com with SMTP id hl10so6807552igb.9 for ; Wed, 21 May 2014 14:59:30 -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=k6Eb83r7rPA5gDOyaQDlT/AOsGDnWKdbf5t2GNVtj/0=; b=F8W1iUBMJYTwHVv03w76eLcmCPyZ0/Gg2qUjmHvGNMoHsZ/EgD+aEaBytiMXa9ob5T CmLVhhkdCz0rllJm2SJ3iWV6geOFNhfOrh63V4ovk/L7PRp3McBiwQTeGjM2pmIlmZF4 hUZXmgeXEXRj0Z9OEa/0hliYLX08Bu4evb4np9JfFQvw3O00kOby2Tlye4R5gBqrFRAM qLZbS2E+LjAcKsTp1s3F+3JXd4KMSdZy8yCJD5ZKK8pyQ1Cn8hmAXHqLB6f3DmUTNd1V wfw4dOk5jSSjk9Vyqb9THlldLYTy6w0YB0UxvUux/+HeHLMQ2xWCCaByC3Jd8xG4fiVG PqPw== X-Gm-Message-State: ALoCoQkuRkHkLW6MqPO2MaxOMQuQLJy5I8WDtnyd6gCb/G7VExkB0EE5hLKrVVL5kXRqhsoAOuDF MIME-Version: 1.0 X-Received: by 10.42.191.202 with SMTP id dn10mr26031729icb.14.1400709570753; Wed, 21 May 2014 14:59:30 -0700 (PDT) Received: by 10.64.93.5 with HTTP; Wed, 21 May 2014 14:59:30 -0700 (PDT) In-Reply-To: <537CFECF.9070701@ccur.com> References: <537CFECF.9070701@ccur.com> Date: Wed, 21 May 2014 14:59:30 -0700 Message-ID: Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT From: Austin Schuh X-ASG-Orig-Subj: Re: Filesystem lockup with CONFIG_PREEMPT_RT To: John Blackwood Cc: Richard Weinberger , linux-kernel@vger.kernel.org, xfs , linux-rt-users@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f176.google.com[209.85.213.176] X-Barracuda-Start-Time: 1400709571 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.6004 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 21, 2014 at 12:30 PM, John Blackwood wrote: >> Date: Wed, 21 May 2014 03:33:49 -0400 >> From: Richard Weinberger >> To: Austin Schuh >> CC: LKML , xfs , rt-users >> >> Subject: Re: Filesystem lockup with CONFIG_PREEMPT_RT > >> >> CC'ing RT folks >> >> On Wed, May 21, 2014 at 8:23 AM, Austin Schuh >> wrote: >> > > On Tue, May 13, 2014 at 7:29 PM, Austin Schuh >> > > wrote: >> >> >> Hi, >> >> >> >> >> >> I am observing a filesystem lockup with XFS on a CONFIG_PREEMPT_RT >> >> >> patched kernel. I have currently only triggered it using dpkg. >> >> >> Dave >> >> >> Chinner on the XFS mailing list suggested that it was a rt-kernel >> >> >> workqueue issue as opposed to a XFS problem after looking at the >> >> >> kernel messages. >> >> >> >> >> >> The only modification to the kernel besides the RT patch is that I >> >> >> have applied tglx's "genirq: Sanitize spurious interrupt detection >> >> >> of >> >> >> threaded irqs" patch. >> > > >> > > I upgraded to 3.14.3-rt4, and the problem still persists. >> > > >> > > I turned on event tracing and tracked it down further. I'm able to >> > > lock it up by scping a new kernel debian package to /tmp/ on the >> > > machine. scp is locking the inode, and then scheduling >> > > xfs_bmapi_allocate_worker in the work queue. The work then never gets >> > > run. The kworkers then lock up waiting for the inode lock. >> > > >> > > Here are the relevant events from the trace. ffff8803e9f10288 >> > > (blk_delay_work) gets run later on in the trace, but ffff8803b4c158d0 >> > > (xfs_bmapi_allocate_worker) never does. The kernel then warns about >> > > blocked tasks 120 seconds later. > > Austin and Richard, > > I'm not 100% sure that the patch below will fix your problem, but we > saw something that sounds pretty familiar to your issue involving the > nvidia driver and the preempt-rt patch. The nvidia driver uses the > completion support to create their own driver's notion of an internally > used semaphore. > > Some tasks were failing to ever wakeup from wait_for_completion() calls > due to a race in the underlying do_wait_for_common() routine. Hi John, Thanks for the suggestion and patch. The issue is that the work never gets run, not that the work finishes but the waiter never gets woken. I applied it anyways to see if it helps, but I still get the lockup. Thanks, Austin From nasty151001@quality.com Thu May 22 03:34:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E59137F3F for ; Thu, 22 May 2014 03:34:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3EF130407F for ; Thu, 22 May 2014 01:34:18 -0700 (PDT) X-ASG-Debug-ID: 1400747654-04cbb006dc21e360001-NocioJ Received: from mail.rts-com.ru (mail.rts-com.ru [109.235.185.90]) by cuda.sgi.com with ESMTP id DiMtd5o3THPJKEzx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 22 May 2014 01:34:16 -0700 (PDT) X-Barracuda-Envelope-From: nasty151001@quality.com X-Barracuda-Apparent-Source-IP: 109.235.185.90 Received: from Unknown (unknown [125.93.83.248]) by mail (Postfix) with ESMTPA id 71FB82E61390; Thu, 22 May 2014 08:28:47 +0000 (UTC) Message-ID: Reply-To: =?windows-1251?B?z9DF0sXNx8jOzc3A3yDQwMHO0sA=?= From: =?windows-1251?B?z9DF0sXNx8jOzc3A3yDQwMHO0sA=?= To: , , , Subject: =?windows-1251?B?0ODx8u7w5uXt6OUg5O7j7uLu8OAg7/DoIPHz?= =?windows-1251?B?+eXx8uLl7e3u7CDo5+zl7eXt6Ogg7uHx8u7/?= =?windows-1251?B?8uXr/PHy4iA=?= Date: Thu, 22 May 2014 10:34:10 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0ODx8u7w5uXt6OUg5O7j7uLu8OAg7/DoIPHz?= =?windows-1251?B?+eXx8uLl7e3u7CDo5+zl7eXt6Ogg7uHx8u7/?= =?windows-1251?B?8uXr/PHy4iA=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1943_01CF75A9.5E2DB3D0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: mail.rts-com.ru[109.235.185.90] X-Barracuda-Start-Time: 1400747656 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6021 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. ------=_NextPart_000_1943_01CF75A9.5E2DB3D0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1944_01CF75A9.5E2DB3D0" ------=_NextPart_001_1944_01CF75A9.5E2DB3D0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E5= =EF=EE=F1=E2=FF=F9=E5=ED=ED=EE=E5: =C7 =C0 =D9 =C8 =D2 =C5 =CF =D0 =C0 =C2 =CA =D0 =C5 =C4 =C8 =D2 =CE= =D0 =C0. =DD=D4=D4=C5=CA=D2=C8=C2=CD=C0=DF =CF=D0=C5=D2=C5=CD=C7=C8=CE=CD=CD=C0=DF= =C8 =C8=D1=CA=CE=C2=C0=DF =D0=C0=C1=CE=D2=C0, =C0 =D2=C0=CA=C6=C5 =C4=CE= =C3=CE=C2=CE=D0=CD=C0=DF. =CF=CE=C4=C3=CE=D2=CE=C2=CA=C0 =CA =D3=D7=C0=D1= =D2=C8=DE =C2 =C0=D0=C1=C8=D2=D0=C0=C6=CD=CE=CC =CF=D0=CE=D6=C5=D1=D1=C5 O9 =96 Io =C8=DE=CD=DF 2=EEI=D7 =E3., =E2 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0= =E1=F3=F0=E3=E5 =CF=CE=CB=CD=C0=DF =EF=F0=EE=E3=F0=E0=EC=EC=E0, =E0 =F2=E0=EA=E6=E5 =F0=E5= =E3=E8=F1=F2=F0=E0=F6=E8=FF =EF=EE =F2=E5=EB.: +7 * =EA=EE=E4 =CF=E8=F2=E5=F0=E0 * 98_6 94 = ^ 1I ------=_NextPart_001_1944_01CF75A9.5E2DB3D0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Untitled Document</TI= TLE> <META content=3Dtext/html;charset=3Dwindows-1251 http-equiv=3DContent-Typ= e> <STYLE type=3Dtext/css>.style2 { FONT-FAMILY: "Courier New", Courier, monospace; FONT-SIZE: large } .style3 { FONT-FAMILY: Georgia, "Times New Roman", Times, serif; FONT-SIZE: large } .style4 { FONT-SIZE: xx-large } .style5 { FONT-FAMILY: Georgia, "Times New Roman", Times, serif } .style6 { FONT-FAMILY: "Courier New", Courier, monospace; FONT-WEIGHT: bold } .style7 { FONT-FAMILY: "Courier New", Courier, monospace } .style10 { FONT-STYLE: italic; FONT-FAMILY: "Times New Roman", Times, serif } </STYLE> <META name=3DGENERATOR content=3D"-[OUTLOOK_VER]-"></HEAD> <BODY> <DIV>=CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =EC=E5=F0=EE=EF=F0=E8=FF=F2= =E8=E5 =EF=EE=F1=E2=FF=F9=E5=ED=ED=EE=E5:<BR>=C7 =C0 =D9 =C8=20 =D2 =C5    =CF =D0 =C0 =C2     =CA= =D0 =C5 =C4 =C8 =D2 =CE =D0=20 =C0.<BR>=DD=D4=D4=C5=CA=D2=C8=C2=CD=C0=DF =CF=D0=C5=D2=C5=CD=C7=C8=CE=CD=CD= =C0=DF =C8 =C8=D1=CA=CE=C2=C0=DF =D0=C0=C1=CE=D2=C0, =C0 =D2=C0=CA=C6=C5 = =C4=CE=C3=CE=C2=CE=D0=CD=C0=DF. =CF=CE=C4=C3=CE=D2=CE=C2=CA=C0=20 =CA =D3=D7=C0=D1=D2=C8=DE =C2 =C0=D0=C1=C8=D2=D0=C0=C6=CD=CE=CC =CF=D0=CE= =D6=C5=D1=D1=C5<BR>O9 =96=20 Io =C8=DE=CD=DF=20 2=EEI=D7 =E3., =E2=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5</DIV> <DIV> </DIV> <DIV>=CF=CE=CB=CD=C0=DF =EF=F0=EE=E3=F0=E0=EC=EC=E0, =E0 =F2=E0=EA=E6=E5 = =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =EF=EE=20 =F2=E5=EB.:<BR> +7 * =EA=EE=E4 =CF=E8=F2=E5=F0=E0 * 98_6= 94 ^ 1I</DIV></BODY></HTML> ------=_NextPart_001_1944_01CF75A9.5E2DB3D0-- ------=_NextPart_000_1943_01CF75A9.5E2DB3D0 Content-Type: application/octet-stream; name="2014_pretenzionka.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="2014_pretenzionka.rar" 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 ------=_NextPart_000_1943_01CF75A9.5E2DB3D0-- From eguan@redhat.com Thu May 22 04:59:21 2014 Return-Path: <eguan@redhat.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 299967F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 04:59:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 274158F8033 for <xfs@oss.sgi.com>; Thu, 22 May 2014 02:59:17 -0700 (PDT) X-ASG-Debug-ID: 1400752756-04cbb006d9224ce0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9lMBId8JV6kLRH1X for <xfs@oss.sgi.com>; Thu, 22 May 2014 02:59: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4M9xGjt019395 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 May 2014 05:59:16 -0400 Received: from localhost (dhcp12-144.nay.redhat.com [10.66.12.144] (may be forged)) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4M9xElZ029219; Thu, 22 May 2014 05:59:15 -0400 From: Eryu Guan <eguan@redhat.com> To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan <eguan@redhat.com> Subject: [PATCH] generic: new ENOSPC regression test Date: Thu, 22 May 2014 17:58:42 +0800 X-ASG-Orig-Subj: [PATCH] generic: new ENOSPC regression test Message-Id: <1400752722-22782-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: 1400752756 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 Run 8 processes writing 1k files to seperate files in seperate dirs to hit ENOSPC on small fs with little free space. Loop for 100 iterations. Regression test for 34cf865 ext4: fix deadlock when writing in ENOSPC conditions Signed-off-by: Eryu Guan <eguan@redhat.com> --- btrfs takes much longer time than xfs and extN do, the rough test time on my test box is xfs 50s extN 90s btrfs 1h I'm not sure what's the best way to deal with such situation, so I simply reduce iteration count for btrfs to 10, and test time on btrfs is about 5m now. tests/generic/027 | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/027.out | 2 + tests/generic/group | 1 + 3 files changed, 110 insertions(+) create mode 100755 tests/generic/027 create mode 100644 tests/generic/027.out diff --git a/tests/generic/027 b/tests/generic/027 new file mode 100755 index 0000000..b9232ec --- /dev/null +++ b/tests/generic/027 @@ -0,0 +1,107 @@ +#! /bin/bash +# FS QA Test No. generic/027 +# +# Run 8 processes writing 1k files to seperate files in seperate dirs to +# hit ENOSPC on small fs with little free space. Loop for 100 iterations. +# +# Regression test for +# 34cf865 ext4: fix deadlock when writing in ENOSPC conditions +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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 / + rm -f $tmp.* +} + +create_file() +{ + local dir=$1 + local direct=$2 + local i=0 + + mkdir -p $dir + while $XFS_IO_PROG -f $direct -c "pwrite 0 1k" $dir/file_$i >/dev/null 2>&1; do + let i=$i+1 + done +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_scratch + +rm -f $seqres.full +echo "Silence is golden" + +_scratch_mkfs_sized $((256 * 1024 * 1024)) >>$seqres.full 2>&1 +_scratch_mount + +echo "Reserve 2M space" >>$seqres.full +$XFS_IO_PROG -f -c "pwrite 0 2m" $SCRATCH_MNT/testfile >>$seqres.full 2>&1 +echo "Fulfill the fs" >>$seqres.full +$XFS_IO_PROG -f -c "pwrite 0 254m" $SCRATCH_MNT/bigfile >>$seqres.full 2>&1 +echo "Remove reserved file" >>$seqres.full +rm -f $SCRATCH_MNT/testfile + +loop=100 +# btrfs takes much longer time, reduce the loop count +if [ "$FSTYP" == "btrfs" ]; then + loop=10 +fi + +dir=$SCRATCH_MNT/testdir +echo -n "iteration" >>$seqres.full +i=1 +while [ $i -le $loop ]; do + echo -n " $i" >>$seqres.full + nr_worker=8 + while [ $nr_worker -gt 0 ]; do + # half buffered I/O half direct I/O + if [ `expr $nr_worker % 2` -eq 0 ]; then + create_file $dir/$nr_worker -d >>$seqres.full & + else + create_file $dir/$nr_worker >>$seqres.full & + fi + let nr_worker=$nr_worker-1 + done + wait + rm -rf $dir + let i=$i+1 +done +_scratch_unmount +_check_scratch_fs + +status=0 +exit diff --git a/tests/generic/027.out b/tests/generic/027.out new file mode 100644 index 0000000..ef78cda --- /dev/null +++ b/tests/generic/027.out @@ -0,0 +1,2 @@ +QA output created by 027 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 961f4e5..e851c62 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -29,6 +29,7 @@ 024 auto quick 025 auto quick 026 acl quick auto +027 auto enospc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.9.0 From BATV+223014ea3f199f94fc8d+3924+infradead.org+hch@bombadil.srs.infradead.org Thu May 22 05:01:46 2014 Return-Path: <BATV+223014ea3f199f94fc8d+3924+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2E2577F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 05:01:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1CFA08F8033 for <xfs@oss.sgi.com>; Thu, 22 May 2014 03:01:43 -0700 (PDT) X-ASG-Debug-ID: 1400752901-04bdf056b823ad30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8nu3iLoAF0BdM2oe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 22 May 2014 03:01:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+223014ea3f199f94fc8d+3924+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 1WnPod-0007GT-0c; Thu, 22 May 2014 10:01:35 +0000 Date: Thu, 22 May 2014 03:01:34 -0700 From: Christoph Hellwig <hch@infradead.org> To: walter harms <wharms@bfs.de> Cc: Dan Carpenter <dan.carpenter@oracle.com>, Christoph Hellwig <hch@infradead.org>, kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement Message-ID: <20140522100134.GA23071@infradead.org> X-ASG-Orig-Subj: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> <20140521142909.GA22281@infradead.org> <20140521143550.GC15585@mwanda> <537CD96D.2090901@bfs.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <537CD96D.2090901@bfs.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1400752901 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.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.6022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, May 21, 2014 at 06:50:53PM +0200, walter harms wrote: > This looks like a ffsll() maybe there are other implemantions and we can > make a generic version (acualy i found only a ffsll() in nouvou, NTL). All the helper in xfs_bit.[ch] are probably candidates for generic library functions. From bfoster@redhat.com Thu May 22 08:17:01 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B354B7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 08:17:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A032B304071 for <xfs@oss.sgi.com>; Thu, 22 May 2014 06:17:01 -0700 (PDT) X-ASG-Debug-ID: 1400764620-04cbb006db239260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OJViRQEQ5I6sE5w5 for <xfs@oss.sgi.com>; Thu, 22 May 2014 06:17:00 -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 (8.14.4/8.14.4) with ESMTP id s4MDGcBH006111 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 May 2014 09:16:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4MDGbwo010866; Thu, 22 May 2014 09:16:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 926E81248A9; Thu, 22 May 2014 09:16:36 -0400 (EDT) Date: Thu, 22 May 2014 09:16:36 -0400 From: Brian Foster <bfoster@redhat.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/2] xfs: sysfs attribute support Message-ID: <20140522131636.GA33295@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC PATCH 0/2] xfs: sysfs attribute support References: <1400263966-35541-1-git-send-email-bfoster@redhat.com> <20140521144859.GB3580@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140521144859.GB3580@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400764620 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, May 21, 2014 at 07:48:59AM -0700, Christoph Hellwig wrote: > On Fri, May 16, 2014 at 02:12:44PM -0400, Brian Foster wrote: > > Hi all, > > > > This is an rfc to get some discussion rolling on sysfs support for XFS. > > The motivation for this work is here: > > > > http://oss.sgi.com/archives/xfs/2014-05/msg00381.html > > All the sysfs magic for this looks pretty ugly. Why can't we just > dump it into debugfs given that it's very much a debug only feature > anyway? > Yeah, it kind of is. I think it also could get a bit worse as the dataset expands and we have to embed more kobjects in the various data structures. i.e., I think creating a full on directory structure in sysfs will involve a heirarchy of ksets/kobjects that would have to be instantiated and reclaimed as the associated subsystems are. debugfs seems like a reasonable suggestion. I think it's suitable for my initial purpose here (log leak detection), at least. Taking a first look through the debugfs code and some examples, it looks like there are some templates for simple/basic types, and then more customized items/output or things that require locking would require custom handlers. It appears we can associate a file with an object in memory. The desired directory structure is created more explicitly (debugfs_create_dir()), so we can still create an arbitrary directory structure. That and the fact that debugfs probably isn't considered ABI are positives to me. I suspect the debugfs interface means we'd probably want to combine the setup and teardown into a single path (i.e., xfs_init/fini_debugfs()), otherwise this would probably get just as ugly by carrying around debugfs directories in in-memory objects such that the infrastructure is available per-subsystem. We'd also have to consider that we might require active modification of the directory structure post-initialization (i.e., Dave's example included per AG attributes, so consider growfs). That could perhaps get ugly with this model vs. one that naturally updates as objects are instantiated/freed. So to me, the right approach seems like it depends on the grand scheme of things here. The wide and encompassing model with per-AG data and controls probably favors the sysfs model where individual files are managed via the individual objects. The current/initial use case probably favors using debugfs. I'd also be happy to start this off with debugfs and we can consider converting it to sysfs when the expanded use case is more defined and justified (though if use cases are clear to others, I'd prefer to do it correctly now rather than waste time converting back and forth). Thoughts? > It would also be really nitfy to have a tool to fronted it in the style > of xfs_db and xfs_io.. Perhaps, but what's the purpose of having a tool that just reads/writes these kind of attribute files? Something like that would be great were these controls exposed via ioctl(), of course, but the existence of sysfs/debugfs with per-file controls eliminates the need for that kind of custom tool IMO. Did you have additional functionality in mind? Thanks for looking at this... Brian From tinguely@sgi.com Thu May 22 08:31:47 2014 Return-Path: <tinguely@sgi.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=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 EE9087F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 08:31:47 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A9E58F8033; Thu, 22 May 2014 06:31:44 -0700 (PDT) Message-ID: <537DFC42.8080100@sgi.com> Date: Thu, 22 May 2014 08:31:46 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Christoph Hellwig <hch@infradead.org> CC: walter harms <wharms@bfs.de>, kernel-janitors@vger.kernel.org, Dan Carpenter <dan.carpenter@oracle.com>, xfs@oss.sgi.com Subject: Re: [patch] [XFS] indent an if statement References: <20140521122746.GD23396@mwanda> <20140521142909.GA22281@infradead.org> <20140521143550.GC15585@mwanda> <537CD96D.2090901@bfs.de> <20140522100134.GA23071@infradead.org> In-Reply-To: <20140522100134.GA23071@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/22/14 05:01, Christoph Hellwig wrote: > On Wed, May 21, 2014 at 06:50:53PM +0200, walter harms wrote: >> This looks like a ffsll() maybe there are other implemantions and we can >> make a generic version (acualy i found only a ffsll() in nouvou, NTL). > > All the helper in xfs_bit.[ch] are probably candidates for generic > library functions. Discussed in the thread: http://oss.sgi.com/archives/xfs/2014-01/msg00542.html --Mark. From dan.carpenter@oracle.com Thu May 22 09:04:18 2014 Return-Path: <dan.carpenter@oracle.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=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 6F0317F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:04:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03439AC002 for <xfs@oss.sgi.com>; Thu, 22 May 2014 07:04:14 -0700 (PDT) X-ASG-Debug-ID: 1400767453-04cbb006db23ef60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ekAOVLUNvoV44lTL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 22 May 2014 07:04:13 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4ME4BrV032150 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 22 May 2014 14:04:12 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4ME4Anw019261 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 22 May 2014 14:04:11 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s4ME48Oj002823; Thu, 22 May 2014 14:04:09 GMT Received: from mwanda (/197.157.0.25) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 22 May 2014 07:04:07 -0700 Date: Thu, 22 May 2014 17:04:05 +0300 From: Dan Carpenter <dan.carpenter@oracle.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: [patch v2] [XFS] small cleanup in xfs_lowbit64() Message-ID: <20140522140405.GA27116@mwanda> X-ASG-Orig-Subj: [patch v2] [XFS] small cleanup in xfs_lowbit64() MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140521142909.GA22281@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1400767453 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.6026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines There are two checkpatch.pl complaints here because of the bad indenting and because of the assignment inside the condition. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> --- v2: more cleanups diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h index f1e3c90..e1649c0 100644 --- a/fs/xfs/xfs_bit.h +++ b/fs/xfs/xfs_bit.h @@ -66,8 +66,11 @@ static inline int xfs_lowbit64(__uint64_t v) n = ffs(w); } else { /* upper bits */ w = (__uint32_t)(v >> 32); - if (w && (n = ffs(w))) - n += 32; + if (w) { + n = ffs(w); + if (n) + n += 32; + } } return n - 1; } From sebivvibes@hotmail.com Thu May 22 09:10:07 2014 Return-Path: <sebivvibes@hotmail.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 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 728C27F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 09: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 81BF630408C for <xfs@oss.sgi.com>; Thu, 22 May 2014 07:10:04 -0700 (PDT) X-ASG-Debug-ID: 1400767803-04cb6c5d0a251c70001-NocioJ Received: from blu0-omc4-s29.blu0.hotmail.com (blu0-omc4-s29.blu0.hotmail.com [65.55.111.168]) by cuda.sgi.com with ESMTP id f8Lbeai4NxqqlsCc for <xfs@oss.sgi.com>; Thu, 22 May 2014 07:10:03 -0700 (PDT) X-Barracuda-Envelope-From: sebivvibes@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.168 Received: from BLU175-W27 ([65.55.111.136]) by blu0-omc4-s29.blu0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 22 May 2014 07:10:02 -0700 X-TMN: [d2IszSiM9GvMeCzEyrIPiBzfY+mUBnA8] X-Originating-Email: [sebivvibes@hotmail.com] Message-ID: <BLU175-W272573098D44296182CE90CF3F0@phx.gbl> Content-Type: multipart/alternative; boundary="_5a11df00-67d2-4bab-8896-7f8e49951da1_" From: Posativ Vibrationz <sebivvibes@hotmail.com> To: "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: xfsmail info Date: Thu, 22 May 2014 14:10:02 +0000 X-ASG-Orig-Subj: xfsmail info Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 22 May 2014 14:10:02.0947 (UTC) FILETIME=[86519930:01CF75C7] X-Barracuda-Connect: blu0-omc4-s29.blu0.hotmail.com[65.55.111.168] X-Barracuda-Start-Time: 1400767803 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.6026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_5a11df00-67d2-4bab-8896-7f8e49951da1_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hello=2C Does this email have anything to do with xfsmail? I have an account on xfsm= ail and cannot access it.. is there any way I can retrieve the information = from that account?=20 cheers=2C MD = --_5a11df00-67d2-4bab-8896-7f8e49951da1_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <html> <head> <style><!-- .hmmessage P { margin:0px=3B padding:0px } body.hmmessage { font-size: 12pt=3B font-family:Calibri } --></style></head> <body class=3D'hmmessage'><div dir=3D'ltr'>Hello=2C<br>Does this email have= anything to do with xfsmail? I have an account on xfsmail and cannot acces= s it.. is there any way I can retrieve the information from that account? <= br><br>cheers=2C<br>MD<br> </div></body> </html>= --_5a11df00-67d2-4bab-8896-7f8e49951da1_-- From jakub@bogusz.priv.pl Thu May 22 11:12:41 2014 Return-Path: <jakub@bogusz.priv.pl> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 55BE27F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 11:12:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E98F8AC002 for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:12:37 -0700 (PDT) X-ASG-Debug-ID: 1400775153-04cbb006dc24ad50001-NocioJ Received: from mail.qboosh.pl (mail.qboosh.pl [217.73.31.61]) by cuda.sgi.com with ESMTP id a48rQ02C3PLpPBfO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:12:35 -0700 (PDT) X-Barracuda-Envelope-From: jakub@bogusz.priv.pl X-Barracuda-Apparent-Source-IP: 217.73.31.61 Received: from stranger.qboosh.pl (77-253-94-151.adsl.inetia.pl [77.253.94.151]) by mail.qboosh.pl (Postfix) with ESMTPSA id 45037FB0E9; Thu, 22 May 2014 18:12:35 +0200 (CEST) Received: from stranger.qboosh.pl (localhost [127.0.0.1]) by stranger.qboosh.pl (8.14.8/8.14.8) with ESMTP id s4MGFaRS032051; Thu, 22 May 2014 18:15:36 +0200 Received: (from qboosh@localhost) by stranger.qboosh.pl (8.14.8/8.14.8/Submit) id s4MGFYMw032046; Thu, 22 May 2014 18:15:34 +0200 Date: Thu, 22 May 2014 18:15:34 +0200 From: Jakub Bogusz <qboosh@pld-linux.org> To: xfs@oss.sgi.com Cc: Christoph Hellwig <hch@infradead.org> Subject: Polish translation update for xfsprogs 3.2.0 Message-ID: <20140522161534.GA31966@stranger.qboosh.pl> X-ASG-Orig-Subj: Polish translation update for xfsprogs 3.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.22 (2013-10-16) X-Barracuda-Connect: mail.qboosh.pl[217.73.31.61] X-Barracuda-Start-Time: 1400775154 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-BRTS-Evidence: qboosh.pl X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.6029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, I updated Polish translation for xfsprogs 3.2.0. It's available at: http://qboosh.pl/pl.po/xfsprogs-3.2.0.pl.po -- Jakub Bogusz http://qboosh.pl/ From eguan@redhat.com Thu May 22 11:17:36 2014 Return-Path: <eguan@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7EDA7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 11:17:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1EF930407B for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:17:33 -0700 (PDT) X-ASG-Debug-ID: 1400775452-04cbb006da24b4b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Thb1GZgDJOhsKAJY for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:17:32 -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 (8.14.4/8.14.4) with ESMTP id s4MGHWvi030478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 May 2014 12:17:32 -0400 Received: from localhost (vpn1-112-215.nay.redhat.com [10.66.112.215]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4MGHU9v020200; Thu, 22 May 2014 12:17:31 -0400 From: Eryu Guan <eguan@redhat.com> To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan <eguan@redhat.com> Subject: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it Date: Fri, 23 May 2014 00:17:09 +0800 X-ASG-Orig-Subj: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it Message-Id: <1400775429-30015-1-git-send-email-eguan@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: 1400775452 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 Failure message of _scratch_mount is something like: mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning not mount: Structure needs cleaning Filter the output and fix the golden image to match the new output. Signed-off-by: Eryu Guan <eguan@redhat.com> --- tests/xfs/005 | 2 +- tests/xfs/005.out | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/xfs/005 b/tests/xfs/005 index 94157c4..534f910 100755 --- a/tests/xfs/005 +++ b/tests/xfs/005 @@ -59,7 +59,7 @@ _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" $XFS_IO_PROG -c "pwrite 224 4" $SCRATCH_DEV | _filter_xfs_io # should FAIL, the crc is bad; golden output contains mount failure -_scratch_mount +_scratch_mount 2>&1 | _filter_scratch # success, all done status=0 diff --git a/tests/xfs/005.out b/tests/xfs/005.out index 13d0125..853e446 100644 --- a/tests/xfs/005.out +++ b/tests/xfs/005.out @@ -1,4 +1,4 @@ QA output created by 005 wrote 4/4 bytes at offset 224 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -mount: Structure needs cleaning +mount: mount SCRATCH_DEV on SCRATCH_MNT failed: Structure needs cleaning -- 1.9.0 From sandeen@sandeen.net Thu May 22 11:30:45 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 ABD6B7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 11:30:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82154304081 for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:30:45 -0700 (PDT) X-ASG-Debug-ID: 1400776244-04cb6c5d0c25f8e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id PGvYLgEI42WF4jmo for <xfs@oss.sgi.com>; Thu, 22 May 2014 09:30:44 -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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AFBCA60B9637; Thu, 22 May 2014 11:30:43 -0500 (CDT) Message-ID: <537E2638.7070000@sandeen.net> Date: Thu, 22 May 2014 11:30:48 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Posativ Vibrationz <sebivvibes@hotmail.com>, "xfs@oss.sgi.com" <xfs@oss.sgi.com> Subject: Re: xfsmail info References: <BLU175-W272573098D44296182CE90CF3F0@phx.gbl> X-ASG-Orig-Subj: Re: xfsmail info In-Reply-To: <BLU175-W272573098D44296182CE90CF3F0@phx.gbl> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1400776244 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.6029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/22/14, 9:10 AM, Posativ Vibrationz wrote: > Hello, > Does this email have anything to do with xfsmail? I have an account > on xfsmail and cannot access it.. is there any way I can retrieve the > information from that account? no, nope, xfsmail is something else. this mailing list is for the xfs filesystem. -Eric From bfoster@redhat.com Thu May 22 12:06:54 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B3B7F7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 12:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A386A30407B for <xfs@oss.sgi.com>; Thu, 22 May 2014 10:06:51 -0700 (PDT) X-ASG-Debug-ID: 1400778410-04cbb006dc24f230001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7nNTNREUogEgjZND for <xfs@oss.sgi.com>; Thu, 22 May 2014 10: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 (8.14.4/8.14.4) with ESMTP id s4MH6oIe018824 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 May 2014 13:06:50 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4MH6nQ5032278; Thu, 22 May 2014 13:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 421D71248A9; Thu, 22 May 2014 13:06:48 -0400 (EDT) Date: Thu, 22 May 2014 13:06:48 -0400 From: Brian Foster <bfoster@redhat.com> To: Eryu Guan <eguan@redhat.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it Message-ID: <20140522170647.GA25877@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it References: <1400775429-30015-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400775429-30015-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400778410 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, May 23, 2014 at 12:17:09AM +0800, Eryu Guan wrote: > Failure message of _scratch_mount is something like: > > mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning > > not > > mount: Structure needs cleaning > > Filter the output and fix the golden image to match the new output. > > Signed-off-by: Eryu Guan <eguan@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > tests/xfs/005 | 2 +- > tests/xfs/005.out | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/tests/xfs/005 b/tests/xfs/005 > index 94157c4..534f910 100755 > --- a/tests/xfs/005 > +++ b/tests/xfs/005 > @@ -59,7 +59,7 @@ _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" > $XFS_IO_PROG -c "pwrite 224 4" $SCRATCH_DEV | _filter_xfs_io > > # should FAIL, the crc is bad; golden output contains mount failure > -_scratch_mount > +_scratch_mount 2>&1 | _filter_scratch > > # success, all done > status=0 > diff --git a/tests/xfs/005.out b/tests/xfs/005.out > index 13d0125..853e446 100644 > --- a/tests/xfs/005.out > +++ b/tests/xfs/005.out > @@ -1,4 +1,4 @@ > QA output created by 005 > wrote 4/4 bytes at offset 224 > XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > -mount: Structure needs cleaning > +mount: mount SCRATCH_DEV on SCRATCH_MNT failed: Structure needs cleaning > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu May 22 18:34:59 2014 Return-Path: <david@fromorbit.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 7BDEF7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 18:34:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5030C8F8037 for <xfs@oss.sgi.com>; Thu, 22 May 2014 16:34:56 -0700 (PDT) X-ASG-Debug-ID: 1400801691-04cbb006dc267150001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 8Gg39ZpqnNXB9XpN for <xfs@oss.sgi.com>; Thu, 22 May 2014 16:34:52 -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: AsVUAIqIflN5LL1sPGdsb2JhbABZgweDQ4UIokMBAQEBAQEGmjsBgQYXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQNcpFxaFP4h5B4RAAQOZcIsYigeBUis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:04:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WncVd-0006xj-Rq; Fri, 23 May 2014 09:34:49 +1000 Date: Fri, 23 May 2014 09:34:49 +1000 From: Dave Chinner <david@fromorbit.com> To: Eryu Guan <eguan@redhat.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it Message-ID: <20140522233449.GN18954@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it References: <1400775429-30015-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400775429-30015-1-git-send-email-eguan@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: 1400801692 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 12:17:09AM +0800, Eryu Guan wrote: > Failure message of _scratch_mount is something like: > > mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning > > not > > mount: Structure needs cleaning Evidence to the contrary: # MKFS_OPTIONS="-b size=1024 -m crc=1" ./check xfs/005 FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 test1 3.15.0-rc5-dgc+ MKFS_OPTIONS -- -f -b size=1024 -m crc=1 /dev/vdb MOUNT_OPTIONS -- /dev/vdb /mnt/scratch xfs/005 0s ... 0s Ran: xfs/005 Passed all 1 tests # mount /dev/vdb /mnt/scratch mount: Structure needs cleaning # mount -V mount from util-linux 2.20.1 (with libblkid and selinux support) # So xfs/005 is correct for a relatively recent mount binary. What version of mount are you using? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Thu May 22 18:54:29 2014 Return-Path: <dave@fromorbit.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 790327F47 for <xfs@oss.sgi.com>; Thu, 22 May 2014 18:54:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B0E58F8033 for <xfs@oss.sgi.com>; Thu, 22 May 2014 16:54:29 -0700 (PDT) X-ASG-Debug-ID: 1400802866-04cb6c5d0c27c570001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 8FBxuKfVkx9EEaUW for <xfs@oss.sgi.com>; Thu, 22 May 2014 16:54:26 -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: AlJTAHGNflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEtLzsYagMHLYhAomK0ZoVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:23:28 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncnf-000702-9a for xfs@oss.sgi.com; Fri, 23 May 2014 09:53:27 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncnf-0005CA-8S for xfs@oss.sgi.com; Fri, 23 May 2014 09:53:27 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH] xfs: kill xfs_buf_geterror() Date: Fri, 23 May 2014 09:53:27 +1000 X-ASG-Orig-Subj: [PATCH] xfs: kill xfs_buf_geterror() Message-Id: <1400802807-19936-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400802866 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Most of the callers are just calling ASSERT(!xfs_buf_geterror()) which means they are checking for bp->b_error == 0. If bp is null in this case, we will assert fail, and hence it's no different in result to oopsing because of a null bp. In some cases, errors have already been checked for or the function returning the buffer can't return a buffer with an error, so it's just a redundant assert. Either way, the assert can either be removed. The other two non-assert callers can just test for a buffer and error properly. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_alloc.c | 1 - fs/xfs/xfs_btree.c | 12 ++---------- fs/xfs/xfs_buf.h | 5 ----- fs/xfs/xfs_buf_item.c | 2 +- fs/xfs/xfs_dquot.c | 6 +++--- fs/xfs/xfs_ialloc.c | 1 - fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_rtbitmap.c | 1 - 8 files changed, 7 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index c1cf6a3..077c3417 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -541,7 +541,6 @@ xfs_alloc_read_agfl( XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_agfl_buf_ops); if (error) return error; - ASSERT(!xfs_buf_geterror(bp)); xfs_buf_set_ref(bp, XFS_AGFL_REF); *bpp = bp; return 0; diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 182bac2..bf810c6 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -553,14 +553,11 @@ xfs_btree_get_bufl( xfs_fsblock_t fsbno, /* file system block number */ uint lock) /* lock flags for get_buf */ { - xfs_buf_t *bp; /* buffer pointer (return value) */ xfs_daddr_t d; /* real disk block address */ ASSERT(fsbno != NULLFSBLOCK); d = XFS_FSB_TO_DADDR(mp, fsbno); - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(!xfs_buf_geterror(bp)); - return bp; + return xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); } /* @@ -575,15 +572,12 @@ xfs_btree_get_bufs( xfs_agblock_t agbno, /* allocation group block number */ uint lock) /* lock flags for get_buf */ { - xfs_buf_t *bp; /* buffer pointer (return value) */ xfs_daddr_t d; /* real disk block address */ ASSERT(agno != NULLAGNUMBER); ASSERT(agbno != NULLAGBLOCK); d = XFS_AGB_TO_DADDR(mp, agno, agbno); - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); - ASSERT(!xfs_buf_geterror(bp)); - return bp; + return xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); } /* @@ -723,7 +717,6 @@ xfs_btree_read_bufl( mp->m_bsize, lock, &bp, ops); if (error) return error; - ASSERT(!xfs_buf_geterror(bp)); if (bp) xfs_buf_set_ref(bp, refval); *bpp = bp; @@ -1179,7 +1172,6 @@ xfs_btree_read_buf_block( if (error) return error; - ASSERT(!xfs_buf_geterror(*bpp)); xfs_btree_set_refs(cur, *bpp); *block = XFS_BUF_TO_BLOCK(*bpp); return 0; diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 0e47fd1..3a7a552 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -298,11 +298,6 @@ extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, extern int xfs_bioerror_relse(struct xfs_buf *); -static inline int xfs_buf_geterror(xfs_buf_t *bp) -{ - return bp ? bp->b_error : ENOMEM; -} - /* Buffer Utility Routines */ extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 64b17f5..4654338 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1052,7 +1052,7 @@ xfs_buf_iodone_callbacks( static ulong lasttime; static xfs_buftarg_t *lasttarg; - if (likely(!xfs_buf_geterror(bp))) + if (likely(!bp->b_error)) goto do_callbacks; /* diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 5fec738..3ee0cd4 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -353,10 +353,10 @@ xfs_qm_dqalloc( dqp->q_blkno, mp->m_quotainfo->qi_dqchunklen, 0); - - error = xfs_buf_geterror(bp); - if (error) + if (!bp) { + error = ENOMEM; goto error1; + } bp->b_ops = &xfs_dquot_buf_ops; /* diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e8dfaf0..5960e55 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -2129,7 +2129,6 @@ xfs_read_agi( if (error) return error; - ASSERT(!xfs_buf_geterror(*bpp)); xfs_buf_set_ref(*bpp, XFS_AGI_REF); return 0; } diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3554098..292308d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1165,7 +1165,7 @@ xlog_iodone(xfs_buf_t *bp) /* * Race to shutdown the filesystem if we see an error. */ - if (XFS_TEST_ERROR((xfs_buf_geterror(bp)), l->l_mp, + if (XFS_TEST_ERROR(bp->b_error, l->l_mp, XFS_ERRTAG_IODONE_IOERR, XFS_RANDOM_IODONE_IOERR)) { xfs_buf_ioerror_alert(bp, __func__); xfs_buf_stale(bp); diff --git a/fs/xfs/xfs_rtbitmap.c b/fs/xfs/xfs_rtbitmap.c index b1f2fe8..f4dd697 100644 --- a/fs/xfs/xfs_rtbitmap.c +++ b/fs/xfs/xfs_rtbitmap.c @@ -74,7 +74,6 @@ xfs_rtbuf_get( mp->m_bsize, 0, &bp, NULL); if (error) return error; - ASSERT(!xfs_buf_geterror(bp)); *bpp = bp; return 0; } -- 1.9.0 From dave@fromorbit.com Thu May 22 19:07:58 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 ED7827F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:07:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D3B258F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:58 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id kv6ZJTVGBDodBxjP for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:57 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-000724-C8 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005UE-BF for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code Date: Fri, 23 May 2014 10:03:50 +1000 X-ASG-Orig-Subj: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code Message-Id: <1400803432-20048-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803676 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Rather than using the superblock value obtained through the xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 12 ++++++------ fs/xfs/xfs_attr_leaf.c | 6 +++--- fs/xfs/xfs_log_rlimit.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 8bb9ae6..ccfc2c9 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -175,11 +175,11 @@ xfs_attr_calc_size( * "local" or "remote" (note: local != inline). */ size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, local); + args->geo->blksize, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { - if (size > (mp->m_sb.sb_blocksize >> 1)) { + if (size > (args->geo->blksize / 2)) { /* Double split possible */ nblks *= 2; } @@ -898,7 +898,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1077,7 +1077,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); @@ -1169,7 +1169,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1432,7 +1432,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 5be77b3..88cd84a 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1077,7 +1077,7 @@ xfs_attr3_leaf_add( xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->trans->t_mountp->m_sb.sb_blocksize, NULL); + args->geo->blksize, NULL); /* * Search through freemap for first-fit on new name length. @@ -1180,13 +1180,13 @@ xfs_attr3_leaf_add_work( ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, NULL)); + args->geo->blksize, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp); + args->geo->blksize, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index 2af1a0a..ee7e0e8 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -42,7 +42,7 @@ xfs_log_calc_max_attrsetm_res( int size; int nblks; - size = xfs_attr_leaf_entsize_local_max(mp->m_sb.sb_blocksize) - + size = xfs_attr_leaf_entsize_local_max(mp->m_attr_geo->blksize) - MAXNAMELEN - 1; nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); nblks += XFS_B_TO_FSB(mp, size); -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:00 2014 Return-Path: <dave@fromorbit.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 2958A7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 106538F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:00 -0700 (PDT) X-ASG-Debug-ID: 1400803675-04cb6c5d0c27cfb0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id B3Z7gUrpoU5fB9IK for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:58 -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: AlhTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZGYgn11CFVY1ABJVyjxaLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071x-Ae for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Tz-9V for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Date: Fri, 23 May 2014 10:03:47 +1000 X-ASG-Orig-Subj: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Message-Id: <1400803432-20048-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803677 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 8 ++++---- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_dir2.c | 3 --- fs/xfs/xfs_dir2_node.c | 10 +++++----- fs/xfs/xfs_mount.h | 2 -- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index c547498..8bb9ae6 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -899,7 +899,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name already exists, and get back a pointer @@ -1078,7 +1078,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); if (error) @@ -1170,7 +1170,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state->args = args; state->mp = dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. @@ -1433,7 +1433,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state->args = args; state->mp = args->dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index b9b007d..f935370 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -167,8 +167,8 @@ xfs_da3_node_verify( * we don't know if the node is for and attribute or directory tree, * so only fail if the count is outside both bounds */ - if (ichdr.count > mp->m_dir_node_ents && - ichdr.count > mp->m_attr_node_ents) + if (ichdr.count > mp->m_dir_geo->node_ents && + ichdr.count > mp->m_attr_geo->node_ents) return false; /* XXX: hash order check? */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 0230342..90d426d 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -144,9 +144,6 @@ xfs_da_mount( else mp->m_dirnameops = &xfs_default_nameops; - /* XXX: these are to be removed as code is converted to use geo */ - mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_attr_node_ents = mp->m_attr_geo->node_ents; return 0; } diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index de5b2996..eff6b8d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1596,8 +1596,8 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->blocksize = args->geo->blksize; + state->node_ents = args->geo->node_ents; /* * Look up the name. We're not supposed to find it, but * this gives us the insertion point. @@ -2043,7 +2043,7 @@ xfs_dir2_node_lookup( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* * Fill in the path to the entry in the cursor. */ @@ -2098,7 +2098,7 @@ xfs_dir2_node_removename( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* Look up the entry we're deleting, set up the cursor. */ error = xfs_da3_node_lookup_int(state, &rval); @@ -2168,7 +2168,7 @@ xfs_dir2_node_replace( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; inum = args->inumber; /* * Lookup the entry to change in the btree. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 3b690c36..6d7e5d7 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -134,8 +134,6 @@ typedef struct xfs_mount { int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:01 2014 Return-Path: <dave@fromorbit.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 0ABFB7F53 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E22F78F8037 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:57 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Lgg53lqoEcAPC2th for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:55 -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: AtRPALyQflN5LL1sPGdsb2JhbABZgwdSqiUCFQEBAQEBAQabQhcDAQEBATg1gwI7gQIDB4htDqJatGiFVYcAghaEKgSlCIlQggkrMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071k-4d for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005T8-3b for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 00/16 V2] xfs: introduce struct xfs_da_geometry Date: Fri, 23 May 2014 10:03:36 +1000 X-ASG-Orig-Subj: [PATCH 00/16 V2] xfs: introduce struct xfs_da_geometry Message-Id: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803674 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is the second version of the patchset I posted here: http://oss.sgi.com/pipermail/xfs/2014-May/036125.html This patchset moves all the directory and attribute structure geometry information into it's own abstract structure. This is done to remove a dependency of the directory code on the struct xfs_mount and hence xfs_mount.h. It also clears up a dependency between xfs_da_format.h and xfs_mount.h by moving all the index type conversion functions to xfs_da_btree.h (as they are not on-disk format definitions). This version compiles cleanly at each patch, and runs correctly so should be fully bisectable (unlike the RFC patch set that was originally posted that oopsed instantly). Note that this version is based on the current for-next branch, not the master branch of the xfs git repo. Comments and testing welcome! Version 2: - patch removing checks from xfs_da_read_buf() sent separately - dropped patch adding xfs_da_geometry to the inode forks as it's not currently needed - cleared up all the "XXX" notations added in the RFC series - fixed several bugs in different patches as a result of incorrect conversions - ensured each patch compiled and passes xfstests individually From dave@fromorbit.com Thu May 22 19:08:01 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04EAF7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B3258304051 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:00 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id bieDAbtFGqRGUDt5 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:58 -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: AmNTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBpo7gQcXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQNdQhVWIdIRMBLBhKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071l-55 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005TB-4G for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 01/16] xfs: introduce directory geometry structure Date: Fri, 23 May 2014 10:03:37 +1000 X-ASG-Orig-Subj: [PATCH 01/16] xfs: introduce directory geometry structure Message-Id: <1400803432-20048-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803678 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The directory code has a dependency on the struct xfs_mount to supply the directory block geometry. Block size, block log size, and other parameters are pre-caclulated in the struct xfs_mount or access directly from the superblock embedded in the struct xfs_mount. Extract all of this geometry information out of the struct xfs_mount and superblock and place it into a new struct xfs_da_geometry defined by the directory code. Allocate and initialise it at mount time, and attach it to the struct xfs_mount so it canbe passed back into the directory code appropriately rather than using the struct xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_leaf.c | 2 ++ fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_da_btree.h | 18 +++++++++++++++ fs/xfs/xfs_dir2.c | 63 ++++++++++++++++++++++++++++++++++++++++---------- fs/xfs/xfs_dir2.h | 2 +- fs/xfs/xfs_mount.c | 18 +++++++++------ fs/xfs/xfs_mount.h | 3 +++ 8 files changed, 88 insertions(+), 20 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 1fc1f06..c547498 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -88,6 +88,7 @@ xfs_attr_args_init( return EINVAL; memset(args, 0, sizeof(*args)); + args->geo = dp->i_mount->m_attr_geo; args->whichfork = XFS_ATTR_FORK; args->dp = dp; args->flags = flags; diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 511c283..2c0fdc8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) memset((char *)&nargs, 0, sizeof(nargs)); nargs.dp = dp; + nargs.geo = args->geo; nargs.firstblock = args->firstblock; nargs.flist = args->flist; nargs.total = args->total; @@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform( * Copy the attributes */ memset((char *)&nargs, 0, sizeof(nargs)); + nargs.geo = args->geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 833fe5d..90e2eeb 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int( xfs_da_args_t args; memset((char *)&args, 0, sizeof(args)); + args.geo = context->dp->i_mount->m_attr_geo; args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index c824a0a..0ac63ad 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -25,6 +25,23 @@ struct xfs_trans; struct zone; struct xfs_dir_ops; +/* + * Directory/attribute geometry information. There will be one of these for each + * data fork type, and it will be passed around via the xfs_da_args. Global + * structures will be attached to the xfs_mount. + */ +struct xfs_da_geometry { + int blksize; /* da block size in bytes */ + int fsbcount; /* da block size in filesystem blocks */ + uint8_t fsblog; /* log2 of _filesystem_ block size */ + uint8_t blklog; /* log2 of da block size */ + uint node_ents; /* # of entries in a danode */ + int magicpct; /* 37% of block size in bytes */ + xfs_dablk_t datablk; /* blockno of dir data v2 */ + xfs_dablk_t leafblk; /* blockno of leaf data v2 */ + xfs_dablk_t freeblk; /* blockno of free data v2 */ +}; + /*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ @@ -42,6 +59,7 @@ enum xfs_dacmp { * Structure to ease passing around component names. */ typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ __uint8_t filetype; /* filetype of inode for directories */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 93fcebd..16c3c4b 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { .compname = xfs_ascii_ci_compname, }; -void -xfs_dir_mount( +int +xfs_da_mount( xfs_mount_t *mp) { - int nodehdr_size; + struct xfs_da_geometry *dageo; + int nodehdr_size; ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); @@ -99,24 +100,56 @@ xfs_dir_mount( mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + if (!mp->m_dir_geo || !mp->m_attr_geo) { + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); + return ENOMEM; + } + + /* set up directory geometry */ + dageo = mp->m_dir_geo; + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; + dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / + dageo->magicpct = (dageo->blksize * 37) / 100; + + /* set up attribute geometry - single fsb only */ + dageo = mp->m_attr_geo; + dageo->blklog = mp->m_sb.sb_blocklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1; + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); + dageo->magicpct = (dageo->blksize * 37) / 100; - mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; if (xfs_sb_version_hasasciici(&mp->m_sb)) mp->m_dirnameops = &xfs_ascii_ci_nameops; else mp->m_dirnameops = &xfs_default_nameops; + /* XXX: these are to be removed as code is converted to use geo */ + mp->m_dirblksize = mp->m_dir_geo->blksize; + mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; + mp->m_dirdatablk = mp->m_dir_geo->datablk; + mp->m_dirleafblk = mp->m_dir_geo->leafblk; + mp->m_dirfreeblk = mp->m_dir_geo->freeblk; + mp->m_dir_node_ents = mp->m_dir_geo->node_ents; + mp->m_dir_magicpct = mp->m_dir_geo->magicpct; + mp->m_attr_node_ents = mp->m_attr_geo->node_ents; + mp->m_attr_magicpct = mp->m_attr_geo->magicpct; + return 0; } /* @@ -192,6 +225,7 @@ xfs_dir_init( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->dp = dp; args->trans = tp; error = xfs_dir2_sf_create(args, pdp->i_ino); @@ -226,6 +260,7 @@ xfs_dir_createname( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -320,6 +355,7 @@ xfs_dir_lookup( * annotations into the reclaim path for the ilock. */ args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -391,6 +427,7 @@ xfs_dir_removename( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -455,6 +492,7 @@ xfs_dir_replace( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -516,6 +554,7 @@ xfs_dir_canenter( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 64a6b19..7b09ef0 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -112,7 +112,7 @@ extern const struct xfs_dir_ops * * Generic directory interface routines */ extern void xfs_dir_startup(void); -extern void xfs_dir_mount(struct xfs_mount *mp); +extern int xfs_da_mount(struct xfs_mount *mp); extern int xfs_dir_isempty(struct xfs_inode *dp); extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_inode *pdp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8dbd718..8d1afb8 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -784,12 +784,11 @@ xfs_mountfs( mp->m_dmevmask = 0; /* not persistent; set after each mount */ - xfs_dir_mount(mp); - - /* - * Initialize the attribute manager's entries. - */ - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize * 37) / 100; + error = xfs_da_mount(mp); + if (error) { + xfs_warn(mp, "Failed dir/attr init: %d", error); + goto out_remove_uuid; + } /* * Initialize the precomputed transaction reservations values. @@ -804,7 +803,7 @@ xfs_mountfs( error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { xfs_warn(mp, "Failed per-ag init: %d", error); - goto out_remove_uuid; + goto out_free_dir; } if (!sbp->sb_logblocks) { @@ -986,6 +985,9 @@ xfs_mountfs( xfs_wait_buftarg(mp->m_ddev_targp); out_free_perag: xfs_free_perag(mp); + out_free_dir: + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); out_remove_uuid: xfs_uuid_unmount(mp); out: @@ -1072,6 +1074,8 @@ xfs_unmountfs( #if defined(DEBUG) xfs_errortag_clearall(mp, 0); #endif + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); xfs_free_perag(mp); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b7f1cfb..01b25e41 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -27,6 +27,7 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; struct xfs_dir_ops; +struct xfs_da_geometry; #ifdef HAVE_PERCPU_SB @@ -96,6 +97,8 @@ typedef struct xfs_mount { uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ uint m_writeio_blocks; /* min write size blocks */ + struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ + struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ struct xlog *m_log; /* log specific stuff */ int m_logbufs; /* number of log buffers */ int m_logbsize; /* size of each log buffer */ -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:01 2014 Return-Path: <dave@fromorbit.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 617387F53 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3C9488F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:01 -0700 (PDT) X-ASG-Debug-ID: 1400803677-04cbb006da268cd0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id UB5HARyTWJtE2RRB for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:59 -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: AlhTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBAQQnLzMIGDE5AwcUGYhA11CFVYkWhCoEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071u-9s for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Tu-94 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry Date: Fri, 23 May 2014 10:03:46 +1000 X-ASG-Orig-Subj: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry Message-Id: <1400803432-20048-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803679 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_dir2.c | 2 -- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_mount.h | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 2c0fdc8..5be77b3 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1949,7 +1949,7 @@ xfs_attr3_leaf_remove( tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + ichdr.count * sizeof(xfs_attr_leaf_entry_t); - return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ + return tmp < args->geo->magicpct; /* leaf is < 37% full */ } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index be7ad35..0230342 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -146,9 +146,7 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; - mp->m_attr_magicpct = mp->m_attr_geo->magicpct; return 0; } diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index ef34c19..de5b2996 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1312,7 +1312,7 @@ xfs_dir2_leafn_remove( */ *rval = (dp->d_ops->leaf_hdr_size + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < - mp->m_dir_magicpct; + args->geo->magicpct; return 0; } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index bf108a7..3b690c36 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -148,8 +148,6 @@ typedef struct xfs_mount { int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:02 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5F7ED7F53 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B782BAC004 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:58 -0700 (PDT) X-ASG-Debug-ID: 1400803675-04cb6c5d0c27cfb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id r00nyN1BB2QxPiOf for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:56 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071o-6c for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005TQ-5m for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry Date: Fri, 23 May 2014 10:03:40 +1000 X-ASG-Orig-Subj: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry Message-Id: <1400803432-20048-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803675 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 18 +++++++++--------- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 7 ++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 6d13fd6..e9496a9 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -204,10 +204,9 @@ xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) * Convert byte in space to offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); + return (xfs_dir2_data_aoff_t)(by & (geo->blksize - 1)); } /* @@ -216,18 +215,17 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) static inline xfs_dir2_data_aoff_t xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); } /* * Convert block and offset to byte in space */ static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; + return ((xfs_dir2_off_t)db << geo->blklog) + o; } /* @@ -255,7 +253,8 @@ static inline xfs_dir2_dataptr_t xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); + return xfs_dir2_byte_to_dataptr( + xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); } /* @@ -273,7 +272,8 @@ xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) static inline xfs_dir2_off_t xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(mp->m_dir_geo, + xfs_dir2_da_to_db(mp, da), 0); } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 1268dae..a7d3884 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -741,7 +741,7 @@ xfs_dir2_shrink_inode( /* * If the block isn't the last one in the directory, we're done. */ - if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(mp, db + 1, 0)) + if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0)) return 0; bno = da; if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) { diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index bf7a5ce..ec912c8 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -560,7 +560,8 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp, map_info->curdb, 0); + newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + map_info->curdb, 0); /* * Start of the current block. */ @@ -578,7 +579,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp, curoff); + byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); /* * Skip past the header. */ @@ -607,7 +608,7 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp, + xfs_dir2_db_off_to_byte(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:03 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 15F5B7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2DDE304051 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:59 -0700 (PDT) X-ASG-Debug-ID: 1400803677-04cbb006da268cd0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id kZTHRUFnEysIBrA7 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:57 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071n-67 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005TL-5D for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Date: Fri, 23 May 2014 10:03:39 +1000 X-ASG-Orig-Subj: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Message-Id: <1400803432-20048-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803677 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> They are just simple wrappers around xfs_dir2_byte_to_db(), and we've already removed one usage earlier in the patch set. Kill the rest before we start removing the xfs_mount from conversion functions. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_format.c | 6 ++++-- fs/xfs/xfs_da_format.h | 6 ------ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 9 +++++---- fs/xfs/xfs_dir2_node.c | 11 +++++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 22bbc79..313eea3 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -610,7 +610,8 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(mp)); } /* @@ -641,7 +642,8 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(mp)); } /* diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 32b415c..44d7fac 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -330,8 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_DATA_SPACE 0 #define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) /* * Describe a free area in the data block. @@ -456,8 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) */ #define XFS_DIR2_LEAF_SPACE 1 #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) /* * Leaf block header. @@ -531,8 +527,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) */ #define XFS_DIR2_FREE_SPACE 2 #define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) typedef struct xfs_dir2_free_hdr { __be32 magic; /* XFS_DIR2_FREE_MAGIC */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 16c3c4b..1268dae 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -736,7 +736,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= XFS_DIR2_LEAF_FIRSTDB(mp)) + if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index f571723..dc4ef19 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(mp, blkno); - ASSERT(ldb == XFS_DIR2_LEAF_FIRSTDB(mp)); + ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -1798,7 +1798,8 @@ xfs_dir2_node_to_leaf( /* * Get rid of the freespace block. */ - error = xfs_dir2_shrink_inode(args, XFS_DIR2_FREE_FIRSTDB(mp), fbp); + error = xfs_dir2_shrink_inode(args, + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 9cb91ee..1bcaaa0 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -315,7 +315,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -1256,7 +1256,7 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1747,7 +1747,8 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = XFS_DIR2_FREE_FIRSTDB(mp); + fbno = xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. */ @@ -1887,7 +1888,9 @@ xfs_dir2_node_addname_int( /* * Remember the first slot as our empty slot. */ - freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * + freehdr.firstdb = + (fbno - xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { free = fbp->b_addr; -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:03 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 828187F53 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AE80304064 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:03 -0700 (PDT) X-ASG-Debug-ID: 1400803675-04cb6c5d0c27cfb0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4oDWG2b3JCU08Pj7 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:07:59 -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: AmRTALyQflN5LL1sPGdsb2JhbABZgwdSh3miQwEBAQEBAQabQhcDAQEBATg1giUBAQUaDS8zCBgxOQMHFBmIQNdQhVWNQASbLolai1kr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071q-7e for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Ta-6j for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry Date: Fri, 23 May 2014 10:03:42 +1000 X-ASG-Orig-Subj: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry Message-Id: <1400803432-20048-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803679 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 22 ++++++++++------------ fs/xfs/xfs_da_format.c | 4 ++-- fs/xfs/xfs_dir2.c | 13 +++++++++---- fs/xfs/xfs_dir2_block.c | 15 +++++++++------ fs/xfs/xfs_dir2_data.c | 3 ++- fs/xfs/xfs_dir2_leaf.c | 30 +++++++++++++++++------------- fs/xfs/xfs_dir2_node.c | 27 ++++++++++++++++----------- fs/xfs/xfs_dir2_readdir.c | 45 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_dir2_sf.c | 4 ++-- 9 files changed, 93 insertions(+), 70 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 8db83fc..d35b31f 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -185,19 +185,18 @@ xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) * Convert byte in space to (DB) block */ static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_db(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); + return (xfs_dir2_db_t)(by >> geo->blklog); } /* * Convert dataptr to a block number */ static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_db(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_db(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -213,9 +212,9 @@ xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) * Convert dataptr to a byte offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_off(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -241,20 +240,19 @@ xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) * Convert byte in space to (DA) block */ static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_da(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(geo, xfs_dir2_byte_to_db(geo, by)); } /* * Convert block and offset to dataptr */ static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_dataptr(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr( - xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(geo, db, o)); } /* diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 313eea3..c782f2c 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -610,7 +610,7 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir2_free_max_bests(mp)); } @@ -642,7 +642,7 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir3_free_max_bests(mp)); } diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index f76008c..0bd3468 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -117,9 +117,14 @@ xfs_da_mount( dageo->fsblog = mp->m_sb.sb_blocklog; dageo->blksize = 1 << dageo->blklog; dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; - dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); - dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); - dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + + /* + * Now we've set up the block conversion variables, we can calculate the + * segment block constants using the geometry structure. + */ + dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET); dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); dageo->magicpct = (dageo->blksize * 37) / 100; @@ -736,7 +741,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) + if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index dd9d005..bc08216 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -639,7 +639,8 @@ xfs_dir2_block_lookup( * Get the offset from the leaf entry, to point to the data. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Fill in inode number, CI name if appropriate, release the block. */ @@ -723,7 +724,7 @@ xfs_dir2_block_lookup_int( * Get pointer to the entry from the leaf. */ dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr)); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -795,8 +796,9 @@ xfs_dir2_block_removename( /* * Point to the data entry using the leaf entry. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Mark the data entry's space free. */ @@ -870,8 +872,9 @@ xfs_dir2_block_replace( /* * Point to the data entry we need to change. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); ASSERT(be64_to_cpu(dep->inumber) != args->inumber); /* * Change the inode number to the new value. diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 890c940..d355ec7 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -172,7 +172,8 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, + mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); name.name = dep->name; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 046ba4a..2b3ddd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && - bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(args->geo, blkno); - ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); + ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -670,7 +670,7 @@ xfs_dir2_leaf_addname( index++, lep++) { if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) continue; - i = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(i < be32_to_cpu(ltp->bestcount)); ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF)); if (be16_to_cpu(bestsp[i]) >= length) { @@ -889,7 +889,8 @@ xfs_dir2_leaf_addname( * Fill in the new leaf entry. */ lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, use_block, + lep->address = cpu_to_be32( + xfs_dir2_db_off_to_dataptr(args->geo, use_block, be16_to_cpu(*tagp))); /* * Log the leaf fields and give up the buffers. @@ -1185,7 +1186,7 @@ xfs_dir2_leaf_lookup( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); /* * Return the found inode number & CI name if appropriate */ @@ -1260,7 +1261,8 @@ xfs_dir2_leaf_lookup_int( /* * Get the new data block number. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * If it's not the same as the old data block number, * need to pitch the old one and read the new one. @@ -1281,7 +1283,8 @@ xfs_dir2_leaf_lookup_int( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -1380,9 +1383,9 @@ xfs_dir2_leaf_removename( * Point to the leaf entry, use that to point to the data entry. */ lep = &ents[index]; - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); ltp = xfs_dir2_leaf_tail_p(mp, leaf); @@ -1515,7 +1518,7 @@ xfs_dir2_leaf_replace( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); ASSERT(args->inumber != be64_to_cpu(dep->inumber)); /* * Put the new inode number in, log it. @@ -1800,7 +1803,8 @@ xfs_dir2_node_to_leaf( * Get rid of the freespace block. */ error = xfs_dir2_shrink_inode(args, - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); + xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET), + fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 3b70d56..89777bf 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -316,7 +316,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(fdb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -451,7 +451,7 @@ xfs_dir2_leafn_add( highstale, &lfloglow, &lfloghigh); lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, + lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo, args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); @@ -577,7 +577,8 @@ xfs_dir2_leafn_lookup_for_addname( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * For addname, we're looking for a place to put the new entry. * We want to use a data block with an entry of equal @@ -723,7 +724,8 @@ xfs_dir2_leafn_lookup_for_entry( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * Not adding a new entry, so we really want to find * the name given to us. @@ -761,7 +763,8 @@ xfs_dir2_leafn_lookup_for_entry( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare the entry and if it's an exact match, return * EEXIST immediately. If it's the first case-insensitive @@ -1196,9 +1199,9 @@ xfs_dir2_leafn_remove( /* * Extract the data block and offset from the entry. */ - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->blkno == db); - off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); + off = xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->index == off); /* @@ -1260,7 +1263,8 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); + (fdb - xfs_dir2_byte_to_db(args->geo, + XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1751,7 +1755,7 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = xfs_dir2_byte_to_db(mp, + fbno = xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. @@ -1893,7 +1897,7 @@ xfs_dir2_node_addname_int( * Remember the first slot as our empty slot. */ freehdr.firstdb = - (fbno - xfs_dir2_byte_to_db(mp, + (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { @@ -2194,7 +2198,8 @@ xfs_dir2_node_replace( hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + - xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); ASSERT(inum != be64_to_cpu(dep->inumber)); /* * Fill in the new inode number and log the entry. diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 57e9247..c2a6387 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -87,8 +87,10 @@ xfs_dir2_sf_getdents( xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* @@ -109,7 +111,7 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; /* @@ -118,9 +120,9 @@ xfs_dir2_sf_getdents( * XXX(hch): the second argument is sometimes 0 and sometimes * mp->m_dirdatablk. */ - dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dotdot_offset); /* @@ -149,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -166,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; return 0; } @@ -190,12 +192,14 @@ xfs_dir2_block_getdents( char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -206,7 +210,7 @@ xfs_dir2_block_getdents( * Extract the byte offset we start at from the seek pointer. * We'll skip entries before this. */ - wantoff = xfs_dir2_dataptr_to_off(mp, ctx->pos); + wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); /* @@ -244,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -264,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; @@ -300,6 +304,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * If we have a buffer, we need to release it and @@ -342,14 +347,14 @@ xfs_dir2_leaf_readbuf( * run out of data blocks, get some more mappings. */ if (1 + mip->ra_want > mip->map_blocks && - mip->map_off < xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET)) { + mip->map_off < xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET)) { /* * Get more bmaps, fill in after the ones * we already have in the table. */ mip->nmap = mip->map_size - mip->map_valid; error = xfs_bmapi_read(dp, mip->map_off, - xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) - + xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET) - mip->map_off, &map[mip->map_valid], &mip->nmap, 0); @@ -370,7 +375,7 @@ xfs_dir2_leaf_readbuf( i = mip->map_valid + mip->nmap - 1; mip->map_off = map[i].br_startoff + map[i].br_blockcount; } else - mip->map_off = xfs_dir2_byte_to_da(mp, + mip->map_off = xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET); /* @@ -396,14 +401,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); + *curoff = xfs_dir2_da_to_byte(geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -504,6 +509,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; + struct xfs_da_geometry *geo; /* * If the offset is at or past the largest allowed value, @@ -513,6 +519,7 @@ xfs_dir2_leaf_getdents( return 0; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * Set up to bmap a number of blocks based on the caller's @@ -536,8 +543,8 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff)); + map_info->map_off = xfs_dir2_db_to_da(geo, + xfs_dir2_byte_to_db(geo, curoff)); /* * Loop over directory entries until we reach the end offset. @@ -571,7 +578,7 @@ xfs_dir2_leaf_getdents( * Make sure we're in the right block. */ else if (curoff > newoff) - ASSERT(xfs_dir2_byte_to_db(mp, curoff) == + ASSERT(xfs_dir2_byte_to_db(geo, curoff) == map_info->curdb); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); @@ -608,8 +615,8 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff), + xfs_dir2_db_off_to_byte(geo, + xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { continue; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 7aab8ec..4dc4193 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -104,8 +104,8 @@ xfs_dir2_block_sfsize( /* * Calculate the pointer to the entry at hand. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:03 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 69ECA7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2B5BAC005 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:02 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id aoZP8YFzOdHSg2zF for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:00 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071s-8s for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Tk-84 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry Date: Fri, 23 May 2014 10:03:44 +1000 X-ASG-Orig-Subj: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry Message-Id: <1400803432-20048-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803680 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.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJECT_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.13 SUBJECT_NOVOWEL Subject: has long non-vowel letter sequence From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_bmap.c | 3 ++- fs/xfs/xfs_da_btree.c | 24 ++++++++---------------- fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2_leaf.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 16 ++++++++-------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_symlink.c | 1 + fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_trans_space.h | 5 +++-- 9 files changed, 27 insertions(+), 33 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..96175df 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1098,10 +1098,11 @@ xfs_bmap_add_attrfork_local( if (S_ISDIR(ip->i_d.di_mode)) { memset(&dargs, 0, sizeof(dargs)); + dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip; dargs.firstblock = firstblock; dargs.flist = flist; - dargs.total = ip->i_mount->m_dirblkfsbs; + dargs.total = dargs.geo->fsbcount; dargs.whichfork = XFS_DATA_FORK; dargs.trans = tp; return xfs_dir2_sf_to_block(&dargs); diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 8621202..4d0a1e8 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2090,20 +2090,12 @@ xfs_da_grow_inode( xfs_dablk_t *new_blkno) { xfs_fileoff_t bno; - int count; int error; trace_xfs_da_grow_inode(args); - if (args->whichfork == XFS_DATA_FORK) { - bno = args->geo->leafblk; - count = args->dp->i_mount->m_dirblkfsbs; - } else { - bno = 0; - count = 1; - } - - error = xfs_da_grow_inode_int(args, &bno, count); + bno = args->geo->leafblk; + error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount); if (!error) *new_blkno = (xfs_dablk_t)bno; return error; @@ -2170,7 +2162,7 @@ xfs_da3_swap_lastblock( /* * Read the last block in the btree space. */ - last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; + last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount; error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); if (error) return error; @@ -2357,10 +2349,7 @@ xfs_da_shrink_inode( w = args->whichfork; tp = args->trans; mp = dp->i_mount; - if (w == XFS_DATA_FORK) - count = mp->m_dirblkfsbs; - else - count = 1; + count = args->geo->fsbcount; for (;;) { /* * Remove extents. If we get ENOSPC for a dir we have to move @@ -2479,7 +2468,10 @@ xfs_dabuf_map( ASSERT(map && *map); ASSERT(*nmaps == 1); - nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; + if (whichfork == XFS_DATA_FORK) + nfsb = mp->m_dir_geo->fsbcount; + else + nfsb = mp->m_attr_geo->fsbcount; /* * Caller doesn't have a mapping. -2 means don't complain diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index fc09a11..200c9c4 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -146,7 +146,6 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; - mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -620,7 +619,7 @@ xfs_dir2_grow_inode( * Set lowest possible block in the space requested. */ bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); - count = mp->m_dirblkfsbs; + count = args->geo->fsbcount; error = xfs_da_grow_inode_int(args, &bno, count); if (error) @@ -711,7 +710,7 @@ xfs_dir2_shrink_inode( /* * Unmap the fsblock(s). */ - if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, + if ((error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, &done))) { /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 3eb8b24..a1f1310 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1715,7 +1715,7 @@ xfs_dir2_node_to_leaf( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { return error; } - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; /* * If there are freespace blocks other than the first one, * take this opportunity to remove trailing empty freespace blocks @@ -1727,7 +1727,7 @@ xfs_dir2_node_to_leaf( return error; } if (rval) - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; else return 0; } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 0c8c09c..8cb5340 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -314,12 +314,12 @@ xfs_dir2_leaf_readbuf( if (bp) { xfs_trans_brelse(NULL, bp); bp = NULL; - mip->map_blocks -= mp->m_dirblkfsbs; + mip->map_blocks -= geo->fsbcount; /* * Loop to get rid of the extents for the * directory block. */ - for (i = mp->m_dirblkfsbs; i > 0; ) { + for (i = geo->fsbcount; i > 0; ) { j = min_t(int, map->br_blockcount, i); map->br_blockcount -= j; map->br_startblock += j; @@ -410,7 +410,7 @@ xfs_dir2_leaf_readbuf( */ mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, - map->br_blockcount >= mp->m_dirblkfsbs ? + map->br_blockcount >= geo->fsbcount ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); /* @@ -424,7 +424,7 @@ xfs_dir2_leaf_readbuf( * was previously ra. */ if (mip->ra_current) - mip->ra_current -= mp->m_dirblkfsbs; + mip->ra_current -= geo->fsbcount; /* * Do we need more readahead? @@ -432,13 +432,13 @@ xfs_dir2_leaf_readbuf( blk_start_plug(&plug); for (mip->ra_index = mip->ra_offset = i = 0; mip->ra_want > mip->ra_current && i < mip->map_blocks; - i += mp->m_dirblkfsbs) { + i += geo->fsbcount) { ASSERT(mip->ra_index < mip->map_valid); /* * Read-ahead a contiguous directory block. */ if (i > mip->ra_current && - map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { + map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, XFS_FSB_TO_DADDR(mp, @@ -461,12 +461,12 @@ xfs_dir2_leaf_readbuf( /* * Advance offset through the mapping table. */ - for (j = 0; j < mp->m_dirblkfsbs; j += length ) { + for (j = 0; j < geo->fsbcount; j += length ) { /* * The rest of this extent but not more than a dir * block. */ - length = min_t(int, mp->m_dirblkfsbs, + length = min_t(int, geo->fsbcount, map[mip->ra_index].br_blockcount - mip->ra_offset); mip->ra_offset += length; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 264e210..275fed3 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -155,7 +155,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 0816b40..d69363c 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -27,6 +27,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_dir2.h" #include "xfs_inode.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 52b6c3e..63a42a1 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -26,6 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index df4c1f8..bf9c457 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -28,7 +28,8 @@ (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ XFS_EXTENTADD_SPACE_RES(mp,w)) -#define XFS_DAENTER_1B(mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) +#define XFS_DAENTER_1B(mp,w) \ + ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) #define XFS_DAENTER_DBS(mp,w) \ (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) #define XFS_DAENTER_BLOCKS(mp,w) \ @@ -55,7 +56,7 @@ * Space reservation values for various transactions. */ #define XFS_ADDAFORK_SPACE_RES(mp) \ - ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) + ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) #define XFS_ATTRRM_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) /* This macro is not used - see inline code in xfs_attr_set */ -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:05 2014 Return-Path: <dave@fromorbit.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 4B8A27F6C for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2697A8F8039 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:04 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id mMJ4Cl2Rp2IeCNkA for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:02 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-000727-Cy for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005UJ-Bi for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Date: Fri, 23 May 2014 10:03:51 +1000 X-ASG-Orig-Subj: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Message-Id: <1400803432-20048-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803681 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> As it's only ever called from contexts where the xfs_da_args is present and contains all the information needed inside the args structure. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 4 +--- fs/xfs/xfs_attr_leaf.c | 47 +++++++++++++++++------------------------------ fs/xfs/xfs_attr_leaf.h | 3 +-- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ccfc2c9..3d8c03e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -174,9 +174,7 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, local); - + size = xfs_attr_leaf_newentsize(args, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { if (size > (args->geo->blksize / 2)) { diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 88cd84a..7761103 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1076,8 +1076,7 @@ xfs_attr3_leaf_add( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); - entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL); + entsize = xfs_attr_leaf_newentsize(args, NULL); /* * Search through freemap for first-fit on new name length. @@ -1179,14 +1178,11 @@ xfs_attr3_leaf_add_work( ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL)); + xfs_attr_leaf_newentsize(args, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); - ichdr->freemap[mapindex].size -= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, &tmp); + ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); @@ -1594,9 +1590,7 @@ xfs_attr3_leaf_figure_balance( max = ichdr1->count + ichdr2->count; half = (max + 1) * sizeof(*entry); half += ichdr1->usedbytes + ichdr2->usedbytes + - xfs_attr_leaf_newentsize(state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); half /= 2; lastdelta = state->blocksize; entry = xfs_attr3_leaf_entryp(leaf1); @@ -1608,10 +1602,7 @@ xfs_attr3_leaf_figure_balance( */ if (count == blk1->index) { tmp = totallen + sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); if (XFS_ATTR_ABS(half - tmp) > lastdelta) break; lastdelta = XFS_ATTR_ABS(half - tmp); @@ -1647,10 +1638,7 @@ xfs_attr3_leaf_figure_balance( totallen -= count * sizeof(*entry); if (foundit) { totallen -= sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); } *countarg = count; @@ -2441,22 +2429,21 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) * a "local" or a "remote" attribute. */ int -xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) +xfs_attr_leaf_newentsize( + struct xfs_da_args *args, + int *local) { - int size; + int size; - size = xfs_attr_leaf_entsize_local(namelen, valuelen); - if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { - if (local) { + size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen); + if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) { + if (local) *local = 1; - } - } else { - size = xfs_attr_leaf_entsize_remote(namelen); - if (local) { - *local = 0; - } + return size; } - return size; + if (local) + *local = 0; + return xfs_attr_leaf_entsize_remote(args->namelen); } diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index 3ec5ec0..e2929da 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -96,8 +96,7 @@ int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); -int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, - int *local); +int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:05 2014 Return-Path: <dave@fromorbit.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 E8ABC7F7C for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFB188F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:04 -0700 (PDT) X-ASG-Debug-ID: 1400803675-04cb6c5d0c27cfb0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id h0SYj1RfLk42m0Mg for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:02 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071m-5W for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005TG-4k for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Date: Fri, 23 May 2014 10:03:38 +1000 X-ASG-Orig-Subj: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-Id: <1400803432-20048-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803681 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Because they aren't actually part of the on-disk format, and so shouldn't be in xfs_da_format.h. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.c | 1 + fs/xfs/xfs_da_format.h | 138 ------------------------------------------------- 3 files changed, 138 insertions(+), 138 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0ac63ad..6d13fd6 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -157,6 +157,143 @@ struct xfs_nameops { }; +/* + * Directory offset/block conversion functions. + * + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Directory tail pointer accessor functions. Based on block geometry. + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + /*======================================================================== * Function prototypes. *========================================================================*/ diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index e6c83e1..22bbc79 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -26,6 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 1432b57..32b415c 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -514,17 +514,6 @@ struct xfs_dir3_leaf { #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) /* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* * Get address of the bests array in the single-leaf block. */ static inline __be16 * @@ -534,123 +523,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } /* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* * Free space block defintions for the node format. */ @@ -736,16 +608,6 @@ typedef struct xfs_dir2_block_tail { } xfs_dir2_block_tail_t; /* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* * Pointer to the leaf entries embedded in a data block (1-block format) */ static inline struct xfs_dir2_leaf_entry * -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:04 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0DA947F66 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54C9EAC004 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:03 -0700 (PDT) X-ASG-Debug-ID: 1400803677-04cbb006da268cd0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id umTM7kGbdC7rURtM for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:01 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071p-73 for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005TV-6H for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Date: Fri, 23 May 2014 10:03:41 +1000 X-ASG-Orig-Subj: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Message-Id: <1400803432-20048-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803680 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.h | 15 +++++++-------- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_data.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ fs/xfs/xfs_dir2_readdir.c | 6 +++--- 6 files changed, 48 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index e9496a9..8db83fc 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -232,9 +232,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, * Convert block (DB) to block (dablk) */ static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); + return (xfs_dablk_t)(db << (geo->blklog - geo->fsblog)); } /* @@ -243,7 +243,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) static inline xfs_dablk_t xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); } /* @@ -261,19 +261,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, * Convert block (dablk) to block (DB) */ static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_db(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); + return (xfs_dir2_db_t)(da >> (geo->blklog - geo->fsblog)); } /* * Convert block (dablk) to byte offset in space */ static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(geo, xfs_dir2_da_to_db(geo, da), 0); } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index a7d3884..f76008c 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -624,7 +624,7 @@ xfs_dir2_grow_inode( if (error) return error; - *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); + *dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno); /* * Update file's size if this is the data space and it grew. @@ -705,7 +705,7 @@ xfs_dir2_shrink_inode( dp = args->dp; mp = dp->i_mount; tp = args->trans; - da = xfs_dir2_db_to_da(mp, db); + da = xfs_dir2_db_to_da(args->geo, db); /* * Unmap the fsblock(s). */ diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index bae8b5b..890c940 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -584,8 +584,8 @@ xfs_dir3_data_init( /* * Get the buffer set up for the block. */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, blkno), + -1, &bp, XFS_DATA_FORK); if (error) return error; bp->b_ops = &xfs_dir3_data_buf_ops; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index dc4ef19..046ba4a 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -350,8 +350,8 @@ xfs_dir3_leaf_get_buf( ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), + -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -403,7 +403,7 @@ xfs_dir2_block_to_leaf( if ((error = xfs_da_grow_inode(args, &blkno))) { return error; } - ldb = xfs_dir2_da_to_db(mp, blkno); + ldb = xfs_dir2_da_to_db(args->geo, blkno); ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. @@ -828,8 +828,8 @@ xfs_dir2_leaf_addname( * Just read that one in. */ error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, use_block), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, use_block), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1269,8 +1269,8 @@ xfs_dir2_leaf_lookup_int( if (dbp) xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, newdb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1310,8 +1310,8 @@ xfs_dir2_leaf_lookup_int( if (cidb != curdb) { xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, cidb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, cidb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1609,7 +1609,8 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(args->geo, db), + -1, &dbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 1bcaaa0..3b70d56 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -195,17 +195,18 @@ xfs_dir2_free_try_read( static int xfs_dir3_free_get_buf( - struct xfs_trans *tp, - struct xfs_inode *dp, + xfs_da_args_t *args, xfs_dir2_db_t fbno, struct xfs_buf **bpp) { + struct xfs_trans *tp = args->trans; + struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; struct xfs_buf *bp; int error; struct xfs_dir3_icfree_hdr hdr; - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -319,7 +320,7 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - error = xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); + error = xfs_dir3_free_get_buf(args, fdb, &fbp); if (error) return error; @@ -605,7 +606,8 @@ xfs_dir2_leafn_lookup_for_addname( xfs_trans_brelse(tp, curbp); error = xfs_dir2_free_read(tp, dp, - xfs_dir2_db_to_da(mp, newfdb), + xfs_dir2_db_to_da(args->geo, + newfdb), &curbp); if (error) return error; @@ -746,7 +748,8 @@ xfs_dir2_leafn_lookup_for_entry( curbp = state->extrablk.bp; } else { error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), + xfs_dir2_db_to_da(args->geo, + newdb), -1, &curbp); if (error) return error; @@ -1246,7 +1249,8 @@ xfs_dir2_leafn_remove( * read in the free block. */ fdb = dp->d_ops->db_to_fdb(mp, db); - error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), + error = xfs_dir2_free_read(tp, dp, + xfs_dir2_db_to_da(args->geo, fdb), &fbp); if (error) return error; @@ -1336,7 +1340,7 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(args->geo, blkno), &newblk->bp, XFS_DIR2_LEAFN_MAGIC); if (error) return error; @@ -1729,7 +1733,7 @@ xfs_dir2_node_addname_int( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) return error; - lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); + lastfbno = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo); fbno = ifbno; } /* @@ -1766,8 +1770,8 @@ xfs_dir2_node_addname_int( * to avoid it. */ error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; if (!fbp) @@ -1837,8 +1841,8 @@ xfs_dir2_node_addname_int( */ fbno = dp->d_ops->db_to_fdb(mp, dbno); error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; @@ -1878,7 +1882,7 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - error = xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); + error = xfs_dir3_free_get_buf(args, fbno, &fbp); if (error) return error; free = fbp->b_addr; @@ -1946,7 +1950,8 @@ xfs_dir2_node_addname_int( /* * Read the data block in. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + error = xfs_dir3_data_read(tp, dp, + xfs_dir2_db_to_da(args->geo, dbno), -1, &dbp); if (error) return error; @@ -2265,9 +2270,9 @@ xfs_dir2_node_trim_free( /* * Blow the block away. */ - if ((error = - xfs_dir2_shrink_inode(args, xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo), - bp))) { + error = xfs_dir2_shrink_inode(args, + xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo), bp); + if (error) { /* * Can't fail with ENOSPC since that only happens with no * space reservation, when breaking up an extent into two diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index ec912c8..57e9247 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -396,14 +396,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp, mip->map_off); + *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -536,7 +536,7 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp, + map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff)); /* -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:06 2014 Return-Path: <dave@fromorbit.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 83B5A7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B2A68F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:06 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0006-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CY1d31Iu5b5y4GJ9 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:03 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAEpQiLWSuBMSQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071z-BH for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005U4-AF for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Date: Fri, 23 May 2014 10:03:48 +1000 X-ASG-Orig-Subj: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Message-Id: <1400803432-20048-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803683 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> There are many places in the directory code were we don't pass the args into and so have to extract the geometry direct from the mount structure. Push the args or the geometry into these leaf functions so that we don't need to grab it from the struct xfs_mount. This, in turn, brings use to the point where directory geometry is no longer a property of the struct xfs_mount; it is not a global property anymore, and hence we can start to consider per-directory configuration of physical geometries. Start by converting the xfs_dir_isblock/leaf code - pass in the xfs_da_args and convert the readdir code to use xfs_da_args like the rest of the directory code to pass information around. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_dir2.c | 50 ++++++++++------------ fs/xfs/xfs_dir2.h | 4 +- fs/xfs/xfs_dir2_readdir.c | 105 ++++++++++++++++++++++------------------------ 3 files changed, 74 insertions(+), 85 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 90d426d..48ad8b7 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -274,7 +274,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -282,7 +282,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -367,7 +367,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -375,7 +375,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -440,7 +440,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -448,7 +448,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -505,7 +505,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -513,7 +513,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -565,7 +565,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -573,7 +573,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -641,18 +641,16 @@ xfs_dir2_grow_inode( */ int xfs_dir2_isblock( - xfs_inode_t *dp, - int *vp) /* out: 1 is block, 0 is not block */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); + rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; + ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); *vp = rval; return 0; } @@ -662,17 +660,15 @@ xfs_dir2_isblock( */ int xfs_dir2_isleaf( - xfs_inode_t *dp, - int *vp) /* out: 1 is leaf, 0 is not leaf */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == args->geo->leafblk + args->geo->fsbcount; return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 85f6be6..f2f6bb8 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -144,8 +144,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); +extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); +extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index fa393d5..6a120ca 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -76,28 +76,24 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { STATIC int xfs_dir2_sf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx) { int i; /* shortform entry number */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_dataptr_t off; /* current entry's offset */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; - struct xfs_da_geometry *geo; - - mp = dp->i_mount; - geo = mp->m_dir_geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* * Give up if the directory is way too short. */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); + ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); return XFS_ERROR(EIO); } @@ -111,7 +107,7 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) return 0; /* @@ -120,9 +116,9 @@ xfs_dir2_sf_getdents( * XXX(hch): the second argument is sometimes 0 and sometimes * geo->datablk */ - dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + dot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, dp->d_ops->data_dotdot_offset); /* @@ -151,7 +147,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + off = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -163,13 +159,13 @@ xfs_dir2_sf_getdents( filetype = dp->d_ops->sf_get_ftype(sfep); ctx->pos = off & 0x7fffffff; if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) return 0; sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, + args->geo->datablk + 1, 0) & 0x7fffffff; return 0; } @@ -178,9 +174,10 @@ xfs_dir2_sf_getdents( */ STATIC int xfs_dir2_block_getdents( - xfs_inode_t *dp, /* incore inode */ + struct xfs_da_args *args, struct dir_context *ctx) { + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_data_hdr_t *hdr; /* block header */ struct xfs_buf *bp; /* buffer for block */ xfs_dir2_block_tail_t *btp; /* block tail */ @@ -188,18 +185,14 @@ xfs_dir2_block_getdents( xfs_dir2_data_unused_t *dup; /* block unused entry */ char *endptr; /* end of the data entries */ int error; /* error return value */ - xfs_mount_t *mp; /* filesystem mount point */ char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; - struct xfs_da_geometry *geo; - mp = dp->i_mount; - geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -210,13 +203,13 @@ xfs_dir2_block_getdents( * Extract the byte offset we start at from the seek pointer. * We'll skip entries before this. */ - wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); + wantoff = xfs_dir2_dataptr_to_off(args->geo, ctx->pos); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); /* * Set up values for the loop. */ - btp = xfs_dir2_block_tail_p(geo, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); @@ -248,7 +241,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + cook = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -258,7 +251,7 @@ xfs_dir2_block_getdents( */ if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) { + xfs_dir3_get_dtype(dp->i_mount, filetype))) { xfs_trans_brelse(NULL, bp); return 0; } @@ -268,8 +261,8 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, + args->geo->datablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; } @@ -290,13 +283,13 @@ struct xfs_dir2_leaf_map_info { STATIC int xfs_dir2_leaf_readbuf( - struct xfs_inode *dp, + struct xfs_da_args *args, size_t bufsize, struct xfs_dir2_leaf_map_info *mip, xfs_dir2_off_t *curoff, struct xfs_buf **bpp) { - struct xfs_mount *mp = dp->i_mount; + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = *bpp; struct xfs_bmbt_irec *map = mip->map; struct blk_plug plug; @@ -304,7 +297,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; - struct xfs_da_geometry *geo = mp->m_dir_geo; + struct xfs_da_geometry *geo = args->geo; /* * If we have a buffer, we need to release it and @@ -314,7 +307,7 @@ xfs_dir2_leaf_readbuf( if (bp) { xfs_trans_brelse(NULL, bp); bp = NULL; - mip->map_blocks -= geo->fsbcount; + mip->map_blocks -= args->geo->fsbcount; /* * Loop to get rid of the extents for the * directory block. @@ -338,8 +331,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + geo->blksize, - mp->m_sb.sb_blocksize) - 1; + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; ASSERT(mip->ra_want >= 0); /* @@ -411,8 +403,8 @@ xfs_dir2_leaf_readbuf( mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= geo->fsbcount ? - XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); - + XFS_FSB_TO_DADDR(dp->i_mount, map->br_startblock) : + -1, &bp); /* * Should just skip over the data block instead of giving up. */ @@ -441,7 +433,7 @@ xfs_dir2_leaf_readbuf( map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, - XFS_FSB_TO_DADDR(mp, + XFS_FSB_TO_DADDR(dp->i_mount, map[mip->ra_index].br_startblock + mip->ra_offset)); mip->ra_current = i; @@ -493,23 +485,23 @@ out: */ STATIC int xfs_dir2_leaf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx, size_t bufsize) { + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = NULL; /* data block buffer */ xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_dir2_data_unused_t *dup; /* unused entry */ int error = 0; /* error return value */ int length; /* temporary length value */ - xfs_mount_t *mp; /* filesystem mount point */ int byteoff; /* offset in current block */ xfs_dir2_off_t curoff; /* current overall offset */ xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; - struct xfs_da_geometry *geo; + struct xfs_da_geometry *geo = args->geo; /* * If the offset is at or past the largest allowed value, @@ -518,15 +510,12 @@ xfs_dir2_leaf_getdents( if (ctx->pos >= XFS_DIR2_MAX_DATAPTR) return 0; - mp = dp->i_mount; - geo = mp->m_dir_geo; - /* * Set up to bmap a number of blocks based on the caller's * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, (1 << geo->fsblog)); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -558,7 +547,7 @@ xfs_dir2_leaf_getdents( */ if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { - error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, + error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, &curoff, &bp); if (error || !map_info->map_valid) break; @@ -566,7 +555,7 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + newoff = xfs_dir2_db_off_to_byte(geo, map_info->curdb, 0); /* * Start of the current block. @@ -585,7 +574,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); + byteoff = xfs_dir2_byte_to_off(geo, curoff); /* * Skip past the header. */ @@ -644,7 +633,7 @@ xfs_dir2_leaf_getdents( ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) break; /* @@ -674,13 +663,14 @@ xfs_dir2_leaf_getdents( */ int xfs_readdir( - xfs_inode_t *dp, - struct dir_context *ctx, - size_t bufsize) + struct xfs_inode *dp, + struct dir_context *ctx, + size_t bufsize) { - int rval; /* return value */ - int v; /* type-checking value */ - uint lock_mode; + struct xfs_da_args args = {0}; + int rval; + int v; + uint lock_mode; trace_xfs_readdir(dp); @@ -690,15 +680,18 @@ xfs_readdir( ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_getdents); + args.dp = dp; + args.geo = dp->i_mount->m_dir_geo; + lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) - rval = xfs_dir2_sf_getdents(dp, ctx); - else if ((rval = xfs_dir2_isblock(dp, &v))) + rval = xfs_dir2_sf_getdents(&args, ctx); + else if ((rval = xfs_dir2_isblock(&args, &v))) ; else if (v) - rval = xfs_dir2_block_getdents(dp, ctx); + rval = xfs_dir2_block_getdents(&args, ctx); else - rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); + rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); xfs_iunlock(dp, lock_mode); return rval; -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:08 2014 Return-Path: <dave@fromorbit.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 26BDB7F77 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D8158F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:07 -0700 (PDT) X-ASG-Debug-ID: 1400803674-04cb6c5d0a27cfa0007-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id bZYsIUjjEtD0nBQe for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:05 -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: AmNTALyQflN5LL1sPGdsb2JhbABZgwdSh3miQwEBAQEBAQabQhcDAQEBATg1giUBAQUnLzMIGDE5AwcUGYhA11CFVY1ABJsuiVqLWSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:58 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071r-8L for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Tf-7I for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry Date: Fri, 23 May 2014 10:03:43 +1000 X-ASG-Orig-Subj: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry Message-Id: <1400803432-20048-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803685 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 22 +++++++++++----------- fs/xfs/xfs_dir2.c | 7 ++----- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_data.c | 9 +++++---- fs/xfs/xfs_dir2_leaf.c | 12 ++++++------ fs/xfs/xfs_dir2_readdir.c | 18 +++++++++--------- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_mount.h | 3 --- 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4db5102..8621202 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -598,7 +598,7 @@ xfs_da3_root_split( * Set up the new root node. */ error = xfs_da3_node_create(args, - (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, + (args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0, level + 1, &bp, args->whichfork); if (error) return error; @@ -616,10 +616,10 @@ xfs_da3_root_split( #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - ASSERT(blk1->blkno >= mp->m_dirleafblk && - blk1->blkno < mp->m_dirfreeblk); - ASSERT(blk2->blkno >= mp->m_dirleafblk && - blk2->blkno < mp->m_dirfreeblk); + ASSERT(blk1->blkno >= args->geo->leafblk && + blk1->blkno < args->geo->freeblk); + ASSERT(blk2->blkno >= args->geo->leafblk && + blk2->blkno < args->geo->freeblk); } #endif @@ -894,8 +894,8 @@ xfs_da3_node_add( ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= state->mp->m_dirleafblk && - newblk->blkno < state->mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->args->geo->leafblk && + newblk->blkno < state->args->geo->freeblk); /* * We may need to make some room before we insert the new node. @@ -1472,7 +1472,7 @@ xfs_da3_node_lookup_int( * Descend thru the B-tree searching each level for the right * node to use, until the right hashval is found. */ - blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0; + blkno = (args->whichfork == XFS_DATA_FORK)? args->geo->leafblk : 0; for (blk = &state->path.blk[0], state->path.active = 1; state->path.active <= XFS_DA_NODE_MAXDEPTH; blk++, state->path.active++) { @@ -2096,7 +2096,7 @@ xfs_da_grow_inode( trace_xfs_da_grow_inode(args); if (args->whichfork == XFS_DATA_FORK) { - bno = args->dp->i_mount->m_dirleafblk; + bno = args->geo->leafblk; count = args->dp->i_mount->m_dirblkfsbs; } else { bno = 0; @@ -2158,7 +2158,7 @@ xfs_da3_swap_lastblock( w = args->whichfork; ASSERT(w == XFS_DATA_FORK); mp = dp->i_mount; - lastoff = mp->m_dirfreeblk; + lastoff = args->geo->freeblk; error = xfs_bmap_last_before(tp, dp, &lastoff, w); if (error) return error; @@ -2247,7 +2247,7 @@ xfs_da3_swap_lastblock( sizeof(sib_info->back))); sib_buf = NULL; } - par_blkno = mp->m_dirleafblk; + par_blkno = args->geo->leafblk; level = -1; /* * Walk down the tree looking for the parent of the moved block. diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 0bd3468..fc09a11 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -147,9 +147,6 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; - mp->m_dirdatablk = mp->m_dir_geo->datablk; - mp->m_dirleafblk = mp->m_dir_geo->leafblk; - mp->m_dirfreeblk = mp->m_dir_geo->freeblk; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -682,7 +679,7 @@ xfs_dir2_isleaf( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); return 0; } @@ -755,7 +752,7 @@ xfs_dir2_shrink_inode( */ return error; } - if (db == mp->m_dirdatablk) + if (db == args->geo->datablk) ASSERT(bno == 0); else ASSERT(bno > 0); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index bc08216..d950cde 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -136,7 +136,7 @@ xfs_dir3_block_read( struct xfs_mount *mp = dp->i_mount; int err; - err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); @@ -969,7 +969,7 @@ xfs_dir2_leaf_to_block( * Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp); if (error) return error; } @@ -1034,7 +1034,7 @@ xfs_dir2_leaf_to_block( /* * Pitch the old leaf block. */ - error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); + error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index d355ec7..6c23f86 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -63,8 +63,10 @@ __xfs_dir3_data_check( int stale; /* count of stale leaves */ struct xfs_name name; const struct xfs_dir_ops *ops; + struct xfs_da_geometry *geo; mp = bp->b_target->bt_mount; + geo = mp->m_dir_geo; /* * We can be passed a null dp here from a verifier, so we need to go the @@ -172,10 +174,9 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, - mp->m_dirdatablk, - (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)hdr)); + addr = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + (xfs_dir2_data_aoff_t) + ((char *)dep - (char *)hdr)); name.name = dep->name; name.len = dep->namelen; hash = mp->m_dirnameops->hashname(&name); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 2b3ddd0..3eb8b24 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -641,7 +641,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1232,7 +1232,7 @@ xfs_dir2_leaf_lookup_int( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1429,7 +1429,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) == mp->m_dirblksize - dp->d_ops->data_entry_offset) { - ASSERT(db != mp->m_dirdatablk); + ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* * Nope, can't get rid of it because it caused @@ -1470,7 +1470,7 @@ xfs_dir2_leaf_removename( /* * If the data block was not the first one, drop it. */ - else if (db != mp->m_dirdatablk) + else if (db != args->geo->datablk) dbp = NULL; xfs_dir3_leaf_check(dp, lbp); @@ -1722,7 +1722,7 @@ xfs_dir2_node_to_leaf( * that may have been left behind during no-space-reservation * operations. */ - while (fo > mp->m_dirfreeblk) { + while (fo > args->geo->freeblk) { if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) { return error; } @@ -1752,7 +1752,7 @@ xfs_dir2_node_to_leaf( /* * Read the freespace block. */ - error = xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); + error = xfs_dir2_free_read(tp, dp, args->geo->freeblk, &fbp); if (error) return error; free = fbp->b_addr; diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index c2a6387..0c8c09c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -111,18 +111,18 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; /* * Precalculate offsets for . and .. as we will always need them. * * XXX(hch): the second argument is sometimes 0 and sometimes - * mp->m_dirdatablk. + * geo->datablk */ - dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dotdot_offset); /* @@ -151,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -168,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; return 0; } @@ -199,7 +199,7 @@ xfs_dir2_block_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -248,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -268,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 4dc4193..10f4c2a 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -247,7 +247,7 @@ xfs_dir2_block_to_sf( /* now we are done with the block, we can shrink the inode */ logflags = XFS_ILOG_CORE; - error = xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp); + error = xfs_dir2_shrink_inode(args, args->geo->datablk, bp); if (error) { ASSERT(error != ENOSPC); goto out; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 01b25e41..264e210 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -156,9 +156,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:08 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E7AAA7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2DFE7AC008 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:07 -0700 (PDT) X-ASG-Debug-ID: 1400803677-04cbb006da268cd0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id yJTkVkUCn6mf6FIb for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:02 -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: AmVTALyQflN5LL1sPGdsb2JhbABZgwdSh3miQwEBAQEBAQabQhcDAQEBATg1giUBAQUaAQwvMwgYMTkDBxQZiEDXUIVVjUAEmy6JWotZKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-000722-Bk for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005U9-Al for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging Date: Fri, 23 May 2014 10:03:49 +1000 X-ASG-Orig-Subj: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging Message-Id: <1400803432-20048-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803682 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> We don't pass the xfs_da_args or the geometry all the way down to the directory buffer logging code, hence we have to use mp->m_dir_geo here. Fix this to use the geometry passed via the xfs_da_args, and convert all the directory logging functions for consistency. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_dir2.h | 12 +++--- fs/xfs/xfs_dir2_block.c | 39 +++++++++--------- fs/xfs/xfs_dir2_data.c | 59 ++++++++++++--------------- fs/xfs/xfs_dir2_leaf.c | 103 +++++++++++++++++++++++++----------------------- fs/xfs/xfs_dir2_node.c | 68 +++++++++++++++----------------- fs/xfs/xfs_dir2_priv.h | 4 +- 6 files changed, 137 insertions(+), 148 deletions(-) diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index f2f6bb8..608f5b8 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -151,16 +151,16 @@ extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, extern void xfs_dir2_data_freescan(struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_entry(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_header(struct xfs_da_args *args, struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_unused(struct xfs_da_args *args, + struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_use_free(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 4204df9..c7cd315 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -281,8 +281,7 @@ out: */ static void xfs_dir2_block_compact( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp, @@ -315,7 +314,7 @@ xfs_dir2_block_compact( *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); *lfloghigh -= be32_to_cpu(btp->stale) - 1; be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), needlog, &needscan); @@ -325,7 +324,7 @@ xfs_dir2_block_compact( * This needs to happen before the next call to use_free. */ if (needscan) - xfs_dir2_data_freescan(dp, hdr, needlog); + xfs_dir2_data_freescan(args->dp, hdr, needlog); } /* @@ -420,7 +419,7 @@ xfs_dir2_block_addname( * If need to compact the leaf entries, do it now. */ if (compact) { - xfs_dir2_block_compact(tp, dp, bp, hdr, btp, blp, &needlog, + xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); /* recalculate blp post-compaction */ blp = xfs_dir2_block_leaf_p(btp); @@ -455,7 +454,7 @@ xfs_dir2_block_addname( /* * Mark the space needed for the new leaf entry, now in use. */ - xfs_dir2_data_use_free(tp, dp, bp, enddup, + xfs_dir2_data_use_free(args, bp, enddup, (xfs_dir2_data_aoff_t) ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), @@ -542,7 +541,7 @@ xfs_dir2_block_addname( /* * Mark space for the data entry used. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* @@ -560,9 +559,9 @@ xfs_dir2_block_addname( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -803,7 +802,7 @@ xfs_dir2_block_removename( * Mark the data entry's space free. */ needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -822,7 +821,7 @@ xfs_dir2_block_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. @@ -881,7 +880,7 @@ xfs_dir2_block_replace( */ dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -1004,7 +1003,7 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, + xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. @@ -1030,7 +1029,7 @@ xfs_dir2_leaf_to_block( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * Pitch the old leaf block. */ @@ -1143,7 +1142,7 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, i, &needlog, &needscan); ASSERT(needscan == 0); /* @@ -1157,7 +1156,7 @@ xfs_dir2_sf_to_block( /* * Remove the freespace, we'll manage it. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* @@ -1170,7 +1169,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1184,7 +1183,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1218,7 +1217,7 @@ xfs_dir2_sf_to_block( dup->length = cpu_to_be16(newoffset - offset); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( ((char *)dup - (char *)hdr)); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_unused(args, bp, dup); xfs_dir2_data_freeinsert(hdr, dp->d_ops->data_bestfree_p(hdr), dup, &dummy); @@ -1235,7 +1234,7 @@ xfs_dir2_sf_to_block( memcpy(dep->name, sfep->name, dep->namelen); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index b73d61a..8c2f642 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -630,8 +630,8 @@ xfs_dir3_data_init( /* * Log it and return it. */ - xfs_dir2_data_log_header(tp, dp, bp); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_header(args, bp); + xfs_dir2_data_log_unused(args, bp, dup); *bpp = bp; return 0; } @@ -641,8 +641,7 @@ xfs_dir3_data_init( */ void xfs_dir2_data_log_entry( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { @@ -653,8 +652,8 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(dp->d_ops->data_entry_tag_p(dep) + 1) - + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dep - (char *)hdr), + (uint)((char *)(args->dp->d_ops->data_entry_tag_p(dep) + 1) - (char *)hdr - 1)); } @@ -663,8 +662,7 @@ xfs_dir2_data_log_entry( */ void xfs_dir2_data_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -676,7 +674,8 @@ xfs_dir2_data_log_header( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->data_entry_offset - 1); } /* @@ -684,7 +683,7 @@ xfs_dir2_data_log_header( */ void xfs_dir2_data_log_unused( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup) /* data unused pointer */ { @@ -698,13 +697,13 @@ xfs_dir2_data_log_unused( /* * Log the first part of the unused entry. */ - xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dup - (char *)hdr), (uint)((char *)&dup->length + sizeof(dup->length) - 1 - (char *)hdr)); /* * Log the end (tag) of the unused entry. */ - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + sizeof(xfs_dir2_data_off_t) - 1)); @@ -716,8 +715,7 @@ xfs_dir2_data_log_unused( */ void xfs_dir2_data_make_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ @@ -727,37 +725,33 @@ xfs_dir2_data_make_free( xfs_dir2_data_hdr_t *hdr; /* data block pointer */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ char *endptr; /* end of data area */ - xfs_mount_t *mp; /* filesystem mount point */ int needscan; /* need to regen bestfree */ xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; - struct xfs_da_geometry *geo; - mp = tp->t_mountp; hdr = bp->b_addr; - geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + geo->blksize; + endptr = (char *)hdr + args->geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(geo, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > dp->d_ops->data_entry_offset) { + if (offset > args->dp->d_ops->data_entry_offset) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; @@ -783,7 +777,7 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ @@ -805,7 +799,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); if (!needscan) { /* * Has to be the case that entries 0 and 1 are @@ -840,7 +834,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); /* * If the previous entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -868,7 +862,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If the following entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -895,7 +889,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); } *needscanp = needscan; @@ -906,8 +900,7 @@ xfs_dir2_data_make_free( */ void xfs_dir2_data_use_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ @@ -938,7 +931,7 @@ xfs_dir2_data_use_free( * Look up the entry in the bestfree table. */ oldlen = be16_to_cpu(dup->length); - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); dfp = xfs_dir2_data_freefind(hdr, bf, dup); ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); /* @@ -970,7 +963,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(oldlen - len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -998,7 +991,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -1026,13 +1019,13 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); newdup2 = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup2->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup2->length = cpu_to_be16(oldlen - len - be16_to_cpu(newdup->length)); *xfs_dir2_data_unused_tag_p(newdup2) = cpu_to_be16((char *)newdup2 - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup2); + xfs_dir2_data_log_unused(args, bp, newdup2); /* * If the old entry was in the table, we need to scan * if the 3rd entry was valid, since these entries diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index e517bd0..fb0aad4 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -41,9 +41,10 @@ */ static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, - int first, int last); -static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args, + struct xfs_buf *bp, int first, int last); +static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args, + struct xfs_buf *bp); /* * Check the internal consistency of a leaf1 block. @@ -357,9 +358,9 @@ xfs_dir3_leaf_get_buf( return error; xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (magic == XFS_DIR2_LEAF1_MAGIC) - xfs_dir3_leaf_log_tail(tp, bp); + xfs_dir3_leaf_log_tail(args, bp); *bpp = bp; return 0; } @@ -428,21 +429,21 @@ xfs_dir2_block_to_leaf( leafhdr.count = be32_to_cpu(btp->count); leafhdr.stale = be32_to_cpu(btp->stale); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1); + xfs_dir3_leaf_log_ents(args, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* * Make the space formerly occupied by the leaf entries and block * tail be free. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), @@ -470,10 +471,10 @@ xfs_dir2_block_to_leaf( * Log the data header and leaf bests table. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(args, lbp, 0, 0); return 0; } @@ -811,14 +812,15 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); hdr = dbp->b_addr; bf = dp->d_ops->data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; @@ -849,7 +851,7 @@ xfs_dir2_leaf_addname( /* * Mark the initial part of our freespace in use for the new entry. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -871,8 +873,8 @@ xfs_dir2_leaf_addname( * Need to log the data block's header. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_header(args, dbp); + xfs_dir2_data_log_entry(args, dbp, dep); /* * If the bests table needs to be changed, do it. * Log the change unless we've already done that. @@ -880,7 +882,7 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { bestsp[use_block] = bf[0].length; if (!grown) - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); } lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, @@ -897,8 +899,8 @@ xfs_dir2_leaf_addname( * Log the leaf fields and give up the buffers. */ dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_ents(args, lbp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); return 0; @@ -950,9 +952,9 @@ xfs_dir3_leaf_compact( leafhdr->stale = 0; dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); - xfs_dir3_leaf_log_header(args->trans, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (loglow != -1) - xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args, bp, loglow, to - 1); } /* @@ -1054,7 +1056,7 @@ xfs_dir3_leaf_compact_x1( */ static void xfs_dir3_leaf_log_bests( - xfs_trans_t *tp, /* transaction pointer */ + struct xfs_da_args *args, struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ @@ -1067,10 +1069,11 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstb - (char *)leaf), (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); } @@ -1079,8 +1082,7 @@ xfs_dir3_leaf_log_bests( */ void xfs_dir3_leaf_log_ents( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, int last) @@ -1095,10 +1097,11 @@ xfs_dir3_leaf_log_ents( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ents = dp->d_ops->leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); firstlep = &ents[first]; lastlep = &ents[last]; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -1107,8 +1110,7 @@ xfs_dir3_leaf_log_ents( */ void xfs_dir3_leaf_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -1118,8 +1120,9 @@ xfs_dir3_leaf_log_header( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - dp->d_ops->leaf_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)&leaf->hdr - (char *)leaf), + args->dp->d_ops->leaf_hdr_size - 1); } /* @@ -1127,21 +1130,20 @@ xfs_dir3_leaf_log_header( */ STATIC void xfs_dir3_leaf_log_tail( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - struct xfs_mount *mp = tp->t_mountp; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); - xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dir_geo->blksize - 1)); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); + xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf), + (uint)(args->geo->blksize - 1)); } /* @@ -1395,7 +1397,7 @@ xfs_dir2_leaf_removename( /* * Mark the former data entry unused. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -1403,10 +1405,10 @@ xfs_dir2_leaf_removename( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index); + xfs_dir3_leaf_log_ents(args, lbp, index, index); /* * Scan the freespace in the data block again if necessary, @@ -1415,14 +1417,14 @@ xfs_dir2_leaf_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ if (be16_to_cpu(bf[0].length) != oldbest) { bestsp[db] = bf[0].length; - xfs_dir3_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(args, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1463,8 +1465,9 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] = cpu_to_be16(NULLDATAOFF); } @@ -1527,7 +1530,7 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); tp = args->trans; - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); xfs_dir3_leaf_check(dp, lbp); xfs_trans_brelse(tp, lbp); return 0; @@ -1648,8 +1651,8 @@ xfs_dir2_leaf_trim_data( bestsp = xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } @@ -1795,9 +1798,9 @@ xfs_dir2_node_to_leaf( freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); xfs_dir3_leaf_check(dp, lbp); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index eff6b8d..65df8cb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -241,8 +241,7 @@ xfs_dir3_free_get_buf( */ STATIC void xfs_dir2_free_log_bests( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ @@ -251,10 +250,10 @@ xfs_dir2_free_log_bests( __be16 *bests; free = bp->b_addr; - bests = dp->d_ops->free_bests_p(free); + bests = args->dp->d_ops->free_bests_p(free); ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)&bests[first] - (char *)free), (uint)((char *)&bests[last] - (char *)free + sizeof(bests[0]) - 1)); @@ -265,8 +264,7 @@ xfs_dir2_free_log_bests( */ static void xfs_dir2_free_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -276,7 +274,8 @@ xfs_dir2_free_log_header( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->free_hdr_size - 1); } /* @@ -350,8 +349,8 @@ xfs_dir2_leaf_to_node( freehdr.nvalid = be32_to_cpu(ltp->bestcount); dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_bests(args, fbp, 0, freehdr.nvalid - 1); + xfs_dir2_free_log_header(args, fbp); /* * Converting the leaf to a leafnode is just a matter of changing the @@ -365,7 +364,7 @@ xfs_dir2_leaf_to_node( leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); xfs_dir3_leaf_check(dp, lbp); return 0; } @@ -455,8 +454,8 @@ xfs_dir2_leafn_add( args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); - xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, bp); + xfs_dir3_leaf_log_ents(args, bp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, bp); return 0; } @@ -851,7 +850,6 @@ xfs_dir3_leafn_moveents( int start_d,/* destination leaf index */ int count) /* count of leaves to copy */ { - struct xfs_trans *tp = args->trans; int stale; /* count stale leaves copied */ trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); @@ -870,7 +868,7 @@ xfs_dir3_leafn_moveents( if (start_d < dhdr->count) { memmove(&dents[start_d + count], &dents[start_d], (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count, + xfs_dir3_leaf_log_ents(args, bp_d, start_d + count, count + dhdr->count - 1); } /* @@ -892,8 +890,7 @@ xfs_dir3_leafn_moveents( */ memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, - start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(args, bp_d, start_d, start_d + count - 1); /* * If there are source entries after the ones we copied, @@ -902,8 +899,7 @@ xfs_dir3_leafn_moveents( if (start_s + count < shdr->count) { memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_s, - start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(args, bp_s, start_s, start_s + count - 1); } /* @@ -1039,8 +1035,8 @@ xfs_dir2_leafn_rebalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); - xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); - xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); + xfs_dir3_leaf_log_header(args, blk1->bp); + xfs_dir3_leaf_log_header(args, blk2->bp); xfs_dir3_leaf_check(dp, blk1->bp); xfs_dir3_leaf_check(dp, blk2->bp); @@ -1083,7 +1079,6 @@ xfs_dir3_data_block_free( struct xfs_buf *fbp, int longest) { - struct xfs_trans *tp = args->trans; int logfree = 0; __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; @@ -1097,7 +1092,7 @@ xfs_dir3_data_block_free( * value. */ bests[findex] = cpu_to_be16(longest); - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1125,7 +1120,7 @@ xfs_dir3_data_block_free( } dp->d_ops->free_hdr_to_disk(free, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); /* * If there are no useful entries left in the block, get rid of the @@ -1149,7 +1144,7 @@ xfs_dir3_data_block_free( /* Log the free entry that changed, unless we got rid of it. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1211,10 +1206,10 @@ xfs_dir2_leafn_remove( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, bp, index, index); + xfs_dir3_leaf_log_ents(args, bp, index, index); /* * Make the data entry free. Keep track of the longest freespace @@ -1226,7 +1221,7 @@ xfs_dir2_leafn_remove( bf = dp->d_ops->data_bestfree_p(hdr); longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, dbp, off, + xfs_dir2_data_make_free(args, dbp, off, dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. @@ -1235,7 +1230,7 @@ xfs_dir2_leafn_remove( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update @@ -1569,8 +1564,8 @@ xfs_dir2_leafn_unbalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); - xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); - xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); + xfs_dir3_leaf_log_header(args, save_blk->bp); + xfs_dir3_leaf_log_header(args, drop_blk->bp); xfs_dir3_leaf_check(dp, save_blk->bp); xfs_dir3_leaf_check(dp, drop_blk->bp); @@ -1931,7 +1926,7 @@ xfs_dir2_node_addname_int( if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { freehdr.nused++; dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); } /* * Update the real value in the table. @@ -1975,7 +1970,7 @@ xfs_dir2_node_addname_int( /* * Mark the first part of the unused space, inuse for us. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -1988,7 +1983,7 @@ xfs_dir2_node_addname_int( dp->d_ops->data_put_ftype(dep, args->filetype); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); /* * Rescan the block for bestfree if needed. */ @@ -1998,7 +1993,7 @@ xfs_dir2_node_addname_int( * Log the data block header if needed. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the freespace entry is now wrong, update it. */ @@ -2011,7 +2006,7 @@ xfs_dir2_node_addname_int( * Log the freespace entry if needed. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); /* * Return the data block and offset in args, then drop the data block. */ @@ -2208,8 +2203,7 @@ xfs_dir2_node_replace( */ dep->inumber = cpu_to_be64(inum); args->dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, args->dp, - state->extrablk.bp, dep); + xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); rval = 0; } /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 2429960..07bfb4b 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -77,9 +77,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); -extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_ents(struct xfs_da_args *args, struct xfs_buf *bp, int first, int last); -extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_header(struct xfs_da_args *args, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:08 2014 Return-Path: <dave@fromorbit.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 ADAA87F7B for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 94A3A8F8035 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:08 -0700 (PDT) X-ASG-Debug-ID: 1400803677-04cbb006da268cd0005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id AyMDe3VNhrJaMDKJ for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:05 -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: AldTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEDXUIVVjUAElXKPFotZKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:58 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00072A-DE for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005UO-CB for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry Date: Fri, 23 May 2014 10:03:52 +1000 X-ASG-Orig-Subj: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry Message-Id: <1400803432-20048-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803685 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 2 +- fs/xfs/xfs_attr_leaf.c | 114 ++++++++++++++++++++++++----------------------- fs/xfs/xfs_attr_remote.c | 55 ++++++++++++----------- fs/xfs/xfs_da_format.h | 10 ----- 4 files changed, 89 insertions(+), 92 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 3d8c03e..470a22d 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -863,7 +863,7 @@ xfs_attr_leaf_get(xfs_da_args_t *args) } /*======================================================================== - * External routines when attribute list size > XFS_LBSIZE(mp). + * External routines when attribute list size > geo->blksize *========================================================================*/ /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 7761103..ae33b14 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -80,11 +80,12 @@ STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, /* * Utility routines. */ -STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, +STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args, + struct xfs_attr_leafblock *src_leaf, struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, struct xfs_attr_leafblock *dst_leaf, struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, - int move_count, struct xfs_mount *mp); + int move_count); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); void @@ -806,18 +807,18 @@ xfs_attr3_leaf_to_shortform( trace_xfs_attr_leaf_to_sf(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); if (!tmpbuffer) return ENOMEM; - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); leaf = (xfs_attr_leafblock_t *)tmpbuffer; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entry = xfs_attr3_leaf_entryp(leaf); /* XXX (dgc): buffer is about to be marked stale - why zero it? */ - memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); + memset(bp->b_addr, 0, args->geo->blksize); /* * Clean out the prior contents of the attribute list. @@ -906,12 +907,12 @@ xfs_attr3_leaf_to_node( /* copy leaf to new buffer, update identifiers */ xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; hdr3->blkno = cpu_to_be64(bp2->b_bn); } - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); /* * Set up the new root node. @@ -932,7 +933,7 @@ xfs_attr3_leaf_to_node( btree[0].before = cpu_to_be32(blkno); icnodehdr.count = 1; dp->d_ops->node_hdr_to_disk(node, &icnodehdr); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1); error = 0; out: return error; @@ -968,10 +969,10 @@ xfs_attr3_leaf_create( bp->b_ops = &xfs_attr3_leaf_buf_ops; xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); leaf = bp->b_addr; - memset(leaf, 0, XFS_LBSIZE(mp)); + memset(leaf, 0, args->geo->blksize); memset(&ichdr, 0, sizeof(ichdr)); - ichdr.firstused = XFS_LBSIZE(mp); + ichdr.firstused = args->geo->blksize; if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp->b_addr; @@ -990,7 +991,7 @@ xfs_attr3_leaf_create( ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); *bpp = bp; return 0; @@ -1175,11 +1176,11 @@ xfs_attr3_leaf_add_work( * Allocate space for the new string (at the end of the run). */ mp = args->trans->t_mountp; - ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args, NULL)); - ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); @@ -1267,14 +1268,13 @@ xfs_attr3_leaf_compact( struct xfs_attr_leafblock *leaf_dst; struct xfs_attr3_icleaf_hdr ichdr_src; struct xfs_trans *trans = args->trans; - struct xfs_mount *mp = trans->t_mountp; char *tmpbuffer; trace_xfs_attr_leaf_compact(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); - memset(bp->b_addr, 0, XFS_LBSIZE(mp)); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); + memset(bp->b_addr, 0, args->geo->blksize); leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; leaf_dst = bp->b_addr; @@ -1287,7 +1287,7 @@ xfs_attr3_leaf_compact( /* Initialise the incore headers */ ichdr_src = *ichdr_dst; /* struct copy */ - ichdr_dst->firstused = XFS_LBSIZE(mp); + ichdr_dst->firstused = args->geo->blksize; ichdr_dst->usedbytes = 0; ichdr_dst->count = 0; ichdr_dst->holes = 0; @@ -1302,13 +1302,13 @@ xfs_attr3_leaf_compact( * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr3_leaf_moveents(leaf_src, &ichdr_src, 0, leaf_dst, ichdr_dst, 0, - ichdr_src.count, mp); + xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0, + leaf_dst, ichdr_dst, 0, ichdr_src.count); /* * this logs the entire buffer, but the caller must write the header * back to the buffer when it is finished modifying it. */ - xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1); kmem_free(tmpbuffer); } @@ -1459,8 +1459,8 @@ xfs_attr3_leaf_rebalance( /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, - leaf2, &ichdr2, 0, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf1, &ichdr1, + ichdr1.count - count, leaf2, &ichdr2, 0, count); } else if (count > ichdr1.count) { /* @@ -1488,8 +1488,8 @@ xfs_attr3_leaf_rebalance( /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, - ichdr1.count, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count); } xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); @@ -1795,7 +1795,6 @@ xfs_attr3_leaf_remove( struct xfs_attr_leafblock *leaf; struct xfs_attr3_icleaf_hdr ichdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = args->trans->t_mountp; int before; int after; int smallest; @@ -1809,7 +1808,7 @@ xfs_attr3_leaf_remove( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); ASSERT(args->index >= 0 && args->index < ichdr.count); ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + xfs_attr3_leaf_hdr_size(leaf)); @@ -1817,7 +1816,7 @@ xfs_attr3_leaf_remove( entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); /* * Scan through free region table: @@ -1832,8 +1831,8 @@ xfs_attr3_leaf_remove( smallest = XFS_ATTR_LEAF_MAPSIZE - 1; entsize = xfs_attr_leaf_entsize(leaf, args->index); for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { - ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); - ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].base < args->geo->blksize); + ASSERT(ichdr.freemap[i].size < args->geo->blksize); if (ichdr.freemap[i].base == tablesize) { ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); @@ -1910,11 +1909,11 @@ xfs_attr3_leaf_remove( * removing the name. */ if (smallest) { - tmp = XFS_LBSIZE(mp); + tmp = args->geo->blksize; entry = xfs_attr3_leaf_entryp(leaf); for (i = ichdr.count - 1; i >= 0; entry++, i--) { ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); if (be16_to_cpu(entry->nameidx) < tmp) tmp = be16_to_cpu(entry->nameidx); @@ -1954,7 +1953,6 @@ xfs_attr3_leaf_unbalance( struct xfs_attr3_icleaf_hdr drophdr; struct xfs_attr3_icleaf_hdr savehdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = state->mp; trace_xfs_attr_leaf_unbalance(state->args); @@ -1981,13 +1979,15 @@ xfs_attr3_leaf_unbalance( */ if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, 0, - drophdr.count, mp); + drophdr.count); } else { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, - savehdr.count, drophdr.count, mp); + savehdr.count, drophdr.count); } } else { /* @@ -2017,19 +2017,23 @@ xfs_attr3_leaf_unbalance( if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, 0, - drophdr.count, mp); - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + drophdr.count); + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - savehdr.count, mp); + savehdr.count); } else { - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, 0, - savehdr.count, mp); - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + savehdr.count); + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - drophdr.count, mp); + drophdr.count); } memcpy(save_leaf, tmp_leaf, state->blocksize); savehdr = tmphdr; /* struct copy */ @@ -2084,7 +2088,7 @@ xfs_attr3_leaf_lookup_int( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); /* * Binary search. (note: small blocks will skip this loop) @@ -2188,7 +2192,7 @@ xfs_attr3_leaf_getvalue( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); ASSERT(args->index < ichdr.count); entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; @@ -2239,14 +2243,14 @@ xfs_attr3_leaf_getvalue( /*ARGSUSED*/ STATIC void xfs_attr3_leaf_moveents( + struct xfs_da_args *args, struct xfs_attr_leafblock *leaf_s, struct xfs_attr3_icleaf_hdr *ichdr_s, int start_s, struct xfs_attr_leafblock *leaf_d, struct xfs_attr3_icleaf_hdr *ichdr_d, int start_d, - int count, - struct xfs_mount *mp) + int count) { struct xfs_attr_leaf_entry *entry_s; struct xfs_attr_leaf_entry *entry_d; @@ -2266,10 +2270,10 @@ xfs_attr3_leaf_moveents( ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); ASSERT(ichdr_s->magic == ichdr_d->magic); - ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8); ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) + xfs_attr3_leaf_hdr_size(leaf_s)); - ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->count < args->geo->blksize / 8); ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) + xfs_attr3_leaf_hdr_size(leaf_d)); @@ -2321,11 +2325,11 @@ xfs_attr3_leaf_moveents( entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memmove(xfs_attr3_leaf_name(leaf_d, desti), xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); ichdr_s->usedbytes -= tmp; ichdr_d->usedbytes += tmp; @@ -2346,7 +2350,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } else { /* @@ -2361,7 +2365,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 0f0679a..b5adfec 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -125,6 +125,7 @@ xfs_attr3_rmt_read_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -133,21 +134,20 @@ xfs_attr3_rmt_read_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), - XFS_ATTR3_RMT_CRC_OFF)) { + if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) { xfs_buf_ioerror(bp, EFSBADCRC); break; } - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); break; } - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } if (bp->b_error) @@ -165,6 +165,7 @@ xfs_attr3_rmt_write_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -173,10 +174,10 @@ xfs_attr3_rmt_write_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); xfs_verifier_error(bp); return; @@ -187,11 +188,11 @@ xfs_attr3_rmt_write_verify( rmt = (struct xfs_attr3_rmt_hdr *)ptr; rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); } - xfs_update_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF); + xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF); - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } ASSERT(len == 0); } @@ -240,12 +241,13 @@ xfs_attr_rmtval_copyout( char *src = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size = 0; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); @@ -263,9 +265,9 @@ xfs_attr_rmtval_copyout( memcpy(*dst, src + hdr_size, byte_cnt); /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - src += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + src += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; @@ -287,12 +289,13 @@ xfs_attr_rmtval_copyin( char *dst = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, @@ -304,17 +307,17 @@ xfs_attr_rmtval_copyin( * If this is the last block, zero the remainder of it. * Check that we are actually the last block, too. */ - if (byte_cnt + hdr_size < XFS_LBSIZE(mp)) { + if (byte_cnt + hdr_size < blksize) { ASSERT(*valuelen - byte_cnt == 0); - ASSERT(len == XFS_LBSIZE(mp)); + ASSERT(len == blksize); memset(dst + hdr_size + byte_cnt, 0, - XFS_LBSIZE(mp) - hdr_size - byte_cnt); + blksize - hdr_size - byte_cnt); } /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - dst += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + dst += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 44d7fac..0a49b02 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -19,10 +19,6 @@ #ifndef __XFS_DA_FORMAT_H__ #define __XFS_DA_FORMAT_H__ -/*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - /* * This structure is common to both leaf nodes and non-leaf nodes in the Btree. * @@ -122,8 +118,6 @@ struct xfs_da3_icnode_hdr { __uint16_t level; }; -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - /* * Directory version 2. * @@ -620,10 +614,6 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) * of an attribute name may not be unique, we may have duplicate keys. The * internal links in the Btree are logical block offsets into the file. * - *======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *======================================================================== - * * Struct leaf_entry's are packed from the top. Name/values grow from the * bottom but are not packed. The freemap contains run-length-encoded entries * for the free bytes after the leaf_entry's, but only the N largest such, -- 1.9.0 From dave@fromorbit.com Thu May 22 19:08:09 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 146957F77 for <xfs@oss.sgi.com>; Thu, 22 May 2014 19:08:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A2A6AC004 for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:08 -0700 (PDT) X-ASG-Debug-ID: 1400803675-04cb6c5d0c27cfb0005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id mscmhK4lGD9EYKAc for <xfs@oss.sgi.com>; Thu, 22 May 2014 17:08:04 -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: AlpTALyQflN5LL1sPGdsb2JhbABZgweIS6JDAQEBAQEBBptCFwMBAQEBODWCJQEBBRoBDC8zCBgxOQMHFBmIQNdQhVWNQASlCItZKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail04.adl6.internode.on.net with ESMTP; 23 May 2014 09:33:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wncxn-00071t-9P for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wncxn-0005Tp-8X for xfs@oss.sgi.com; Fri, 23 May 2014 10:03:55 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry Date: Fri, 23 May 2014 10:03:45 +1000 X-ASG-Orig-Subj: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry Message-Id: <1400803432-20048-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1400803432-20048-1-git-send-email-david@fromorbit.com> References: <1400803432-20048-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1400803683 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.6040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_da_btree.h | 8 ++++---- fs/xfs/xfs_da_format.c | 36 ++++++++++++++++++------------------ fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2.h | 10 ++++++---- fs/xfs/xfs_dir2_block.c | 32 ++++++++++++++++---------------- fs/xfs/xfs_dir2_data.c | 17 ++++++++++------- fs/xfs/xfs_dir2_leaf.c | 35 ++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 42 ++++++++++++++++++++++-------------------- fs/xfs/xfs_dir2_readdir.c | 11 +++++------ fs/xfs/xfs_dir2_sf.c | 14 ++++++++------ fs/xfs/xfs_fsops.c | 4 +++- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_trans_resv.c | 2 +- 14 files changed, 115 insertions(+), 106 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4d0a1e8..b9b007d 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2169,8 +2169,8 @@ xfs_da3_swap_lastblock( /* * Copy the last block into the dead buffer and log it. */ - memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); - xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); + memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); + xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); dead_info = dead_buf->b_addr; /* * Get values from the moved block. diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index d35b31f..3fdc358 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -277,17 +277,17 @@ xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) * Directory tail pointer accessor functions. Based on block geometry. */ static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +xfs_dir2_block_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_data_hdr *hdr) { return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; + ((char *)hdr + geo->blksize)) - 1; } static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp) { return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - + ((char *)lp + geo->blksize - sizeof(struct xfs_dir2_leaf_tail)); } diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index c782f2c..d70c05b 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -426,9 +426,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * Directory Leaf block operations */ static int -xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +xfs_dir2_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -439,9 +439,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) } static int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp) +xfs_dir3_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -592,9 +592,9 @@ xfs_da3_node_hdr_to_disk( * Directory free space block operations */ static int -xfs_dir2_free_max_bests(struct xfs_mount *mp) +xfs_dir2_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -608,25 +608,25 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir2_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir2_free_max_bests(mp); + return db % xfs_dir2_free_max_bests(geo); } static int -xfs_dir3_free_max_bests(struct xfs_mount *mp) +xfs_dir3_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -640,19 +640,19 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir3_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir3_free_max_bests(mp); + return db % xfs_dir3_free_max_bests(geo); } static void diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 200c9c4..be7ad35 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -145,7 +145,6 @@ xfs_da_mount( mp->m_dirnameops = &xfs_default_nameops; /* XXX: these are to be removed as code is converted to use geo */ - mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -657,8 +656,8 @@ xfs_dir2_isblock( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); + rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; + ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); *vp = rval; return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 7b09ef0..85f6be6 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -80,7 +80,7 @@ struct xfs_dir_ops { struct xfs_dir3_icleaf_hdr *from); void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, struct xfs_dir2_leaf *from); - int (*leaf_max_ents)(struct xfs_mount *mp); + int (*leaf_max_ents)(struct xfs_da_geometry *geo); struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); @@ -97,10 +97,12 @@ struct xfs_dir_ops { struct xfs_dir3_icfree_hdr *from); void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, struct xfs_dir2_free *from); - int (*free_max_bests)(struct xfs_mount *mp); + int (*free_max_bests)(struct xfs_da_geometry *geo); __be16 * (*free_bests_p)(struct xfs_dir2_free *free); - xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db); - int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db); + xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); + int (*db_to_fdindex)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); }; extern const struct xfs_dir_ops * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index d950cde..4204df9 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -377,7 +377,7 @@ xfs_dir2_block_addname( * Set up pointers to parts of the block. */ hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -581,7 +581,7 @@ xfs_dir2_block_log_leaf( xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); blp = xfs_dir2_block_leaf_p(btp); xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); @@ -598,7 +598,7 @@ xfs_dir2_block_log_tail( xfs_dir2_data_hdr_t *hdr = bp->b_addr; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), (uint)((char *)(btp + 1) - (char *)hdr - 1)); } @@ -633,7 +633,7 @@ xfs_dir2_block_lookup( mp = dp->i_mount; hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Get the offset from the leaf entry, to point to the data. @@ -686,7 +686,7 @@ xfs_dir2_block_lookup_int( hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Loop doing a binary search for our hash value. @@ -791,7 +791,7 @@ xfs_dir2_block_removename( tp = args->trans; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry using the leaf entry. @@ -867,7 +867,7 @@ xfs_dir2_block_replace( dp = args->dp; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry we need to change. @@ -941,7 +941,7 @@ xfs_dir2_leaf_to_block( leaf = lbp->b_addr; dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); @@ -951,13 +951,13 @@ xfs_dir2_leaf_to_block( * been left behind during no-space-reservation operations. * These will show up in the leaf bests table. */ - while (dp->i_d.di_size > mp->m_dirblksize) { + while (dp->i_d.di_size > args->geo->blksize) { int hdrsz; hdrsz = dp->d_ops->data_entry_offset; bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == - mp->m_dirblksize - hdrsz) { + args->geo->blksize - hdrsz) { if ((error = xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -985,7 +985,7 @@ xfs_dir2_leaf_to_block( /* * Look at the last data entry. */ - tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; + tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1; dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); /* * If it's not free or is too short we can't do it. @@ -1004,12 +1004,12 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, mp->m_dirblksize - size, size, + xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); @@ -1143,13 +1143,13 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, - &needscan); + xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + i, &needlog, &needscan); ASSERT(needscan == 0); /* * Fill in the tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ btp->stale = 0; blp = xfs_dir2_block_leaf_p(btp); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 6c23f86..b73d61a 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -80,7 +80,7 @@ __xfs_dir3_data_check( switch (hdr->magic) { case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; @@ -96,7 +96,7 @@ __xfs_dir3_data_check( break; case cpu_to_be32(XFS_DIR3_DATA_MAGIC): case cpu_to_be32(XFS_DIR2_DATA_MAGIC): - endp = (char *)hdr + mp->m_dirblksize; + endp = (char *)hdr + geo->blksize; break; default: XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); @@ -511,6 +511,7 @@ xfs_dir2_data_freescan( struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ + struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -529,10 +530,10 @@ xfs_dir2_data_freescan( p = (char *)dp->d_ops->data_entry_p(hdr); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else - endp = (char *)hdr + dp->i_mount->m_dirblksize; + endp = (char *)hdr + geo->blksize; /* * Loop over the block's entries. */ @@ -622,7 +623,7 @@ xfs_dir3_data_init( dup = dp->d_ops->data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset; + t = args->geo->blksize - (uint)dp->d_ops->data_entry_offset; bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); @@ -732,22 +733,24 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; + struct xfs_da_geometry *geo; mp = tp->t_mountp; hdr = bp->b_addr; + geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + mp->m_dirblksize; + endptr = (char *)hdr + geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index a1f1310..e517bd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -92,6 +92,7 @@ xfs_dir3_leaf_check_int( int i; const struct xfs_dir_ops *ops; struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * we can be passed a null dp here from a verifier, so we need to go the @@ -105,14 +106,14 @@ xfs_dir3_leaf_check_int( } ents = ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(geo, leaf); /* * XXX (dgc): This value is not restrictive enough. * Should factor in the size of the bests table as well. * We can deduce a value for that from di_size. */ - if (hdr->count > ops->leaf_max_ents(mp)) + if (hdr->count > ops->leaf_max_ents(geo)) return false; /* Leaves and bests don't overlap in leaf format. */ @@ -323,7 +324,7 @@ xfs_dir3_leaf_init( if (type == XFS_DIR2_LEAF1_MAGIC) { struct xfs_dir2_leaf_tail *ltp; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); @@ -415,7 +416,7 @@ xfs_dir2_block_to_leaf( leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = dp->d_ops->data_bestfree_p(hdr); ents = dp->d_ops->leaf_ents_p(leaf); @@ -443,7 +444,7 @@ xfs_dir2_block_to_leaf( */ xfs_dir2_data_make_free(tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), - (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), &needlog, &needscan); /* @@ -461,7 +462,7 @@ xfs_dir2_block_to_leaf( /* * Set up leaf tail and bests table. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(1); bestsp = xfs_dir2_leaf_bests_p(ltp); bestsp[0] = bf[0].length; @@ -653,7 +654,7 @@ xfs_dir2_leaf_addname( */ index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ents = dp->d_ops->leaf_ents_p(leaf); dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); @@ -1066,7 +1067,7 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), @@ -1138,9 +1139,9 @@ xfs_dir3_leaf_log_tail( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dirblksize - 1)); + (uint)(mp->m_dir_geo->blksize - 1)); } /* @@ -1388,7 +1389,7 @@ xfs_dir2_leaf_removename( xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) == oldbest); /* @@ -1428,7 +1429,7 @@ xfs_dir2_leaf_removename( * If the data block is now empty then get rid of the data block. */ if (be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset) { + args->geo->blksize - dp->d_ops->data_entry_offset) { ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1618,7 +1619,7 @@ xfs_dir2_leaf_trim_data( return error; leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); #ifdef DEBUG { @@ -1628,7 +1629,7 @@ xfs_dir2_leaf_trim_data( ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); ASSERT(be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset); + args->geo->blksize - dp->d_ops->data_entry_offset); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif @@ -1740,7 +1741,7 @@ xfs_dir2_node_to_leaf( /* * If it's not the single leaf block, give up. */ - if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) + if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize) return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; @@ -1764,7 +1765,7 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) { xfs_trans_brelse(tp, fbp); return 0; } @@ -1784,7 +1785,7 @@ xfs_dir2_node_to_leaf( /* * Set up the leaf tail from the freespace block. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(freehdr.nvalid); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 89777bf..ef34c19 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -327,9 +327,9 @@ xfs_dir2_leaf_to_node( free = fbp->b_addr; dp->d_ops->free_hdr_from_disk(&freehdr, free); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(be32_to_cpu(ltp->bestcount) <= - (uint)dp->i_d.di_size / mp->m_dirblksize); + (uint)dp->i_d.di_size / args->geo->blksize); /* * Copy freespace entries from the leaf block to the new block. @@ -416,7 +416,7 @@ xfs_dir2_leafn_add( * a compact. */ - if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { + if (leafhdr.count == dp->d_ops->leaf_max_ents(args->geo)) { if (!leafhdr.stale) return XFS_ERROR(ENOSPC); compact = leafhdr.stale > 1; @@ -472,7 +472,8 @@ xfs_dir2_free_hdr_check( dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); - ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0); + ASSERT((hdr.firstdb % + dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } @@ -595,7 +596,7 @@ xfs_dir2_leafn_lookup_for_addname( * Convert the data block to the free block * holding its freespace information. */ - newfdb = dp->d_ops->db_to_fdb(mp, newdb); + newfdb = dp->d_ops->db_to_fdb(args->geo, newdb); /* * If it's not the one we have in hand, read it in. */ @@ -619,7 +620,7 @@ xfs_dir2_leafn_lookup_for_addname( /* * Get the index for our entry. */ - fi = dp->d_ops->db_to_fdindex(mp, curdb); + fi = dp->d_ops->db_to_fdindex(args->geo, curdb); /* * If it has room, return it. */ @@ -1251,7 +1252,7 @@ xfs_dir2_leafn_remove( * Convert the data block number to a free block, * read in the free block. */ - fdb = dp->d_ops->db_to_fdb(mp, db); + fdb = dp->d_ops->db_to_fdb(args->geo, db); error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(args->geo, fdb), &fbp); @@ -1262,7 +1263,7 @@ xfs_dir2_leafn_remove( { struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); - ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * + ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(args->geo) * (fdb - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET))); } @@ -1270,13 +1271,13 @@ xfs_dir2_leafn_remove( /* * Calculate which entry we need to fix. */ - findex = dp->d_ops->db_to_fdindex(mp, db); + findex = dp->d_ops->db_to_fdindex(args->geo, db); longest = be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest == mp->m_dirblksize - + if (longest == args->geo->blksize - dp->d_ops->data_entry_offset) { /* * Try to punch out the data block. @@ -1595,7 +1596,7 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = state->args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Look up the name. We're not supposed to find it, but @@ -1843,7 +1844,7 @@ xfs_dir2_node_addname_int( * Get the freespace block corresponding to the data block * that was just allocated. */ - fbno = dp->d_ops->db_to_fdb(mp, dbno); + fbno = dp->d_ops->db_to_fdb(args->geo, dbno); error = xfs_dir2_free_try_read(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), &fbp); @@ -1860,12 +1861,13 @@ xfs_dir2_node_addname_int( if (error) return error; - if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) { + if (dp->d_ops->db_to_fdb(args->geo, dbno) != fbno) { xfs_alert(mp, "%s: dir ino %llu needed freesp block %lld for\n" " data block %lld, got %lld ifbno %llu lastfbno %d", __func__, (unsigned long long)dp->i_ino, - (long long)dp->d_ops->db_to_fdb(mp, dbno), + (long long)dp->d_ops->db_to_fdb( + args->geo, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { @@ -1899,7 +1901,7 @@ xfs_dir2_node_addname_int( freehdr.firstdb = (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * - dp->d_ops->free_max_bests(mp); + dp->d_ops->free_max_bests(args->geo); } else { free = fbp->b_addr; bests = dp->d_ops->free_bests_p(free); @@ -1909,13 +1911,13 @@ xfs_dir2_node_addname_int( /* * Set the freespace block index from the data block number. */ - findex = dp->d_ops->db_to_fdindex(mp, dbno); + findex = dp->d_ops->db_to_fdindex(args->geo, dbno); /* * If it's after the end of the current entries in the * freespace block, extend that table. */ if (findex >= freehdr.nvalid) { - ASSERT(findex < dp->d_ops->free_max_bests(mp)); + ASSERT(findex < dp->d_ops->free_max_bests(args->geo)); freehdr.nvalid = findex + 1; /* * Tag new entry so nused will go up. @@ -2040,7 +2042,7 @@ xfs_dir2_node_lookup( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Fill in the path to the entry in the cursor. @@ -2095,7 +2097,7 @@ xfs_dir2_node_removename( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* Look up the entry we're deleting, set up the cursor. */ @@ -2165,7 +2167,7 @@ xfs_dir2_node_replace( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; inum = args->inumber; /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8cb5340..fa393d5 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -216,7 +216,7 @@ xfs_dir2_block_getdents( /* * Set up values for the loop. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); @@ -338,7 +338,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + mp->m_dirblksize, + mip->ra_want = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize) - 1; ASSERT(mip->ra_want >= 0); @@ -526,8 +526,7 @@ xfs_dir2_leaf_getdents( * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + mp->m_dirblksize, - mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -557,7 +556,7 @@ xfs_dir2_leaf_getdents( * If we have no buffer, or we're off the end of the * current buffer, need to get another one. */ - if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { + if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, &curoff, &bp); @@ -618,7 +617,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_db_off_to_byte(geo, xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); - if (ptr >= (char *)hdr + mp->m_dirblksize) { + if (ptr >= (char *)hdr + geo->blksize) { continue; } } diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 10f4c2a..53c3be6 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -82,8 +82,10 @@ xfs_dir2_block_sfsize( xfs_ino_t parent = 0; /* parent inode number */ int size=0; /* total computed size */ int has_ftype; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * if there is a filetype field, add the extra byte to the namelen @@ -92,7 +94,7 @@ xfs_dir2_block_sfsize( has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; count = i8count = namelen = 0; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -105,7 +107,7 @@ xfs_dir2_block_sfsize( * Calculate the pointer to the entry at hand. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); + xfs_dir2_dataptr_to_off(geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. @@ -195,7 +197,7 @@ xfs_dir2_block_to_sf( /* * Set up to loop over the block's entries. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); @@ -586,7 +588,7 @@ xfs_dir2_sf_addname_pick( * we'll go back, convert to block, then try the insert and convert * to leaf. */ - if (used + (holefit ? 0 : size) > mp->m_dirblksize) + if (used + (holefit ? 0 : size) > args->geo->blksize) return 0; /* * If changing the inode number size, do it the hard way. @@ -601,7 +603,7 @@ xfs_dir2_sf_addname_pick( /* * If it won't fit at the end then do it the hard way (use the hole). */ - if (used + size > mp->m_dirblksize) + if (used + size > args->geo->blksize) return 2; /* * Do it the easy way. @@ -652,7 +654,7 @@ xfs_dir2_sf_check( ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); } #endif /* DEBUG */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 97886a7..d229556 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -24,6 +24,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -105,7 +107,7 @@ xfs_fs_geometry( geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; - geo->dirblocksize = mp->m_dirblksize; + geo->dirblocksize = mp->m_dir_geo->blksize; } if (new_version >= 4) { geo->flags |= diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 275fed3..bf108a7 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -154,7 +154,6 @@ typedef struct xfs_mount { const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ - int m_dirblksize; /* directory block sz--bytes */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 63a42a1..f2bda7c 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -610,7 +610,7 @@ xfs_calc_addafork_reservation( return XFS_DQUOT_LOGRES(mp) + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), -- 1.9.0 From eguan@redhat.com Thu May 22 22:17:58 2014 Return-Path: <eguan@redhat.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 141887F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 22:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F3BB98F8033 for <xfs@oss.sgi.com>; Thu, 22 May 2014 20:17:54 -0700 (PDT) X-ASG-Debug-ID: 1400815073-04cb6c5d0b286840001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4lNdCgYnVB8mK2Q6 for <xfs@oss.sgi.com>; Thu, 22 May 2014 20:17:53 -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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4N3HqS0019311 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 22 May 2014 23:17:52 -0400 Received: from localhost (dhcp12-144.nay.redhat.com [10.66.12.144] (may be forged)) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4N3Hn4k014016; Thu, 22 May 2014 23:17:51 -0400 Date: Fri, 23 May 2014 11:17:48 +0800 From: Eryu Guan <eguan@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it Message-ID: <20140523031748.GU18962@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs/005: filter _scratch_mount output and fix golden output to match it References: <1400775429-30015-1-git-send-email-eguan@redhat.com> <20140522233449.GN18954@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140522233449.GN18954@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400815073 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, May 23, 2014 at 09:34:49AM +1000, Dave Chinner wrote: > On Fri, May 23, 2014 at 12:17:09AM +0800, Eryu Guan wrote: > > Failure message of _scratch_mount is something like: > > > > mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning > > > > not > > > > mount: Structure needs cleaning > > Evidence to the contrary: > > # MKFS_OPTIONS="-b size=1024 -m crc=1" ./check xfs/005 > FSTYP -- xfs (debug) > PLATFORM -- Linux/x86_64 test1 3.15.0-rc5-dgc+ > MKFS_OPTIONS -- -f -b size=1024 -m crc=1 /dev/vdb > MOUNT_OPTIONS -- /dev/vdb /mnt/scratch > > xfs/005 0s ... 0s > Ran: xfs/005 > Passed all 1 tests > > # mount /dev/vdb /mnt/scratch > mount: Structure needs cleaning > # mount -V > mount from util-linux 2.20.1 (with libblkid and selinux support) > # > > So xfs/005 is correct for a relatively recent mount binary. > What version of mount are you using? I'm using util-linux 2.23 # mount -V mount from util-linux 2.23.2 (libmount 2.23.0: selinux, debug, assert) I looked into the util-linux git history, the new output has been added to mount since v2.21-rc1~41, via commit ce433404. So probably the output should be filtered to remove the device and mount point info. I'll send a v2. Thanks for the review! Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eguan@redhat.com Thu May 22 22:44:01 2014 Return-Path: <eguan@redhat.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 5AF3F7F3F for <xfs@oss.sgi.com>; Thu, 22 May 2014 22:44:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42FEA8F8049 for <xfs@oss.sgi.com>; Thu, 22 May 2014 20:44:00 -0700 (PDT) X-ASG-Debug-ID: 1400816636-04cbb006dc273510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7PV0FzACfZ2qJQoJ for <xfs@oss.sgi.com>; Thu, 22 May 2014 20:43: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4N3huEd009573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 22 May 2014 23:43:56 -0400 Received: from localhost (dhcp12-144.nay.redhat.com [10.66.12.144] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4N3hsRR019191; Thu, 22 May 2014 23:43:55 -0400 From: Eryu Guan <eguan@redhat.com> To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Eryu Guan <eguan@redhat.com> Subject: [PATCH v2] xfs/005: filter _scratch_mount output to match golden image Date: Fri, 23 May 2014 11:43:23 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs/005: filter _scratch_mount output to match golden image Message-Id: <1400816603-2263-1-git-send-email-eguan@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: 1400816637 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 Failure message of mount has been changed since util-linux v2.21, to something like: mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning Filter the output to match the golden image for newer mount binary so that both old and new version of mount work correctly. Signed-off-by: Eryu Guan <eguan@redhat.com> --- v2: filter the mount error message instead of changing the golden image tests/xfs/005 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/xfs/005 b/tests/xfs/005 index 94157c4..509ac61 100755 --- a/tests/xfs/005 +++ b/tests/xfs/005 @@ -40,6 +40,11 @@ _cleanup() rm -f $tmp.* } +filter_mount() +{ + sed -e "s/mount .* failed: //" +} + # get standard environment, filters and checks . ./common/rc . ./common/filter @@ -59,7 +64,7 @@ _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" $XFS_IO_PROG -c "pwrite 224 4" $SCRATCH_DEV | _filter_xfs_io # should FAIL, the crc is bad; golden output contains mount failure -_scratch_mount +_scratch_mount 2>&1 | filter_mount # success, all done status=0 -- 1.9.0 From bfoster@redhat.com Fri May 23 06:39:11 2014 Return-Path: <bfoster@redhat.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 732007F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 06:39:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46AA38F8039 for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:39:08 -0700 (PDT) X-ASG-Debug-ID: 1400845144-04cbb006db2903f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qz4ZSEzQ5YujoBwE for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:39:04 -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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBd3dV018796 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 23 May 2014 07:39:03 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4NBd3PL024225; Fri, 23 May 2014 07:39:03 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 79EB31248A9; Fri, 23 May 2014 07:39:02 -0400 (EDT) Date: Fri, 23 May 2014 07:39:02 -0400 From: Brian Foster <bfoster@redhat.com> To: Eryu Guan <eguan@redhat.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs/005: filter _scratch_mount output to match golden image Message-ID: <20140523113902.GA38092@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2] xfs/005: filter _scratch_mount output to match golden image References: <1400816603-2263-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400816603-2263-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400845144 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, May 23, 2014 at 11:43:23AM +0800, Eryu Guan wrote: > Failure message of mount has been changed since util-linux v2.21, to > something like: > > mount: mount /dev/sda5 on /mnt/scratch failed: Structure needs cleaning > > Filter the output to match the golden image for newer mount binary so > that both old and new version of mount work correctly. > > Signed-off-by: Eryu Guan <eguan@redhat.com> > --- > v2: filter the mount error message instead of changing the golden image > Works for me on 2.24.2. Reviewed-by: Brian Foster <bfoster@redhat.com> > tests/xfs/005 | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/tests/xfs/005 b/tests/xfs/005 > index 94157c4..509ac61 100755 > --- a/tests/xfs/005 > +++ b/tests/xfs/005 > @@ -40,6 +40,11 @@ _cleanup() > rm -f $tmp.* > } > > +filter_mount() > +{ > + sed -e "s/mount .* failed: //" > +} > + > # get standard environment, filters and checks > . ./common/rc > . ./common/filter > @@ -59,7 +64,7 @@ _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" > $XFS_IO_PROG -c "pwrite 224 4" $SCRATCH_DEV | _filter_xfs_io > > # should FAIL, the crc is bad; golden output contains mount failure > -_scratch_mount > +_scratch_mount 2>&1 | filter_mount > > # success, all done > status=0 > -- > 1.9.0 > > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From bfoster@redhat.com Fri May 23 06:52:34 2014 Return-Path: <bfoster@redhat.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 27A907F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 06:52:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C88E8F8039 for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52:33 -0700 (PDT) X-ASG-Debug-ID: 1400845952-04cbb006d9291230001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GlFzZAWnPDcMPaBE for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBqWST004446 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:32 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4NBqVbx028613 for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DAF7C1248A9; Fri, 23 May 2014 07:52:30 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v2 0/3] xfs: run eofblocks scan on ENOSPC Date: Fri, 23 May 2014 07:52:27 -0400 X-ASG-Orig-Subj: [PATCH v2 0/3] xfs: run eofblocks scan on ENOSPC Message-Id: <1400845950-41435-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400845952 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 v2 of the eofblocks scan on ENOSPC series, incorporating feedback from v1: http://oss.sgi.com/archives/xfs/2014-03/msg00388.html The major change here is to simplify the error checking logic and tie the eofblocks scan to the inode flush in the ENOSPC scenario. I've done some high-level testing that doesn't seem to elicit any sort of pathological behavior given the circumstances (i.e., performance will never be ideal as we head into ENOSPC). I tested on a hacked filesystem that makes preallocation persistent (no trim on close), disables preallocation throttling and set the background scanner to a high value to create worst case conditions. I ran an fs_mark workload to create 64k 1MB files. Then, started 16x8GB sequential dd writers expected to hit ENOSPC. This is on a 16xcpu box with 32GB RAM and a 200GB fs (with agcounts of 32 and 1024). Via tracepoints, I generally observe that the inode flush acts as a filter to prevent many threads from entering into eofblocks scans at once. E.g., by the time the first handful of threads make it through a scan, they and/or others have dirtied more data for the remaining queued up inode flushers to work with. I notice some occasional spikes in kworkers or rcu processing, but nothing for longer than a couple seconds or so. A downside I've noticed with this logic is that once one thread runs a scan and makes it through this retry sequence, it has a better chance to allocate more of the recently freed space than the others, all of which might have queued on the inode flush lock by the time the first flush/scan completes. This leads to what one might consider "unfair" allocation across the set of writers when we enter this scenario. E.g., I saw tests were some threads were able to complete the 8GB write while others only made it to 2-3GB before the filesystem completely ran out of space. Given the benefit of the series, I think this is something that can be potentially enhanced incrementally if it turns out to be a problem in practice. I also have an xfstests test I'm planning to post soon that verifies lingering preallocations can be reclaimed in a reasonable manner before returning ENOSPC. Thoughts, reviews, flames appreciated. Brian v2: - Drop flush mechanism during eofblocks scan (along with prereq patch). - Simplify scan logic on ENOSPC. Separate EDQUOT from ENOSPC and tie ENOSPC scan to inode flush. - Eliminate unnecessary project quota handling from xfs_inode_free_quota_eofblocks() (ENOSPC is a separate path). Brian Foster (3): xfs: add scan owner field to xfs_eofblocks xfs: run an eofblocks scan on ENOSPC/EDQUOT xfs: squash prealloc while over quota free space as well fs/xfs/xfs_dquot.h | 15 ++++++++++++++ fs/xfs/xfs_file.c | 23 +++++++++++++++++---- fs/xfs/xfs_icache.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_icache.h | 3 +++ fs/xfs/xfs_iomap.c | 20 ++++++++++++------ 5 files changed, 109 insertions(+), 11 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri May 23 06:52:35 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 303B57F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 06:52:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0738AC002 for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52:34 -0700 (PDT) X-ASG-Debug-ID: 1400845952-04cb6c5d0c2a57e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wJflgpOjEq15Fm1j for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBqWhD024570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:32 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBqV3D013453 for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F21011248BB; Fri, 23 May 2014 07:52:30 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Date: Fri, 23 May 2014 07:52:29 -0400 X-ASG-Orig-Subj: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-Id: <1400845950-41435-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1400845950-41435-1-git-send-email-bfoster@redhat.com> References: <1400845950-41435-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: 1400845952 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 Speculative preallocation and and the associated throttling metrics assume we're working with large files on large filesystems. Users have reported inefficiencies in these mechanisms when we happen to be dealing with large files on smaller filesystems. This can occur because while prealloc throttling is aggressive under low free space conditions, it is not active until we reach 5% free space or less. For example, a 40GB filesystem has enough space for several files large enough to have multi-GB preallocations at any given time. If those files are slow growing, they might reserve preallocation for long periods of time as well as avoid the background scanner due to frequent modification. If a new file is written under these conditions, said file has no access to this already reserved space and premature ENOSPC is imminent. To handle this scenario, modify the buffered write ENOSPC handling and retry sequence to invoke an eofblocks scan. In the smaller filesystem scenario, the eofblocks scan resets the usage of preallocation such that when the 5% free space threshold is met, throttling effectively takes over to provide fair and efficient preallocation until legitimate ENOSPC. The eofblocks scan is selective based on the nature of the failure. For example, an EDQUOT failure in a particular quota will use a filtered scan for that quota. Because we don't know which quota might have caused an allocation failure at any given time, we run a scan against each applicable quota determined to be under low free space conditions. Signed-off-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_dquot.h | 15 +++++++++++++++ fs/xfs/xfs_file.c | 23 +++++++++++++++++++---- fs/xfs/xfs_icache.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_icache.h | 1 + 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 68a68f7..c24c67e 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -139,6 +139,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) } } +/* + * Check whether a dquot is under low free space conditions. We assume the quota + * is enabled and enforced. + */ +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) +{ + int64_t freesp; + + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) + return true; + + return false; +} + #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1b8160d..2e0e73b 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -38,6 +38,7 @@ #include "xfs_trace.h" #include "xfs_log.h" #include "xfs_dinode.h" +#include "xfs_icache.h" #include <linux/aio.h> #include <linux/dcache.h> @@ -741,14 +742,28 @@ write_retry: ret = generic_perform_write(file, &from, pos); if (likely(ret >= 0)) iocb->ki_pos = pos + ret; + /* - * If we just got an ENOSPC, try to write back all dirty inodes to - * convert delalloc space to free up some of the excess reserved - * metadata space. + * If we hit a space limit, try to free up some lingering preallocated + * space before returning an error. In the case of ENOSPC, first try to + * write back all dirty inodes to free up some of the excess reserved + * metadata space. This reduces the chances that the eofblocks scan + * waits on dirty mappings. Since xfs_flush_inodes() is serialized, this + * also behaves as a filter to prevent too many eofblocks scans from + * running at the same time. */ - if (ret == -ENOSPC && !enospc) { + if (ret == -EDQUOT && !enospc) { + enospc = xfs_inode_free_quota_eofblocks(ip); + if (enospc) + goto write_retry; + } else if (ret == -ENOSPC && !enospc) { + struct xfs_eofblocks eofb = {0}; + enospc = 1; xfs_flush_inodes(ip->i_mount); + eofb.eof_scan_owner = ip->i_ino; /* for locking */ + eofb.eof_flags = XFS_EOF_FLAGS_SYNC; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); goto write_retry; } diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index f4191f6..3cceb1b 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -33,6 +33,9 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_bmap_util.h" +#include "xfs_quota.h" +#include "xfs_dquot_item.h" +#include "xfs_dquot.h" #include <linux/kthread.h> #include <linux/freezer.h> @@ -1270,6 +1273,50 @@ xfs_icache_free_eofblocks( eofb, XFS_ICI_EOFBLOCKS_TAG); } +/* + * Run eofblocks scans on the quotas applicable to the inode. For inodes with + * multiple quotas, we don't know exactly which quota caused an allocation + * failure. We make a best effort by running scans for each quota considered + * to be under low free space conditions (less than 1% available free space). + */ +int +xfs_inode_free_quota_eofblocks( + struct xfs_inode *ip) +{ + int scanned = 0; + struct xfs_eofblocks eofb = {0,}; + struct xfs_dquot *dq; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + + /* set the scan owner to avoid potential livelock */ + eofb.eof_scan_owner = ip->i_ino; + + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_USER); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_uid = VFS_I(ip)->i_uid; + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| + XFS_EOF_FLAGS_UID; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + } + } + + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_gid = VFS_I(ip)->i_gid; + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| + XFS_EOF_FLAGS_GID; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + } + } + + return scanned; +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 152757f..b432d83 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -58,6 +58,7 @@ void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_icache_free_eofblocks(struct xfs_mount *, struct xfs_eofblocks *); +int xfs_inode_free_quota_eofblocks(struct xfs_inode *ip); void xfs_eofblocks_worker(struct work_struct *); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Fri May 23 06:52:34 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 720E07F47 for <xfs@oss.sgi.com>; Fri, 23 May 2014 06:52:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C58AAC004 for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52:33 -0700 (PDT) X-ASG-Debug-ID: 1400845952-04bdf056b52af010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3UB4kcROkDJQsdKR for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52: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 (8.14.4/8.14.4) with ESMTP id s4NBqWCN024568 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:32 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBqVbA013455 for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0AC161248D1; Fri, 23 May 2014 07:52:31 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v2 3/3] xfs: squash prealloc while over quota free space as well Date: Fri, 23 May 2014 07:52:30 -0400 X-ASG-Orig-Subj: [PATCH v2 3/3] xfs: squash prealloc while over quota free space as well Message-Id: <1400845950-41435-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1400845950-41435-1-git-send-email-bfoster@redhat.com> References: <1400845950-41435-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: 1400845952 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 Commit 4d559a3b introduced heavy prealloc. squashing to catch the case of requesting too large a prealloc on smaller filesystems, leading to repeated flush and retry cycles that occur on ENOSPC. Now that we issue eofblocks scans on EDQUOT/ENOSPC, squash the prealloc against the minimum available free space across all applicable quotas as well to avoid a similar problem of repeated eofblocks scans. Signed-off-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_iomap.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 6c5eb4c..28629e9 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -397,7 +397,8 @@ xfs_quota_calc_throttle( struct xfs_inode *ip, int type, xfs_fsblock_t *qblocks, - int *qshift) + int *qshift, + int64_t *qfreesp) { int64_t freesp; int shift = 0; @@ -406,6 +407,7 @@ xfs_quota_calc_throttle( /* over hi wmark, squash the prealloc completely */ if (dq->q_res_bcount >= dq->q_prealloc_hi_wmark) { *qblocks = 0; + *qfreesp = 0; return; } @@ -418,6 +420,9 @@ xfs_quota_calc_throttle( shift += 2; } + if (freesp < *qfreesp) + *qfreesp = freesp; + /* only overwrite the throttle values if we are more aggressive */ if ((freesp >> shift) < (*qblocks >> *qshift)) { *qblocks = freesp; @@ -476,15 +481,18 @@ xfs_iomap_prealloc_size( } /* - * Check each quota to cap the prealloc size and provide a shift - * value to throttle with. + * Check each quota to cap the prealloc size, provide a shift value to + * throttle with and adjust amount of available space. */ if (xfs_quota_need_throttle(ip, XFS_DQ_USER, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_GROUP, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_PROJ, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift, + &freesp); /* * The final prealloc size is set to the minimum of free space available -- 1.8.3.1 From bfoster@redhat.com Fri May 23 06:52:37 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C0217F47 for <xfs@oss.sgi.com>; Fri, 23 May 2014 06:52:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5C8F304032 for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52:33 -0700 (PDT) X-ASG-Debug-ID: 1400845952-04bdf056b82af020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NXoYjTJtvv6vQARF for <xfs@oss.sgi.com>; Fri, 23 May 2014 04:52: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 (8.14.4/8.14.4) with ESMTP id s4NBqW85025563 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:32 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NBqV7B029023 for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:52:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E9A8A124894; Fri, 23 May 2014 07:52:30 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: xfs@oss.sgi.com Subject: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Date: Fri, 23 May 2014 07:52:28 -0400 X-ASG-Orig-Subj: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-Id: <1400845950-41435-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1400845950-41435-1-git-send-email-bfoster@redhat.com> References: <1400845950-41435-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: 1400845952 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 scan owner field represents an optional inode number that is responsible for the current scan. The purpose is to identify that an inode is under iolock and as such, the iolock shouldn't be attempted when trimming eofblocks. This is an internal only field. Signed-off-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_icache.c | 12 +++++++++++- fs/xfs/xfs_icache.h | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index c48df5f..f4191f6 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1211,6 +1211,7 @@ xfs_inode_free_eofblocks( { int ret; struct xfs_eofblocks *eofb = args; + bool need_iolock = true; if (!xfs_can_free_eofblocks(ip, false)) { /* inode could be preallocated or append-only */ @@ -1235,9 +1236,18 @@ xfs_inode_free_eofblocks( if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && XFS_ISIZE(ip) < eofb->eof_min_file_size) return 0; + + /* + * A scan owner implies we already hold the iolock. Skip it in + * xfs_free_eofblocks() to avoid deadlock. This also eliminates + * the possibility of EAGAIN being returned. + */ + if (eofb->eof_scan_owner != NULLFSINO && + eofb->eof_scan_owner == ip->i_ino) + need_iolock = false; } - ret = xfs_free_eofblocks(ip->i_mount, ip, true); + ret = xfs_free_eofblocks(ip->i_mount, ip, need_iolock); /* don't revisit the inode if we're not waiting */ if (ret == EAGAIN && !(flags & SYNC_WAIT)) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 9cf017b..152757f 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -27,6 +27,7 @@ struct xfs_eofblocks { kgid_t eof_gid; prid_t eof_prid; __u64 eof_min_file_size; + xfs_ino_t eof_scan_owner; }; #define SYNC_WAIT 0x0001 /* wait for i/o to complete */ @@ -84,6 +85,7 @@ xfs_fs_eofblocks_from_user( dst->eof_flags = src->eof_flags; dst->eof_prid = src->eof_prid; dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_scan_owner = NULLFSINO; dst->eof_uid = INVALID_UID; if (src->eof_flags & XFS_EOF_FLAGS_UID) { -- 1.8.3.1 From bfoster@redhat.com Fri May 23 07:58:39 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E478C7F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 07:58:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 653D0AC006 for <xfs@oss.sgi.com>; Fri, 23 May 2014 05:58:35 -0700 (PDT) X-ASG-Debug-ID: 1400849913-04cb6c5d0c2aaf30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d0ou8BqVI4sB5EMr for <xfs@oss.sgi.com>; Fri, 23 May 2014 05:58: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NCwXrO005636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 08:58:33 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NCwWsV004894; Fri, 23 May 2014 08:58:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E25FE1248A9; Fri, 23 May 2014 08:58:31 -0400 (EDT) From: Brian Foster <bfoster@redhat.com> To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC Date: Fri, 23 May 2014 08:58:31 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC Message-Id: <1400849911-46606-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: 1400849913 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 XFS can allocate significant amounts of space to files via speculative preallocation. Such preallocation may not be reclaimed automatically on file close() if a file is repeatedly opened and extended. For smaller filesystems with relatively large and slow growing files, this preallocation can linger for some time, including contributing to out of space conditions. Create a situation where an fs is near out of space while several files still have lingering, significant preallocations. Verify that new writers reclaim the preallocated space rather than return ENOSPC. Signed-off-by: Brian Foster <bfoster@redhat.com> --- Hi all, This test is associated with the recently posted eofblocks scan on ENOSPC series. It currently fails and should pass with the aforementioned patches applied. Thanks. Brian tests/xfs/014 | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/014.out | 95 ++++++++++++++++++++++++++++++++++++ tests/xfs/group | 1 + 3 files changed, 237 insertions(+) create mode 100755 tests/xfs/014 create mode 100644 tests/xfs/014.out diff --git a/tests/xfs/014 b/tests/xfs/014 new file mode 100755 index 0000000..53bc9e1 --- /dev/null +++ b/tests/xfs/014 @@ -0,0 +1,141 @@ +#!/bin/bash +# FS QA Test No. xfs/014 +# +# Test the behavior of XFS dynamic speculative preallocation at ENOSPC +# conditions. Speculative preallocation allocates post-EOF space to files as +# they are extended. This test creates conditions that bypass natural low space +# preallocation throttling and verifies that when no other space is available, +# writers reclaim the preallocated space and do not fail with premature ENOSPC. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_cleanup() +{ + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# create a file that is likely to retain speculative preallocation after close +_spec_prealloc_file() +{ + file=$1 + + rm -f $file + + # a few file extending open-write-close cycles should be enough to + # trigger the fs to retain preallocation. write 256k in 32k intervals to + # be sure + for i in $(seq 0 32768 262144) + do + $XFS_IO_PROG -fc "pwrite $i 32k" $file | _filter_xfs_io + done + + # write a 4k aligned amount of data to keep the calculations simple + $XFS_IO_PROG -c "pwrite 0 128m" $file | _filter_xfs_io + + size=`stat -c "%s" $file` + blocks=`stat -c "%b" $file` + blocksize=`stat -c "%B" $file` + + prealloc_size=$((blocks * blocksize - size)) + if [ $prealloc_size -eq 0 ] + then + echo "Warning: No speculative preallocation for $file." \ + "Check use of the allocsize= mount option." + fi + + # keep a running total of how much preallocation we've created + TOTAL_PREALLOC=$((TOTAL_PREALLOC + prealloc_size)) +} + +_consume_free_space() +{ + dir=$1 + + # calculate the rough amount of free space in MB + fsblocksize=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bsize | \ + awk '{ print $3 }'` + blocksavail=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bavail | \ + awk '{ print $3 }'` + freesp=$((fsblocksize * blocksavail / 1024 / 1024)) + + # allocate all but 10MB + freesp=$((freesp - 10)) + $XFS_IO_PROG -fc "falloc 0 ${freesp}M" $dir/spc +} + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_io_command "falloc" + +rm -f $seqres.full + +# 10GB fs +_scratch_mkfs_xfs_opts "-d size=$((1024*1024*1024 * 10))" | \ + _filter_mkfs 2>> $seqres.full +_scratch_mount + +# make sure the background eofblocks scanner doesn't interfere +orig_sp_time=`cat /proc/sys/fs/xfs/speculative_prealloc_lifetime` +echo 9999 > /proc/sys/fs/xfs/speculative_prealloc_lifetime + +# create a few files with relatively significant preallocation +TOTAL_PREALLOC=0 +for i in $(seq 0 3) +do + _spec_prealloc_file $SCRATCH_MNT/pre$i +done + +# consume most of the remaining free space in the fs to put us near ENOSPC +_consume_free_space $SCRATCH_MNT + +# start a few background writers to consume the bulk of the space that has been +# previously preallocated to other files. this space should be reclaimed such +# these writers complete without hitting ENOSPC +write_size=$((TOTAL_PREALLOC / 2 / 4)) +for i in $(seq 0 3) +do + $XFS_IO_PROG -fc "pwrite 0 $write_size" $SCRATCH_MNT/file.$i | \ + _filter_xfs_io & +done +wait + +echo $orig_sp_time > /proc/sys/fs/xfs/speculative_prealloc_lifetime +umount $SCRATCH_MNT + +status=0 +exit diff --git a/tests/xfs/014.out b/tests/xfs/014.out new file mode 100644 index 0000000..aed3c0f --- /dev/null +++ b/tests/xfs/014.out @@ -0,0 +1,95 @@ +QA output created by 014 +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks +data = bsize=XXX blocks=XXX, imaxpct=PCT + = sunit=XXX swidth=XXX, unwritten=X +naming =VERN bsize=XXX +log =LDEV bsize=XXX blocks=XXX +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX +wrote 32768/32768 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 32768 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 98304 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 131072 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 163840 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 196608 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 229376 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 134217728/134217728 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 32768 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 98304 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 131072 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 163840 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 196608 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 229376 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 134217728/134217728 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 32768 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 98304 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 131072 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 163840 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 196608 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 229376 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 134217728/134217728 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 32768 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 98304 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 131072 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 163840 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 196608 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 229376 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 32768/32768 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 134217728/134217728 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67076096/67076096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67076096/67076096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67076096/67076096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67076096/67076096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/xfs/group b/tests/xfs/group index 19fd968..a39afc1 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -10,6 +10,7 @@ 010 auto quick repair 012 rw auto quick 013 auto metadata stress +014 auto enospc quick 016 rw auto quick 017 mount auto quick stress 018 deprecated # log logprint v2log -- 1.8.3.1 From bfoster@redhat.com Fri May 23 12:51:23 2014 Return-Path: <bfoster@redhat.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 5C24A7F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:51:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 385B28F8040 for <xfs@oss.sgi.com>; Fri, 23 May 2014 10:51:20 -0700 (PDT) X-ASG-Debug-ID: 1400867478-04cb6c22b814a20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TjewJiJ9YMYvaoIp for <xfs@oss.sgi.com>; Fri, 23 May 2014 10:51: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 (8.14.4/8.14.4) with ESMTP id s4NHpADa016263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 13:51:10 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NHp98q006590; Fri, 23 May 2014 13:51:09 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 9CEC0120AC1; Fri, 23 May 2014 13:51:08 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NHp7Cr008348; Fri, 23 May 2014 13:51:07 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 13:51:07 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill xfs_buf_geterror() Message-ID: <20140523175106.GA8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill xfs_buf_geterror() References: <1400802807-19936-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400802807-19936-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400867478 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, May 23, 2014 at 09:53:27AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Most of the callers are just calling ASSERT(!xfs_buf_geterror()) > which means they are checking for bp->b_error == 0. If bp is null in > this case, we will assert fail, and hence it's no different in > result to oopsing because of a null bp. In some cases, errors have > already been checked for or the function returning the buffer can't > return a buffer with an error, so it's just a redundant assert. > Either way, the assert can either be removed. > > The other two non-assert callers can just test for a buffer and > error properly. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Looks good to me. Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_alloc.c | 1 - > fs/xfs/xfs_btree.c | 12 ++---------- > fs/xfs/xfs_buf.h | 5 ----- > fs/xfs/xfs_buf_item.c | 2 +- > fs/xfs/xfs_dquot.c | 6 +++--- > fs/xfs/xfs_ialloc.c | 1 - > fs/xfs/xfs_log.c | 2 +- > fs/xfs/xfs_rtbitmap.c | 1 - > 8 files changed, 7 insertions(+), 23 deletions(-) > > diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c > index c1cf6a3..077c3417 100644 > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -541,7 +541,6 @@ xfs_alloc_read_agfl( > XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_agfl_buf_ops); > if (error) > return error; > - ASSERT(!xfs_buf_geterror(bp)); > xfs_buf_set_ref(bp, XFS_AGFL_REF); > *bpp = bp; > return 0; > diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c > index 182bac2..bf810c6 100644 > --- a/fs/xfs/xfs_btree.c > +++ b/fs/xfs/xfs_btree.c > @@ -553,14 +553,11 @@ xfs_btree_get_bufl( > xfs_fsblock_t fsbno, /* file system block number */ > uint lock) /* lock flags for get_buf */ > { > - xfs_buf_t *bp; /* buffer pointer (return value) */ > xfs_daddr_t d; /* real disk block address */ > > ASSERT(fsbno != NULLFSBLOCK); > d = XFS_FSB_TO_DADDR(mp, fsbno); > - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); > - ASSERT(!xfs_buf_geterror(bp)); > - return bp; > + return xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); > } > > /* > @@ -575,15 +572,12 @@ xfs_btree_get_bufs( > xfs_agblock_t agbno, /* allocation group block number */ > uint lock) /* lock flags for get_buf */ > { > - xfs_buf_t *bp; /* buffer pointer (return value) */ > xfs_daddr_t d; /* real disk block address */ > > ASSERT(agno != NULLAGNUMBER); > ASSERT(agbno != NULLAGBLOCK); > d = XFS_AGB_TO_DADDR(mp, agno, agbno); > - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); > - ASSERT(!xfs_buf_geterror(bp)); > - return bp; > + return xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, lock); > } > > /* > @@ -723,7 +717,6 @@ xfs_btree_read_bufl( > mp->m_bsize, lock, &bp, ops); > if (error) > return error; > - ASSERT(!xfs_buf_geterror(bp)); > if (bp) > xfs_buf_set_ref(bp, refval); > *bpp = bp; > @@ -1179,7 +1172,6 @@ xfs_btree_read_buf_block( > if (error) > return error; > > - ASSERT(!xfs_buf_geterror(*bpp)); > xfs_btree_set_refs(cur, *bpp); > *block = XFS_BUF_TO_BLOCK(*bpp); > return 0; > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 0e47fd1..3a7a552 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -298,11 +298,6 @@ extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, > > extern int xfs_bioerror_relse(struct xfs_buf *); > > -static inline int xfs_buf_geterror(xfs_buf_t *bp) > -{ > - return bp ? bp->b_error : ENOMEM; > -} > - > /* Buffer Utility Routines */ > extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 64b17f5..4654338 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1052,7 +1052,7 @@ xfs_buf_iodone_callbacks( > static ulong lasttime; > static xfs_buftarg_t *lasttarg; > > - if (likely(!xfs_buf_geterror(bp))) > + if (likely(!bp->b_error)) > goto do_callbacks; > > /* > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index 5fec738..3ee0cd4 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -353,10 +353,10 @@ xfs_qm_dqalloc( > dqp->q_blkno, > mp->m_quotainfo->qi_dqchunklen, > 0); > - > - error = xfs_buf_geterror(bp); > - if (error) > + if (!bp) { > + error = ENOMEM; > goto error1; > + } > bp->b_ops = &xfs_dquot_buf_ops; > > /* > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index e8dfaf0..5960e55 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -2129,7 +2129,6 @@ xfs_read_agi( > if (error) > return error; > > - ASSERT(!xfs_buf_geterror(*bpp)); > xfs_buf_set_ref(*bpp, XFS_AGI_REF); > return 0; > } > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 3554098..292308d 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1165,7 +1165,7 @@ xlog_iodone(xfs_buf_t *bp) > /* > * Race to shutdown the filesystem if we see an error. > */ > - if (XFS_TEST_ERROR((xfs_buf_geterror(bp)), l->l_mp, > + if (XFS_TEST_ERROR(bp->b_error, l->l_mp, > XFS_ERRTAG_IODONE_IOERR, XFS_RANDOM_IODONE_IOERR)) { > xfs_buf_ioerror_alert(bp, __func__); > xfs_buf_stale(bp); > diff --git a/fs/xfs/xfs_rtbitmap.c b/fs/xfs/xfs_rtbitmap.c > index b1f2fe8..f4dd697 100644 > --- a/fs/xfs/xfs_rtbitmap.c > +++ b/fs/xfs/xfs_rtbitmap.c > @@ -74,7 +74,6 @@ xfs_rtbuf_get( > mp->m_bsize, 0, &bp, NULL); > if (error) > return error; > - ASSERT(!xfs_buf_geterror(bp)); > *bpp = bp; > return 0; > } > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:05:13 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 95E487F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:05:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4794B304032 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:10 -0700 (PDT) X-ASG-Debug-ID: 1400871908-04bdf059a11d010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vR38vrSdjFcKOHOw for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ52jN025986 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 23 May 2014 15:05:02 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4NJ51BZ027104; Fri, 23 May 2014 15:05:01 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id E71CB120AC1; Fri, 23 May 2014 15:05:00 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ4xi3008764; Fri, 23 May 2014 15:04:59 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:04:59 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/16] xfs: introduce directory geometry structure Message-ID: <20140523190459.GB8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/16] xfs: introduce directory geometry structure References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400871908 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, May 23, 2014 at 10:03:37AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > The directory code has a dependency on the struct xfs_mount to > supply the directory block geometry. Block size, block log size, > and other parameters are pre-caclulated in the struct xfs_mount or > access directly from the superblock embedded in the struct > xfs_mount. > > Extract all of this geometry information out of the struct xfs_mount > and superblock and place it into a new struct xfs_da_geometry > defined by the directory code. Allocate and initialise it at mount > time, and attach it to the struct xfs_mount so it canbe passed back > into the directory code appropriately rather than using the struct > xfs_mount. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_attr.c | 1 + > fs/xfs/xfs_attr_leaf.c | 2 ++ > fs/xfs/xfs_attr_list.c | 1 + > fs/xfs/xfs_da_btree.h | 18 +++++++++++++++ > fs/xfs/xfs_dir2.c | 63 ++++++++++++++++++++++++++++++++++++++++---------- > fs/xfs/xfs_dir2.h | 2 +- > fs/xfs/xfs_mount.c | 18 +++++++++------ > fs/xfs/xfs_mount.h | 3 +++ > 8 files changed, 88 insertions(+), 20 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 1fc1f06..c547498 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -88,6 +88,7 @@ xfs_attr_args_init( > return EINVAL; > > memset(args, 0, sizeof(*args)); > + args->geo = dp->i_mount->m_attr_geo; > args->whichfork = XFS_ATTR_FORK; > args->dp = dp; > args->flags = flags; > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 511c283..2c0fdc8 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) > > memset((char *)&nargs, 0, sizeof(nargs)); > nargs.dp = dp; > + nargs.geo = args->geo; > nargs.firstblock = args->firstblock; > nargs.flist = args->flist; > nargs.total = args->total; > @@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform( > * Copy the attributes > */ > memset((char *)&nargs, 0, sizeof(nargs)); > + nargs.geo = args->geo; > nargs.dp = dp; > nargs.firstblock = args->firstblock; > nargs.flist = args->flist; > diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c > index 833fe5d..90e2eeb 100644 > --- a/fs/xfs/xfs_attr_list.c > +++ b/fs/xfs/xfs_attr_list.c > @@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int( > xfs_da_args_t args; > > memset((char *)&args, 0, sizeof(args)); > + args.geo = context->dp->i_mount->m_attr_geo; > args.dp = context->dp; > args.whichfork = XFS_ATTR_FORK; > args.valuelen = valuelen; > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index c824a0a..0ac63ad 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -25,6 +25,23 @@ struct xfs_trans; > struct zone; > struct xfs_dir_ops; > > +/* > + * Directory/attribute geometry information. There will be one of these for each > + * data fork type, and it will be passed around via the xfs_da_args. Global > + * structures will be attached to the xfs_mount. > + */ > +struct xfs_da_geometry { > + int blksize; /* da block size in bytes */ > + int fsbcount; /* da block size in filesystem blocks */ > + uint8_t fsblog; /* log2 of _filesystem_ block size */ > + uint8_t blklog; /* log2 of da block size */ > + uint node_ents; /* # of entries in a danode */ > + int magicpct; /* 37% of block size in bytes */ > + xfs_dablk_t datablk; /* blockno of dir data v2 */ > + xfs_dablk_t leafblk; /* blockno of leaf data v2 */ > + xfs_dablk_t freeblk; /* blockno of free data v2 */ > +}; > + > /*======================================================================== > * Btree searching and modification structure definitions. > *========================================================================*/ > @@ -42,6 +59,7 @@ enum xfs_dacmp { > * Structure to ease passing around component names. > */ > typedef struct xfs_da_args { > + struct xfs_da_geometry *geo; /* da block geometry */ > const __uint8_t *name; /* string (maybe not NULL terminated) */ > int namelen; /* length of string (maybe no NULL) */ > __uint8_t filetype; /* filetype of inode for directories */ > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 93fcebd..16c3c4b 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { > .compname = xfs_ascii_ci_compname, > }; > > -void > -xfs_dir_mount( > +int > +xfs_da_mount( > xfs_mount_t *mp) > { > - int nodehdr_size; > + struct xfs_da_geometry *dageo; > + int nodehdr_size; > > > ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); > @@ -99,24 +100,56 @@ xfs_dir_mount( > mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); > mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); > > - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); > - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; > - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); > - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); > - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); > - > nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; > - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / > + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > + KM_SLEEP | KM_MAYFAIL); > + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > + KM_SLEEP | KM_MAYFAIL); > + if (!mp->m_dir_geo || !mp->m_attr_geo) { > + kmem_free(mp->m_dir_geo); > + kmem_free(mp->m_attr_geo); > + return ENOMEM; > + } While it looks like everything is handled correctly here, I think this would be much cleaner if we just created a set of xfs_mount_alloc/free() helpers that did all of the allocations at once. Then we wouldn't have a situation where the caller has non-obvious memory allocations to clean up should it fail sometime after calling xfs_da_mount(). Brian > + > + /* set up directory geometry */ > + dageo = mp->m_dir_geo; > + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; > + dageo->fsblog = mp->m_sb.sb_blocklog; > + dageo->blksize = 1 << dageo->blklog; > + dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; > + dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); > + dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); > + dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); > + dageo->node_ents = (dageo->blksize - nodehdr_size) / > (uint)sizeof(xfs_da_node_entry_t); > - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / > + dageo->magicpct = (dageo->blksize * 37) / 100; > + > + /* set up attribute geometry - single fsb only */ > + dageo = mp->m_attr_geo; > + dageo->blklog = mp->m_sb.sb_blocklog; > + dageo->fsblog = mp->m_sb.sb_blocklog; > + dageo->blksize = 1 << dageo->blklog; > + dageo->fsbcount = 1; > + dageo->node_ents = (dageo->blksize - nodehdr_size) / > (uint)sizeof(xfs_da_node_entry_t); > + dageo->magicpct = (dageo->blksize * 37) / 100; > > - mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; > if (xfs_sb_version_hasasciici(&mp->m_sb)) > mp->m_dirnameops = &xfs_ascii_ci_nameops; > else > mp->m_dirnameops = &xfs_default_nameops; > > + /* XXX: these are to be removed as code is converted to use geo */ > + mp->m_dirblksize = mp->m_dir_geo->blksize; > + mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; > + mp->m_dirdatablk = mp->m_dir_geo->datablk; > + mp->m_dirleafblk = mp->m_dir_geo->leafblk; > + mp->m_dirfreeblk = mp->m_dir_geo->freeblk; > + mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > + mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > + mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > + mp->m_attr_magicpct = mp->m_attr_geo->magicpct; > + return 0; > } > > /* > @@ -192,6 +225,7 @@ xfs_dir_init( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->dp = dp; > args->trans = tp; > error = xfs_dir2_sf_create(args, pdp->i_ino); > @@ -226,6 +260,7 @@ xfs_dir_createname( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -320,6 +355,7 @@ xfs_dir_lookup( > * annotations into the reclaim path for the ilock. > */ > args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -391,6 +427,7 @@ xfs_dir_removename( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -455,6 +492,7 @@ xfs_dir_replace( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -516,6 +554,7 @@ xfs_dir_canenter( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index 64a6b19..7b09ef0 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -112,7 +112,7 @@ extern const struct xfs_dir_ops * > * Generic directory interface routines > */ > extern void xfs_dir_startup(void); > -extern void xfs_dir_mount(struct xfs_mount *mp); > +extern int xfs_da_mount(struct xfs_mount *mp); > extern int xfs_dir_isempty(struct xfs_inode *dp); > extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_inode *pdp); > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 8dbd718..8d1afb8 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -784,12 +784,11 @@ xfs_mountfs( > > mp->m_dmevmask = 0; /* not persistent; set after each mount */ > > - xfs_dir_mount(mp); > - > - /* > - * Initialize the attribute manager's entries. > - */ > - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize * 37) / 100; > + error = xfs_da_mount(mp); > + if (error) { > + xfs_warn(mp, "Failed dir/attr init: %d", error); > + goto out_remove_uuid; > + } > > /* > * Initialize the precomputed transaction reservations values. > @@ -804,7 +803,7 @@ xfs_mountfs( > error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); > if (error) { > xfs_warn(mp, "Failed per-ag init: %d", error); > - goto out_remove_uuid; > + goto out_free_dir; > } > > if (!sbp->sb_logblocks) { > @@ -986,6 +985,9 @@ xfs_mountfs( > xfs_wait_buftarg(mp->m_ddev_targp); > out_free_perag: > xfs_free_perag(mp); > + out_free_dir: > + kmem_free(mp->m_dir_geo); > + kmem_free(mp->m_attr_geo); > out_remove_uuid: > xfs_uuid_unmount(mp); > out: > @@ -1072,6 +1074,8 @@ xfs_unmountfs( > #if defined(DEBUG) > xfs_errortag_clearall(mp, 0); > #endif > + kmem_free(mp->m_dir_geo); > + kmem_free(mp->m_attr_geo); > xfs_free_perag(mp); > } > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index b7f1cfb..01b25e41 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -27,6 +27,7 @@ struct xfs_nameops; > struct xfs_ail; > struct xfs_quotainfo; > struct xfs_dir_ops; > +struct xfs_da_geometry; > > #ifdef HAVE_PERCPU_SB > > @@ -96,6 +97,8 @@ typedef struct xfs_mount { > uint m_readio_blocks; /* min read size blocks */ > uint m_writeio_log; /* min write size log bytes */ > uint m_writeio_blocks; /* min write size blocks */ > + struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ > + struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ > struct xlog *m_log; /* log specific stuff */ > int m_logbufs; /* number of log buffers */ > int m_logbsize; /* size of each log buffer */ > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:05:27 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E428E7F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:05:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A851AC006 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:23 -0700 (PDT) X-ASG-Debug-ID: 1400871921-04cbb02a121ae20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IrUiFmwk73ivAPja for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:22 -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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ5KKT016673 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 15:05:20 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ5KTU023864; Fri, 23 May 2014 15:05:20 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 83830120AC1; Fri, 23 May 2014 15:05:19 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ5IEm008773; Fri, 23 May 2014 15:05:18 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:05:18 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-ID: <20140523190518.GC8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400871921 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, May 23, 2014 at 10:03:38AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Because they aren't actually part of the on-disk format, and so > shouldn't be in xfs_da_format.h. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Looks straightforward. Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_da_btree.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_da_format.c | 1 + > fs/xfs/xfs_da_format.h | 138 ------------------------------------------------- > 3 files changed, 138 insertions(+), 138 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 0ac63ad..6d13fd6 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -157,6 +157,143 @@ struct xfs_nameops { > }; > > > +/* > + * Directory offset/block conversion functions. > + * > + * DB blocks here are logical directory block numbers, not filesystem blocks. > + */ > + > +/* > + * Convert dataptr to byte in file space > + */ > +static inline xfs_dir2_off_t > +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) > +{ > + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; > +} > + > +/* > + * Convert byte in file space to dataptr. It had better be aligned. > + */ > +static inline xfs_dir2_dataptr_t > +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) > +{ > + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); > +} > + > +/* > + * Convert byte in space to (DB) block > + */ > +static inline xfs_dir2_db_t > +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) > +{ > + return (xfs_dir2_db_t) > + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); > +} > + > +/* > + * Convert dataptr to a block number > + */ > +static inline xfs_dir2_db_t > +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > +{ > + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); > +} > + > +/* > + * Convert byte in space to offset in a block > + */ > +static inline xfs_dir2_data_aoff_t > +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) > +{ > + return (xfs_dir2_data_aoff_t)(by & > + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); > +} > + > +/* > + * Convert dataptr to a byte offset in a block > + */ > +static inline xfs_dir2_data_aoff_t > +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > +{ > + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); > +} > + > +/* > + * Convert block and offset to byte in space > + */ > +static inline xfs_dir2_off_t > +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, > + xfs_dir2_data_aoff_t o) > +{ > + return ((xfs_dir2_off_t)db << > + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; > +} > + > +/* > + * Convert block (DB) to block (dablk) > + */ > +static inline xfs_dablk_t > +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > +{ > + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); > +} > + > +/* > + * Convert byte in space to (DA) block > + */ > +static inline xfs_dablk_t > +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) > +{ > + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); > +} > + > +/* > + * Convert block and offset to dataptr > + */ > +static inline xfs_dir2_dataptr_t > +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > + xfs_dir2_data_aoff_t o) > +{ > + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); > +} > + > +/* > + * Convert block (dablk) to block (DB) > + */ > +static inline xfs_dir2_db_t > +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) > +{ > + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); > +} > + > +/* > + * Convert block (dablk) to byte offset in space > + */ > +static inline xfs_dir2_off_t > +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) > +{ > + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); > +} > + > +/* > + * Directory tail pointer accessor functions. Based on block geometry. > + */ > +static inline struct xfs_dir2_block_tail * > +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) > +{ > + return ((struct xfs_dir2_block_tail *) > + ((char *)hdr + mp->m_dirblksize)) - 1; > +} > + > +static inline struct xfs_dir2_leaf_tail * > +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) > +{ > + return (struct xfs_dir2_leaf_tail *) > + ((char *)lp + mp->m_dirblksize - > + sizeof(struct xfs_dir2_leaf_tail)); > +} > + > /*======================================================================== > * Function prototypes. > *========================================================================*/ > diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c > index e6c83e1..22bbc79 100644 > --- a/fs/xfs/xfs_da_format.c > +++ b/fs/xfs/xfs_da_format.c > @@ -26,6 +26,7 @@ > #include "xfs_ag.h" > #include "xfs_mount.h" > #include "xfs_da_format.h" > +#include "xfs_da_btree.h" > #include "xfs_inode.h" > #include "xfs_dir2.h" > > diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h > index 1432b57..32b415c 100644 > --- a/fs/xfs/xfs_da_format.h > +++ b/fs/xfs/xfs_da_format.h > @@ -514,17 +514,6 @@ struct xfs_dir3_leaf { > #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) > > /* > - * Get address of the bestcount field in the single-leaf block. > - */ > -static inline struct xfs_dir2_leaf_tail * > -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) > -{ > - return (struct xfs_dir2_leaf_tail *) > - ((char *)lp + mp->m_dirblksize - > - sizeof(struct xfs_dir2_leaf_tail)); > -} > - > -/* > * Get address of the bests array in the single-leaf block. > */ > static inline __be16 * > @@ -534,123 +523,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) > } > > /* > - * DB blocks here are logical directory block numbers, not filesystem blocks. > - */ > - > -/* > - * Convert dataptr to byte in file space > - */ > -static inline xfs_dir2_off_t > -xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) > -{ > - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; > -} > - > -/* > - * Convert byte in file space to dataptr. It had better be aligned. > - */ > -static inline xfs_dir2_dataptr_t > -xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) > -{ > - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); > -} > - > -/* > - * Convert byte in space to (DB) block > - */ > -static inline xfs_dir2_db_t > -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) > -{ > - return (xfs_dir2_db_t) > - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); > -} > - > -/* > - * Convert dataptr to a block number > - */ > -static inline xfs_dir2_db_t > -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > -{ > - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); > -} > - > -/* > - * Convert byte in space to offset in a block > - */ > -static inline xfs_dir2_data_aoff_t > -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) > -{ > - return (xfs_dir2_data_aoff_t)(by & > - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); > -} > - > -/* > - * Convert dataptr to a byte offset in a block > - */ > -static inline xfs_dir2_data_aoff_t > -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > -{ > - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); > -} > - > -/* > - * Convert block and offset to byte in space > - */ > -static inline xfs_dir2_off_t > -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, > - xfs_dir2_data_aoff_t o) > -{ > - return ((xfs_dir2_off_t)db << > - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; > -} > - > -/* > - * Convert block (DB) to block (dablk) > - */ > -static inline xfs_dablk_t > -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > -{ > - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); > -} > - > -/* > - * Convert byte in space to (DA) block > - */ > -static inline xfs_dablk_t > -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) > -{ > - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); > -} > - > -/* > - * Convert block and offset to dataptr > - */ > -static inline xfs_dir2_dataptr_t > -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > - xfs_dir2_data_aoff_t o) > -{ > - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); > -} > - > -/* > - * Convert block (dablk) to block (DB) > - */ > -static inline xfs_dir2_db_t > -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) > -{ > - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); > -} > - > -/* > - * Convert block (dablk) to byte offset in space > - */ > -static inline xfs_dir2_off_t > -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) > -{ > - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); > -} > - > -/* > * Free space block defintions for the node format. > */ > > @@ -736,16 +608,6 @@ typedef struct xfs_dir2_block_tail { > } xfs_dir2_block_tail_t; > > /* > - * Pointer to the leaf header embedded in a data block (1-block format) > - */ > -static inline struct xfs_dir2_block_tail * > -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) > -{ > - return ((struct xfs_dir2_block_tail *) > - ((char *)hdr + mp->m_dirblksize)) - 1; > -} > - > -/* > * Pointer to the leaf entries embedded in a data block (1-block format) > */ > static inline struct xfs_dir2_leaf_entry * > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:05:32 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 253DC7F55 for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:05:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03ED2304032 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:31 -0700 (PDT) X-ASG-Debug-ID: 1400871930-04cb6c22b61c050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7P8nuCxT7USZSgw8 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05: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 (8.14.4/8.14.4) with ESMTP id s4NJ5TGM026123 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 15:05:29 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ5To9021323; Fri, 23 May 2014 15:05:29 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 8AE1B120AC1; Fri, 23 May 2014 15:05:28 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ5RLY008776; Fri, 23 May 2014 15:05:27 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:05:27 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Message-ID: <20140523190526.GD8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400871930 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, May 23, 2014 at 10:03:39AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > They are just simple wrappers around xfs_dir2_byte_to_db(), and > we've already removed one usage earlier in the patch set. Kill > the rest before we start removing the xfs_mount from conversion > functions. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_da_format.c | 6 ++++-- > fs/xfs/xfs_da_format.h | 6 ------ > fs/xfs/xfs_dir2.c | 2 +- > fs/xfs/xfs_dir2_leaf.c | 9 +++++---- > fs/xfs/xfs_dir2_node.c | 11 +++++++---- > 5 files changed, 17 insertions(+), 17 deletions(-) > > diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c > index 22bbc79..313eea3 100644 > --- a/fs/xfs/xfs_da_format.c > +++ b/fs/xfs/xfs_da_format.c > @@ -610,7 +610,8 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) > static xfs_dir2_db_t > xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > { > - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); > + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + > + (db / xfs_dir2_free_max_bests(mp)); > } > > /* > @@ -641,7 +642,8 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) > static xfs_dir2_db_t > xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > { > - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); > + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + > + (db / xfs_dir3_free_max_bests(mp)); > } > > /* > diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h > index 32b415c..44d7fac 100644 > --- a/fs/xfs/xfs_da_format.h > +++ b/fs/xfs/xfs_da_format.h > @@ -330,8 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) > #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) > #define XFS_DIR2_DATA_SPACE 0 > #define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) > -#define XFS_DIR2_DATA_FIRSTDB(mp) \ > - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) > > /* > * Describe a free area in the data block. > @@ -456,8 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) > */ > #define XFS_DIR2_LEAF_SPACE 1 > #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) > -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ > - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) > > /* > * Leaf block header. > @@ -531,8 +527,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) > */ > #define XFS_DIR2_FREE_SPACE 2 > #define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) > -#define XFS_DIR2_FREE_FIRSTDB(mp) \ > - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) > > typedef struct xfs_dir2_free_hdr { > __be32 magic; /* XFS_DIR2_FREE_MAGIC */ > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 16c3c4b..1268dae 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -736,7 +736,7 @@ xfs_dir2_shrink_inode( > /* > * If it's not a data block, we're done. > */ > - if (db >= XFS_DIR2_LEAF_FIRSTDB(mp)) > + if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) > return 0; > /* > * If the block isn't the last one in the directory, we're done. > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index f571723..dc4ef19 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( > int error; > > ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); > - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && > - bno < XFS_DIR2_FREE_FIRSTDB(mp)); > + ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && > + bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); > > error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, > XFS_DATA_FORK); > @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( > return error; > } > ldb = xfs_dir2_da_to_db(mp, blkno); > - ASSERT(ldb == XFS_DIR2_LEAF_FIRSTDB(mp)); > + ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); > /* > * Initialize the leaf block, get a buffer for it. > */ > @@ -1798,7 +1798,8 @@ xfs_dir2_node_to_leaf( > /* > * Get rid of the freespace block. > */ > - error = xfs_dir2_shrink_inode(args, XFS_DIR2_FREE_FIRSTDB(mp), fbp); > + error = xfs_dir2_shrink_inode(args, > + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); > if (error) { > /* > * This can't fail here because it can only happen when > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 9cb91ee..1bcaaa0 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -315,7 +315,7 @@ xfs_dir2_leaf_to_node( > if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { > return error; > } > - ASSERT(fdb == XFS_DIR2_FREE_FIRSTDB(mp)); > + ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); > /* > * Get the buffer for the new freespace block. > */ > @@ -1256,7 +1256,7 @@ xfs_dir2_leafn_remove( > struct xfs_dir3_icfree_hdr freehdr; > dp->d_ops->free_hdr_from_disk(&freehdr, free); > ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * > - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); > + (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); > } > #endif > /* > @@ -1747,7 +1747,8 @@ xfs_dir2_node_addname_int( > * us a freespace block to start with. > */ > if (++fbno == 0) > - fbno = XFS_DIR2_FREE_FIRSTDB(mp); > + fbno = xfs_dir2_byte_to_db(mp, > + XFS_DIR2_FREE_OFFSET); > /* > * If it's ifbno we already looked at it. > */ > @@ -1887,7 +1888,9 @@ xfs_dir2_node_addname_int( > /* > * Remember the first slot as our empty slot. > */ > - freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * > + freehdr.firstdb = > + (fbno - xfs_dir2_byte_to_db(mp, > + XFS_DIR2_FREE_OFFSET)) * > dp->d_ops->free_max_bests(mp); > } else { > free = fbp->b_addr; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:05:41 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E9C47F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:05:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F15A830406B for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:40 -0700 (PDT) X-ASG-Debug-ID: 1400871939-04cbb02a121ae90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IVAmn6w8oYswovrt for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:05:39 -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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ5c65006659 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 15:05:38 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ5cUv024181; Fri, 23 May 2014 15:05:38 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id AD487120AC1; Fri, 23 May 2014 15:05:37 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ5bqr008781; Fri, 23 May 2014 15:05:37 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:05:36 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry Message-ID: <20140523190536.GE8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400871939 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, May 23, 2014 at 10:03:40AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_da_btree.h | 18 +++++++++--------- > fs/xfs/xfs_dir2.c | 2 +- > fs/xfs/xfs_dir2_readdir.c | 7 ++++--- > 3 files changed, 14 insertions(+), 13 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 6d13fd6..e9496a9 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -204,10 +204,9 @@ xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > * Convert byte in space to offset in a block > */ > static inline xfs_dir2_data_aoff_t > -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) > +xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) > { > - return (xfs_dir2_data_aoff_t)(by & > - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); > + return (xfs_dir2_data_aoff_t)(by & (geo->blksize - 1)); > } > > /* > @@ -216,18 +215,17 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) > static inline xfs_dir2_data_aoff_t > xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > { > - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); > + return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); > } > > /* > * Convert block and offset to byte in space > */ > static inline xfs_dir2_off_t > -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, > +xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, > xfs_dir2_data_aoff_t o) > { > - return ((xfs_dir2_off_t)db << > - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; > + return ((xfs_dir2_off_t)db << geo->blklog) + o; > } > > /* > @@ -255,7 +253,8 @@ static inline xfs_dir2_dataptr_t > xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > xfs_dir2_data_aoff_t o) > { > - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); > + return xfs_dir2_byte_to_dataptr( > + xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); > } > > /* > @@ -273,7 +272,8 @@ xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) > static inline xfs_dir2_off_t > xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) > { > - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); > + return xfs_dir2_db_off_to_byte(mp->m_dir_geo, > + xfs_dir2_da_to_db(mp, da), 0); > } > > /* > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 1268dae..a7d3884 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -741,7 +741,7 @@ xfs_dir2_shrink_inode( > /* > * If the block isn't the last one in the directory, we're done. > */ > - if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(mp, db + 1, 0)) > + if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0)) > return 0; > bno = da; > if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) { > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index bf7a5ce..ec912c8 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -560,7 +560,8 @@ xfs_dir2_leaf_getdents( > /* > * Having done a read, we need to set a new offset. > */ > - newoff = xfs_dir2_db_off_to_byte(mp, map_info->curdb, 0); > + newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, > + map_info->curdb, 0); > /* > * Start of the current block. > */ > @@ -578,7 +579,7 @@ xfs_dir2_leaf_getdents( > * Find our position in the block. > */ > ptr = (char *)dp->d_ops->data_entry_p(hdr); > - byteoff = xfs_dir2_byte_to_off(mp, curoff); > + byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); > /* > * Skip past the header. > */ > @@ -607,7 +608,7 @@ xfs_dir2_leaf_getdents( > * Now set our real offset. > */ > curoff = > - xfs_dir2_db_off_to_byte(mp, > + xfs_dir2_db_off_to_byte(mp->m_dir_geo, > xfs_dir2_byte_to_db(mp, curoff), > (char *)ptr - (char *)hdr); > if (ptr >= (char *)hdr + mp->m_dirblksize) { > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:06:27 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3B61D7F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:06:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17185304032 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:06:27 -0700 (PDT) X-ASG-Debug-ID: 1400871985-04cbb02a0f1afa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MkcvQAk5OE3wG5XX for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:06: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-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ6Oac017811 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 23 May 2014 15:06:25 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4NJ6Olb009462; Fri, 23 May 2014 15:06:24 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id CA802120AC1; Fri, 23 May 2014 15:06:23 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ6NSk008784; Fri, 23 May 2014 15:06:23 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:06:22 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Message-ID: <20140523190622.GF8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400871985 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, May 23, 2014 at 10:03:41AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_da_btree.h | 15 +++++++-------- > fs/xfs/xfs_dir2.c | 4 ++-- > fs/xfs/xfs_dir2_data.c | 4 ++-- > fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- > fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ > fs/xfs/xfs_dir2_readdir.c | 6 +++--- > 6 files changed, 48 insertions(+), 43 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index e9496a9..8db83fc 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -232,9 +232,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, > * Convert block (DB) to block (dablk) > */ > static inline xfs_dablk_t > -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > +xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > { > - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); > + return (xfs_dablk_t)(db << (geo->blklog - geo->fsblog)); > } > > /* > @@ -243,7 +243,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > static inline xfs_dablk_t > xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) > { > - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); > + return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); > } > > /* > @@ -261,19 +261,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > * Convert block (dablk) to block (DB) > */ > static inline xfs_dir2_db_t > -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) > +xfs_dir2_da_to_db(struct xfs_da_geometry *geo, xfs_dablk_t da) > { > - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); > + return (xfs_dir2_db_t)(da >> (geo->blklog - geo->fsblog)); > } > > /* > * Convert block (dablk) to byte offset in space > */ > static inline xfs_dir2_off_t > -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) > +xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) > { > - return xfs_dir2_db_off_to_byte(mp->m_dir_geo, > - xfs_dir2_da_to_db(mp, da), 0); > + return xfs_dir2_db_off_to_byte(geo, xfs_dir2_da_to_db(geo, da), 0); > } Is it a problem that we convert a dablk to a db block on the way to a byte conversion? i.e., that seems like a lossy conversion, assuming I am correctly understanding that a dablk is equivalent to a filesystem block and a db block is a directory block (1 or more dablks). Perhaps this isn't a problem due to how this is used, but I just wanted to call it out. The code uses this implementation irrespective of this patch, and the patch looks Ok to me: Reviewed-by: Brian Foster <bfoster@redhat.com> > > /* > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index a7d3884..f76008c 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -624,7 +624,7 @@ xfs_dir2_grow_inode( > if (error) > return error; > > - *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); > + *dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno); > > /* > * Update file's size if this is the data space and it grew. > @@ -705,7 +705,7 @@ xfs_dir2_shrink_inode( > dp = args->dp; > mp = dp->i_mount; > tp = args->trans; > - da = xfs_dir2_db_to_da(mp, db); > + da = xfs_dir2_db_to_da(args->geo, db); > /* > * Unmap the fsblock(s). > */ > diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c > index bae8b5b..890c940 100644 > --- a/fs/xfs/xfs_dir2_data.c > +++ b/fs/xfs/xfs_dir2_data.c > @@ -584,8 +584,8 @@ xfs_dir3_data_init( > /* > * Get the buffer set up for the block. > */ > - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, > - XFS_DATA_FORK); > + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, blkno), > + -1, &bp, XFS_DATA_FORK); > if (error) > return error; > bp->b_ops = &xfs_dir3_data_buf_ops; > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index dc4ef19..046ba4a 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -350,8 +350,8 @@ xfs_dir3_leaf_get_buf( > ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && > bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); > > - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, > - XFS_DATA_FORK); > + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), > + -1, &bp, XFS_DATA_FORK); > if (error) > return error; > > @@ -403,7 +403,7 @@ xfs_dir2_block_to_leaf( > if ((error = xfs_da_grow_inode(args, &blkno))) { > return error; > } > - ldb = xfs_dir2_da_to_db(mp, blkno); > + ldb = xfs_dir2_da_to_db(args->geo, blkno); > ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); > /* > * Initialize the leaf block, get a buffer for it. > @@ -828,8 +828,8 @@ xfs_dir2_leaf_addname( > * Just read that one in. > */ > error = xfs_dir3_data_read(tp, dp, > - xfs_dir2_db_to_da(mp, use_block), > - -1, &dbp); > + xfs_dir2_db_to_da(args->geo, use_block), > + -1, &dbp); > if (error) { > xfs_trans_brelse(tp, lbp); > return error; > @@ -1269,8 +1269,8 @@ xfs_dir2_leaf_lookup_int( > if (dbp) > xfs_trans_brelse(tp, dbp); > error = xfs_dir3_data_read(tp, dp, > - xfs_dir2_db_to_da(mp, newdb), > - -1, &dbp); > + xfs_dir2_db_to_da(args->geo, newdb), > + -1, &dbp); > if (error) { > xfs_trans_brelse(tp, lbp); > return error; > @@ -1310,8 +1310,8 @@ xfs_dir2_leaf_lookup_int( > if (cidb != curdb) { > xfs_trans_brelse(tp, dbp); > error = xfs_dir3_data_read(tp, dp, > - xfs_dir2_db_to_da(mp, cidb), > - -1, &dbp); > + xfs_dir2_db_to_da(args->geo, cidb), > + -1, &dbp); > if (error) { > xfs_trans_brelse(tp, lbp); > return error; > @@ -1609,7 +1609,8 @@ xfs_dir2_leaf_trim_data( > /* > * Read the offending data block. We need its buffer. > */ > - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); > + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(args->geo, db), > + -1, &dbp); > if (error) > return error; > > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 1bcaaa0..3b70d56 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -195,17 +195,18 @@ xfs_dir2_free_try_read( > > static int > xfs_dir3_free_get_buf( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + xfs_da_args_t *args, > xfs_dir2_db_t fbno, > struct xfs_buf **bpp) > { > + struct xfs_trans *tp = args->trans; > + struct xfs_inode *dp = args->dp; > struct xfs_mount *mp = dp->i_mount; > struct xfs_buf *bp; > int error; > struct xfs_dir3_icfree_hdr hdr; > > - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), > + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), > -1, &bp, XFS_DATA_FORK); > if (error) > return error; > @@ -319,7 +320,7 @@ xfs_dir2_leaf_to_node( > /* > * Get the buffer for the new freespace block. > */ > - error = xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); > + error = xfs_dir3_free_get_buf(args, fdb, &fbp); > if (error) > return error; > > @@ -605,7 +606,8 @@ xfs_dir2_leafn_lookup_for_addname( > xfs_trans_brelse(tp, curbp); > > error = xfs_dir2_free_read(tp, dp, > - xfs_dir2_db_to_da(mp, newfdb), > + xfs_dir2_db_to_da(args->geo, > + newfdb), > &curbp); > if (error) > return error; > @@ -746,7 +748,8 @@ xfs_dir2_leafn_lookup_for_entry( > curbp = state->extrablk.bp; > } else { > error = xfs_dir3_data_read(tp, dp, > - xfs_dir2_db_to_da(mp, newdb), > + xfs_dir2_db_to_da(args->geo, > + newdb), > -1, &curbp); > if (error) > return error; > @@ -1246,7 +1249,8 @@ xfs_dir2_leafn_remove( > * read in the free block. > */ > fdb = dp->d_ops->db_to_fdb(mp, db); > - error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), > + error = xfs_dir2_free_read(tp, dp, > + xfs_dir2_db_to_da(args->geo, fdb), > &fbp); > if (error) > return error; > @@ -1336,7 +1340,7 @@ xfs_dir2_leafn_split( > /* > * Initialize the new leaf block. > */ > - error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), > + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(args->geo, blkno), > &newblk->bp, XFS_DIR2_LEAFN_MAGIC); > if (error) > return error; > @@ -1729,7 +1733,7 @@ xfs_dir2_node_addname_int( > > if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) > return error; > - lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); > + lastfbno = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo); > fbno = ifbno; > } > /* > @@ -1766,8 +1770,8 @@ xfs_dir2_node_addname_int( > * to avoid it. > */ > error = xfs_dir2_free_try_read(tp, dp, > - xfs_dir2_db_to_da(mp, fbno), > - &fbp); > + xfs_dir2_db_to_da(args->geo, fbno), > + &fbp); > if (error) > return error; > if (!fbp) > @@ -1837,8 +1841,8 @@ xfs_dir2_node_addname_int( > */ > fbno = dp->d_ops->db_to_fdb(mp, dbno); > error = xfs_dir2_free_try_read(tp, dp, > - xfs_dir2_db_to_da(mp, fbno), > - &fbp); > + xfs_dir2_db_to_da(args->geo, fbno), > + &fbp); > if (error) > return error; > > @@ -1878,7 +1882,7 @@ xfs_dir2_node_addname_int( > /* > * Get a buffer for the new block. > */ > - error = xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); > + error = xfs_dir3_free_get_buf(args, fbno, &fbp); > if (error) > return error; > free = fbp->b_addr; > @@ -1946,7 +1950,8 @@ xfs_dir2_node_addname_int( > /* > * Read the data block in. > */ > - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), > + error = xfs_dir3_data_read(tp, dp, > + xfs_dir2_db_to_da(args->geo, dbno), > -1, &dbp); > if (error) > return error; > @@ -2265,9 +2270,9 @@ xfs_dir2_node_trim_free( > /* > * Blow the block away. > */ > - if ((error = > - xfs_dir2_shrink_inode(args, xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo), > - bp))) { > + error = xfs_dir2_shrink_inode(args, > + xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo), bp); > + if (error) { > /* > * Can't fail with ENOSPC since that only happens with no > * space reservation, when breaking up an extent into two > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index ec912c8..57e9247 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -396,14 +396,14 @@ xfs_dir2_leaf_readbuf( > * No valid mappings, so no more data blocks. > */ > if (!mip->map_valid) { > - *curoff = xfs_dir2_da_to_byte(mp, mip->map_off); > + *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); > goto out; > } > > /* > * Read the directory block starting at the first mapping. > */ > - mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff); > + mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); > error = xfs_dir3_data_read(NULL, dp, map->br_startoff, > map->br_blockcount >= mp->m_dirblkfsbs ? > XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); > @@ -536,7 +536,7 @@ xfs_dir2_leaf_getdents( > * Force this conversion through db so we truncate the offset > * down to get the start of the data block. > */ > - map_info->map_off = xfs_dir2_db_to_da(mp, > + map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, > xfs_dir2_byte_to_db(mp, curoff)); > > /* > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 14:07:09 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B95257F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 14:07:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51F36AC005 for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:07:08 -0700 (PDT) X-ASG-Debug-ID: 1400872026-04bdf0599f1d310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QTlY9xwQisVHEXEx for <xfs@oss.sgi.com>; Fri, 23 May 2014 12:07:06 -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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NJ759b014916 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 23 May 2014 15:07:05 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4NJ7441028183; Fri, 23 May 2014 15:07:04 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id EF1E4120AC1; Fri, 23 May 2014 15:07:03 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NJ73B1008787; Fri, 23 May 2014 15:07:03 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 15:07:02 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry Message-ID: <20140523190702.GG8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400872026 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, May 23, 2014 at 10:03:42AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_da_btree.h | 22 ++++++++++------------ > fs/xfs/xfs_da_format.c | 4 ++-- > fs/xfs/xfs_dir2.c | 13 +++++++++---- > fs/xfs/xfs_dir2_block.c | 15 +++++++++------ > fs/xfs/xfs_dir2_data.c | 3 ++- > fs/xfs/xfs_dir2_leaf.c | 30 +++++++++++++++++------------- > fs/xfs/xfs_dir2_node.c | 27 ++++++++++++++++----------- > fs/xfs/xfs_dir2_readdir.c | 45 ++++++++++++++++++++++++++------------------- > fs/xfs/xfs_dir2_sf.c | 4 ++-- > 9 files changed, 93 insertions(+), 70 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index 8db83fc..d35b31f 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -185,19 +185,18 @@ xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) > * Convert byte in space to (DB) block > */ > static inline xfs_dir2_db_t > -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) > +xfs_dir2_byte_to_db(struct xfs_da_geometry *geo, xfs_dir2_off_t by) > { > - return (xfs_dir2_db_t) > - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); > + return (xfs_dir2_db_t)(by >> geo->blklog); > } > > /* > * Convert dataptr to a block number > */ > static inline xfs_dir2_db_t > -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > +xfs_dir2_dataptr_to_db(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) > { > - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); > + return xfs_dir2_byte_to_db(geo, xfs_dir2_dataptr_to_byte(dp)); > } > > /* > @@ -213,9 +212,9 @@ xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) > * Convert dataptr to a byte offset in a block > */ > static inline xfs_dir2_data_aoff_t > -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) > +xfs_dir2_dataptr_to_off(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) > { > - return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); > + return xfs_dir2_byte_to_off(geo, xfs_dir2_dataptr_to_byte(dp)); > } > > /* > @@ -241,20 +240,19 @@ xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > * Convert byte in space to (DA) block > */ > static inline xfs_dablk_t > -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) > +xfs_dir2_byte_to_da(struct xfs_da_geometry *geo, xfs_dir2_off_t by) > { > - return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); > + return xfs_dir2_db_to_da(geo, xfs_dir2_byte_to_db(geo, by)); > } Same byte->db->da question here, though this one looks like it's only used for the special hardcoded offsets. Otherwise, looks good... Reviewed-by: Brian Foster <bfoster@redhat.com> > > /* > * Convert block and offset to dataptr > */ > static inline xfs_dir2_dataptr_t > -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > +xfs_dir2_db_off_to_dataptr(struct xfs_da_geometry *geo, xfs_dir2_db_t db, > xfs_dir2_data_aoff_t o) > { > - return xfs_dir2_byte_to_dataptr( > - xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); > + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(geo, db, o)); > } > > /* > diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c > index 313eea3..c782f2c 100644 > --- a/fs/xfs/xfs_da_format.c > +++ b/fs/xfs/xfs_da_format.c > @@ -610,7 +610,7 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) > static xfs_dir2_db_t > xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > { > - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + > + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + > (db / xfs_dir2_free_max_bests(mp)); > } > > @@ -642,7 +642,7 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) > static xfs_dir2_db_t > xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > { > - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + > + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + > (db / xfs_dir3_free_max_bests(mp)); > } > > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index f76008c..0bd3468 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -117,9 +117,14 @@ xfs_da_mount( > dageo->fsblog = mp->m_sb.sb_blocklog; > dageo->blksize = 1 << dageo->blklog; > dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; > - dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); > - dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); > - dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); > + > + /* > + * Now we've set up the block conversion variables, we can calculate the > + * segment block constants using the geometry structure. > + */ > + dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET); > + dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET); > + dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET); > dageo->node_ents = (dageo->blksize - nodehdr_size) / > (uint)sizeof(xfs_da_node_entry_t); > dageo->magicpct = (dageo->blksize * 37) / 100; > @@ -736,7 +741,7 @@ xfs_dir2_shrink_inode( > /* > * If it's not a data block, we're done. > */ > - if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) > + if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)) > return 0; > /* > * If the block isn't the last one in the directory, we're done. > diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c > index dd9d005..bc08216 100644 > --- a/fs/xfs/xfs_dir2_block.c > +++ b/fs/xfs/xfs_dir2_block.c > @@ -639,7 +639,8 @@ xfs_dir2_block_lookup( > * Get the offset from the leaf entry, to point to the data. > */ > dep = (xfs_dir2_data_entry_t *)((char *)hdr + > - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(blp[ent].address))); > /* > * Fill in inode number, CI name if appropriate, release the block. > */ > @@ -723,7 +724,7 @@ xfs_dir2_block_lookup_int( > * Get pointer to the entry from the leaf. > */ > dep = (xfs_dir2_data_entry_t *) > - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); > + ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr)); > /* > * Compare name and if it's an exact match, return the index > * and buffer. If it's the first case-insensitive match, store > @@ -795,8 +796,9 @@ xfs_dir2_block_removename( > /* > * Point to the data entry using the leaf entry. > */ > - dep = (xfs_dir2_data_entry_t *) > - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); > + dep = (xfs_dir2_data_entry_t *)((char *)hdr + > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(blp[ent].address))); > /* > * Mark the data entry's space free. > */ > @@ -870,8 +872,9 @@ xfs_dir2_block_replace( > /* > * Point to the data entry we need to change. > */ > - dep = (xfs_dir2_data_entry_t *) > - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); > + dep = (xfs_dir2_data_entry_t *)((char *)hdr + > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(blp[ent].address))); > ASSERT(be64_to_cpu(dep->inumber) != args->inumber); > /* > * Change the inode number to the new value. > diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c > index 890c940..d355ec7 100644 > --- a/fs/xfs/xfs_dir2_data.c > +++ b/fs/xfs/xfs_dir2_data.c > @@ -172,7 +172,8 @@ __xfs_dir3_data_check( > lastfree = 0; > if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { > - addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, > + addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, > + mp->m_dirdatablk, > (xfs_dir2_data_aoff_t) > ((char *)dep - (char *)hdr)); > name.name = dep->name; > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index 046ba4a..2b3ddd0 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( > int error; > > ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); > - ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && > - bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); > + ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) && > + bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); > > error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), > -1, &bp, XFS_DATA_FORK); > @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( > return error; > } > ldb = xfs_dir2_da_to_db(args->geo, blkno); > - ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); > + ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)); > /* > * Initialize the leaf block, get a buffer for it. > */ > @@ -670,7 +670,7 @@ xfs_dir2_leaf_addname( > index++, lep++) { > if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) > continue; > - i = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > + i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); > ASSERT(i < be32_to_cpu(ltp->bestcount)); > ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF)); > if (be16_to_cpu(bestsp[i]) >= length) { > @@ -889,7 +889,8 @@ xfs_dir2_leaf_addname( > * Fill in the new leaf entry. > */ > lep->hashval = cpu_to_be32(args->hashval); > - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, use_block, > + lep->address = cpu_to_be32( > + xfs_dir2_db_off_to_dataptr(args->geo, use_block, > be16_to_cpu(*tagp))); > /* > * Log the leaf fields and give up the buffers. > @@ -1185,7 +1186,7 @@ xfs_dir2_leaf_lookup( > */ > dep = (xfs_dir2_data_entry_t *) > ((char *)dbp->b_addr + > - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); > + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); > /* > * Return the found inode number & CI name if appropriate > */ > @@ -1260,7 +1261,8 @@ xfs_dir2_leaf_lookup_int( > /* > * Get the new data block number. > */ > - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > + newdb = xfs_dir2_dataptr_to_db(args->geo, > + be32_to_cpu(lep->address)); > /* > * If it's not the same as the old data block number, > * need to pitch the old one and read the new one. > @@ -1281,7 +1283,8 @@ xfs_dir2_leaf_lookup_int( > * Point to the data entry. > */ > dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + > - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(lep->address))); > /* > * Compare name and if it's an exact match, return the index > * and buffer. If it's the first case-insensitive match, store > @@ -1380,9 +1383,9 @@ xfs_dir2_leaf_removename( > * Point to the leaf entry, use that to point to the data entry. > */ > lep = &ents[index]; > - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > - dep = (xfs_dir2_data_entry_t *) > - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); > + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); > + dep = (xfs_dir2_data_entry_t *)((char *)hdr + > + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); > needscan = needlog = 0; > oldbest = be16_to_cpu(bf[0].length); > ltp = xfs_dir2_leaf_tail_p(mp, leaf); > @@ -1515,7 +1518,7 @@ xfs_dir2_leaf_replace( > */ > dep = (xfs_dir2_data_entry_t *) > ((char *)dbp->b_addr + > - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); > + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); > ASSERT(args->inumber != be64_to_cpu(dep->inumber)); > /* > * Put the new inode number in, log it. > @@ -1800,7 +1803,8 @@ xfs_dir2_node_to_leaf( > * Get rid of the freespace block. > */ > error = xfs_dir2_shrink_inode(args, > - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); > + xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET), > + fbp); > if (error) { > /* > * This can't fail here because it can only happen when > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 3b70d56..89777bf 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -316,7 +316,7 @@ xfs_dir2_leaf_to_node( > if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { > return error; > } > - ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); > + ASSERT(fdb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); > /* > * Get the buffer for the new freespace block. > */ > @@ -451,7 +451,7 @@ xfs_dir2_leafn_add( > highstale, &lfloglow, &lfloghigh); > > lep->hashval = cpu_to_be32(args->hashval); > - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, > + lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo, > args->blkno, args->index)); > > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > @@ -577,7 +577,8 @@ xfs_dir2_leafn_lookup_for_addname( > /* > * Pull the data block number from the entry. > */ > - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > + newdb = xfs_dir2_dataptr_to_db(args->geo, > + be32_to_cpu(lep->address)); > /* > * For addname, we're looking for a place to put the new entry. > * We want to use a data block with an entry of equal > @@ -723,7 +724,8 @@ xfs_dir2_leafn_lookup_for_entry( > /* > * Pull the data block number from the entry. > */ > - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > + newdb = xfs_dir2_dataptr_to_db(args->geo, > + be32_to_cpu(lep->address)); > /* > * Not adding a new entry, so we really want to find > * the name given to us. > @@ -761,7 +763,8 @@ xfs_dir2_leafn_lookup_for_entry( > * Point to the data entry. > */ > dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + > - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(lep->address))); > /* > * Compare the entry and if it's an exact match, return > * EEXIST immediately. If it's the first case-insensitive > @@ -1196,9 +1199,9 @@ xfs_dir2_leafn_remove( > /* > * Extract the data block and offset from the entry. > */ > - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); > + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); > ASSERT(dblk->blkno == db); > - off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); > + off = xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)); > ASSERT(dblk->index == off); > > /* > @@ -1260,7 +1263,8 @@ xfs_dir2_leafn_remove( > struct xfs_dir3_icfree_hdr freehdr; > dp->d_ops->free_hdr_from_disk(&freehdr, free); > ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * > - (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); > + (fdb - xfs_dir2_byte_to_db(args->geo, > + XFS_DIR2_FREE_OFFSET))); > } > #endif > /* > @@ -1751,7 +1755,7 @@ xfs_dir2_node_addname_int( > * us a freespace block to start with. > */ > if (++fbno == 0) > - fbno = xfs_dir2_byte_to_db(mp, > + fbno = xfs_dir2_byte_to_db(args->geo, > XFS_DIR2_FREE_OFFSET); > /* > * If it's ifbno we already looked at it. > @@ -1893,7 +1897,7 @@ xfs_dir2_node_addname_int( > * Remember the first slot as our empty slot. > */ > freehdr.firstdb = > - (fbno - xfs_dir2_byte_to_db(mp, > + (fbno - xfs_dir2_byte_to_db(args->geo, > XFS_DIR2_FREE_OFFSET)) * > dp->d_ops->free_max_bests(mp); > } else { > @@ -2194,7 +2198,8 @@ xfs_dir2_node_replace( > hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); > dep = (xfs_dir2_data_entry_t *) > ((char *)hdr + > - xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); > + xfs_dir2_dataptr_to_off(args->geo, > + be32_to_cpu(lep->address))); > ASSERT(inum != be64_to_cpu(dep->inumber)); > /* > * Fill in the new inode number and log the entry. > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index 57e9247..c2a6387 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -87,8 +87,10 @@ xfs_dir2_sf_getdents( > xfs_dir2_dataptr_t dot_offset; > xfs_dir2_dataptr_t dotdot_offset; > xfs_ino_t ino; > + struct xfs_da_geometry *geo; > > mp = dp->i_mount; > + geo = mp->m_dir_geo; > > ASSERT(dp->i_df.if_flags & XFS_IFINLINE); > /* > @@ -109,7 +111,7 @@ xfs_dir2_sf_getdents( > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) > + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) > return 0; > > /* > @@ -118,9 +120,9 @@ xfs_dir2_sf_getdents( > * XXX(hch): the second argument is sometimes 0 and sometimes > * mp->m_dirdatablk. > */ > - dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, > + dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > dp->d_ops->data_dot_offset); > - dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, > + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > dp->d_ops->data_dotdot_offset); > > /* > @@ -149,7 +151,7 @@ xfs_dir2_sf_getdents( > for (i = 0; i < sfp->count; i++) { > __uint8_t filetype; > > - off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, > + off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > xfs_dir2_sf_get_offset(sfep)); > > if (ctx->pos > off) { > @@ -166,7 +168,7 @@ xfs_dir2_sf_getdents( > sfep = dp->d_ops->sf_nextentry(sfp, sfep); > } > > - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & > + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & > 0x7fffffff; > return 0; > } > @@ -190,12 +192,14 @@ xfs_dir2_block_getdents( > char *ptr; /* current data entry */ > int wantoff; /* starting block offset */ > xfs_off_t cook; > + struct xfs_da_geometry *geo; > > mp = dp->i_mount; > + geo = mp->m_dir_geo; > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) > + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) > return 0; > > error = xfs_dir3_block_read(NULL, dp, &bp); > @@ -206,7 +210,7 @@ xfs_dir2_block_getdents( > * Extract the byte offset we start at from the seek pointer. > * We'll skip entries before this. > */ > - wantoff = xfs_dir2_dataptr_to_off(mp, ctx->pos); > + wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); > hdr = bp->b_addr; > xfs_dir3_data_check(dp, bp); > /* > @@ -244,7 +248,7 @@ xfs_dir2_block_getdents( > if ((char *)dep - (char *)hdr < wantoff) > continue; > > - cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, > + cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > (char *)dep - (char *)hdr); > > ctx->pos = cook & 0x7fffffff; > @@ -264,7 +268,7 @@ xfs_dir2_block_getdents( > * Reached the end of the block. > * Set the offset to a non-existent block 1 and return. > */ > - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & > + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & > 0x7fffffff; > xfs_trans_brelse(NULL, bp); > return 0; > @@ -300,6 +304,7 @@ xfs_dir2_leaf_readbuf( > int length; > int i; > int j; > + struct xfs_da_geometry *geo = mp->m_dir_geo; > > /* > * If we have a buffer, we need to release it and > @@ -342,14 +347,14 @@ xfs_dir2_leaf_readbuf( > * run out of data blocks, get some more mappings. > */ > if (1 + mip->ra_want > mip->map_blocks && > - mip->map_off < xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET)) { > + mip->map_off < xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET)) { > /* > * Get more bmaps, fill in after the ones > * we already have in the table. > */ > mip->nmap = mip->map_size - mip->map_valid; > error = xfs_bmapi_read(dp, mip->map_off, > - xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) - > + xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET) - > mip->map_off, > &map[mip->map_valid], &mip->nmap, 0); > > @@ -370,7 +375,7 @@ xfs_dir2_leaf_readbuf( > i = mip->map_valid + mip->nmap - 1; > mip->map_off = map[i].br_startoff + map[i].br_blockcount; > } else > - mip->map_off = xfs_dir2_byte_to_da(mp, > + mip->map_off = xfs_dir2_byte_to_da(geo, > XFS_DIR2_LEAF_OFFSET); > > /* > @@ -396,14 +401,14 @@ xfs_dir2_leaf_readbuf( > * No valid mappings, so no more data blocks. > */ > if (!mip->map_valid) { > - *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); > + *curoff = xfs_dir2_da_to_byte(geo, mip->map_off); > goto out; > } > > /* > * Read the directory block starting at the first mapping. > */ > - mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); > + mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); > error = xfs_dir3_data_read(NULL, dp, map->br_startoff, > map->br_blockcount >= mp->m_dirblkfsbs ? > XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); > @@ -504,6 +509,7 @@ xfs_dir2_leaf_getdents( > xfs_dir2_off_t newoff; /* new curoff after new blk */ > char *ptr = NULL; /* pointer to current data */ > struct xfs_dir2_leaf_map_info *map_info; > + struct xfs_da_geometry *geo; > > /* > * If the offset is at or past the largest allowed value, > @@ -513,6 +519,7 @@ xfs_dir2_leaf_getdents( > return 0; > > mp = dp->i_mount; > + geo = mp->m_dir_geo; > > /* > * Set up to bmap a number of blocks based on the caller's > @@ -536,8 +543,8 @@ xfs_dir2_leaf_getdents( > * Force this conversion through db so we truncate the offset > * down to get the start of the data block. > */ > - map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, > - xfs_dir2_byte_to_db(mp, curoff)); > + map_info->map_off = xfs_dir2_db_to_da(geo, > + xfs_dir2_byte_to_db(geo, curoff)); > > /* > * Loop over directory entries until we reach the end offset. > @@ -571,7 +578,7 @@ xfs_dir2_leaf_getdents( > * Make sure we're in the right block. > */ > else if (curoff > newoff) > - ASSERT(xfs_dir2_byte_to_db(mp, curoff) == > + ASSERT(xfs_dir2_byte_to_db(geo, curoff) == > map_info->curdb); > hdr = bp->b_addr; > xfs_dir3_data_check(dp, bp); > @@ -608,8 +615,8 @@ xfs_dir2_leaf_getdents( > * Now set our real offset. > */ > curoff = > - xfs_dir2_db_off_to_byte(mp->m_dir_geo, > - xfs_dir2_byte_to_db(mp, curoff), > + xfs_dir2_db_off_to_byte(geo, > + xfs_dir2_byte_to_db(geo, curoff), > (char *)ptr - (char *)hdr); > if (ptr >= (char *)hdr + mp->m_dirblksize) { > continue; > diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c > index 7aab8ec..4dc4193 100644 > --- a/fs/xfs/xfs_dir2_sf.c > +++ b/fs/xfs/xfs_dir2_sf.c > @@ -104,8 +104,8 @@ xfs_dir2_block_sfsize( > /* > * Calculate the pointer to the entry at hand. > */ > - dep = (xfs_dir2_data_entry_t *) > - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); > + dep = (xfs_dir2_data_entry_t *)((char *)hdr + > + xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); > /* > * Detect . and .., so we can special-case them. > * . is not included in sf directories. > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 15:43:21 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8AB827F3F for <xfs@oss.sgi.com>; Fri, 23 May 2014 15:43:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6789D304066 for <xfs@oss.sgi.com>; Fri, 23 May 2014 13:43:21 -0700 (PDT) X-ASG-Debug-ID: 1400877799-04cbb02a1023240001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GwhftFaqAlhl1VDH for <xfs@oss.sgi.com>; Fri, 23 May 2014 13:43: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4NKhG0a013531 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 16:43:16 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NKhGHm029729; Fri, 23 May 2014 16:43:16 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id B9403120AC1; Fri, 23 May 2014 16:43:15 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NKhFwB009496; Fri, 23 May 2014 16:43:15 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 16:43:14 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry Message-ID: <20140523204314.GH8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1400877800 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, May 23, 2014 at 10:03:43AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_da_btree.c | 22 +++++++++++----------- > fs/xfs/xfs_dir2.c | 7 ++----- > fs/xfs/xfs_dir2_block.c | 6 +++--- > fs/xfs/xfs_dir2_data.c | 9 +++++---- > fs/xfs/xfs_dir2_leaf.c | 12 ++++++------ > fs/xfs/xfs_dir2_readdir.c | 18 +++++++++--------- > fs/xfs/xfs_dir2_sf.c | 2 +- > fs/xfs/xfs_mount.h | 3 --- > 8 files changed, 37 insertions(+), 42 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index 4db5102..8621202 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -598,7 +598,7 @@ xfs_da3_root_split( > * Set up the new root node. > */ > error = xfs_da3_node_create(args, > - (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, > + (args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0, > level + 1, &bp, args->whichfork); > if (error) > return error; > @@ -616,10 +616,10 @@ xfs_da3_root_split( > #ifdef DEBUG > if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { > - ASSERT(blk1->blkno >= mp->m_dirleafblk && > - blk1->blkno < mp->m_dirfreeblk); > - ASSERT(blk2->blkno >= mp->m_dirleafblk && > - blk2->blkno < mp->m_dirfreeblk); > + ASSERT(blk1->blkno >= args->geo->leafblk && > + blk1->blkno < args->geo->freeblk); > + ASSERT(blk2->blkno >= args->geo->leafblk && > + blk2->blkno < args->geo->freeblk); > } > #endif > > @@ -894,8 +894,8 @@ xfs_da3_node_add( > ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); > ASSERT(newblk->blkno != 0); > if (state->args->whichfork == XFS_DATA_FORK) > - ASSERT(newblk->blkno >= state->mp->m_dirleafblk && > - newblk->blkno < state->mp->m_dirfreeblk); > + ASSERT(newblk->blkno >= state->args->geo->leafblk && > + newblk->blkno < state->args->geo->freeblk); > > /* > * We may need to make some room before we insert the new node. > @@ -1472,7 +1472,7 @@ xfs_da3_node_lookup_int( > * Descend thru the B-tree searching each level for the right > * node to use, until the right hashval is found. > */ > - blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0; > + blkno = (args->whichfork == XFS_DATA_FORK)? args->geo->leafblk : 0; > for (blk = &state->path.blk[0], state->path.active = 1; > state->path.active <= XFS_DA_NODE_MAXDEPTH; > blk++, state->path.active++) { > @@ -2096,7 +2096,7 @@ xfs_da_grow_inode( > trace_xfs_da_grow_inode(args); > > if (args->whichfork == XFS_DATA_FORK) { > - bno = args->dp->i_mount->m_dirleafblk; > + bno = args->geo->leafblk; > count = args->dp->i_mount->m_dirblkfsbs; > } else { > bno = 0; > @@ -2158,7 +2158,7 @@ xfs_da3_swap_lastblock( > w = args->whichfork; > ASSERT(w == XFS_DATA_FORK); > mp = dp->i_mount; > - lastoff = mp->m_dirfreeblk; > + lastoff = args->geo->freeblk; > error = xfs_bmap_last_before(tp, dp, &lastoff, w); > if (error) > return error; > @@ -2247,7 +2247,7 @@ xfs_da3_swap_lastblock( > sizeof(sib_info->back))); > sib_buf = NULL; > } > - par_blkno = mp->m_dirleafblk; > + par_blkno = args->geo->leafblk; > level = -1; > /* > * Walk down the tree looking for the parent of the moved block. > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 0bd3468..fc09a11 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -147,9 +147,6 @@ xfs_da_mount( > /* XXX: these are to be removed as code is converted to use geo */ > mp->m_dirblksize = mp->m_dir_geo->blksize; > mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; > - mp->m_dirdatablk = mp->m_dir_geo->datablk; > - mp->m_dirleafblk = mp->m_dir_geo->leafblk; > - mp->m_dirfreeblk = mp->m_dir_geo->freeblk; > mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > @@ -682,7 +679,7 @@ xfs_dir2_isleaf( > mp = dp->i_mount; > if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > return rval; > - *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); > + *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); > return 0; > } > > @@ -755,7 +752,7 @@ xfs_dir2_shrink_inode( > */ > return error; > } > - if (db == mp->m_dirdatablk) > + if (db == args->geo->datablk) > ASSERT(bno == 0); > else > ASSERT(bno > 0); > diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c > index bc08216..d950cde 100644 > --- a/fs/xfs/xfs_dir2_block.c > +++ b/fs/xfs/xfs_dir2_block.c > @@ -136,7 +136,7 @@ xfs_dir3_block_read( > struct xfs_mount *mp = dp->i_mount; > int err; > > - err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, > + err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, > XFS_DATA_FORK, &xfs_dir3_block_buf_ops); > if (!err && tp) > xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); > @@ -969,7 +969,7 @@ xfs_dir2_leaf_to_block( > * Read the data block if we don't already have it, give up if it fails. > */ > if (!dbp) { > - error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); > + error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp); > if (error) > return error; > } > @@ -1034,7 +1034,7 @@ xfs_dir2_leaf_to_block( > /* > * Pitch the old leaf block. > */ > - error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); > + error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp); > if (error) > return error; > > diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c > index d355ec7..6c23f86 100644 > --- a/fs/xfs/xfs_dir2_data.c > +++ b/fs/xfs/xfs_dir2_data.c > @@ -63,8 +63,10 @@ __xfs_dir3_data_check( > int stale; /* count of stale leaves */ > struct xfs_name name; > const struct xfs_dir_ops *ops; > + struct xfs_da_geometry *geo; > > mp = bp->b_target->bt_mount; > + geo = mp->m_dir_geo; > > /* > * We can be passed a null dp here from a verifier, so we need to go the > @@ -172,10 +174,9 @@ __xfs_dir3_data_check( > lastfree = 0; > if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { > - addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, > - mp->m_dirdatablk, > - (xfs_dir2_data_aoff_t) > - ((char *)dep - (char *)hdr)); > + addr = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > + (xfs_dir2_data_aoff_t) > + ((char *)dep - (char *)hdr)); > name.name = dep->name; > name.len = dep->namelen; > hash = mp->m_dirnameops->hashname(&name); > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index 2b3ddd0..3eb8b24 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -641,7 +641,7 @@ xfs_dir2_leaf_addname( > tp = args->trans; > mp = dp->i_mount; > > - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); > + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); > if (error) > return error; > > @@ -1232,7 +1232,7 @@ xfs_dir2_leaf_lookup_int( > tp = args->trans; > mp = dp->i_mount; > > - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); > + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); > if (error) > return error; > > @@ -1429,7 +1429,7 @@ xfs_dir2_leaf_removename( > */ > if (be16_to_cpu(bf[0].length) == > mp->m_dirblksize - dp->d_ops->data_entry_offset) { > - ASSERT(db != mp->m_dirdatablk); > + ASSERT(db != args->geo->datablk); > if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { > /* > * Nope, can't get rid of it because it caused > @@ -1470,7 +1470,7 @@ xfs_dir2_leaf_removename( > /* > * If the data block was not the first one, drop it. > */ > - else if (db != mp->m_dirdatablk) > + else if (db != args->geo->datablk) > dbp = NULL; > > xfs_dir3_leaf_check(dp, lbp); > @@ -1722,7 +1722,7 @@ xfs_dir2_node_to_leaf( > * that may have been left behind during no-space-reservation > * operations. > */ > - while (fo > mp->m_dirfreeblk) { > + while (fo > args->geo->freeblk) { > if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) { > return error; > } > @@ -1752,7 +1752,7 @@ xfs_dir2_node_to_leaf( > /* > * Read the freespace block. > */ > - error = xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); > + error = xfs_dir2_free_read(tp, dp, args->geo->freeblk, &fbp); > if (error) > return error; > free = fbp->b_addr; > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index c2a6387..0c8c09c 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -111,18 +111,18 @@ xfs_dir2_sf_getdents( > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) > + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > return 0; > > /* > * Precalculate offsets for . and .. as we will always need them. > * > * XXX(hch): the second argument is sometimes 0 and sometimes > - * mp->m_dirdatablk. > + * geo->datablk > */ > - dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > + dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > dp->d_ops->data_dot_offset); > - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > dp->d_ops->data_dotdot_offset); > > /* > @@ -151,7 +151,7 @@ xfs_dir2_sf_getdents( > for (i = 0; i < sfp->count; i++) { > __uint8_t filetype; > > - off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > + off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > xfs_dir2_sf_get_offset(sfep)); > > if (ctx->pos > off) { > @@ -168,7 +168,7 @@ xfs_dir2_sf_getdents( > sfep = dp->d_ops->sf_nextentry(sfp, sfep); > } > > - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & > + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > 0x7fffffff; > return 0; > } > @@ -199,7 +199,7 @@ xfs_dir2_block_getdents( > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) > + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > return 0; > > error = xfs_dir3_block_read(NULL, dp, &bp); > @@ -248,7 +248,7 @@ xfs_dir2_block_getdents( > if ((char *)dep - (char *)hdr < wantoff) > continue; > > - cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, > + cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > (char *)dep - (char *)hdr); > > ctx->pos = cook & 0x7fffffff; > @@ -268,7 +268,7 @@ xfs_dir2_block_getdents( > * Reached the end of the block. > * Set the offset to a non-existent block 1 and return. > */ > - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & > + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > 0x7fffffff; > xfs_trans_brelse(NULL, bp); > return 0; > diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c > index 4dc4193..10f4c2a 100644 > --- a/fs/xfs/xfs_dir2_sf.c > +++ b/fs/xfs/xfs_dir2_sf.c > @@ -247,7 +247,7 @@ xfs_dir2_block_to_sf( > > /* now we are done with the block, we can shrink the inode */ > logflags = XFS_ILOG_CORE; > - error = xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp); > + error = xfs_dir2_shrink_inode(args, args->geo->datablk, bp); > if (error) { > ASSERT(error != ENOSPC); > goto out; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 01b25e41..264e210 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -156,9 +156,6 @@ typedef struct xfs_mount { > const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ > int m_dirblksize; /* directory block sz--bytes */ > int m_dirblkfsbs; /* directory block sz--fsbs */ > - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ > - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ > - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ > uint m_chsize; /* size of next field */ > atomic_t m_active_trans; /* number trans frozen */ > #ifdef HAVE_PERCPU_SB > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 23 15:43:28 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 535DD7F51 for <xfs@oss.sgi.com>; Fri, 23 May 2014 15:43:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 06EC1AC002 for <xfs@oss.sgi.com>; Fri, 23 May 2014 13:43:24 -0700 (PDT) X-ASG-Debug-ID: 1400877803-04bdf0599f25b30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GBq2KAHEloqqQCea for <xfs@oss.sgi.com>; Fri, 23 May 2014 13:43:23 -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 (8.14.4/8.14.4) with ESMTP id s4NKhMMe031955 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 23 May 2014 16:43:22 -0400 Received: from laptop.bfoster (vpn-59-163.rdu2.redhat.com [10.10.59.163]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4NKhLr4009059; Fri, 23 May 2014 16:43:21 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 6E3CE120AC1; Fri, 23 May 2014 16:43:21 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4NKhKuo009504; Fri, 23 May 2014 16:43:20 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 23 May 2014 16:43:20 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry Message-ID: <20140523204320.GI8343@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1400877803 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, May 23, 2014 at 10:03:44AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_bmap.c | 3 ++- > fs/xfs/xfs_da_btree.c | 24 ++++++++---------------- > fs/xfs/xfs_dir2.c | 5 ++--- > fs/xfs/xfs_dir2_leaf.c | 4 ++-- > fs/xfs/xfs_dir2_readdir.c | 16 ++++++++-------- > fs/xfs/xfs_mount.h | 1 - > fs/xfs/xfs_symlink.c | 1 + > fs/xfs/xfs_trans_resv.c | 1 + > fs/xfs/xfs_trans_space.h | 5 +++-- > 9 files changed, 27 insertions(+), 33 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 1ff0da6..96175df 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1098,10 +1098,11 @@ xfs_bmap_add_attrfork_local( > > if (S_ISDIR(ip->i_d.di_mode)) { > memset(&dargs, 0, sizeof(dargs)); > + dargs.geo = ip->i_mount->m_dir_geo; > dargs.dp = ip; > dargs.firstblock = firstblock; > dargs.flist = flist; > - dargs.total = ip->i_mount->m_dirblkfsbs; > + dargs.total = dargs.geo->fsbcount; > dargs.whichfork = XFS_DATA_FORK; > dargs.trans = tp; > return xfs_dir2_sf_to_block(&dargs); > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index 8621202..4d0a1e8 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -2090,20 +2090,12 @@ xfs_da_grow_inode( > xfs_dablk_t *new_blkno) > { > xfs_fileoff_t bno; > - int count; > int error; > > trace_xfs_da_grow_inode(args); > > - if (args->whichfork == XFS_DATA_FORK) { > - bno = args->geo->leafblk; > - count = args->dp->i_mount->m_dirblkfsbs; > - } else { > - bno = 0; > - count = 1; > - } > - > - error = xfs_da_grow_inode_int(args, &bno, count); > + bno = args->geo->leafblk; > + error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount); > if (!error) > *new_blkno = (xfs_dablk_t)bno; > return error; > @@ -2170,7 +2162,7 @@ xfs_da3_swap_lastblock( > /* > * Read the last block in the btree space. > */ > - last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; > + last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount; > error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); > if (error) > return error; > @@ -2357,10 +2349,7 @@ xfs_da_shrink_inode( > w = args->whichfork; > tp = args->trans; > mp = dp->i_mount; > - if (w == XFS_DATA_FORK) > - count = mp->m_dirblkfsbs; > - else > - count = 1; > + count = args->geo->fsbcount; > for (;;) { > /* > * Remove extents. If we get ENOSPC for a dir we have to move > @@ -2479,7 +2468,10 @@ xfs_dabuf_map( > ASSERT(map && *map); > ASSERT(*nmaps == 1); > > - nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; > + if (whichfork == XFS_DATA_FORK) > + nfsb = mp->m_dir_geo->fsbcount; > + else > + nfsb = mp->m_attr_geo->fsbcount; > > /* > * Caller doesn't have a mapping. -2 means don't complain > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index fc09a11..200c9c4 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -146,7 +146,6 @@ xfs_da_mount( > > /* XXX: these are to be removed as code is converted to use geo */ > mp->m_dirblksize = mp->m_dir_geo->blksize; > - mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; > mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > @@ -620,7 +619,7 @@ xfs_dir2_grow_inode( > * Set lowest possible block in the space requested. > */ > bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); > - count = mp->m_dirblkfsbs; > + count = args->geo->fsbcount; > > error = xfs_da_grow_inode_int(args, &bno, count); > if (error) > @@ -711,7 +710,7 @@ xfs_dir2_shrink_inode( > /* > * Unmap the fsblock(s). > */ > - if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, > + if ((error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, > XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, > &done))) { > /* > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index 3eb8b24..a1f1310 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -1715,7 +1715,7 @@ xfs_dir2_node_to_leaf( > if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { > return error; > } > - fo -= mp->m_dirblkfsbs; > + fo -= args->geo->fsbcount; > /* > * If there are freespace blocks other than the first one, > * take this opportunity to remove trailing empty freespace blocks > @@ -1727,7 +1727,7 @@ xfs_dir2_node_to_leaf( > return error; > } > if (rval) > - fo -= mp->m_dirblkfsbs; > + fo -= args->geo->fsbcount; > else > return 0; > } > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index 0c8c09c..8cb5340 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -314,12 +314,12 @@ xfs_dir2_leaf_readbuf( > if (bp) { > xfs_trans_brelse(NULL, bp); > bp = NULL; > - mip->map_blocks -= mp->m_dirblkfsbs; > + mip->map_blocks -= geo->fsbcount; > /* > * Loop to get rid of the extents for the > * directory block. > */ > - for (i = mp->m_dirblkfsbs; i > 0; ) { > + for (i = geo->fsbcount; i > 0; ) { > j = min_t(int, map->br_blockcount, i); > map->br_blockcount -= j; > map->br_startblock += j; > @@ -410,7 +410,7 @@ xfs_dir2_leaf_readbuf( > */ > mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); > error = xfs_dir3_data_read(NULL, dp, map->br_startoff, > - map->br_blockcount >= mp->m_dirblkfsbs ? > + map->br_blockcount >= geo->fsbcount ? > XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); > > /* > @@ -424,7 +424,7 @@ xfs_dir2_leaf_readbuf( > * was previously ra. > */ > if (mip->ra_current) > - mip->ra_current -= mp->m_dirblkfsbs; > + mip->ra_current -= geo->fsbcount; > > /* > * Do we need more readahead? > @@ -432,13 +432,13 @@ xfs_dir2_leaf_readbuf( > blk_start_plug(&plug); > for (mip->ra_index = mip->ra_offset = i = 0; > mip->ra_want > mip->ra_current && i < mip->map_blocks; > - i += mp->m_dirblkfsbs) { > + i += geo->fsbcount) { > ASSERT(mip->ra_index < mip->map_valid); > /* > * Read-ahead a contiguous directory block. > */ > if (i > mip->ra_current && > - map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { > + map[mip->ra_index].br_blockcount >= geo->fsbcount) { > xfs_dir3_data_readahead(dp, > map[mip->ra_index].br_startoff + mip->ra_offset, > XFS_FSB_TO_DADDR(mp, > @@ -461,12 +461,12 @@ xfs_dir2_leaf_readbuf( > /* > * Advance offset through the mapping table. > */ > - for (j = 0; j < mp->m_dirblkfsbs; j += length ) { > + for (j = 0; j < geo->fsbcount; j += length ) { > /* > * The rest of this extent but not more than a dir > * block. > */ > - length = min_t(int, mp->m_dirblkfsbs, > + length = min_t(int, geo->fsbcount, > map[mip->ra_index].br_blockcount - > mip->ra_offset); > mip->ra_offset += length; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 264e210..275fed3 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -155,7 +155,6 @@ typedef struct xfs_mount { > const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ > const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ > int m_dirblksize; /* directory block sz--bytes */ > - int m_dirblkfsbs; /* directory block sz--fsbs */ > uint m_chsize; /* size of next field */ > atomic_t m_active_trans; /* number trans frozen */ > #ifdef HAVE_PERCPU_SB > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 0816b40..d69363c 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -27,6 +27,7 @@ > #include "xfs_ag.h" > #include "xfs_mount.h" > #include "xfs_da_format.h" > +#include "xfs_da_btree.h" > #include "xfs_dir2.h" > #include "xfs_inode.h" > #include "xfs_ialloc.h" > diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c > index 52b6c3e..63a42a1 100644 > --- a/fs/xfs/xfs_trans_resv.c > +++ b/fs/xfs/xfs_trans_resv.c > @@ -26,6 +26,7 @@ > #include "xfs_ag.h" > #include "xfs_mount.h" > #include "xfs_da_format.h" > +#include "xfs_da_btree.h" > #include "xfs_inode.h" > #include "xfs_bmap_btree.h" > #include "xfs_ialloc.h" > diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h > index df4c1f8..bf9c457 100644 > --- a/fs/xfs/xfs_trans_space.h > +++ b/fs/xfs/xfs_trans_space.h > @@ -28,7 +28,8 @@ > (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ > XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ > XFS_EXTENTADD_SPACE_RES(mp,w)) > -#define XFS_DAENTER_1B(mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) > +#define XFS_DAENTER_1B(mp,w) \ > + ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) > #define XFS_DAENTER_DBS(mp,w) \ > (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) > #define XFS_DAENTER_BLOCKS(mp,w) \ > @@ -55,7 +56,7 @@ > * Space reservation values for various transactions. > */ > #define XFS_ADDAFORK_SPACE_RES(mp) \ > - ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) > + ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) > #define XFS_ATTRRM_SPACE_RES(mp) \ > XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) > /* This macro is not used - see inline code in xfs_attr_set */ > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From gabriel@vlasiu.net Sun May 25 12:32:21 2014 Return-Path: <gabriel@vlasiu.net> X-Spam-Checker-Version: SpamAssassin 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 97F0E7F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 12:32:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 73B4E304039 for <xfs@oss.sgi.com>; Sun, 25 May 2014 10:32:21 -0700 (PDT) X-ASG-Debug-ID: 1401039135-04cb6c22b5b8060001-NocioJ Received: from mail.vlasiu.net (mail.vlasiu.net [91.223.50.125]) by cuda.sgi.com with ESMTP id 0r79bOe4Ac7FYQEl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Sun, 25 May 2014 10:32:17 -0700 (PDT) X-Barracuda-Envelope-From: gabriel@vlasiu.net X-Barracuda-Apparent-Source-IP: 91.223.50.125 Received: from localhost (localhost [127.0.0.1]) by mail.vlasiu.net (Postfix) with ESMTP id 82BFCA0065 for <xfs@oss.sgi.com>; Sun, 25 May 2014 20:32:14 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=vlasiu.net; h= content-type:content-type:mime-version:user-agent:message-id :subject:subject:from:from:date:date:received:received:received; s=default; t=1401039131; x=1401042732; bh=MBodwwzsSauiWKO2ncvb1 8xl42K170CBxFxn1n//ETY=; b=Sn1Xk9f+2y/2VnleoPjkssaNPGrRL2CkhcYR2 Ne0i4ruNzWaFulAdeEi0awatGKoCJRDfPiZP2kcqjzro5+KtSXZ35jgfUoL/iedT GpFccTCuCI/pP7e+1JbvNT5ydelKoHsOBDVzG0eHZzIp6pAwu1umlEiMcOxgtsow HWSYX4= X-Virus-Scanned: amavisd-new at vlasiu.net Received: from mail.vlasiu.net ([127.0.0.1]) by localhost (mail.vlasiu.net [127.0.0.1]) (amavisd-new, port 10026) with LMTP id GG8fkp0dRCET for <xfs@oss.sgi.com>; Sun, 25 May 2014 20:32:11 +0300 (EEST) Received: by mail.vlasiu.net (Postfix, from userid 500) id E4F1DA006C; Sun, 25 May 2014 20:32:10 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.vlasiu.net (Postfix) with ESMTP id B3734A0065 for <xfs@oss.sgi.com>; Sun, 25 May 2014 20:32:10 +0300 (EEST) Date: Sun, 25 May 2014 20:32:04 +0300 (EEST) From: Gabriel VLASIU <gabriel@vlasiu.net> To: xfs@oss.sgi.com Subject: xfs fs shutdown when no more space available Message-ID: <alpine.LRH.2.03.1405252005430.25037@mail.vlasiu.net> X-ASG-Orig-Subj: xfs fs shutdown when no more space available User-Agent: Alpine 2.03 (LRH 1266 2009-07-14) X-OpenGPG-KeyID: 44952F15 X-OpenGPG-Fingerprint: 4AC5 7C26 2FE9 02DA 4906 24B2 D32B 7ED7 4495 2F15 X-OpenGPG-URL: http://www.vlasiu.net/public.key MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail.vlasiu.net[91.223.50.125] X-Barracuda-Start-Time: 1401039136 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: vlasiu.net X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.6108 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: SHA512 Hi! Usually, when the xfs partition has no more space nothing happend except I cannot write new data. This was true for a long time. But it's seems that in 3.14.4 something has changed (3.14.x?): # dd if=/dev/urandom of=noise.dat count=4194304 cp noise.dat 11.dat cp noise.dat 22.dat .... At some point the partition become full and I get this in logs: May 25 19:48:25 imhotep kernel: [26271.780894] XFS (loop0): xlog_write: reservation summary: May 25 19:48:25 imhotep kernel: [26271.780894] trans type = FSYNC_TS (36) May 25 19:48:25 imhotep kernel: [26271.780894] unit res = 9640 bytes May 25 19:48:25 imhotep kernel: [26271.780894] current res = -4 bytes May 25 19:48:25 imhotep kernel: [26271.780894] total reg = 0 bytes (o/flow = 0 bytes) May 25 19:48:25 imhotep kernel: [26271.780894] ophdrs = 0 (ophdr space = 0 bytes) May 25 19:48:25 imhotep kernel: [26271.780894] ophdr + reg = 0 bytes May 25 19:48:25 imhotep kernel: [26271.780894] num regions = 0 May 25 19:48:25 imhotep kernel: [26271.780894] May 25 19:48:25 imhotep kernel: [26271.780910] XFS (loop0): xlog_write: reservation ran out. Need to up reservation May 25 19:48:25 imhotep kernel: [26271.780917] XFS (loop0): xfs_do_force_shutdown(0x2) called from line 1999 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa009a6e8 May 25 19:48:25 imhotep kernel: [26271.781084] XFS (loop0): Log I/O Error Detected. Shutting down filesystem May 25 19:48:25 imhotep kernel: [26271.781088] XFS (loop0): Please umount the filesystem and rectify the problem(s) May 25 19:48:25 imhotep kernel: [26271.781197] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:48:25 imhotep kernel: [26271.781550] Buffer I/O error on device loop0, logical block 115955756 May 25 19:48:25 imhotep kernel: [26271.781556] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781566] Buffer I/O error on device loop0, logical block 115955757 May 25 19:48:25 imhotep kernel: [26271.781570] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781576] Buffer I/O error on device loop0, logical block 115955758 May 25 19:48:25 imhotep kernel: [26271.781581] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781586] Buffer I/O error on device loop0, logical block 115955759 May 25 19:48:25 imhotep kernel: [26271.781590] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781597] Buffer I/O error on device loop0, logical block 115955760 May 25 19:48:25 imhotep kernel: [26271.781601] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781607] Buffer I/O error on device loop0, logical block 115955761 May 25 19:48:25 imhotep kernel: [26271.781611] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781616] Buffer I/O error on device loop0, logical block 115955762 May 25 19:48:25 imhotep kernel: [26271.781620] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781626] Buffer I/O error on device loop0, logical block 115955763 May 25 19:48:25 imhotep kernel: [26271.781630] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781636] Buffer I/O error on device loop0, logical block 115955764 May 25 19:48:25 imhotep kernel: [26271.781640] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.781646] Buffer I/O error on device loop0, logical block 115955765 May 25 19:48:25 imhotep kernel: [26271.781650] lost page write due to I/O error on loop0 May 25 19:48:25 imhotep kernel: [26271.831068] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:48:54 imhotep kernel: [26300.896096] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:49:24 imhotep kernel: [26330.976040] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:49:54 imhotep kernel: [26361.056082] XFS (loop0): xfs_log_force: error 5 returned. >>>> umount /home here: May 25 19:50:04 imhotep kernel: [26370.798657] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:50:05 imhotep kernel: [26372.117698] XFS (loop0): xfs_log_force: error 5 returned. May 25 19:50:05 imhotep kernel: [26372.121153] XFS (loop0): xfs_log_force: error 5 returned. >>>> mount /home here: May 25 19:50:54 imhotep kernel: [26420.912686] XFS (loop0): Mounting Filesystem May 25 19:50:55 imhotep kernel: [26421.551754] XFS (loop0): Starting recovery (logdev: internal) May 25 19:50:55 imhotep kernel: [26421.903891] XFS (loop0): Ending recovery (logdev: internal) Seems like an log error. Can this be fixed? Thank you. # uname -a Linux imhotep.vlasiu.net 3.14.4-100.AES.f19g.x86_64 #1 SMP Tue May 13 21:36:02 EEST 2014 x86_64 x86_64 x86_64 GNU/Linux # xfs_repair -V xfs_repair version 3.1.10 # cat /proc/cpuinfo | grep ^process | wc -l 2 # cat /proc/meminfo MemTotal: 3982872 kB MemFree: 2352536 kB MemAvailable: 2803296 kB Buffers: 432 kB Cached: 997232 kB SwapCached: 36 kB Active: 1029964 kB Inactive: 417876 kB Active(anon): 761920 kB Inactive(anon): 83260 kB Active(file): 268044 kB Inactive(file): 334616 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 4194296 kB SwapFree: 4193708 kB Dirty: 4 kB Writeback: 0 kB AnonPages: 450140 kB Mapped: 91904 kB Shmem: 395004 kB Slab: 75724 kB SReclaimable: 34068 kB SUnreclaim: 41656 kB KernelStack: 1576 kB PageTables: 10812 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 6185732 kB Committed_AS: 1386592 kB VmallocTotal: 34359738367 kB VmallocUsed: 131492 kB VmallocChunk: 34359561724 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 163520 kB DirectMap2M: 3964928 kB # cat /proc/mounts | grep -v cgroup | grep -w xfs /dev/sda3 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 /dev/loop6 /tmp xfs rw,seclabel,nosuid,nodev,noexec,relatime,attr2,inode64,noquota 0 0 /dev/loop6 /var/tmp xfs rw,seclabel,nosuid,nodev,noexec,relatime,attr2,inode64,noquota 0 0 /dev/loop0 /home xfs rw,seclabel,nosuid,nodev,relatime,attr2,inode64,logbufs=8,logbsize=256k,noquota 0 0 # xfs_info /dev/loop0 meta-data=/dev/loop0 isize=256 agcount=4, agsize=40108032 blks = sectsz=512 attr=2 data = bsize=4096 blocks=160432126, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=78335, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Sincerely, Gabriel - -- // Gabriel VLASIU // // OpenGPG-KeyID : 44952F15 // OpenGPG-Fingerprint: 4AC5 7C26 2FE9 02DA 4906 24B2 D32B 7ED7 4495 2F15 // OpenGPG-URL : http://www.vlasiu.net/public.key -----BEGIN PGP SIGNATURE----- iQIcBAEBCgAGBQJTgikUAAoJENMrftdElS8VLHkP/3hCMyYmgEZSFYs4alYZRqYp SMhTiq41h4Q3GaSSqMvrC9U3+j2MlyaaC/tCOxlCszGNf077X3XsrqDBdyrXXpqW +qKMroXegwkwg0VQVR6LAJFqIMYweK8WIDFUSE+giSPYL4eG5mWlDr9vC6eMrATH MwcGH9MwI46Bwq9BjxHdlAfp7F5S913sdGpIEN/wQGMVNCewOo2+dJ2vsIqv8QxM dSrjGXn8QijAJfbgYcrv43wRWONignHgtLmk5bUuyhg7qz0SYOBnziQSuxnDwX8B sUXDD2RQujy4wfbMPmO+qpZvfmb8lB7mOATDGNX9Sw4JrSMNrl6yLYTNz20PRMq/ IW9q6JAsis3ona9ojJqQDRKOmmoa6+17A3CHkKjSZO3Xuw8kD4XDg8dCQ1xp3qA3 IRfqMKdqQ2mtAI7NZgk4iq5GLdRyZnnGiHMCtP2YV7lqgbjm3M5akSxdoSFrmmdE gWZu5GC1XVjpbL52eDMoScnFzFfKMXwiMSw++766Z/xzGqr90f+GNcrVk6sk7Dt4 gkSzmuVqkAzkHl5DicZRsjiHqxVxBisLaCaJXqUCC1ZrRf5A4/ga8HpE+1TZHnwt eDV7obPK6zyg4KkcJzl6RFoes/0XLsN+gay8n4q8AkkqPZso6jJ++3lqpl9ZNOCC 5Cdl0Gyiq5avibzMEsus =geAz -----END PGP SIGNATURE----- From linus971@gmail.com Sun May 25 15:04:19 2014 Return-Path: <linus971@gmail.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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,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 1A09F7F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 15:04:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC1E6304043 for <xfs@oss.sgi.com>; Sun, 25 May 2014 13:04:15 -0700 (PDT) X-ASG-Debug-ID: 1401048250-04cb6c22b8c0c10001-NocioJ Received: from mail-ve0-f178.google.com (mail-ve0-f178.google.com [209.85.128.178]) by cuda.sgi.com with ESMTP id MH5xdM4cx4S49gYw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Sun, 25 May 2014 13:04:10 -0700 (PDT) X-Barracuda-Envelope-From: linus971@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] Received: by mail-ve0-f178.google.com with SMTP id sa20so8536908veb.9 for <xfs@oss.sgi.com>; Sun, 25 May 2014 13:04:09 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=3e1kBOwFLPUWo+Kjfar38sOGzPRVi0D0JYe9NopixFI=; b=gNwnmye7XymTyh58DbeskUf5X+vuS6avF2NH6CXEN1X3bzRevkWxNUeaUapeMfVhLJ oh7kEzkd3xX8rQGJPH5SRVVZikLxak+nRyfmw18EK6ZU0XeV2FH5JHix2r1UZTNY2mgu QXkVONVcNGDhBQ+g8JU7SbSV1QRFixauoAtUbTZRs4rHj07TmBMs1CvFvjdXSq42mzyn U8/+2lYu32qnPSdWgAm7vBLGsJrrTx8j9RTGdTa7Mxj3cj0jL3fo7eTUkH1SwCbQgqTW CsAtkw3968wU6fGMGPLJmF4UEUngbh+VII9GKVBNyql6ElS6g+7Kn8D54toiBfnrZROH OCOA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux-foundation.org; s=google; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=3e1kBOwFLPUWo+Kjfar38sOGzPRVi0D0JYe9NopixFI=; b=araTl0/A76+GKOPIJiJ+YixSEGjpwWqXeXhh6lrmdiENj3Y4k58iVzXGvQtU0RRfHl T2OrMTP/1fzEzh1Bo433UWCHEIdhYMtnzSlxLT80U7VAyrRRB5Nct+XftthdT3ZGZjgR bMKSWeX7GWw7WcpW4ektBxANDtomchQNBDJ2w= MIME-Version: 1.0 X-Received: by 10.220.106.7 with SMTP id v7mr2237243vco.46.1401048249655; Sun, 25 May 2014 13:04:09 -0700 (PDT) Sender: linus971@gmail.com Received: by 10.220.2.205 with HTTP; Sun, 25 May 2014 13:04:09 -0700 (PDT) In-Reply-To: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> Date: Sun, 25 May 2014 13:04:09 -0700 X-Google-Sender-Auth: AhRwGK-ol00QNAHJOUs0E7F2HKM Message-ID: <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking From: Linus Torvalds <torvalds@linux-foundation.org> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking To: Plamen Petrov <plamen.sisi@gmail.com>, Dave Chinner <david@fromorbit.com> Cc: LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=047d7b3432363bf83f04fa3ef71d X-Barracuda-Connect: mail-ve0-f178.google.com[209.85.128.178] X-Barracuda-Start-Time: 1401048250 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.6112 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 --047d7b3432363bf83f04fa3ef71d Content-Type: text/plain; charset=UTF-8 On Mon, May 5, 2014 at 11:34 AM, Plamen Petrov <plamen.sisi@gmail.com> wrote: > > The story short: on systems with btrfs root I have a kernel .config with ext4, > xfs and btrfs built-in which works fine with 3.13.x, but 3.14.x panics. After > inserting some debug printks, I got this info from mount_block_root: > > ---> EACCESS=13, EINVAL=22, Available filesystems: ext3 ext2 ext4 fuseblk xfs btrfs > -----> Tried ext3, error code is -22. > -----> Tried ext2, error code is -22. > -----> Tried ext4, error code is -22. > -----> Tried fuseblk, error code is -22. > -----> Tried xfs, error code is -38. > VFS: Cannot open root device "sda2" or unknown-block(8,2): error -38 > Please append a correct "root=" boot option; here are the available partitions: > > Last one tried is xfs, the needed btrfs in this case never gets a chance. > Looking at the code in init/do_mounts.c we can see that it "continue"s only if > the return code it got is EINVAL, yet xfs clearly does not fit - so the kernel > panics. Maybe there are other filesystems like xfs - I did not check. This > patch fixes mount_block_root to try all available filesystems first, and then > panic. The patched 3.14.x works for me. Hmm. I don't really dislike your patch, but it makes all the code _after_ the switch-statement dead, since there is now no way to ever fall through the switch statement. So now that /* * Allow the user to distinguish between failed sys_open * and bad superblock on root device. * and give them a list of the available devices */ comment ends up being entirely stale, and the code after it is pointless and it all looks very misleading. And I'm assuming somebody cared about that difference at some point. The fact is, I think xfs is just buggy. Returning 38 (ENOSYS) is totally insane. "No such system call"? Somebody is on some bad bad drugs. Not that the mount_block_root() loop and error handling might not be a good thing to perhaps tweak _too_, but at the very least your patch means that now it no longer prints out the error number at all. Maybe just making it do something like the attached patch instead? It doesn't panic on unrecognized errors, just prints them out (just once, if it repeats). It also doesn't do the "goto repeat" if we already have the RDONLY bit set, because if somebody is returning insane error numbers, that could otherwise result in an endless loop. Anyway, I'm also not seeing why that xfs error would be new to 3.14, though.. Adding the XFS people to the cc. Comments (patch obviously TOTALLY UNTESTED) Linus --047d7b3432363bf83f04fa3ef71d Content-Type: text/plain; charset=US-ASCII; name="patch.diff" Content-Disposition: attachment; filename="patch.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hvmrw5xg0 IGluaXQvZG9fbW91bnRzLmMgfCAyNCArKysrKystLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBj aGFuZ2VkLCA2IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2lu aXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmluZGV4IDgyZjIyODg1Yzg3ZS4uYTZh NzI1ZjQ2ZjE4IDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91 bnRzLmMKQEAgLTM4NSw2ICszODUsNyBAQCB2b2lkIF9faW5pdCBtb3VudF9ibG9ja19yb290KGNo YXIgKm5hbWUsIGludCBmbGFncykKICNlbHNlCiAJY29uc3QgY2hhciAqYiA9IG5hbWU7CiAjZW5k aWYKKwlpbnQgbGFzdF9lcnIgPSAwOwogCiAJZ2V0X2ZzX25hbWVzKGZzX25hbWVzKTsKIHJldHJ5 OgpAQCAtMzk0LDI5ICszOTUsMTYgQEAgcmV0cnk6CiAJCQljYXNlIDA6CiAJCQkJZ290byBvdXQ7 CiAJCQljYXNlIC1FQUNDRVM6CisJCQkJaWYgKGZsYWdzICYgTVNfUkRPTkxZKQorCQkJCQlicmVh azsKIAkJCQlmbGFncyB8PSBNU19SRE9OTFk7CiAJCQkJZ290byByZXRyeTsKIAkJCWNhc2UgLUVJ TlZBTDoKIAkJCQljb250aW51ZTsKIAkJfQotCSAgICAgICAgLyoKLQkJICogQWxsb3cgdGhlIHVz ZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWlsZWQgc3lzX29wZW4KLQkJICogYW5kIGJhZCBz dXBlcmJsb2NrIG9uIHJvb3QgZGV2aWNlLgotCQkgKiBhbmQgZ2l2ZSB0aGVtIGEgbGlzdCBvZiB0 aGUgYXZhaWxhYmxlIGRldmljZXMKLQkJICovCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0JCV9fYmRl dm5hbWUoUk9PVF9ERVYsIGIpOwotI2VuZGlmCi0JCXByaW50aygiVkZTOiBDYW5ub3Qgb3BlbiBy b290IGRldmljZSBcIiVzXCIgb3IgJXM6IGVycm9yICVkXG4iLAotCQkJCXJvb3RfZGV2aWNlX25h bWUsIGIsIGVycik7Ci0JCXByaW50aygiUGxlYXNlIGFwcGVuZCBhIGNvcnJlY3QgXCJyb290PVwi IGJvb3Qgb3B0aW9uOyBoZXJlIGFyZSB0aGUgYXZhaWxhYmxlIHBhcnRpdGlvbnM6XG4iKTsKLQot CQlwcmludGtfYWxsX3BhcnRpdGlvbnMoKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfQkxPQ0tfRVhU X0RFVlQKLQkJcHJpbnRrKCJERUJVR19CTE9DS19FWFRfREVWVCBpcyBlbmFibGVkLCB5b3UgbmVl ZCB0byBzcGVjaWZ5ICIKLQkJICAgICAgICJleHBsaWNpdCB0ZXh0dWFsIG5hbWUgZm9yIFwicm9v dD1cIiBib290IG9wdGlvbi5cbiIpOwotI2VuZGlmCi0JCXBhbmljKCJWRlM6IFVuYWJsZSB0byBt b3VudCByb290IGZzIG9uICVzIiwgYik7CisJCWlmIChlcnIgIT0gbGFzdF9lcnIpCisJCQlwcmlu dGsoIlZGUzogQ2Fubm90IG9wZW4gcm9vdCBkZXZpY2UgXCIlc1wiIG9yICVzOiBlcnJvciAlZFxu IiwKKwkJCQkJcm9vdF9kZXZpY2VfbmFtZSwgYiwgZXJyKTsKIAl9CiAKIAlwcmludGsoIkxpc3Qg b2YgYWxsIHBhcnRpdGlvbnM6XG4iKTsK --047d7b3432363bf83f04fa3ef71d-- From tytso@thunk.org Sun May 25 16:11:40 2014 Return-Path: <tytso@thunk.org> X-Spam-Checker-Version: SpamAssassin 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 BCBD57F47 for <xfs@oss.sgi.com>; Sun, 25 May 2014 16:11:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 959688F8037 for <xfs@oss.sgi.com>; Sun, 25 May 2014 14:11:37 -0700 (PDT) X-ASG-Debug-ID: 1401052293-04bdf0599fc63e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 2EGXDrEQzefBstyT (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Sun, 25 May 2014 14:11:34 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=JPJyOGD6G3iXb/SIxyLfK+LXamY/bpihA4trDStpERo=; b=hlSuaPyZkqspdGyvhyb0o/bbLgb4fkkYbNomDdQQao/RsqdMeFN2XT8bxOJZDQboqkurtIBLp8fv8tTGvrm7VUNfCfU7k83ZqeN1f0EZZWlOFvxNP0HTvxT2jMhAbcxEoK5bfaE0nXaQs1rBON9akDK0vWL3U5tAvrLwL9oGaTw=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from <tytso@thunk.org>) id 1Wofha-0001SM-QZ; Sun, 25 May 2014 21:11:30 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 1441B5804DE; Sun, 25 May 2014 17:11:30 -0400 (EDT) Date: Sun, 25 May 2014 17:11:30 -0400 From: Theodore Ts'o <tytso@mit.edu> To: Linus Torvalds <torvalds@linux-foundation.org> Cc: Plamen Petrov <plamen.sisi@gmail.com>, Dave Chinner <david@fromorbit.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking Message-ID: <20140525211129.GA5243@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking Mail-Followup-To: Theodore Ts'o <tytso@mit.edu>, Linus Torvalds <torvalds@linux-foundation.org>, Plamen Petrov <plamen.sisi@gmail.com>, Dave Chinner <david@fromorbit.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com, sandeen@redhat.com References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: <locally generated> X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1401052294 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=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6113 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 Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: > > The fact is, I think xfs is just buggy. Returning 38 (ENOSYS) is > totally insane. "No such system call"? Somebody is on some bad bad > drugs. Not that the mount_block_root() loop and error handling might > not be a good thing to perhaps tweak _too_, but at the very least your > patch means that now it no longer prints out the error number at all. There's only a single instance of ENOSYS in fs/xfs/xfs_mount.c: /* * We must be able to do sector-sized and sector-aligned IO. */ if (sector_size > sbp->sb_sectsize) { if (loud) xfs_warn(mp, "device supports %u byte sectors (not %u)", sector_size, sbp->sb_sectsize); error = ENOSYS; goto release_buf; } Plamen, does changing the ENOSYS to EINVAL above fix things for you? > Anyway, I'm also not seeing why that xfs error would be new to 3.14, > though.. Adding the XFS people to the cc. If I had to guess, commit daba5427d is new to 3.14, and it might explain the change in behavior. Cheers, - Ted From david@fromorbit.com Sun May 25 18:37:55 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 24DE77F50 for <xfs@oss.sgi.com>; Sun, 25 May 2014 18:37:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0DE2AC001 for <xfs@oss.sgi.com>; Sun, 25 May 2014 16:37:51 -0700 (PDT) X-ASG-Debug-ID: 1401061068-04cbb02a12c3130001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 16hQNcwHMrciKghu for <xfs@oss.sgi.com>; Sun, 25 May 2014 16:37:49 -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: AphMAH19glN5LL1sPGdsb2JhbABZgweIS6JRAQEBAQEBBpgKAYEGFwMBAQEBODWCJQEBBTocIxAIAxgJJQ8FJQMHGhOIQddDFxaFP4h9B4RABJlylnIr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 09:07:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wohz8-0006o3-Hy; Mon, 26 May 2014 09:37:46 +1000 Date: Mon, 26 May 2014 09:37:46 +1000 From: Dave Chinner <david@fromorbit.com> To: Gabriel VLASIU <gabriel@vlasiu.net> Cc: xfs@oss.sgi.com Subject: Re: xfs fs shutdown when no more space available Message-ID: <20140525233746.GR8554@dastard> X-ASG-Orig-Subj: Re: xfs fs shutdown when no more space available References: <alpine.LRH.2.03.1405252005430.25037@mail.vlasiu.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <alpine.LRH.2.03.1405252005430.25037@mail.vlasiu.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: 1401061068 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.6118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 25, 2014 at 08:32:04PM +0300, Gabriel VLASIU wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > Hi! > > Usually, when the xfs partition has no more space nothing happend except I > cannot write new data. This was true for a long time. But it's seems that > in 3.14.4 something has changed (3.14.x?): > > # dd if=/dev/urandom of=noise.dat count=4194304 > cp noise.dat 11.dat > cp noise.dat 22.dat > .... > > At some point the partition become full and I get this in logs: > > May 25 19:48:25 imhotep kernel: [26271.780894] XFS (loop0): xlog_write: reservation summary: > May 25 19:48:25 imhotep kernel: [26271.780894] trans type = FSYNC_TS (36) > May 25 19:48:25 imhotep kernel: [26271.780894] unit res = 9640 bytes > May 25 19:48:25 imhotep kernel: [26271.780894] current res = -4 bytes > May 25 19:48:25 imhotep kernel: [26271.780894] total reg = 0 bytes (o/flow = 0 bytes) > May 25 19:48:25 imhotep kernel: [26271.780894] ophdrs = 0 (ophdr space = 0 bytes) > May 25 19:48:25 imhotep kernel: [26271.780894] ophdr + reg = 0 bytes > May 25 19:48:25 imhotep kernel: [26271.780894] num regions = 0 fe4c224 xfs: inode log reservations are still too small Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 25 19:08:21 2014 Return-Path: <david@fromorbit.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 3E2C97F47 for <xfs@oss.sgi.com>; Sun, 25 May 2014 19:08:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CD558F8035 for <xfs@oss.sgi.com>; Sun, 25 May 2014 17:08:18 -0700 (PDT) X-ASG-Debug-ID: 1401062895-04cbb02a11c45b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CZJeC6UUdOSLYK9a for <xfs@oss.sgi.com>; Sun, 25 May 2014 17:08: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: AiNMAHmEglN5LL1sPGdsb2JhbABZgwdSqk0BAQEBAQEGmAoBgQYXAwEBAQE4NYIlAQEEAScTHCMFCwgDGAklDwUNGAMHGhOILgMJBw7REA2GMRaFP4ZnghYHhEAEl32BdYsYgh6JPCsvAQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 09:38:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WoiSb-0006ru-70; Mon, 26 May 2014 10:08:13 +1000 Date: Mon, 26 May 2014 10:08:13 +1000 From: Dave Chinner <david@fromorbit.com> To: Linus Torvalds <torvalds@linux-foundation.org> Cc: Plamen Petrov <plamen.sisi@gmail.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking Message-ID: <20140526000813.GS8554@dastard> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.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: 1401062895 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.6119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: > On Mon, May 5, 2014 at 11:34 AM, Plamen Petrov <plamen.sisi@gmail.com> wrote: > > > > The story short: on systems with btrfs root I have a kernel .config with ext4, > > xfs and btrfs built-in which works fine with 3.13.x, but 3.14.x panics. After > > inserting some debug printks, I got this info from mount_block_root: > > > > ---> EACCESS=13, EINVAL=22, Available filesystems: ext3 ext2 ext4 fuseblk xfs btrfs > > -----> Tried ext3, error code is -22. > > -----> Tried ext2, error code is -22. > > -----> Tried ext4, error code is -22. > > -----> Tried fuseblk, error code is -22. > > -----> Tried xfs, error code is -38. > > VFS: Cannot open root device "sda2" or unknown-block(8,2): error -38 > > Please append a correct "root=" boot option; here are the available partitions: So, XFS returned ENOSYS to the mount attempt. That means it found what appears to be a valid XFS superblock at block zero. That is, the magic number matched, the version was valid, all of the sanity checks of the values are within supported ranges, and the reason the mount failed was either a block size larger than page size or an unsupported inode size. There would have been an error in dmesg to tell you which. Can you please send the dmesg output of the failed mount attempt, as well as the output of: # dd if=/dev/sda2 bs=512 count=1 | hexdump -C So we can determine exactly why XFS thought it should be mounting that block device? > > Last one tried is xfs, the needed btrfs in this case never gets a chance. > > Looking at the code in init/do_mounts.c we can see that it "continue"s only if > > the return code it got is EINVAL, yet xfs clearly does not fit - so the kernel > > panics. Maybe there are other filesystems like xfs - I did not check. This > > patch fixes mount_block_root to try all available filesystems first, and then > > panic. The patched 3.14.x works for me. > > Hmm. I don't really dislike your patch, but it makes all the code > _after_ the switch-statement dead, since there is now no way to ever > fall through the switch statement. I don't think the patch addresses the cause of the problem. The code is trying to "mount the first filesystem type it finds that matches", but that match has resulted in a "filesystem cannot be mounted" error. The cause of the problem is that there's a difference between "don't understand what is on disk" and "understand exactly what is on disk and we don't support it". If we find a superblock match, then there is no other filesystem type that should be checked regardless of the error that is returned to upper loop. The loop should only continue if the filesystem doesn't recognise what is on disk (i.e. EINVAL) is returned. If it matches, then the filesystem must try to mount the filesystem. What do you expect a filesystem to do if it has an error during mount? It's going to return something other than EINVAL. It could be ENOMEM, EIO, etc, and those cases should terminate the "search until we find a match" loop. So, from that persepective the change is simply wrong. > The fact is, I think xfs is just buggy. Returning 38 (ENOSYS) is > totally insane. "No such system call"? Somebody is on some bad bad > drugs. Not that the mount_block_root() loop and error handling might > not be a good thing to perhaps tweak _too_, but at the very least your > patch means that now it no longer prints out the error number at all. Sure, the error might be silly, but it's irrelevant to the patch being discussed because it could have been one of several different errors that a failed mount could return. And, besides, XFS has returned that error for this condition for, well, more than 10 years: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=ba4331892d608b4e816b52a4de29693af0dd5c13 IOWs, ENOSYS in this case effectively means "system does not support filesystem configuration". It's not an invalid superblock (EINVAL) nor is it a corrupted superblock (EFSCORRUPTED), so it's something else... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 25 20:19:15 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1775F7F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 20:19:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B3817304043 for <xfs@oss.sgi.com>; Sun, 25 May 2014 18:19:14 -0700 (PDT) X-ASG-Debug-ID: 1401067148-04cbb02a12c76d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3tiigeW27D7fbpfU for <xfs@oss.sgi.com>; Sun, 25 May 2014 18:19: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: AlxMAC+VglN5LL1sPGdsb2JhbABZgwdSjXOcWgEBAQEBAQaQUIc6AYEGFwMBAQEBODWCJQEBAQQBAiQTHCMQCAMYCSUPBQ0HEQMHGhOILgMQDtENDYYaFxaFP4ZnghYHhEAElXKBIGuBdYsYgh6JPCsv Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 10:49:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WojZA-0006z4-Bz; Mon, 26 May 2014 11:19:04 +1000 Date: Mon, 26 May 2014 11:19:04 +1000 From: Dave Chinner <david@fromorbit.com> To: Linus Torvalds <torvalds@linux-foundation.org> Cc: Plamen Petrov <plamen.sisi@gmail.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking Message-ID: <20140526011904.GT8554@dastard> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> <20140526000813.GS8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526000813.GS8554@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: 1401067148 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.6121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 26, 2014 at 10:08:13AM +1000, Dave Chinner wrote: > On Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: > > On Mon, May 5, 2014 at 11:34 AM, Plamen Petrov <plamen.sisi@gmail.com> wrote: > > > > > > The story short: on systems with btrfs root I have a kernel .config with ext4, > > > xfs and btrfs built-in which works fine with 3.13.x, but 3.14.x panics. After > > > inserting some debug printks, I got this info from mount_block_root: > > > > > > ---> EACCESS=13, EINVAL=22, Available filesystems: ext3 ext2 ext4 fuseblk xfs btrfs > > > -----> Tried ext3, error code is -22. > > > -----> Tried ext2, error code is -22. > > > -----> Tried ext4, error code is -22. > > > -----> Tried fuseblk, error code is -22. > > > -----> Tried xfs, error code is -38. > > > VFS: Cannot open root device "sda2" or unknown-block(8,2): error -38 > > > Please append a correct "root=" boot option; here are the available partitions: BTW, This is the original thread with lots of triage in it: http://www.spinics.net/lists/linux-btrfs/msg33455.html But that doesn't reach any conclusion. I suspect that the change of btrfs init (from very early (@~1.8s into the boot) until a few milliseconds before the root mount is changing the order in which the filesystem type list is traversed by the mount, resulting in XFS being used to probe the device before btrfs. Why XFS is seeing /dev/sda2 as containing an XFS filesystem is not yet clear, but perhaps once you've dumped the the first sector of the btrfs partition all will become clear.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 25 21:40:59 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BAE07F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:40:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2DD8F304043 for <xfs@oss.sgi.com>; Sun, 25 May 2014 19:40:59 -0700 (PDT) X-ASG-Debug-ID: 1401072053-04bdf0599fd4e70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bQlfYvlUgsgKBPS9 for <xfs@oss.sgi.com>; Sun, 25 May 2014 19:40:53 -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: AppMANeoglN5LL1sPGdsb2JhbABZDoJ5iEuiUwEBAQEBAQaYCgGBBhcDAQEBATg1giUBAQUnExwzCAMYCSUPBSUDBxoBEohB1z0XFoU/iQSEQAEDmXKLGIsIUis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 12:10:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WokqJ-000775-C1; Mon, 26 May 2014 12:40:51 +1000 Date: Mon, 26 May 2014 12:40:51 +1000 From: Dave Chinner <david@fromorbit.com> To: Theodore Ts'o <tytso@mit.edu>, Linus Torvalds <torvalds@linux-foundation.org>, Plamen Petrov <plamen.sisi@gmail.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking Message-ID: <20140526024051.GU8554@dastard> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> <20140525211129.GA5243@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140525211129.GA5243@thunk.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: 1401072053 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.6122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, May 25, 2014 at 05:11:30PM -0400, Theodore Ts'o wrote: > On Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: > > > > The fact is, I think xfs is just buggy. Returning 38 (ENOSYS) is > > totally insane. "No such system call"? Somebody is on some bad bad > > drugs. Not that the mount_block_root() loop and error handling might > > not be a good thing to perhaps tweak _too_, but at the very least your > > patch means that now it no longer prints out the error number at all. > > There's only a single instance of ENOSYS in fs/xfs/xfs_mount.c: > > /* > * We must be able to do sector-sized and sector-aligned IO. > */ > if (sector_size > sbp->sb_sectsize) { > if (loud) > xfs_warn(mp, "device supports %u byte sectors (not %u)", > sector_size, sbp->sb_sectsize); > error = ENOSYS; > goto release_buf; > } > > Plamen, does changing the ENOSYS to EINVAL above fix things for you? > > > Anyway, I'm also not seeing why that xfs error would be new to 3.14, > > though.. Adding the XFS people to the cc. > > If I had to guess, commit daba5427d is new to 3.14, and it might > explain the change in behavior. Yup, it's buggy, though not in an obvious way. I'll have a patch for it soon. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 25 23:20:10 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17D697F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 23: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 052D3304039 for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:20:06 -0700 (PDT) X-ASG-Debug-ID: 1401078003-04cbb02a11cedf0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NEOz5uqOmlwCIvS2 for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:20: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: AmhNAJO/glN5LL1sPGdsb2JhbABZgwdSgnGnUQ4BAQEGkFCHOgGBCRcDAQEBATg1giUBAQEDAQECJBMcIwULCAMVAwklDwUNBxEDBxoTiC4DCQcO0QUNhhoXFoU/hmeCFgeEQASVcoEga4F1ixiCHok8Ky+BAyQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 13:50:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WomOE-0007IJ-Pj; Mon, 26 May 2014 14:19:58 +1000 Date: Mon, 26 May 2014 14:19:58 +1000 From: Dave Chinner <david@fromorbit.com> To: Linus Torvalds <torvalds@linux-foundation.org> Cc: Plamen Petrov <plamen.sisi@gmail.com>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking Message-ID: <20140526041958.GV8554@dastard> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> <20140526000813.GS8554@dastard> <20140526011904.GT8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526011904.GT8554@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: 1401078003 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.6124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 26, 2014 at 11:19:04AM +1000, Dave Chinner wrote: > On Mon, May 26, 2014 at 10:08:13AM +1000, Dave Chinner wrote: > > On Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: > > > On Mon, May 5, 2014 at 11:34 AM, Plamen Petrov <plamen.sisi@gmail.com> wrote: > > > > > > > > The story short: on systems with btrfs root I have a kernel .config with ext4, > > > > xfs and btrfs built-in which works fine with 3.13.x, but 3.14.x panics. After > > > > inserting some debug printks, I got this info from mount_block_root: > > > > > > > > ---> EACCESS=13, EINVAL=22, Available filesystems: ext3 ext2 ext4 fuseblk xfs btrfs > > > > -----> Tried ext3, error code is -22. > > > > -----> Tried ext2, error code is -22. > > > > -----> Tried ext4, error code is -22. > > > > -----> Tried fuseblk, error code is -22. > > > > -----> Tried xfs, error code is -38. > > > > VFS: Cannot open root device "sda2" or unknown-block(8,2): error -38 > > > > Please append a correct "root=" boot option; here are the available partitions: > > BTW, This is the original thread with lots of triage in it: > > http://www.spinics.net/lists/linux-btrfs/msg33455.html > > But that doesn't reach any conclusion. I suspect that the > change of btrfs init (from very early (@~1.8s into the boot) until a > few milliseconds before the root mount is changing the order in > which the filesystem type list is traversed by the mount, resulting > in XFS being used to probe the device before btrfs. On that point, on 3.15-rc6: $ tail -1 /proc/filesystems btrfs $ > Why XFS is seeing /dev/sda2 as containing an XFS filesystem is not > yet clear, but perhaps once you've dumped the the first sector of > the btrfs partition all will become clear.... No need, I found the regression. Plamen, can you please try the patch below? Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: xfs_readsb needs to check for magic numbers From: Dave Chinner <dchinner@redhat.com> Commit daba542 ("xfs: skip verification on initial "guess" superblock read") dropped the use of a veridier for the initial superblock read so we can probe the sector size of the filesystem stored in the superblock. It, however, now fails to validate that what was read initially is actually an XFS superblock and hence will fail the sector size check and return ENOSYS. This causes probe-based mounts to fail because it expects XFS to return EINVAL when it doesn't recognise the superblock format. cc: <stable@vger.kernel.org> Reported-by: Plamen Petrov <plamen.sisi@gmail.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_mount.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8d1afb8..2409224 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -327,8 +327,19 @@ reread: /* * Initialize the mount structure from the superblock. */ - xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp)); - xfs_sb_quota_from_disk(&mp->m_sb); + xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); + xfs_sb_quota_from_disk(sbp); + + /* + * If we haven't validated the superblock, do so now before we try + * to check the sector size and reread the superblock appropriately. + */ + if (sbp->sb_magicnum != XFS_SB_MAGIC) { + if (loud) + xfs_warn(mp, "Invalid superblock magic number"); + error = EINVAL; + goto release_buf; + } /* * We must be able to do sector-sized and sector-aligned IO. @@ -341,11 +352,11 @@ reread: goto release_buf; } - /* - * Re-read the superblock so the buffer is correctly sized, - * and properly verified. - */ if (buf_ops == NULL) { + /* + * Re-read the superblock so the buffer is correctly sized, + * and properly verified. + */ xfs_buf_relse(bp); sector_size = sbp->sb_sectsize; buf_ops = loud ? &xfs_sb_buf_ops : &xfs_sb_quiet_buf_ops; From david@fromorbit.com Sun May 25 23:28:13 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 52BBC7F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 23:28:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D86F304039 for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:28:13 -0700 (PDT) X-ASG-Debug-ID: 1401078490-04cbb02a12cf2a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NNyp8HM6TI6iZ4zT for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:28: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: AlZNAPLBglN5LL1sPGdsb2JhbABZgweDQ4UIolcBAQEGmAoBgQkXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hB118XFoU/iH0HhEAEmXKWcis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 13:58:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WomW7-0007J9-MH; Mon, 26 May 2014 14:28:07 +1000 Date: Mon, 26 May 2014 14:28:07 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/16] xfs: introduce directory geometry structure Message-ID: <20140526042807.GW8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 01/16] xfs: introduce directory geometry structure References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-2-git-send-email-david@fromorbit.com> <20140523190459.GB8343@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140523190459.GB8343@laptop.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: 1401078490 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.6124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 03:04:59PM -0400, Brian Foster wrote: > On Fri, May 23, 2014 at 10:03:37AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > The directory code has a dependency on the struct xfs_mount to > > supply the directory block geometry. Block size, block log size, > > and other parameters are pre-caclulated in the struct xfs_mount or > > access directly from the superblock embedded in the struct > > xfs_mount. > > > > Extract all of this geometry information out of the struct xfs_mount > > and superblock and place it into a new struct xfs_da_geometry > > defined by the directory code. Allocate and initialise it at mount > > time, and attach it to the struct xfs_mount so it canbe passed back > > into the directory code appropriately rather than using the struct > > xfs_mount. > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> .... > > @@ -99,24 +100,56 @@ xfs_dir_mount( > > mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); > > mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); > > > > - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); > > - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; > > - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); > > - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); > > - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); > > - > > nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; > > - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / > > + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > + KM_SLEEP | KM_MAYFAIL); > > + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > + KM_SLEEP | KM_MAYFAIL); > > + if (!mp->m_dir_geo || !mp->m_attr_geo) { > > + kmem_free(mp->m_dir_geo); > > + kmem_free(mp->m_attr_geo); > > + return ENOMEM; > > + } > > While it looks like everything is handled correctly here, I think this > would be much cleaner if we just created a set of xfs_mount_alloc/free() > helpers that did all of the allocations at once. Then we wouldn't have a > situation where the caller has non-obvious memory allocations to clean > up should it fail sometime after calling xfs_da_mount(). I think that each subsystem needs to have it's own init/teardown functions, and that the rest of the code needs to call them appropriately. Yes, error handling can be non-trivial, but the idea that we do unconditional allocation for subsystems/configs that we may not use (eg. due to mkfs options) seems a little wrong to me. And aggregating all the allocations doesn't remove the need for most subsystems to be able to return initialisation errors, so int he long run it doesn't really change the fact that we have to initialise and then tear down on subsequent subsystem init failures... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun May 25 23:48:49 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C6E17F3F for <xfs@oss.sgi.com>; Sun, 25 May 2014 23:48:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DED41304039 for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:48:48 -0700 (PDT) X-ASG-Debug-ID: 1401079722-04bdf0599eda310001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id D8lZXGTqKMZWAxE3 for <xfs@oss.sgi.com>; Sun, 25 May 2014 21:48: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: AlZNAJzGglN5LL1sPGdsb2JhbABZgweDQ4UIolcBAQEGmAoBgQkXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hB11UXFoU/iH0HhEAEmXKLGItaKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 26 May 2014 14:18:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Womq0-0007LY-4d; Mon, 26 May 2014 14:48:40 +1000 Date: Mon, 26 May 2014 14:48:40 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Message-ID: <20140526044840.GX8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-6-git-send-email-david@fromorbit.com> <20140523190622.GF8343@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140523190622.GF8343@laptop.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: 1401079723 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.6124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 03:06:22PM -0400, Brian Foster wrote: > On Fri, May 23, 2014 at 10:03:41AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > --- > > fs/xfs/xfs_da_btree.h | 15 +++++++-------- > > fs/xfs/xfs_dir2.c | 4 ++-- > > fs/xfs/xfs_dir2_data.c | 4 ++-- > > fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- > > fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ > > fs/xfs/xfs_dir2_readdir.c | 6 +++--- > > 6 files changed, 48 insertions(+), 43 deletions(-) > > > > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > > index e9496a9..8db83fc 100644 > > --- a/fs/xfs/xfs_da_btree.h > > +++ b/fs/xfs/xfs_da_btree.h > > @@ -232,9 +232,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, > > * Convert block (DB) to block (dablk) > > */ > > static inline xfs_dablk_t > > -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > > +xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > > { > > - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); > > + return (xfs_dablk_t)(db << (geo->blklog - geo->fsblog)); > > } > > > > /* > > @@ -243,7 +243,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) > > static inline xfs_dablk_t > > xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) > > { > > - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); > > + return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); > > } > > > > /* > > @@ -261,19 +261,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, > > * Convert block (dablk) to block (DB) > > */ > > static inline xfs_dir2_db_t > > -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) > > +xfs_dir2_da_to_db(struct xfs_da_geometry *geo, xfs_dablk_t da) > > { > > - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); > > + return (xfs_dir2_db_t)(da >> (geo->blklog - geo->fsblog)); > > } > > > > /* > > * Convert block (dablk) to byte offset in space > > */ > > static inline xfs_dir2_off_t > > -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) > > +xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) > > { > > - return xfs_dir2_db_off_to_byte(mp->m_dir_geo, > > - xfs_dir2_da_to_db(mp, da), 0); > > + return xfs_dir2_db_off_to_byte(geo, xfs_dir2_da_to_db(geo, da), 0); > > } > > Is it a problem that we convert a dablk to a db block on the way to a > byte conversion? i.e., that seems like a lossy conversion, assuming I am > correctly understanding that a dablk is equivalent to a filesystem block > and a db block is a directory block (1 or more dablks). It's not lossy, because the only way that directory blocks are physically indexed is by the start address of the block. That is: sb_dirblklog = 2 db blockk index 0 1 2 dir block map +---------------+---------------+ bmbt map +---+---+---+---+---+---+---+---+ dablk index 0 1 2 3 4 5 6 7 8 The only time non-sb_dirblklog aligned dablk values are used are during discontiguous buffer operations The mapping code in xfs_dabuf_map() is the only code that needs to know about the intermediate dablk indexes to be able to map and build the discontiguous buffers. otherwise dablk increases by 4 counts for every directory block and the other indexes are never directly used. Cheers, Dave. -- Dave Chinner david@fromorbit.com From plamen.sisi@gmail.com Mon May 26 00:19:07 2014 Return-Path: <plamen.sisi@gmail.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,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 5DB1C7F3F for <xfs@oss.sgi.com>; Mon, 26 May 2014 00:19:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 47C9E8F8037 for <xfs@oss.sgi.com>; Sun, 25 May 2014 22:19:04 -0700 (PDT) X-ASG-Debug-ID: 1401081539-04cb6c22b6d8630001-NocioJ Received: from mail-yh0-f45.google.com (mail-yh0-f45.google.com [209.85.213.45]) by cuda.sgi.com with ESMTP id iEbGyiH3CfPw8oi9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Sun, 25 May 2014 22:18:59 -0700 (PDT) X-Barracuda-Envelope-From: plamen.sisi@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] Received: by mail-yh0-f45.google.com with SMTP id b6so6029506yha.4 for <xfs@oss.sgi.com>; Sun, 25 May 2014 22:18:59 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.45] 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=XJfnc0EwjwYC+eKxd7oeVEQWqtDVKx7k75c8lVM1R+M=; b=QE4TyNnL+k3LaDWN8XWL542RxcNBbsKpVol7jECPUBMbht2C/TLjnpHHkJo6JLvY6K SCwanSBhTLQwG1/UowjAPC6n1/a1FWtyqPv4S5WFlWu+zT9COTBWiQsexcIJW81OIXXY EARaephb98FdNfTaIkJagvQ3r3GeML0johQJYks8wZwoqmgdIRglS7mHe9Vjhww5W2el CdjRmR2jQDGMZx9s7Li010DPRXn32wvbBUvR1R8JymGwRHJd9MP/KyoxeGB+2/M76RVZ ohH/CE4srF11hu/I4VtMOLjCcD322WhhOr9wfsqu45O6ke/0SrcKKjVlWmCfMxfdeX68 hwKA== MIME-Version: 1.0 X-Received: by 10.236.122.227 with SMTP id t63mr259099yhh.119.1401081539211; Sun, 25 May 2014 22:18:59 -0700 (PDT) Received: by 10.170.43.143 with HTTP; Sun, 25 May 2014 22:18:59 -0700 (PDT) In-Reply-To: <20140526041958.GV8554@dastard> References: <1399314889-9829-1-git-send-email-plamen.sisi@gmail.com> <CA+55aFwxF2xnYerLdJZ2gQdZizK3953L16X5KkUAqD-YePausQ@mail.gmail.com> <20140526000813.GS8554@dastard> <20140526011904.GT8554@dastard> <20140526041958.GV8554@dastard> Date: Mon, 26 May 2014 08:18:59 +0300 Message-ID: <CALkh-HgGuGaR3rimNeCgRUexU1LgKMbSZ+WcPMmzD6UwtVC7pQ@mail.gmail.com> Subject: Re: [PATCH] do_mounts: try all available filesystems before panicking From: =?UTF-8?B?0J/Qu9Cw0LzQtdC9INCf0LXRgtGA0L7Qsg==?= <plamen.sisi@gmail.com> X-ASG-Orig-Subj: Re: [PATCH] do_mounts: try all available filesystems before panicking To: Dave Chinner <david@fromorbit.com> Cc: Linus Torvalds <torvalds@linux-foundation.org>, LKML <linux-kernel@vger.kernel.org>, xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yh0-f45.google.com[209.85.213.45] X-Barracuda-Start-Time: 1401081539 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.6124 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 2014-05-26 7:19 GMT+03:00 Dave Chinner <david@fromorbit.com>: > On Mon, May 26, 2014 at 11:19:04AM +1000, Dave Chinner wrote: >> On Mon, May 26, 2014 at 10:08:13AM +1000, Dave Chinner wrote: >> > On Sun, May 25, 2014 at 01:04:09PM -0700, Linus Torvalds wrote: >> > > On Mon, May 5, 2014 at 11:34 AM, Plamen Petrov <plamen.sisi@gmail.com> wrote: >> > > > >> > > > The story short: on systems with btrfs root I have a kernel .config with ext4, >> > > > xfs and btrfs built-in which works fine with 3.13.x, but 3.14.x panics. After >> > > > inserting some debug printks, I got this info from mount_block_root: >> > > > >> > > > ---> EACCESS=13, EINVAL=22, Available filesystems: ext3 ext2 ext4 fuseblk xfs btrfs >> > > > -----> Tried ext3, error code is -22. >> > > > -----> Tried ext2, error code is -22. >> > > > -----> Tried ext4, error code is -22. >> > > > -----> Tried fuseblk, error code is -22. >> > > > -----> Tried xfs, error code is -38. >> > > > VFS: Cannot open root device "sda2" or unknown-block(8,2): error -38 >> > > > Please append a correct "root=" boot option; here are the available partitions: >> >> BTW, This is the original thread with lots of triage in it: >> >> http://www.spinics.net/lists/linux-btrfs/msg33455.html >> >> But that doesn't reach any conclusion. I suspect that the >> change of btrfs init (from very early (@~1.8s into the boot) until a >> few milliseconds before the root mount is changing the order in >> which the filesystem type list is traversed by the mount, resulting >> in XFS being used to probe the device before btrfs. > > On that point, on 3.15-rc6: > > $ tail -1 /proc/filesystems > btrfs > $ > >> Why XFS is seeing /dev/sda2 as containing an XFS filesystem is not >> yet clear, but perhaps once you've dumped the the first sector of >> the btrfs partition all will become clear.... > > No need, I found the regression. Plamen, can you please try the > patch below? > Yes, Dave. I applied your patch on top of linux 3.15-rc5. I tried the patch you sent in a VM I used for tests. With only your patch applied - the system boots up normally. Thanks for the different perspectives, guys! Always a pleasure communicating with you. After a month or so waiting - definetly worth it! Thanks a lot! -- Plamen Petrov From gabriel@vlasiu.net Mon May 26 00:52:38 2014 Return-Path: <gabriel@vlasiu.net> X-Spam-Checker-Version: SpamAssassin 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 47C877F3F for <xfs@oss.sgi.com>; Mon, 26 May 2014 00:52:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BECCDAC003 for <xfs@oss.sgi.com>; Sun, 25 May 2014 22:52:37 -0700 (PDT) X-ASG-Debug-ID: 1401083552-04cb6c22b8d9cc0001-NocioJ Received: from mail.vlasiu.net (mail.vlasiu.net [91.223.50.125]) by cuda.sgi.com with ESMTP id RhhE6V2mbZMtGUdj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Sun, 25 May 2014 22:52:34 -0700 (PDT) X-Barracuda-Envelope-From: gabriel@vlasiu.net X-Barracuda-Apparent-Source-IP: 91.223.50.125 Received: from localhost (localhost [127.0.0.1]) by mail.vlasiu.net (Postfix) with ESMTP id BE144A0065; Mon, 26 May 2014 08:52:31 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=vlasiu.net; h= content-type:content-type:mime-version:user-agent:references :message-id:in-reply-to:subject:subject:from:from:date:date :received:received:received; s=default; t=1401083549; x= 1401087150; bh=661IfmWNH8kxnBF+eNeB8+/m9uYhe4NlUvZ8UJBH07g=; b=N OZusf6jNBufrZ//5KymI2CKKdid7sDUbB1SsOlc3nZiVLbYsGXtsTKkECeQFVnwV aL1j7bEWHyun60KaOIjGyCA7LxVv30TWQ0iMGEURYoLt2R2qbPmBPzvPWhptO1A1 +Ftpib18zG/kGZVFeyTkTrLl/hUSpAj6mGR+wsFEr4= X-Virus-Scanned: amavisd-new at vlasiu.net Received: from mail.vlasiu.net ([127.0.0.1]) by localhost (mail.vlasiu.net [127.0.0.1]) (amavisd-new, port 10026) with LMTP id p4d4c1DQN-zw; Mon, 26 May 2014 08:52:29 +0300 (EEST) Received: by mail.vlasiu.net (Postfix, from userid 500) id 24FC2A006C; Mon, 26 May 2014 08:52:28 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.vlasiu.net (Postfix) with ESMTP id EC443A0065; Mon, 26 May 2014 08:52:28 +0300 (EEST) Date: Mon, 26 May 2014 08:52:23 +0300 (EEST) From: Gabriel VLASIU <gabriel@vlasiu.net> To: Dave Chinner <david@fromorbit.com> cc: xfs@oss.sgi.com Subject: Re: xfs fs shutdown when no more space available In-Reply-To: <20140525233746.GR8554@dastard> X-ASG-Orig-Subj: Re: xfs fs shutdown when no more space available Message-ID: <alpine.LRH.2.03.1405260851580.2838@mail.vlasiu.net> References: <alpine.LRH.2.03.1405252005430.25037@mail.vlasiu.net> <20140525233746.GR8554@dastard> User-Agent: Alpine 2.03 (LRH 1266 2009-07-14) X-OpenGPG-KeyID: 44952F15 X-OpenGPG-Fingerprint: 4AC5 7C26 2FE9 02DA 4906 24B2 D32B 7ED7 4495 2F15 X-OpenGPG-URL: http://www.vlasiu.net/public.key MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail.vlasiu.net[91.223.50.125] X-Barracuda-Start-Time: 1401083553 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: vlasiu.net X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.6125 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: SHA512 Hi! On Mon, 26 May 2014, Dave Chinner wrote: > fe4c224 xfs: inode log reservations are still too small Thank you. Sincerely, Gabriel - -- // Gabriel VLASIU // // OpenGPG-KeyID : 44952F15 // OpenGPG-Fingerprint: 4AC5 7C26 2FE9 02DA 4906 24B2 D32B 7ED7 4495 2F15 // OpenGPG-URL : http://www.vlasiu.net/public.key -----BEGIN PGP SIGNATURE----- iQIcBAEBCgAGBQJTgtaXAAoJENMrftdElS8VMGAP/iG0M6ZC3jsUxUQzY6tqmKp0 w/bHVK1toey6Km8q7UtDo6SKMWPJt9pIOs4kjcvepy9GxkXIeZq/Gz2NLhqbjKv1 eGmX/ZuOs/3KzYbmSOScnWDJXiCh2JQLZkgAhJ93w/EyGWiqWNfUMjMJjyGiUA6S /MAxRmMGgYF76Mt0cfkuT38I222EFMcAjKHERqkoCZJOIsIg/S79URjoAO1QkJ/9 51OkZfWIe0xtX/vEXoGk+QUsWgXbYKYRk5OH7kXFqqBn3tF+tKMFP6G3TwaAOh4p e68iS4UVJz1LGMn2y32RzDGVHBS2cbH62s8vTEW2QWIoJZQoOHdp7BnmOQfUi84c yxOD9KisxWP0ZPgr2425id/TS/4OhjFkGrbo/hcpnDAxbflzi339WxWO4T8FTYGr ZPolq6ttC8ZYTZ6yL4aUb/MIY8RtPNiVytLAlJOk3bOwn8SZs79TfBeLzOOAM8Hc j3Bzk/pVu8cW7pI0oU+AeRZisnCPMiRslXWaIBrjd/d86G44Cxytqz8csqaYHrLD PdvF195dQc8iyAm8lQA3k3nxVTO2kh0stJTGGwVjo0nYWRz0vDQBK8k/a9hRccqw rtYKS2Xwia6MhAsBAcyL0CwlcAhvENpTzWATxfkU7rWkgftFUWABVp6JQvhAs99i xZswSoh5U9eSj+q53wj1 =P1OT -----END PGP SIGNATURE----- From debbugs@buxtehude.debian.org Mon May 26 05:57:29 2014 Return-Path: <debbugs@buxtehude.debian.org> X-Spam-Checker-Version: SpamAssassin 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 1DBF17F3F for <xfs@oss.sgi.com>; Mon, 26 May 2014 05:57:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E314AC002 for <xfs@oss.sgi.com>; Mon, 26 May 2014 03:57:28 -0700 (PDT) X-ASG-Debug-ID: 1401101840-04cb6c22b8ef5e0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id lwELrSmGypGLvRFI (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Mon, 26 May 2014 03:57:21 -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.80) (envelope-from <debbugs@buxtehude.debian.org>) id 1Wosaj-00017K-Lt; Mon, 26 May 2014 10:57:17 +0000 MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) X-Loop: owner@bugs.debian.org From: owner@bugs.debian.org (Debian Bug Tracking System) To: =?UTF-8?Q?An=C3=ADbal?= Monsalve Salazar <anibal@debian.org> Subject: Bug#713994: marked as done (xfsprogs: Failure to allocate new space, potentially after an xfs_grow, to existing files) Message-ID: <handler.713994.D713994.14011016762813.ackdone@bugs.debian.org> X-ASG-Orig-Subj: Bug#713994: marked as done (xfsprogs: Failure to allocate new space, potentially after an xfs_grow, to existing files) References: <20140526105428.GA1589@master.debian.org> <CAMjbrKpGsyWCca_VX5yXpen5V6zbT_QxS2JpcR6B=XNUaHipZw@mail.gmail.com> X-Debian-PR-Message: closed 713994 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: upstream X-Debian-PR-Source: xfsprogs Date: Mon, 26 May 2014 10:57:17 +0000 Content-Type: multipart/mixed; boundary="----------=_1401101837-4286-0" Sender: Debian BTS <debbugs@buxtehude.debian.org> X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1401101841 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15: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.6130 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... ------------=_1401101837-4286-0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Your message dated Mon, 26 May 2014 20:54:28 +1000 with message-id <20140526105428.GA1589@master.debian.org> and subject line Re: Bug#713994: XFS repair has caused the Debian Bug report #713994, regarding xfsprogs: Failure to allocate new space, potentially after an xfs= _grow, to existing files 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 713994: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D713994 Debian Bug Tracking System Contact owner@bugs.debian.org with problems ------------=_1401101837-4286-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by bugs.debian.org; 24 Jun 2013 16:33:03 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=4.0 tests=BAYES_00,DIGITS_LETTERS, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FOURLA,FREEMAIL_FROM,HAS_PACKAGE, HTML_MESSAGE,MULTALT,RCVD_IN_DNSWL_LOW,SPF_PASS,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 5; hammy, 151; neutral, 559; spammy, 0. spammytokens: hammytokens:0.000-+--sk:linux2, 0.000-+--sk:linux-2, 0.000-+--26325amd64, 0.000-+--2.6.32-5-amd64, 0.000-+--x86_64 Return-path: <yhetti@gmail.com> Received: from mail-ie0-f176.google.com ([209.85.223.176]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:128) (Exim 4.80) (envelope-from <yhetti@gmail.com>) id 1Ur9hO-0003iv-UL for submit@bugs.debian.org; Mon, 24 Jun 2013 16:33:03 +0000 Received: by mail-ie0-f176.google.com with SMTP id ar20so25345710iec.35 for <submit@bugs.debian.org>; Mon, 24 Jun 2013 09:32:56 -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=u5HgIL9wE0opCl1/+kmOC7bRDBAc9+ARcFpfbayKSvc=; b=S09N60hC1weLoygqwUzhauRM+zpavSMq3GxnhePlNUixgDXC7u0QHfoLy2J4GAPkJG GH+zUzDgjWCgR8bIk5FYeMhw+eGxoGpVTriLajsfqESOiNpiczIHt9xbhCK3yoFRukOd PRSebgrEmsQMDruMOwB+Bb1Y9mtDB0sMDJfnWD2iDX/hEZzXZz+3h3XzkQV2CMpFNsPu Ofay4FUAu93EoLD3EihSoXgz/jjcCEu0YKAgAIbbbLeOFkmCMUjM3lLqf9Y49sRjqGqe Gq76aAwQpBvhqjamgxN/WWyGNZaIrSXwjZ02eNw6W6BGSZTH1xR014xbscToHlEbulkg apgw== MIME-Version: 1.0 X-Received: by 10.43.46.134 with SMTP id uo6mr8715847icb.96.1372091576631; Mon, 24 Jun 2013 09:32:56 -0700 (PDT) Received: by 10.42.30.145 with HTTP; Mon, 24 Jun 2013 09:32:56 -0700 (PDT) Date: Mon, 24 Jun 2013 12:32:56 -0400 Message-ID: <CAMjbrKpGsyWCca_VX5yXpen5V6zbT_QxS2JpcR6B=XNUaHipZw@mail.gmail.com> Subject: xfsprogs: Failure to allocate new space, potentially after an xfs_grow, to existing files From: Wes Deviers <yhetti@gmail.com> To: submit@bugs.debian.org Content-Type: multipart/alternative; boundary=bcaec529a017064b8904dfe8f7d7 Delivered-To: submit@bugs.debian.org --bcaec529a017064b8904dfe8f7d7 Content-Type: text/plain; charset=ISO-8859-1 Package: xfsprogs Version: 3.1.4 Justification: breaks unrelated software Severity: critical Tags: upstream *** Please type your report below this line *** As part of my standard virtual machine template for MySQL, I created an LVM setup as follows: pvcreate /dev/sdb vgcreate vg0 /dev/sdb lvcreate -n mysql -L 10G vg0 lvcreate -n mysqlbinlog -L 5G vg0 lvcreate -n mysqllog -L 5G vg0 Then, after I deploy the template, I resize the LVs and xfs_growfs them, apt-get upgrade, and restart. I also frequently (multiple times per week) extend MySQL data volumes on the fly using echo 1 > /sys/block/sdb/device/rescane pvresize /dev/sdb lvresize -l +100%FREE /dev/vg0/mysql xfs_growfs /mysql This has worked hundreds of times. Twice, though, on Debian 6.x (I don't have enough 7.x boxes in production yet) I've had something happen with XFS. Once, after an extend, it was unmountable. I assumed this was an error on my part, created the FS, and moved on. Today, I got an SQL error on a MySQL replication box: Error 'The table 'XXXXX' is full' on query. Default database: XXXXXYYYYYY Normally this would be a configuration issue in MySQL related to a setting called "innodb_data_file_path". Mine is configured correctly; otherwise all of my templates would have died years ago. On this particular host, I extended /mysql (the data volume) to 120G before reboot. Today, when it hit what appears to be the *original* size: /dev/mapper/vg0-mysql 125814784 10473148 115341636 9% /mysql XFS threw allocation errors. [4051547.986869] ffff880638219200: 58 41 47 46 00 00 00 01 00 00 00 0c 00 05 00 00 XAGF............ [4051547.987636] Filesystem "dm-2": XFS internal error xfs_alloc_read_agf at line 2293 of file /build/buildd-linux-2.6_2.6.32-48squeeze1-amd64-qu4MIV/linux-2.6-2.6.32/debian/build/source_amd64_none/fs/xfs/xfs_alloc.c. Caller 0xffffffffa021fcb0 [4051547.987639] [4051547.988226] Pid: 3367, comm: mysqld Not tainted 2.6.32-5-amd64 #1 [4051547.988228] Call Trace: [4051547.988287] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4051547.988298] [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs] [4051547.988307] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4051547.988317] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4051547.988331] [<ffffffffa021fd45>] ? xfs_alloc_pagf_init+0x13/0x34 [xfs] [4051547.988342] [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x24/0x51 [xfs] [4051547.988353] [<ffffffffa022c67d>] ? xfs_bmap_btalloc+0x25f/0x732 [xfs] [4051547.988368] [<ffffffffa0228b70>] ? xfs_bmap_search_extents+0x57/0xd1 [xfs] [4051547.988379] [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xfs] [4051547.988386] [<ffffffff8118eec3>] ? _atomic_dec_and_lock+0x33/0x50 [4051547.988406] [<ffffffffa0257217>] ? xfs_trans_reserve+0xc8/0x19d [xfs] [4051547.988419] [<ffffffffa024a51f>] ? xfs_iomap_write_direct+0x305/0x3f5 [xfs] [4051547.988432] [<ffffffffa024a7bc>] ? xfs_iomap+0x1ad/0x285 [xfs] [4051547.988444] [<ffffffffa025db53>] ? __xfs_get_blocks+0x6c/0x15c [xfs] [4051547.988450] [<ffffffff81062311>] ? queue_work_on+0x45/0x4f [4051547.988455] [<ffffffff8111442a>] ? __blockdev_direct_IO+0x575/0xa60 [4051547.988461] [<ffffffff810482ef>] ? finish_task_switch+0x3a/0xaf [4051547.988472] [<ffffffffa025d983>] ? xfs_vm_direct_IO+0xd4/0x102 [xfs] [4051547.988483] [<ffffffffa025dc43>] ? xfs_get_blocks_direct+0x0/0x11 [xfs] [4051547.988494] [<ffffffffa025d791>] ? xfs_end_io_direct+0x0/0x5f [xfs] [4051547.988499] [<ffffffff810b55d6>] ? generic_file_direct_write+0xdd/0x152 [4051547.988510] [<ffffffffa0264532>] ? xfs_write+0x44f/0x6ea [xfs] [4051547.988523] [<ffffffffa02442ca>] ? xfs_iunlock+0x31/0x7c [xfs] [4051547.988528] [<ffffffff810ef21e>] ? do_sync_write+0xce/0x113 [4051547.988532] [<ffffffff810652b2>] ? autoremove_wake_function+0x0/0x2e [4051547.988535] [<ffffffff810482ef>] ? finish_task_switch+0x3a/0xaf [4051547.988538] [<ffffffff810efb70>] ? vfs_write+0xa9/0x102 [4051547.988541] [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77 [4051547.988545] [<ffffffff81010b42>] ? system_call_fastpath+0x16/0x1b [4053278.621482] ffff880638219200: 58 41 47 46 00 00 00 01 00 00 00 0c 00 05 00 00 XAGF............ [4053278.621761] Filesystem "dm-2": XFS internal error xfs_alloc_read_agf at line 2293 of file /build/buildd-linux-2.6_2.6.32-48squeeze1-amd64-qu4MIV/linux-2.6-2.6.32/debian/build/source_amd64_none/fs/xfs/xfs_alloc.c. Caller 0xffffffffa021fcb0 [4053278.621764] [4053278.622352] Pid: 3367, comm: mysqld Not tainted 2.6.32-5-amd64 #1 [4053278.622354] Call Trace: [4053278.622381] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4053278.622392] [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs] [4053278.622401] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4053278.622411] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4053278.622421] [<ffffffffa021fd45>] ? xfs_alloc_pagf_init+0x13/0x34 [xfs] [4053278.622432] [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x24/0x51 [xfs] [4053278.622442] [<ffffffffa022c67d>] ? xfs_bmap_btalloc+0x25f/0x732 [xfs] [4053278.622453] [<ffffffffa0228b70>] ? xfs_bmap_search_extents+0x57/0xd1 [xfs] [4053278.622465] [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xfs] [4053278.622486] [<ffffffff8118eec3>] ? _atomic_dec_and_lock+0x33/0x50 [4053278.622501] [<ffffffffa0257217>] ? xfs_trans_reserve+0xc8/0x19d [xfs] [4053278.622514] [<ffffffffa024a51f>] ? xfs_iomap_write_direct+0x305/0x3f5 [xfs] [4053278.622527] [<ffffffffa024a7bc>] ? xfs_iomap+0x1ad/0x285 [xfs] [4053278.622538] [<ffffffffa025db53>] ? __xfs_get_blocks+0x6c/0x15c [xfs] [4053278.622551] [<ffffffff8111442a>] ? __blockdev_direct_IO+0x575/0xa60 [4053278.622563] [<ffffffffa025d983>] ? xfs_vm_direct_IO+0xd4/0x102 [xfs] [4053278.622574] [<ffffffffa025dc43>] ? xfs_get_blocks_direct+0x0/0x11 [xfs] [4053278.622585] [<ffffffffa025d791>] ? xfs_end_io_direct+0x0/0x5f [xfs] [4053278.622593] [<ffffffff810b55d6>] ? generic_file_direct_write+0xdd/0x152 [4053278.622605] [<ffffffffa0264532>] ? xfs_write+0x44f/0x6ea [xfs] [4053278.622618] [<ffffffffa02442ca>] ? xfs_iunlock+0x31/0x7c [xfs] [4053278.622625] [<ffffffff810ef21e>] ? do_sync_write+0xce/0x113 [4053278.622637] [<ffffffff810652b2>] ? autoremove_wake_function+0x0/0x2e [4053278.622646] [<ffffffff810482ef>] ? finish_task_switch+0x3a/0xaf [4053278.622650] [<ffffffff810efb70>] ? vfs_write+0xa9/0x102 [4053278.622652] [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77 [4053278.622660] [<ffffffff81010b42>] ? system_call_fastpath+0x16/0x1b [4055487.227132] ffff880638219200: 58 41 47 46 00 00 00 01 00 00 00 0c 00 05 00 00 XAGF............ [4055487.227678] Filesystem "dm-2": XFS internal error xfs_alloc_read_agf at line 2293 of file /build/buildd-linux-2.6_2.6.32-48squeeze1-amd64-qu4MIV/linux-2.6-2.6.32/debian/build/source_amd64_none/fs/xfs/xfs_alloc.c. Caller 0xffffffffa021fcb0 [4055487.227681] [4055487.228267] Pid: 32572, comm: mysqld Not tainted 2.6.32-5-amd64 #1 [4055487.228269] Call Trace: [4055487.228292] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4055487.228302] [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs] [4055487.228311] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4055487.228321] [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs] [4055487.228330] [<ffffffffa021fd45>] ? xfs_alloc_pagf_init+0x13/0x34 [xfs] [4055487.228341] [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x24/0x51 [xfs] [4055487.228352] [<ffffffffa022c67d>] ? xfs_bmap_btalloc+0x25f/0x732 [xfs] [4055487.228363] [<ffffffffa0228b70>] ? xfs_bmap_search_extents+0x57/0xd1 [xfs] [4055487.228374] [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xfs] [4055487.228388] [<ffffffffa0257217>] ? xfs_trans_reserve+0xc8/0x19d [xfs] [4055487.228400] [<ffffffffa024a51f>] ? xfs_iomap_write_direct+0x305/0x3f5 [xfs] [4055487.228413] [<ffffffffa024a7bc>] ? xfs_iomap+0x1ad/0x285 [xfs] [4055487.228425] [<ffffffffa025db53>] ? __xfs_get_blocks+0x6c/0x15c [xfs] [4055487.228431] [<ffffffff8111442a>] ? __blockdev_direct_IO+0x575/0xa60 [4055487.228442] [<ffffffffa025d983>] ? xfs_vm_direct_IO+0xd4/0x102 [xfs] [4055487.228453] [<ffffffffa025dc43>] ? xfs_get_blocks_direct+0x0/0x11 [xfs] [4055487.228464] [<ffffffffa025d791>] ? xfs_end_io_direct+0x0/0x5f [xfs] [4055487.228468] [<ffffffff810b55d6>] ? generic_file_direct_write+0xdd/0x152 [4055487.228479] [<ffffffffa0264532>] ? xfs_write+0x44f/0x6ea [xfs] [4055487.228492] [<ffffffffa02442ca>] ? xfs_iunlock+0x31/0x7c [xfs] [4055487.228496] [<ffffffff810ef21e>] ? do_sync_write+0xce/0x113 [4055487.228500] [<ffffffff810652b2>] ? autoremove_wake_function+0x0/0x2e [4055487.228503] [<ffffffff810efb70>] ? vfs_write+0xa9/0x102 [4055487.228505] [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77 [4055487.228509] [<ffffffff81010b42>] ? system_call_fastpath+0x16/0x1b Throwing a dd at the FS works fine: dd if=/dev/urandom of=/mysql/data/somefile.out bs=1M count=512 Two things might be going on here that are special 1) I'm using a pretty customized MySQL configuration, including a setting called O_DIRECT, which turns on direct IO for InnoDB flushes. Therefore, the code path for some InnoDB writes is going to be different from what dd does. 2) This is SAN-backed storage; it shouldn't matter, but it does introduce IO latency. I've been trying to find a way to fix this "hot"; these are production systems. Luckily it was just a read-only replica. If this had happened to the master, there would probably have been data corruption (hence the sev 1 ticket). Couldn't find a hot fix, so I'm going to unmount/repair and then reboot. I'll keep track of what happens so I can attach it to this report later if possible. Thanks! Wes -- System Information: Debian Release: 6.0.7 APT prefers oldstable-updates APT policy: (500, 'oldstable-updates'), (500, 'oldstable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32-5-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages xfsprogs depends on: ii libblkid1 2.17.2-9 block device id library ii libc6 2.11.3-4 Embedded GNU C Library: Shared lib ii libreadline5 5.2-7 GNU readline and history libraries ii libuuid1 2.17.2-9 Universally Unique ID library xfsprogs recommends no packages. Versions of packages xfsprogs suggests: pn acl <none> (no description available) pn attr <none> (no description available) pn quota <none> (no description available) pn xfsdump <none> (no description available) -- no debconf information --bcaec529a017064b8904dfe8f7d7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Package: xfsprogs<br>Version: 3.1.4<br>Justification: brea= ks unrelated software<br>Severity: critical<br> Tags: upstream<br><br>*** Please type your report below this line ***<br><b= r>As part of my standard virtual machine template for MySQL, I created an L= VM setup as follows:<br>pvcreate /dev/sdb<br>vgcreate vg0 /dev/sdb<br> lvcreate -n mysql -L 10G vg0<br> lvcreate -n mysqlbinlog -L 5G vg0<br>lvcreate -n mysqllog -L 5G vg0<br><br>= Then, after I deploy the template, I resize the LVs and xfs_growfs them, ap= t-get upgrade, and restart.<br><br>I also frequently (multiple times per we= ek) extend MySQL data volumes on the fly using<br> echo 1 > /sys/block/sdb/device/rescane<br>pvresize /dev/sdb<br>lvresize = -l +100%FREE /dev/vg0/mysql<br>xfs_growfs /mysql<br><br>This has worked hundreds of times.=A0 Twice, though, on Debian 6.x (I don't= =20 have enough 7.x boxes in production yet) I've had something happen with= =20 XFS.=A0 Once, after an extend, it was unmountable. I assumed this was an=20 error on my part, created the FS, and moved on. <br> <br>Today, I got an SQL error on a MySQL replication box:<br><br>=A0Error &= #39;The table 'XXXXX' is full' on query. Default database: XXXX= XYYYYYY<br><br>Normally this would be a configuration issue in MySQL related to a setting=20 called "innodb_data_file_path".=A0 Mine is configured correctly; = otherwise all of my templates would have died years ago.=A0 On this particular=20 host, I extended /mysql (the data volume) to 120G before reboot.=A0 Today, when it hit what appears to be the *original* size:<br> <br>/dev/mapper/vg0-mysql=A0=A0=A0=A0=A0=A0=A0=A0=A0<div dir=3D"ltr">=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0 125814784=A0 10473148 115341636=A0=A0 9% /mysql= <br><br>XFS threw allocation errors.<br><br>[4051547.986869] ffff8806382192= 00: 58 41 47 46 00 00 00 01 00 00 00 0c 00 05 00 00=A0 XAGF............<br> [4051547.987636] Filesystem "dm-2": XFS internal error xfs_alloc_= read_agf at line 2293 of file /build/buildd-linux-2.6_2.6.32-48squeeze1-amd= 64-qu4MIV/linux-2.6-2.6.32/debian/build/source_amd64_none/fs/xfs/xfs_alloc.= c.=A0 Caller 0xffffffffa021fcb0<br> [4051547.987639] <br>[4051547.988226] Pid: 3367, comm: mysqld Not tainted 2= .6.32-5-amd64 #1<br>[4051547.988228] Call Trace:<br>[4051547.988287]=A0 [&l= t;ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs]<br>[4051547.98= 8298]=A0 [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs]<br> [4051547.988307]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0x= a4 [xfs]<br>[4051547.988317]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read= _agf+0x22/0xa4 [xfs]<br>[4051547.988331]=A0 [<ffffffffa021fd45>] ? xf= s_alloc_pagf_init+0x13/0x34 [xfs]<br> [4051547.988342]=A0 [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x= 24/0x51 [xfs]<br>[4051547.988353]=A0 [<ffffffffa022c67d>] ? xfs_bmap_= btalloc+0x25f/0x732 [xfs]<br>[4051547.988368]=A0 [<ffffffffa0228b70>]= ? xfs_bmap_search_extents+0x57/0xd1 [xfs]<br> [4051547.988379]=A0 [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xf= s]<br>[4051547.988386]=A0 [<ffffffff8118eec3>] ? _atomic_dec_and_lock= +0x33/0x50<br>[4051547.988406]=A0 [<ffffffffa0257217>] ? xfs_trans_re= serve+0xc8/0x19d [xfs]<br> [4051547.988419]=A0 [<ffffffffa024a51f>] ? xfs_iomap_write_direct+0x3= 05/0x3f5 [xfs]<br>[4051547.988432]=A0 [<ffffffffa024a7bc>] ? xfs_ioma= p+0x1ad/0x285 [xfs]<br>[4051547.988444]=A0 [<ffffffffa025db53>] ? __x= fs_get_blocks+0x6c/0x15c [xfs]<br> [4051547.988450]=A0 [<ffffffff81062311>] ? queue_work_on+0x45/0x4f<br= >[4051547.988455]=A0 [<ffffffff8111442a>] ? __blockdev_direct_IO+0x57= 5/0xa60<br>[4051547.988461]=A0 [<ffffffff810482ef>] ? finish_task_swi= tch+0x3a/0xaf<br> [4051547.988472]=A0 [<ffffffffa025d983>] ? xfs_vm_direct_IO+0xd4/0x10= 2 [xfs]<br>[4051547.988483]=A0 [<ffffffffa025dc43>] ? xfs_get_blocks_= direct+0x0/0x11 [xfs]<br>[4051547.988494]=A0 [<ffffffffa025d791>] ? x= fs_end_io_direct+0x0/0x5f [xfs]<br> [4051547.988499]=A0 [<ffffffff810b55d6>] ? generic_file_direct_write+= 0xdd/0x152<br>[4051547.988510]=A0 [<ffffffffa0264532>] ? xfs_write+0x= 44f/0x6ea [xfs]<br>[4051547.988523]=A0 [<ffffffffa02442ca>] ? xfs_iun= lock+0x31/0x7c [xfs]<br> [4051547.988528]=A0 [<ffffffff810ef21e>] ? do_sync_write+0xce/0x113<b= r>[4051547.988532]=A0 [<ffffffff810652b2>] ? autoremove_wake_function= +0x0/0x2e<br>[4051547.988535]=A0 [<ffffffff810482ef>] ? finish_task_s= witch+0x3a/0xaf<br> [4051547.988538]=A0 [<ffffffff810efb70>] ? vfs_write+0xa9/0x102<br>[4= 051547.988541]=A0 [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77<br>[4= 051547.988545]=A0 [<ffffffff81010b42>] ? system_call_fastpath+0x16/0x= 1b<br> [4053278.621482] ffff880638219200: 58 41 47 46 00 00 00 01 00 00 00 0c 00 0= 5 00 00=A0 XAGF............<br>[4053278.621761] Filesystem "dm-2"= : XFS internal error xfs_alloc_read_agf at line 2293 of file /build/buildd-= linux-2.6_2.6.32-48squeeze1-amd64-qu4MIV/linux-2.6-2.6.32/debian/build/sour= ce_amd64_none/fs/xfs/xfs_alloc.c.=A0 Caller 0xffffffffa021fcb0<br> [4053278.621764] <br>[4053278.622352] Pid: 3367, comm: mysqld Not tainted 2= .6.32-5-amd64 #1<br>[4053278.622354] Call Trace:<br>[4053278.622381]=A0 [&l= t;ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs]<br>[4053278.62= 2392]=A0 [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs]<br> [4053278.622401]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0x= a4 [xfs]<br>[4053278.622411]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read= _agf+0x22/0xa4 [xfs]<br>[4053278.622421]=A0 [<ffffffffa021fd45>] ? xf= s_alloc_pagf_init+0x13/0x34 [xfs]<br> [4053278.622432]=A0 [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x= 24/0x51 [xfs]<br>[4053278.622442]=A0 [<ffffffffa022c67d>] ? xfs_bmap_= btalloc+0x25f/0x732 [xfs]<br>[4053278.622453]=A0 [<ffffffffa0228b70>]= ? xfs_bmap_search_extents+0x57/0xd1 [xfs]<br> [4053278.622465]=A0 [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xf= s]<br>[4053278.622486]=A0 [<ffffffff8118eec3>] ? _atomic_dec_and_lock= +0x33/0x50<br>[4053278.622501]=A0 [<ffffffffa0257217>] ? xfs_trans_re= serve+0xc8/0x19d [xfs]<br> [4053278.622514]=A0 [<ffffffffa024a51f>] ? xfs_iomap_write_direct+0x3= 05/0x3f5 [xfs]<br>[4053278.622527]=A0 [<ffffffffa024a7bc>] ? xfs_ioma= p+0x1ad/0x285 [xfs]<br>[4053278.622538]=A0 [<ffffffffa025db53>] ? __x= fs_get_blocks+0x6c/0x15c [xfs]<br> [4053278.622551]=A0 [<ffffffff8111442a>] ? __blockdev_direct_IO+0x575= /0xa60<br>[4053278.622563]=A0 [<ffffffffa025d983>] ? xfs_vm_direct_IO= +0xd4/0x102 [xfs]<br>[4053278.622574]=A0 [<ffffffffa025dc43>] ? xfs_g= et_blocks_direct+0x0/0x11 [xfs]<br> [4053278.622585]=A0 [<ffffffffa025d791>] ? xfs_end_io_direct+0x0/0x5f= [xfs]<br>[4053278.622593]=A0 [<ffffffff810b55d6>] ? generic_file_dir= ect_write+0xdd/0x152<br>[4053278.622605]=A0 [<ffffffffa0264532>] ? xf= s_write+0x44f/0x6ea [xfs]<br> [4053278.622618]=A0 [<ffffffffa02442ca>] ? xfs_iunlock+0x31/0x7c [xfs= ]<br>[4053278.622625]=A0 [<ffffffff810ef21e>] ? do_sync_write+0xce/0x= 113<br>[4053278.622637]=A0 [<ffffffff810652b2>] ? autoremove_wake_fun= ction+0x0/0x2e<br> [4053278.622646]=A0 [<ffffffff810482ef>] ? finish_task_switch+0x3a/0x= af<br>[4053278.622650]=A0 [<ffffffff810efb70>] ? vfs_write+0xa9/0x102= <br>[4053278.622652]=A0 [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77= <br> [4053278.622660]=A0 [<ffffffff81010b42>] ? system_call_fastpath+0x16/= 0x1b<br>[4055487.227132] ffff880638219200: 58 41 47 46 00 00 00 01 00 00 00= 0c 00 05 00 00=A0 XAGF............<br>[4055487.227678] Filesystem "dm= -2": XFS internal error xfs_alloc_read_agf at line 2293 of file /build= /buildd-linux-2.6_2.6.32-48squeeze1-amd64-qu4MIV/linux-2.6-2.6.32/debian/bu= ild/source_amd64_none/fs/xfs/xfs_alloc.c.=A0 Caller 0xffffffffa021fcb0<br> [4055487.227681] <br>[4055487.228267] Pid: 32572, comm: mysqld Not tainted = 2.6.32-5-amd64 #1<br>[4055487.228269] Call Trace:<br>[4055487.228292]=A0 [&= lt;ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0xa4 [xfs]<br>[4055487.2= 28302]=A0 [<ffffffffa021fc73>] ? xfs_read_agf+0x12e/0x149 [xfs]<br> [4055487.228311]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read_agf+0x22/0x= a4 [xfs]<br>[4055487.228321]=A0 [<ffffffffa021fcb0>] ? xfs_alloc_read= _agf+0x22/0xa4 [xfs]<br>[4055487.228330]=A0 [<ffffffffa021fd45>] ? xf= s_alloc_pagf_init+0x13/0x34 [xfs]<br> [4055487.228341]=A0 [<ffffffffa022c3f1>] ? xfs_inode_is_filestream+0x= 24/0x51 [xfs]<br>[4055487.228352]=A0 [<ffffffffa022c67d>] ? xfs_bmap_= btalloc+0x25f/0x732 [xfs]<br>[4055487.228363]=A0 [<ffffffffa0228b70>]= ? xfs_bmap_search_extents+0x57/0xd1 [xfs]<br> [4055487.228374]=A0 [<ffffffffa022ee83>] ? xfs_bmapi+0x876/0x104d [xf= s]<br>[4055487.228388]=A0 [<ffffffffa0257217>] ? xfs_trans_reserve+0x= c8/0x19d [xfs]<br>[4055487.228400]=A0 [<ffffffffa024a51f>] ? xfs_ioma= p_write_direct+0x305/0x3f5 [xfs]<br> [4055487.228413]=A0 [<ffffffffa024a7bc>] ? xfs_iomap+0x1ad/0x285 [xfs= ]<br>[4055487.228425]=A0 [<ffffffffa025db53>] ? __xfs_get_blocks+0x6c= /0x15c [xfs]<br>[4055487.228431]=A0 [<ffffffff8111442a>] ? __blockdev= _direct_IO+0x575/0xa60<br> [4055487.228442]=A0 [<ffffffffa025d983>] ? xfs_vm_direct_IO+0xd4/0x10= 2 [xfs]<br>[4055487.228453]=A0 [<ffffffffa025dc43>] ? xfs_get_blocks_= direct+0x0/0x11 [xfs]<br>[4055487.228464]=A0 [<ffffffffa025d791>] ? x= fs_end_io_direct+0x0/0x5f [xfs]<br> [4055487.228468]=A0 [<ffffffff810b55d6>] ? generic_file_direct_write+= 0xdd/0x152<br>[4055487.228479]=A0 [<ffffffffa0264532>] ? xfs_write+0x= 44f/0x6ea [xfs]<br>[4055487.228492]=A0 [<ffffffffa02442ca>] ? xfs_iun= lock+0x31/0x7c [xfs]<br> [4055487.228496]=A0 [<ffffffff810ef21e>] ? do_sync_write+0xce/0x113<b= r>[4055487.228500]=A0 [<ffffffff810652b2>] ? autoremove_wake_function= +0x0/0x2e<br>[4055487.228503]=A0 [<ffffffff810efb70>] ? vfs_write+0xa= 9/0x102<br> [4055487.228505]=A0 [<ffffffff810efc20>] ? sys_pwrite64+0x57/0x77<br>= [4055487.228509]=A0 [<ffffffff81010b42>] ? system_call_fastpath+0x16/= 0x1b<br><br>Throwing a dd at the FS works fine:<br><br>dd if=3D/dev/urandom= of=3D/mysql/data/somefile.out bs=3D1M count=3D512<br> <br>Two things might be going on here that are special<br><br>1) I'm=20 using a pretty customized MySQL configuration, including a setting=20 called O_DIRECT, which turns on direct IO for InnoDB flushes.=A0=20 Therefore, the code path for some InnoDB writes is going to be different from what dd does.<br> 2) This is SAN-backed storage; it shouldn't matter, but it does introdu= ce IO latency.<br><br><br>I've been trying to find a way to fix this "hot"; these are productio= n=20 systems.=A0 Luckily it was just a read-only replica. If this had happened= =20 to the master, there would probably have been data corruption (hence the sev 1 ticket).=A0 Couldn't find a hot fix, so I'm going to unmount= /repair and then reboot. I'll keep track of what happens so I can attach it to= =20 this report later if possible.<br> <br>Thanks!<br><br>Wes<br><br>-- System Information:<br>Debian Release: 6.0= .7<br>=A0 APT prefers oldstable-updates<br>=A0 APT policy: (500, 'oldst= able-updates'), (500, 'oldstable')<br>Architecture: amd64 (x86_= 64)<br> <br>Kernel: Linux 2.6.32-5-amd64 (SMP w/4 CPU cores)<br>Locale: LANG=3Den_U= S.UTF-8, LC_CTYPE=3Den_US.UTF-8 (charmap=3DUTF-8)<br>Shell: /bin/sh linked = to /bin/bash<br><br>Versions of packages xfsprogs depends on:<br>ii=A0 libb= lkid1=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 2.17.2-9= =A0=A0 block device id library<br> ii=A0 libc6=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 2.11.3-4=A0=A0 Embedded GNU C Library: Shared lib<br>ii=A0 librea= dline5=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 5.2-7=A0=A0=A0=A0= =A0 GNU readline and history libraries<br>ii=A0 libuuid1=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 2.17.2-9=A0=A0 Universally Un= ique ID library<br> <br>xfsprogs recommends no packages.<br><br>Versions of packages xfsprogs s= uggests:<br>pn=A0 acl=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0 <none>=A0=A0=A0=A0 (no description available= )<br>pn=A0 attr=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 <none>=A0=A0=A0=A0 (no description available)<br> pn=A0 quota=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0 <none>=A0=A0=A0=A0 (no description available)<br>pn=A0 xfsd= ump=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 <n= one>=A0=A0=A0=A0 (no description available)<br><br>-- no debconf informa= tion</div></div> --bcaec529a017064b8904dfe8f7d7-- ------------=_1401101837-4286-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 713994-done) by bugs.debian.org; 26 May 2014 10:54:36 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-12.9 required=4.0 tests=BAYES_00,FROMDEVELOPER, HAS_BUG_NUMBER,OUR_MTA_MSGID,PGPSIGNATURE,RCVD_IN_DNSWL_MED,T_RP_MATCHES_RCVD, VERSION autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 8; hammy, 151; neutral, 112; spammy, 0. spammytokens: hammytokens:0.000-+--H*c:pgp-sha512, 0.000-+--H*u:2014-03-12, 0.000-+--H*UA:2014-03-12, 0.000-+--H*u:1.5.23, 0.000-+--H*UA:1.5.23 Return-path: <anibal@master.debian.org> Received: from master.debian.org ([82.195.75.110]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=master.debian.org,EMAIL=hostmaster@master.debian.org (verified) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from <anibal@master.debian.org>) id 1WosY8-0000j8-Hz for 713994-done@bugs.debian.org; Mon, 26 May 2014 10:54:36 +0000 Received: from anibal by master.debian.org with local (Exim 4.80) (envelope-from <anibal@master.debian.org>) id 1WosY4-0005G9-W3 for 713994-done@bugs.debian.org; Mon, 26 May 2014 10:54:33 +0000 Date: Mon, 26 May 2014 20:54:28 +1000 From: =?iso-8859-1?Q?An=EDbal?= Monsalve Salazar <anibal@debian.org> To: 713994-done@bugs.debian.org Subject: Re: Bug#713994: XFS repair Message-ID: <20140526105428.GA1589@master.debian.org> References: <CAMjbrKp164a2CU2SPn94NGP+urwKUCtGz2vKyt6snSWaYdHebA@mail.gmail.com> <20130624224753.GW29338@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="T4sUOijqQbZv57TR" Content-Disposition: inline In-Reply-To: <20130624224753.GW29338@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: Anibal Monsalve Salazar <anibal@master.debian.org> --T4sUOijqQbZv57TR Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Version: 3.1.4 On Tue, 2013-06-25 08:47:53 +1000, Dave Chinner wrote: > On Mon, Jun 24, 2013 at 12:43:55PM -0400, Wes Deviers wrote: >> Update: >>=20 >> xfs_repair has fixed the problem: >>=20 >> root@ashdbtrk-s008-02:/home/wdeviers# xfs_check /dev/vg0/mysql >> agf_freeblks 327676, counted 655100 in ag 4 >> agf_longest 327676, counted 655100 in ag 4 >> block 12/1 expected type unknown got btbno >> block 12/4 expected type unknown got free2 >> ... >> block 12/45268 expected type unknown got free2 >> block 12/45269 expected type unknown got free2 >> block 12/45270 expected type unknown got free2 >> block 12/45271 expected type unknown got free2 >> block 12/45272 expected type unknown got free2 >> block 12/45273 expected type unknown got free2 >> block 12/45274 expected type unknown got free2 >> block 12/45275 expected type unknown got free2 >>=20 >> root@ashdbtrk-s008-02:/home/wdeviers# xfs_repair /dev/vg0/mysql >> Phase 1 - find and verify superblock... >> Phase 2 - using internal log >> - zero log... >> - scan filesystem freespace and inode maps... >> primary/secondary superblock 4 conflict - AG superblock geometry info >> conflicts with filesystem geometry >> bad sequence # 12 for agf 4 >> bad length 327680 for agf 4, should be 655104 >> bad sequence # 12 for agi 4 >> bad length # 327680 for agi 4, should be 655104 >> reset bad sb for ag 4 >> reset bad agf for ag 4 >> reset bad agi for ag 4 >> sb_fdblocks 28836636, counted 28509212 >=20 > The AG headers for AG #4 have been overwritten with header from a > different AG# (12 instead of 4) that has a different length (327680 > instead of 655104). The sequence number mismatch is why the runtime > errors are being thrown >=20 > However, the superblock for AG 4 has the wrong geometry and that's > indicative of it belonging to some other filesystem. i.e. a > misdirected write. I'd be taking a careful look at your storage, > because misdirected writes are evil and *extremely hard* to diagnose > without specialised equipment... >=20 > Anyway, you're running an old, old kernel (2.6.32-5-amd64) and > xfsprogs, so unless you can reproduce this reliably on a couple of > different types of hardware with a more recent kernel and xfsprogs, > we aren't really going to be able to do anything about your problem. >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com I'm closing this bug report after 11 months since Dave's response. Please feel free to reopen when you have the information requested by Dave. --T4sUOijqQbZv57TR Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBCgAGBQJTgx1jAAoJEHxWrP6UeJfYaeAQAMUjf8CyEIBL+o5+cvJw5oYF hpJD8HUlSn0j/4o3Ae18nkd1DOR/Nr+jdAEAHNC5+7/OBj87CKeJMvs6RkkIXZNU XpK9DzBx+wwPHHMye+HJ55nZF0t3+AtYbYxJSsqdCIqiDmyYrmNXW5K7jdlCSXtu JkMPugt1bt4O/OuYBbgot+tG4fTTcMetFeHQXQuvoQdLT/eTuZPky8M1JhuRDzIU kIdfdRJJQQtNnYAsex8vc19/TMThjU2CFBGj4FRDzl1eLhVTZKlrew/EB9vUwThp EeNTzej6cl6B0TT0TNwspeNtZI9+lrZC1qx/DHRTFFh3YwgAeHg+UcTpz15mkmf7 uqLlKxag6J1yE/kERp3a1vyf8up20PZQcAc7laSiBctu8RvJ/44DU64+IiBU+NzD hcuzDF7fjmj1JQqYwOaE5U+M2YTD2z4TR+fRwpNN8F4ZXQrZIVgRMnjjlLe67Iu+ oJCbB/eOYzv32bKuKJE6dkYJ2qlaWpkAsX+WKXJ1l8FlIxn9XgtZLStbVDkjPjiA QOBt6RfZcSjglIj8bOODm+XfkUK6dzjzoOFpC+3pUCP6plxCwlXlSi/VKyU9f3oF OoEYVqrqM3hJC4nwh4htE6TXAak7DzU/QOEQKE08LK4dRmWrsr99TZoSWknnR4dV UxpRlOQyEXgk/jzOHqBn =xJTH -----END PGP SIGNATURE----- --T4sUOijqQbZv57TR-- ------------=_1401101837-4286-0-- From penguin-kernel@i-love.sakura.ne.jp Mon May 26 06:45:58 2014 Return-Path: <penguin-kernel@i-love.sakura.ne.jp> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 000297F3F for <xfs@oss.sgi.com>; Mon, 26 May 2014 06:45:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D09508F8052 for <xfs@oss.sgi.com>; Mon, 26 May 2014 04:45:54 -0700 (PDT) X-ASG-Debug-ID: 1401104750-04bdf0599ffa990001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id K6Wxye0T4U4qQGA5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Mon, 26 May 2014 04:45:51 -0700 (PDT) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from www262.sakura.ne.jp (ksav55.sakura.ne.jp [219.94.192.135]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4QBjDTj075471; Mon, 26 May 2014 20:45:13 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) X-Nat-Received: from [202.181.97.72]:24791 [ident-empty] by smtp-proxy.isp with TPROXY id 1401104713.5618 Received: from CLAMP (KD175108057186.ppp-bb.dion.ne.jp [175.108.57.186]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id s4QBjDMs075468; Mon, 26 May 2014 20:45:13 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: Motohiro.Kosaki@us.fujitsu.com, david@fromorbit.com, riel@redhat.com Cc: kosaki.motohiro@jp.fujitsu.com, fengguang.wu@intel.com, kamezawa.hiroyu@jp.fujitsu.com, akpm@linux-foundation.org, hch@infradead.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] mm/vmscan: Do not block forever atshrink_inactive_list(). From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> X-ASG-Orig-Subj: Re: [PATCH] mm/vmscan: Do not block forever atshrink_inactive_list(). References: <20140520004449.GE18954@dastard> <20140519225915.3370328d.akpm@linux-foundation.org> <20140520063024.GH18954@dastard> <201405202358.ADF10119.SMOFOQLFtOVHJF@I-love.SAKURA.ne.jp> <6B2BA408B38BA1478B473C31C3D2074E31D59D8673@SV-EXCHANGE1.Corp.FC.LOCAL> In-Reply-To: <6B2BA408B38BA1478B473C31C3D2074E31D59D8673@SV-EXCHANGE1.Corp.FC.LOCAL> Message-Id: <201405262045.CDG95893.HLFFOSFMQOVOJt@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Mon, 26 May 2014 20:45:11 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 26052014 #8026966, status: clean X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1401104751 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.6131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Tetsuo Handa wrote: > Dave, if you are OK with this updated patch, please let me know commit ID of your patch. I overlooked that too_many_isolated() in mm/vmscan.c already has if (current_is_kswapd()) return 0; lines. Therefore, it turned out that my patch is irrelevant to XFS issue. Does patch shown below make sense? Regards. ---------- >From e133aadd65df3d8622efced3443888ed3e60327b Mon Sep 17 00:00:00 2001 From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Date: Mon, 26 May 2014 20:37:12 +0900 Subject: [PATCH] mm/vmscan: Do not throttle when hibernation_mode != 0. In shrink_inactive_list(), we do not insert delay at if (!sc->hibernation_mode && !current_is_kswapd()) wait_iff_congested(zone, BLK_RW_ASYNC, HZ/10); if sc->hibernation_mode != 0. Follow the same reason, we should not insert delay at while (unlikely(too_many_isolated(zone, file, sc))) { congestion_wait(BLK_RW_ASYNC, HZ/10); /* We are about to die and free our memory. Return now. */ if (fatal_signal_pending(current)) return SWAP_CLUSTER_MAX; } if sc->hibernation_mode != 0. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> --- mm/vmscan.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 32c661d..89c42ca 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1362,6 +1362,9 @@ static int too_many_isolated(struct zone *zone, int file, if (current_is_kswapd()) return 0; + if (sc->hibernation_mode) + return 0; + if (!global_reclaim(sc)) return 0; -- 1.7.1 From bfoster@redhat.com Mon May 26 08:30:11 2014 Return-Path: <bfoster@redhat.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 914437F3F for <xfs@oss.sgi.com>; Mon, 26 May 2014 08:30:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7238F8F8050 for <xfs@oss.sgi.com>; Mon, 26 May 2014 06:30:08 -0700 (PDT) X-ASG-Debug-ID: 1401111003-04cb6c22b6fdfb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mwiqoHaNoKvTTjtF for <xfs@oss.sgi.com>; Mon, 26 May 2014 06:30:04 -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 (8.14.4/8.14.4) with ESMTP id s4QDTu1k002870 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 26 May 2014 09:29:56 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4QDTuSJ030425; Mon, 26 May 2014 09:29:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0E73D1248A9; Mon, 26 May 2014 09:29:55 -0400 (EDT) Date: Mon, 26 May 2014 09:29:55 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/16] xfs: introduce directory geometry structure Message-ID: <20140526132954.GA61135@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/16] xfs: introduce directory geometry structure References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-2-git-send-email-david@fromorbit.com> <20140523190459.GB8343@laptop.bfoster> <20140526042807.GW8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526042807.GW8554@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401111004 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, May 26, 2014 at 02:28:07PM +1000, Dave Chinner wrote: > On Fri, May 23, 2014 at 03:04:59PM -0400, Brian Foster wrote: > > On Fri, May 23, 2014 at 10:03:37AM +1000, Dave Chinner wrote: > > > From: Dave Chinner <dchinner@redhat.com> > > > > > > The directory code has a dependency on the struct xfs_mount to > > > supply the directory block geometry. Block size, block log size, > > > and other parameters are pre-caclulated in the struct xfs_mount or > > > access directly from the superblock embedded in the struct > > > xfs_mount. > > > > > > Extract all of this geometry information out of the struct xfs_mount > > > and superblock and place it into a new struct xfs_da_geometry > > > defined by the directory code. Allocate and initialise it at mount > > > time, and attach it to the struct xfs_mount so it canbe passed back > > > into the directory code appropriately rather than using the struct > > > xfs_mount. > > > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > .... > > > @@ -99,24 +100,56 @@ xfs_dir_mount( > > > mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); > > > mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); > > > > > > - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); > > > - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; > > > - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); > > > - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); > > > - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); > > > - > > > nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; > > > - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / > > > + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > > + KM_SLEEP | KM_MAYFAIL); > > > + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > > + KM_SLEEP | KM_MAYFAIL); > > > + if (!mp->m_dir_geo || !mp->m_attr_geo) { > > > + kmem_free(mp->m_dir_geo); > > > + kmem_free(mp->m_attr_geo); > > > + return ENOMEM; > > > + } > > > > While it looks like everything is handled correctly here, I think this > > would be much cleaner if we just created a set of xfs_mount_alloc/free() > > helpers that did all of the allocations at once. Then we wouldn't have a > > situation where the caller has non-obvious memory allocations to clean > > up should it fail sometime after calling xfs_da_mount(). > > I think that each subsystem needs to have it's own init/teardown > functions, and that the rest of the code needs to call them > appropriately. Yes, error handling can be non-trivial, but the idea > that we do unconditional allocation for subsystems/configs that we > may not use (eg. due to mkfs options) seems a little wrong to me. > > And aggregating all the allocations doesn't remove the need for most > subsystems to be able to return initialisation errors, so int he > long run it doesn't really change the fact that we have to > initialise and then tear down on subsequent subsystem init > failures... > Part of the reason I suggested that approach was that the allocation appeared unconditional. Now that I think about it, a related question is why not embed the structers into the mount? No matter, perhaps there is good reason for that. If we do want to keep it localized to the subsystem, creating an xfs_da_unmount() (perhaps just an inline) would be cleaner and more consistent IMO. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon May 26 16:39:49 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DBE707F51 for <xfs@oss.sgi.com>; Mon, 26 May 2014 16:39:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BC945304032 for <xfs@oss.sgi.com>; Mon, 26 May 2014 14:39:46 -0700 (PDT) X-ASG-Debug-ID: 1401140383-04cb6c22b81285c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8CU4TBxlloNpxvFX for <xfs@oss.sgi.com>; Mon, 26 May 2014 14:39: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: AqsGAAa0g1N5LL1s/2dsb2JhbABZgweDQ6dkAQEBAQEBBpgMAYEWF3SCJQEBBAEnExwjBQsIAw4HAwklDwUlAyETiDoH1QsXFoU/iH0HhEAEmXKTKINKKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 07:09:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp2cE-0001FX-1g; Tue, 27 May 2014 07:39:30 +1000 Date: Tue, 27 May 2014 07:39:30 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/16] xfs: introduce directory geometry structure Message-ID: <20140526213929.GO18954@dastard> X-ASG-Orig-Subj: Re: [PATCH 01/16] xfs: introduce directory geometry structure References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-2-git-send-email-david@fromorbit.com> <20140523190459.GB8343@laptop.bfoster> <20140526042807.GW8554@dastard> <20140526132954.GA61135@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526132954.GA61135@bfoster.bfoster> 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: 1401140384 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.6140 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, May 26, 2014 at 09:29:55AM -0400, Brian Foster wrote: > On Mon, May 26, 2014 at 02:28:07PM +1000, Dave Chinner wrote: > > On Fri, May 23, 2014 at 03:04:59PM -0400, Brian Foster wrote: > > > On Fri, May 23, 2014 at 10:03:37AM +1000, Dave Chinner wrote: > > > > From: Dave Chinner <dchinner@redhat.com> > > > > > > > > The directory code has a dependency on the struct xfs_mount to > > > > supply the directory block geometry. Block size, block log size, > > > > and other parameters are pre-caclulated in the struct xfs_mount or > > > > access directly from the superblock embedded in the struct > > > > xfs_mount. > > > > > > > > Extract all of this geometry information out of the struct xfs_mount > > > > and superblock and place it into a new struct xfs_da_geometry > > > > defined by the directory code. Allocate and initialise it at mount > > > > time, and attach it to the struct xfs_mount so it canbe passed back > > > > into the directory code appropriately rather than using the struct > > > > xfs_mount. > > > > > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > .... > > > > @@ -99,24 +100,56 @@ xfs_dir_mount( > > > > mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); > > > > mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); > > > > > > > > - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); > > > > - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; > > > > - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); > > > > - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); > > > > - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); > > > > - > > > > nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; > > > > - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / > > > > + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > > > + KM_SLEEP | KM_MAYFAIL); > > > > + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > > > > + KM_SLEEP | KM_MAYFAIL); > > > > + if (!mp->m_dir_geo || !mp->m_attr_geo) { > > > > + kmem_free(mp->m_dir_geo); > > > > + kmem_free(mp->m_attr_geo); > > > > + return ENOMEM; > > > > + } > > > > > > While it looks like everything is handled correctly here, I think this > > > would be much cleaner if we just created a set of xfs_mount_alloc/free() > > > helpers that did all of the allocations at once. Then we wouldn't have a > > > situation where the caller has non-obvious memory allocations to clean > > > up should it fail sometime after calling xfs_da_mount(). > > > > I think that each subsystem needs to have it's own init/teardown > > functions, and that the rest of the code needs to call them > > appropriately. Yes, error handling can be non-trivial, but the idea > > that we do unconditional allocation for subsystems/configs that we > > may not use (eg. due to mkfs options) seems a little wrong to me. > > > > And aggregating all the allocations doesn't remove the need for most > > subsystems to be able to return initialisation errors, so int he > > long run it doesn't really change the fact that we have to > > initialise and then tear down on subsequent subsystem init > > failures... > > > > Part of the reason I suggested that approach was that the allocation > appeared unconditional. Now that I think about it, a related question is > why not embed the structers into the mount? The exact reason I wrote the patchset in the first place - dependencies. If it gets embedded into the struct xfs_mount, there's now a dependency between the header files, and a circular one at that (xfs_mount requires xfs_da_btree.h, xfs_da_btree.h requires xfs_mount.h). By using allocations and forward declarations of the structure we remove dependencies between the header files... > No matter, perhaps there is good reason for that. If we do want to keep > it localized to the subsystem, creating an xfs_da_unmount() (perhaps > just an inline) would be cleaner and more consistent IMO. *nod* I can add that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon May 26 17:27:17 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 384FB7F4E for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:27:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27D1A304032 for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27:16 -0700 (PDT) X-ASG-Debug-ID: 1401143233-04cb6c22b612b410002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XLU3wp3MosQk7eLI for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27: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: Ao0GAJ2+g1N5LL1s/2dsb2JhbABZgwerJwEBAQEBAQaZJBd0giUBAQUnLzMIGDEhGAMbGYguAxDOcg2GMYVVhmeCM4QqBJd9jQ2CHoVyg0orgTIk Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 07:57:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wp3MA-0001PT-Bq for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wp3MA-0002VF-B7 for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: xfs_readsb needs to check for magic numbers Date: Tue, 27 May 2014 08:26:54 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: xfs_readsb needs to check for magic numbers Message-Id: <1401143214-9181-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401143214-9181-1-git-send-email-david@fromorbit.com> References: <1401143214-9181-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1401143235 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.6141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Commit daba542 ("xfs: skip verification on initial "guess" superblock read") dropped the use of a verifier for the initial superblock read so we can probe the sector size of the filesystem stored in the superblock. It, however, now fails to validate that what was read initially is actually an XFS superblock and hence will fail the sector size check and return ENOSYS. This causes probe-based mounts to fail because it expects XFS to return EINVAL when it doesn't recognise the superblock format. cc: <stable@vger.kernel.org> Reported-by: Plamen Petrov <plamen.sisi@gmail.com> Tested-by: Plamen Petrov <plamen.sisi@gmail.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_mount.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3f09782..fa8a420 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -323,8 +323,19 @@ reread: /* * Initialize the mount structure from the superblock. */ - xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp)); - xfs_sb_quota_from_disk(&mp->m_sb); + xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); + xfs_sb_quota_from_disk(sbp); + + /* + * If we haven't validated the superblock, do so now before we try + * to check the sector size and reread the superblock appropriately. + */ + if (sbp->sb_magicnum != XFS_SB_MAGIC) { + if (loud) + xfs_warn(mp, "Invalid superblock magic number"); + error = EINVAL; + goto release_buf; + } /* * We must be able to do sector-sized and sector-aligned IO. @@ -337,11 +348,11 @@ reread: goto release_buf; } - /* - * Re-read the superblock so the buffer is correctly sized, - * and properly verified. - */ if (buf_ops == NULL) { + /* + * Re-read the superblock so the buffer is correctly sized, + * and properly verified. + */ xfs_buf_relse(bp); sector_size = sbp->sb_sectsize; buf_ops = loud ? &xfs_sb_buf_ops : &xfs_sb_quiet_buf_ops; -- 1.9.0 From dave@fromorbit.com Mon May 26 17:27:19 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2624B7F54 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:27:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 151B0304032 for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27:15 -0700 (PDT) X-ASG-Debug-ID: 1401143233-04cb6c22b612b410001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id V0YcU2WGxYD3QNVx for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27:14 -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: AoIGAJ2+g1N5LL1s/2dsb2JhbABZgwerJwEBAQEBB5kkF3SDAjuBAgOIdaAFtSuFVYVuAYMrhCoErRqBQYIJKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 07:57:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wp3MA-0001PR-BE for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wp3MA-0002V7-AG for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: regression fixes Date: Tue, 27 May 2014 08:26:52 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: regression fixes Message-Id: <1401143214-9181-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1401143233 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.6141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, These are a couple of fixes that have come to light in the past few days. The first prevents bad things happening in memory reclaim when kswapd delegates block allocation to a workqueue, and the second ensures XFS doesn't incorrectly try to check the sector size on non-xfs devices when mount is probing. Both are regressions, but given how late in the 3.15 cycle we are, I'll probably just push these through the 3.16 merge to give them a bit more testing and let them be handled by stable kernel backports. Anyone have any particular concerns over that plan? Cheers, Dave. From dave@fromorbit.com Mon May 26 17:27:24 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E8197F58 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:27:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 34F30AC003 for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27:21 -0700 (PDT) X-ASG-Debug-ID: 1401143235-04bdf059a01335b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id j5oCvnha6XJkpJ3S for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:27: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: Ao0GAJ2+g1N5LL1s/2dsb2JhbABZgwerJwEBAQEBAQaZJBd0giUBAQUnLzMIGDE5AxsZiEHVMIVVjUQErRqDSiuBMCQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 07:57:13 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1Wp3MA-0001PS-BV for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1Wp3MA-0002VA-Ao for xfs@oss.sgi.com; Tue, 27 May 2014 08:26:58 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: block allocation work needs to be kswapd aware Date: Tue, 27 May 2014 08:26:53 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: block allocation work needs to be kswapd aware Message-Id: <1401143214-9181-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401143214-9181-1-git-send-email-david@fromorbit.com> References: <1401143214-9181-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1401143235 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: 1.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SARE_STILLSINGLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.66 SARE_STILLSINGLE BODY: Contains phrasing used by spammers From: Dave Chinner <dchinner@redhat.com> Upon memory pressure, kswapd calls xfs_vm_writepage() from shrink_page_list(). This can result in delayed allocation occurring and that gets deferred to the the allocation workqueue. The allocation then runs outside kswapd context, which means if it needs memory (and it does to demand page metadata from disk) it can block in shrink_inactive_list() waiting for IO congestion. These blocking waits are normally avoiding in kswapd context, so under memory pressure writeback from kswapd can be arbitrarily delayed by memory reclaim. To avoid this, pass the kswapd context to the allocation being done by the workqueue, so that memory reclaim understands correctly that the work is being done for kswapd and therefore it is not blocked and does not delay memory reclaim. To avoid issues with int->char conversion of flag fields (as noticed in v1 of this patch) convert the flag fields in the struct xfs_bmalloca to bool types. pahole indicates these variables are still single byte variables, so no extra space is consumed by this change. cc: <stable@vger.kernel.org> Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_bmap_util.c | 16 +++++++++++++--- fs/xfs/xfs_bmap_util.h | 13 +++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 057f671..703b3ec 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -258,14 +258,23 @@ xfs_bmapi_allocate_worker( struct xfs_bmalloca *args = container_of(work, struct xfs_bmalloca, work); unsigned long pflags; + unsigned long new_pflags = PF_FSTRANS; - /* we are in a transaction context here */ - current_set_flags_nested(&pflags, PF_FSTRANS); + /* + * we are in a transaction context here, but may also be doing work + * in kswapd context, and hence we may need to inherit that state + * temporarily to ensure that we don't block waiting for memory reclaim + * in any way. + */ + if (args->kswapd) + new_pflags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; + + current_set_flags_nested(&pflags, new_pflags); args->result = __xfs_bmapi_allocate(args); complete(args->done); - current_restore_flags_nested(&pflags, PF_FSTRANS); + current_restore_flags_nested(&pflags, new_pflags); } /* @@ -284,6 +293,7 @@ xfs_bmapi_allocate( args->done = &done; + args->kswapd = current_is_kswapd(); INIT_WORK_ONSTACK(&args->work, xfs_bmapi_allocate_worker); queue_work(xfs_alloc_wq, &args->work); wait_for_completion(&done); diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..075f722 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -50,12 +50,13 @@ struct xfs_bmalloca { xfs_extlen_t total; /* total blocks needed for xaction */ xfs_extlen_t minlen; /* minimum allocation size (blocks) */ xfs_extlen_t minleft; /* amount must be left after alloc */ - char eof; /* set if allocating past last extent */ - char wasdel; /* replacing a delayed allocation */ - char userdata;/* set if is user data */ - char aeof; /* allocated space at eof */ - char conv; /* overwriting unwritten extents */ - char stack_switch; + bool eof; /* set if allocating past last extent */ + bool wasdel; /* replacing a delayed allocation */ + bool userdata;/* set if is user data */ + bool aeof; /* allocated space at eof */ + bool conv; /* overwriting unwritten extents */ + bool stack_switch; + bool kswapd; /* allocation in kswapd context */ int flags; struct completion *done; struct work_struct work; -- 1.9.0 From david@fromorbit.com Mon May 26 17:40:55 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C32B829DF8 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:40:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68DBCAC00A for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:40:55 -0700 (PDT) X-ASG-Debug-ID: 1401144047-04bdf059a11343b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id IlMBr9Jnoe0Ea3Ar for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:40: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: AsUGAEjCg1N5LL1s/2dsb2JhbABZgwdSgnGnWQsBAQEBAQEGmAwBgRcXdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4hBDtUoFoU/hwOBegeEQASZcpMog0orLw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 08:10:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp3ZJ-0001Rb-TY; Tue, 27 May 2014 08:40:33 +1000 Date: Tue, 27 May 2014 08:40:33 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 00/20] xfsprogs: introduce the free inode btree Message-ID: <20140526224033.GP18954@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 00/20] xfsprogs: introduce the free inode btree References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1399465319-65066-1-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: 1401144047 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.6142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, May 07, 2014 at 08:21:39AM -0400, Brian Foster wrote: > Hi all, > > Here's v4 of the finobt series for xfsprogs. Patches 1-10 are unchanged > as they are based on the corresponding kernel patches, which have now > been merged. > > v4 includes some fairly isolated fixes for mkfs and repair based on > review feedback for v3: > > http://oss.sgi.com/archives/xfs/2014-04/msg00239.html > > Some concern was raised over xfs_repair performance based on the > implementation of patch 17 in v3, so I have run a few repair tests on > largish filesystems. Tests involved creating a large number of inodes on > a 1TB 4xraid0, freeing a random percentage to populate the finobt and > running xfs_repair (e.g., no actual corruptions). xfs_repair was run > normally (with these patches) and with a change to skip the finobt > processing via an xfs_sb_version_hasfinobt() hack. The tests were run on > a 16xcpu, 32GB RAM server. I still have some concerns about this simply based on the algorithm and that it will come back an bite us eventually, but for the moment I think you've done enough to show that it's not going to an immediate issue. I haven't seen anything else that needs fixing or causes problems, so I'm going to merge it for 3.2.1. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 17:49:37 2014 Return-Path: <david@fromorbit.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 A226029DF8 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:49:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 763CF8F8059 for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:49:37 -0700 (PDT) X-ASG-Debug-ID: 1401144574-04bdf059a1134cc0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4YJAah0BcZna1foE for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:49:35 -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: AqsGAKTEg1N5LL1s/2dsb2JhbABPCoMHg0OnZAEBAQEBAQaYDAGBFxd0giUBAQUnExwjEAgDDgoJJQ8FJQMhE4hB1SAXFoU/iBkIXAeEQASZcosYiBCDSiuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 08:19:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp3hp-0001SX-Qu; Tue, 27 May 2014 08:49:21 +1000 Date: Tue, 27 May 2014 08:49:21 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140526224921.GQ18954@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400845950-41435-2-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: 1401144574 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.6142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 07:52:28AM -0400, Brian Foster wrote: > The scan owner field represents an optional inode number that is > responsible for the current scan. The purpose is to identify that an > inode is under iolock and as such, the iolock shouldn't be attempted > when trimming eofblocks. This is an internal only field. > > Signed-off-by: Brian Foster <bfoster@redhat.com> > --- > fs/xfs/xfs_icache.c | 12 +++++++++++- > fs/xfs/xfs_icache.h | 2 ++ > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index c48df5f..f4191f6 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -1211,6 +1211,7 @@ xfs_inode_free_eofblocks( > { > int ret; > struct xfs_eofblocks *eofb = args; > + bool need_iolock = true; > > if (!xfs_can_free_eofblocks(ip, false)) { > /* inode could be preallocated or append-only */ > @@ -1235,9 +1236,18 @@ xfs_inode_free_eofblocks( > if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && > XFS_ISIZE(ip) < eofb->eof_min_file_size) > return 0; > + > + /* > + * A scan owner implies we already hold the iolock. Skip it in > + * xfs_free_eofblocks() to avoid deadlock. This also eliminates > + * the possibility of EAGAIN being returned. > + */ > + if (eofb->eof_scan_owner != NULLFSINO && > + eofb->eof_scan_owner == ip->i_ino) > + need_iolock = false; No need to check against NULLFSINO there. ip->i_ino can never be NULLFSINO, so just checking eofb->eof_scan_owner == ip->i_ino is sufficient. What might be an idea is adding a ASSERT(eofb->eof_scan_owner != 0); to the start of the function to catch anyone who does not initialise it appropriately. The inode number can never be zero (that would translate to block 0 - the primary superblock) and so this woul dbe sufficient to ensure callers are doing the right thing.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 17:58:12 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ED6927F50 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:58:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90FADAC003 for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:58:11 -0700 (PDT) X-ASG-Debug-ID: 1401145088-04bdf059a1135610001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 93ScLkeH5P28GKZh for <xfs@oss.sgi.com>; Mon, 26 May 2014 15:58: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: AqsGAJzFg1N5LL1s/2dsb2JhbABZgweDQ6dkAQEBAQEBBpgMAYEXF3SCJQEBBScTHCMQCAMOCgklDwUlAyETiEHVIBcWhT+IJgpNB4RABJlykyiDSiuBMQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 08:28:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp3q7-0001Tc-F0; Tue, 27 May 2014 08:57:55 +1000 Date: Tue, 27 May 2014 08:57:55 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140526225755.GR18954@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400845950-41435-3-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: 1401145088 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.6142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 07:52:29AM -0400, Brian Foster wrote: > Speculative preallocation and and the associated throttling metrics > assume we're working with large files on large filesystems. Users have > reported inefficiencies in these mechanisms when we happen to be dealing > with large files on smaller filesystems. This can occur because while > prealloc throttling is aggressive under low free space conditions, it is > not active until we reach 5% free space or less. > > For example, a 40GB filesystem has enough space for several files large > enough to have multi-GB preallocations at any given time. If those files > are slow growing, they might reserve preallocation for long periods of > time as well as avoid the background scanner due to frequent > modification. If a new file is written under these conditions, said file > has no access to this already reserved space and premature ENOSPC is > imminent. > > To handle this scenario, modify the buffered write ENOSPC handling and > retry sequence to invoke an eofblocks scan. In the smaller filesystem > scenario, the eofblocks scan resets the usage of preallocation such that > when the 5% free space threshold is met, throttling effectively takes > over to provide fair and efficient preallocation until legitimate > ENOSPC. > > The eofblocks scan is selective based on the nature of the failure. For > example, an EDQUOT failure in a particular quota will use a filtered > scan for that quota. Because we don't know which quota might have caused > an allocation failure at any given time, we run a scan against each > applicable quota determined to be under low free space conditions. > > Signed-off-by: Brian Foster <bfoster@redhat.com> > --- > fs/xfs/xfs_dquot.h | 15 +++++++++++++++ > fs/xfs/xfs_file.c | 23 +++++++++++++++++++---- > fs/xfs/xfs_icache.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_icache.h | 1 + > 4 files changed, 82 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h > index 68a68f7..c24c67e 100644 > --- a/fs/xfs/xfs_dquot.h > +++ b/fs/xfs/xfs_dquot.h > @@ -139,6 +139,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) > } > } > > +/* > + * Check whether a dquot is under low free space conditions. We assume the quota > + * is enabled and enforced. > + */ > +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) > +{ > + int64_t freesp; > + > + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; > + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) > + return true; > + > + return false; > +} > + > #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) > #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) > #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1b8160d..2e0e73b 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -38,6 +38,7 @@ > #include "xfs_trace.h" > #include "xfs_log.h" > #include "xfs_dinode.h" > +#include "xfs_icache.h" > > #include <linux/aio.h> > #include <linux/dcache.h> > @@ -741,14 +742,28 @@ write_retry: > ret = generic_perform_write(file, &from, pos); > if (likely(ret >= 0)) > iocb->ki_pos = pos + ret; > + > /* > - * If we just got an ENOSPC, try to write back all dirty inodes to > - * convert delalloc space to free up some of the excess reserved > - * metadata space. > + * If we hit a space limit, try to free up some lingering preallocated > + * space before returning an error. In the case of ENOSPC, first try to > + * write back all dirty inodes to free up some of the excess reserved > + * metadata space. This reduces the chances that the eofblocks scan > + * waits on dirty mappings. Since xfs_flush_inodes() is serialized, this > + * also behaves as a filter to prevent too many eofblocks scans from > + * running at the same time. > */ > - if (ret == -ENOSPC && !enospc) { > + if (ret == -EDQUOT && !enospc) { > + enospc = xfs_inode_free_quota_eofblocks(ip); > + if (enospc) > + goto write_retry; > + } else if (ret == -ENOSPC && !enospc) { > + struct xfs_eofblocks eofb = {0}; > + > enospc = 1; > xfs_flush_inodes(ip->i_mount); > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > goto write_retry; > } > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index f4191f6..3cceb1b 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -33,6 +33,9 @@ > #include "xfs_trace.h" > #include "xfs_icache.h" > #include "xfs_bmap_util.h" > +#include "xfs_quota.h" > +#include "xfs_dquot_item.h" > +#include "xfs_dquot.h" > > #include <linux/kthread.h> > #include <linux/freezer.h> > @@ -1270,6 +1273,50 @@ xfs_icache_free_eofblocks( > eofb, XFS_ICI_EOFBLOCKS_TAG); > } > > +/* > + * Run eofblocks scans on the quotas applicable to the inode. For inodes with > + * multiple quotas, we don't know exactly which quota caused an allocation > + * failure. We make a best effort by running scans for each quota considered > + * to be under low free space conditions (less than 1% available free space). > + */ > +int > +xfs_inode_free_quota_eofblocks( > + struct xfs_inode *ip) > +{ > + int scanned = 0; > + struct xfs_eofblocks eofb = {0,}; > + struct xfs_dquot *dq; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + > + /* set the scan owner to avoid potential livelock */ > + eofb.eof_scan_owner = ip->i_ino; > + > + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { > + dq = xfs_inode_dquot(ip, XFS_DQ_USER); > + if (dq && xfs_dquot_lowsp(dq)) { > + eofb.eof_uid = VFS_I(ip)->i_uid; > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > + XFS_EOF_FLAGS_UID; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + } > + } > + > + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { > + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); > + if (dq && xfs_dquot_lowsp(dq)) { > + eofb.eof_gid = VFS_I(ip)->i_gid; > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > + XFS_EOF_FLAGS_GID; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + } > + } Rather that doing two scans here, wouldn't it be more efficient to do: eofb.eof_flags = XFS_EOF_FLAGS_SYNC; scan = false; if (uquota is low) { eofb.eof_uid = VFS_I(ip)->i_uid; eofb.eof_flags |= XFS_EOF_FLAGS_UID; scan = true; } if (gquota is low) { eofb.eof_gid = VFS_I(ip)->i_gid; eofb.eof_flags |= XFS_EOF_FLAGS_GID; scan = true; } if (scan) xfs_icache_free_eofblocks(ip->i_mount, &eofb); and change xfs_inode_match_id() to be able to check against multiple flags on a single inode? That way we only scan the inode cache once, regardless of the number of quota types that are enabled and are tracking low space thresholds. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 18:01:17 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71C077F4E for <xfs@oss.sgi.com>; Mon, 26 May 2014 18:01:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62496304032 for <xfs@oss.sgi.com>; Mon, 26 May 2014 16:01:14 -0700 (PDT) X-ASG-Debug-ID: 1401145272-04cb6c22b712d580001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id zHYWvoqqEq2retRn for <xfs@oss.sgi.com>; Mon, 26 May 2014 16:01:12 -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: AqsGAPrGg1N5LL1s/2dsb2JhbABZgweDQ6dkAQEBAQEBBpgMAYEXF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQdUiFxaFP4gwTQeEQASZcpMog0orgTE Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 08:31:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp3t5-0001Uf-88; Tue, 27 May 2014 09:00:59 +1000 Date: Tue, 27 May 2014 09:00:59 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 3/3] xfs: squash prealloc while over quota free space as well Message-ID: <20140526230059.GS18954@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs: squash prealloc while over quota free space as well References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400845950-41435-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: 1401145272 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.6142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, May 23, 2014 at 07:52:30AM -0400, Brian Foster wrote: > Commit 4d559a3b introduced heavy prealloc. squashing to catch the case > of requesting too large a prealloc on smaller filesystems, leading to > repeated flush and retry cycles that occur on ENOSPC. Now that we issue > eofblocks scans on EDQUOT/ENOSPC, squash the prealloc against the > minimum available free space across all applicable quotas as well to > avoid a similar problem of repeated eofblocks scans. > > Signed-off-by: Brian Foster <bfoster@redhat.com> Good idea - thrashing is something worth avoiding.... Reviewed-by: Dave Chinner <dchinner@redhat.com> -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 19:34:43 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 856B57F4E for <xfs@oss.sgi.com>; Mon, 26 May 2014 19:34:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C8B3304032 for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:34:40 -0700 (PDT) X-ASG-Debug-ID: 1401150877-04cb6c22b7132940001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id BxAw5q7MPAsMAbfK for <xfs@oss.sgi.com>; Mon, 26 May 2014 17:34:38 -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: AskGAELdg1N5LL1s/2dsb2JhbABZgwcfM4Jxp1kLAQEBAQEBBpBSiEcXdIJmHDskDCgFJQM0iEGgCrUtFoU/iQ4Mgh4PRIE5BJlykyiBQYIJKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 10:04:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp5L4-0001iN-Iw for xfs@oss.sgi.com; Tue, 27 May 2014 10:33:58 +1000 Date: Tue, 27 May 2014 10:33:58 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 03e956b Message-ID: <20140527003358.GT18954@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 03e956b MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1401150877 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.6143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 03e956b db: add finobt support to metadump New Commits: Brian Foster (20): [70eb733] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers [dad1321] xfs: reserve v5 superblock read-only compat. feature bit for finobt [c0a4c22] xfs: support the XFS_BTNUM_FINOBT free inode btree type [0f88d64] xfs: update inode allocation/free transaction reservations for finobt [3c69927] xfs: insert newly allocated inode chunks into the finobt [88fc730] xfs: use and update the finobt on inode allocation [eb9a297] xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper [1bb93fd] xfs: update the finobt on inode free [608dff0] xfs: report finobt status in fs geometry [a9f4ba9] xfs: enable the finobt feature on v5 superblocks [f49c4e8] mkfs: finobt mkfs support [2a0cd7a] db: finobt support [7b37090] repair: account for finobt in ag 0 geometry pre-calculation [1578050] repair: phase 2 finobt scan [bb26606] repair: pass btree block magic as param to build_ino_tree() [d6412d1] repair: pull the build_agi() call up out of the inode tree build [01159bd] repair: helpers for finding in-core inode records w/ free inodes [bbdb21b] repair: reconstruct the finobt in phase 5 [0506438] growfs: report finobt status in fs geometry (xfs_info) [03e956b] db: add finobt support to metadump Code Diffstat: db/agi.c | 2 + db/btblock.c | 12 + db/metadump.c | 25 +- growfs/xfs_growfs.c | 14 +- include/xfs_ag.h | 32 ++- include/xfs_btree.h | 3 + include/xfs_format.h | 14 +- include/xfs_fs.h | 1 + include/xfs_ialloc_btree.h | 3 +- include/xfs_sb.h | 10 +- include/xfs_trans_space.h | 7 +- include/xfs_types.h | 2 +- libxfs/xfs_btree.c | 6 +- libxfs/xfs_ialloc.c | 617 ++++++++++++++++++++++++++++++++++++++------- libxfs/xfs_ialloc_btree.c | 68 ++++- libxfs/xfs_trans_resv.c | 47 +++- mkfs/xfs_mkfs.c | 93 +++++-- repair/incore.h | 27 ++ repair/phase5.c | 109 ++++++-- repair/scan.c | 251 +++++++++++++++++- repair/xfs_repair.c | 10 +- 21 files changed, 1171 insertions(+), 182 deletions(-) -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 20:42:37 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC3B27F4E for <xfs@oss.sgi.com>; Mon, 26 May 2014 20:42:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63711AC002 for <xfs@oss.sgi.com>; Mon, 26 May 2014 18:42:36 -0700 (PDT) X-ASG-Debug-ID: 1401154949-04cb6c22b51367d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id z3fXzMsV6uiO2OvB for <xfs@oss.sgi.com>; Mon, 26 May 2014 18:42:30 -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: AqsGAIDsg1N5LL1s/2dsb2JhbABZgweDQ6dkAQEBAQEBBpgMAYEMF3SCJQEBBTocIxAIAw4KCSUPBSUDIROIQdUoFxaFP4h9B4MrgRUEjz+KM5Mog0or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 11:12:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp6P9-0001sx-Fk; Tue, 27 May 2014 11:42:15 +1000 Date: Tue, 27 May 2014 11:42:15 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC Message-ID: <20140527014215.GA6677@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC References: <1400849911-46606-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400849911-46606-1-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: 1401154949 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.6144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 08:58:31AM -0400, Brian Foster wrote: > XFS can allocate significant amounts of space to files via speculative > preallocation. Such preallocation may not be reclaimed automatically on > file close() if a file is repeatedly opened and extended. For smaller > filesystems with relatively large and slow growing files, this > preallocation can linger for some time, including contributing to out of > space conditions. > > Create a situation where an fs is near out of space while several files > still have lingering, significant preallocations. Verify that new > writers reclaim the preallocated space rather than return ENOSPC. > > Signed-off-by: Brian Foster <bfoster@redhat.com> > --- > > Hi all, > > This test is associated with the recently posted eofblocks scan on > ENOSPC series. It currently fails and should pass with the > aforementioned patches applied. Thanks. > > Brian > > tests/xfs/014 | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/014.out | 95 ++++++++++++++++++++++++++++++++++++ > tests/xfs/group | 1 + > 3 files changed, 237 insertions(+) > create mode 100755 tests/xfs/014 > create mode 100644 tests/xfs/014.out > > diff --git a/tests/xfs/014 b/tests/xfs/014 > new file mode 100755 > index 0000000..53bc9e1 > --- /dev/null > +++ b/tests/xfs/014 > @@ -0,0 +1,141 @@ > +#!/bin/bash > +# FS QA Test No. xfs/014 > +# > +# Test the behavior of XFS dynamic speculative preallocation at ENOSPC > +# conditions. Speculative preallocation allocates post-EOF space to files as > +# they are extended. This test creates conditions that bypass natural low space > +# preallocation throttling and verifies that when no other space is available, > +# writers reclaim the preallocated space and do not fail with premature ENOSPC. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014 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! > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +_cleanup() > +{ > + cd / > + umount $SCRATCH_MNT 2>/dev/null > + rm -f $tmp.* > +} > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +# create a file that is likely to retain speculative preallocation after close > +_spec_prealloc_file() > +{ > + file=$1 > + > + rm -f $file > + > + # a few file extending open-write-close cycles should be enough to > + # trigger the fs to retain preallocation. write 256k in 32k intervals to > + # be sure > + for i in $(seq 0 32768 262144) > + do > + $XFS_IO_PROG -fc "pwrite $i 32k" $file | _filter_xfs_io > + done > + > + # write a 4k aligned amount of data to keep the calculations simple > + $XFS_IO_PROG -c "pwrite 0 128m" $file | _filter_xfs_io > + > + size=`stat -c "%s" $file` > + blocks=`stat -c "%b" $file` > + blocksize=`stat -c "%B" $file` > + > + prealloc_size=$((blocks * blocksize - size)) > + if [ $prealloc_size -eq 0 ] > + then > + echo "Warning: No speculative preallocation for $file." \ > + "Check use of the allocsize= mount option." > + fi > + > + # keep a running total of how much preallocation we've created > + TOTAL_PREALLOC=$((TOTAL_PREALLOC + prealloc_size)) > +} > + > +_consume_free_space() > +{ > + dir=$1 > + > + # calculate the rough amount of free space in MB > + fsblocksize=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bsize | \ > + awk '{ print $3 }'` > + blocksavail=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bavail | \ > + awk '{ print $3 }'` > + freesp=$((fsblocksize * blocksavail / 1024 / 1024)) > + > + # allocate all but 10MB > + freesp=$((freesp - 10)) > + $XFS_IO_PROG -fc "falloc 0 ${freesp}M" $dir/spc > +} > + > +# real QA test starts here > +_supported_fs xfs > +_supported_os Linux > + > +_require_scratch > +_require_xfs_io_command "falloc" > + > +rm -f $seqres.full > + > +# 10GB fs > +_scratch_mkfs_xfs_opts "-d size=$((1024*1024*1024 * 10))" | \ > + _filter_mkfs 2>> $seqres.full Which will fail on a few of my test machines because they only have 4GB scratch devices (ram disks). What I think is better here is to use a sparse file on the scratch device and mount via loopback. Most of the space is being used by fallocate, so it will never get written. hence this test will fit in most scratch devices without needing to worry about the size of the filesystem being tested.... > +_scratch_mount > + > +# make sure the background eofblocks scanner doesn't interfere > +orig_sp_time=`cat /proc/sys/fs/xfs/speculative_prealloc_lifetime` > +echo 9999 > /proc/sys/fs/xfs/speculative_prealloc_lifetime > + > +# create a few files with relatively significant preallocation > +TOTAL_PREALLOC=0 > +for i in $(seq 0 3) > +do > + _spec_prealloc_file $SCRATCH_MNT/pre$i > +done > + > +# consume most of the remaining free space in the fs to put us near ENOSPC > +_consume_free_space $SCRATCH_MNT > + > +# start a few background writers to consume the bulk of the space that has been > +# previously preallocated to other files. this space should be reclaimed such > +# these writers complete without hitting ENOSPC > +write_size=$((TOTAL_PREALLOC / 2 / 4)) > +for i in $(seq 0 3) > +do > + $XFS_IO_PROG -fc "pwrite 0 $write_size" $SCRATCH_MNT/file.$i | \ > + _filter_xfs_io & > +done > +wait > + > +echo $orig_sp_time > /proc/sys/fs/xfs/speculative_prealloc_lifetime > +umount $SCRATCH_MNT I'd recommend checking the filesystem here as well. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon May 26 21:45:46 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD4557F4E for <xfs@oss.sgi.com>; Mon, 26 May 2014 21:45:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A931AC002 for <xfs@oss.sgi.com>; Mon, 26 May 2014 19:45:43 -0700 (PDT) X-ASG-Debug-ID: 1401158740-04cb6c22b5139ca0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id r4JbA77t1RZYSQWV for <xfs@oss.sgi.com>; Mon, 26 May 2014 19:45:41 -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: ArsHAMb7g1N5LL1s/2dsb2JhbABZgwcfM4Jxp2UBAQEBAQaQUoc6gQ0XdIMCIxgkNAUlAzSIQdQ5FoU/iH0dgh4PRCSBFQSZcpMogUGCCSs Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 27 May 2014 12:15:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wp7NV-00021C-3x; Tue, 27 May 2014 12:44:37 +1000 Date: Tue, 27 May 2014 12:44:37 +1000 From: Dave Chinner <david@fromorbit.com> To: fstests@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 45d1fac Message-ID: <20140527024437.GC8554@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 45d1fac MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="AkbCVLjbJ9qUtAXD" 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: 1401158740 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.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6145 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) --AkbCVLjbJ9qUtAXD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to fstests@vger.kernel.org so they can be picked up in the next update. I've sent this announcement to fstests, linux-fsdevel and the XFS, ext4 and btrfs lists. Future fstests announcements will only be directed to the fstests and linux-fsdevel lists. The new head of the master branch is commit: 45d1fac btrfs: test for btrfs send when nested subvols/snapshots exist New Commits: Eryu Guan (2): [82afae2] generic: new ENOSPC regression test [caca581] xfs/005: filter _scratch_mount output to match golden image Filipe David Borba Manana (5): [e7dd9f1] btrfs: add test for btrfs send with long paths [86da66c] common: add helper require function _require_btrfs_cloner [d140277] btrfs: add test for clone operation [3318629] btrfs: add test for btrfs send with large xattrs [45d1fac] btrfs: test for btrfs send when nested subvols/snapshots ex= ist Code Diffstat: common/rc | 7 + tests/btrfs/035 | 4 +- tests/btrfs/051 | 85 +++++++++ tests/btrfs/051.out | 1 + tests/btrfs/052 | 171 +++++++++++++++++ tests/btrfs/052.out | 499 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ tests/btrfs/053 | 109 +++++++++++ tests/btrfs/053.out | 1 + tests/btrfs/054 | 109 +++++++++++ tests/btrfs/054.out | 1 + tests/btrfs/group | 4 + tests/generic/027 | 107 +++++++++++ tests/generic/027.out | 2 + tests/generic/group | 1 + tests/xfs/005 | 7 +- 15 files changed, 1104 insertions(+), 4 deletions(-) create mode 100755 tests/btrfs/051 create mode 100644 tests/btrfs/051.out create mode 100755 tests/btrfs/052 create mode 100644 tests/btrfs/052.out create mode 100755 tests/btrfs/053 create mode 100644 tests/btrfs/053.out create mode 100755 tests/btrfs/054 create mode 100644 tests/btrfs/054.out create mode 100755 tests/generic/027 create mode 100644 tests/generic/027.out --=20 Dave Chinner david@fromorbit.com --AkbCVLjbJ9qUtAXD Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJTg/wUAAoJEK3oKUf0dfodUUgP/2Q2n/WpbhrwHtWRQkQgsQMO LNvYOMACzn9ayFqVZ0AZW+CmTprEim8tPSmO6F2Zfg8bHbJxl6dS1IU2Ff/ksT8b y52HNh4Co9rX6+0d9aat7+YmP1X8ZBbSc0uIbWeeGuWpZ1BPSiCCS///Th342qNm tg+cIhavASweeU/cXTk8711sTyfS2GZkrfOW6cPru96vlwg/g61nqLI7seLdfN5F qXY825WbQ1azI473JnvTXJ7aHY7iTO+O7lX2oMhRnHDhWVpaRmZLAKL1r398sAXV 5hTUEw79KrfRlsFN371nK2eMzdHJ4XcUwtAOtz0g8CXhGEGEkP9CDPjXghHnBs3J mS3/uxQcm6BwD0iYJheW0r5kBHmIs0Rm36QrHVSSKPX/zekKYm2zjhxdUNXXWgIA FLAhhFijMv9Dz11xfV5EZmK1musjovBchtP8MX+ObUudVeiWmplhkkISVFH9DE0X 2GqOxYCHMSuj1UuFe2/9vtZn22tBR/O09VRhLCB2iTYz0dgeaz4FJcil6lbrOROV ADlqbzX83B8jOJBEfCGw/anKCL4pIhe67NBxuj5Kl3o77GubXS6JN91E1VhXduR8 AyzpB0QWkq/ymFMc+nKn+8rxA85SiFldaigRX7Y3X/Ob62xbpDzCN75KTpMzgFuA rWbLcEnPvkB+7C8Tslm8 =yWMA -----END PGP SIGNATURE----- --AkbCVLjbJ9qUtAXD-- From debbugs@buxtehude.debian.org Tue May 27 02:39:37 2014 Return-Path: <debbugs@buxtehude.debian.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 B993B7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 02:39:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B237D304032 for <xfs@oss.sgi.com>; Tue, 27 May 2014 00:39:34 -0700 (PDT) X-ASG-Debug-ID: 1401176372-04cb6c22b8149590001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id WXaBJd7pJlsp50nl (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 00:39:32 -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.80) (envelope-from <debbugs@buxtehude.debian.org>) id 1WpByr-0000wH-Qb; Tue, 27 May 2014 07:39:29 +0000 X-Loop: owner@bugs.debian.org Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) Content-Type: text/plain; charset=utf-8 From: owner@bugs.debian.org (Debian Bug Tracking System) To: =?UTF-8?Q?An=C3=ADbal?= Monsalve Salazar <anibal@debian.org> CC: xfs@oss.sgi.com Subject: Processed: Re: Bug#713994: XFS repair Message-ID: <handler.s.C.140117566230471.transcript@bugs.debian.org> X-ASG-Orig-Subj: Processed: Re: Bug#713994: XFS repair References: <20140527072735.GA4275@master.debian.org> X-Debian-PR-Package: xfsprogs X-Debian-PR-Source: xfsprogs X-Debian-PR-Message: transcript X-Loop: owner@bugs.debian.org Date: Tue, 27 May 2014 07:39:29 +0000 Sender: Debian BTS <debbugs@buxtehude.debian.org> X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1401176372 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.6150 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Processing commands for control@bugs.debian.org: > notfound 713994 xfsprogs/3.1.4 Bug #713994 {Done: An=C3=ADbal Monsalve Salazar <anibal@debian.org>} [xfspr= ogs] xfsprogs: Failure to allocate new space, potentially after an xfs_grow= , to existing files No longer marked as found in versions xfsprogs/3.1.4. > stop Stopping processing here. Please contact me if you need assistance. --=20 713994: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D713994 Debian Bug Tracking System Contact owner@bugs.debian.org with problems From namjae.jeon@samsung.com Tue May 27 03:19:08 2014 Return-Path: <namjae.jeon@samsung.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.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 D22737F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:19:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91E118F8064 for <xfs@oss.sgi.com>; Tue, 27 May 2014 01:19:05 -0700 (PDT) X-ASG-Debug-ID: 1401178741-04bdf059a11536c0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id PxGiutHXhekqDINb (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 01:19:03 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N68005F54FLNJE0@mailout4.samsung.com> for xfs@oss.sgi.com; Tue, 27 May 2014 17:18:57 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id FA.8A.19452.17A44835; Tue, 27 May 2014 17:18:57 +0900 (KST) X-AuditID: cbfee68e-b7fb96d000004bfc-b7-53844a71a293 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 71.38.07139.17A44835; Tue, 27 May 2014 17:18:57 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N68006NH4FLL040@mmp1.samsung.com>; Tue, 27 May 2014 17:18:57 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com, Brian Foster <bfoster@redhat.com>, linux-fsdevel@vger.kernel.org, Ashish Sangwan <a.sangwan@samsung.com> Subject: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 27 May 2014 17:18:57 +0900 X-ASG-Orig-Subj: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac95g8yt4Q1WErHKQoSPGe7ML86REQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLIsWRmVeSWpSXmKPExsWyRsSkWLfQqyXYYO83VYulEy8xW7z7XGWx 5dg9Ros9e0+yWCzqu8XowOpxapGEx+oLWxk93u+7yubRt2UVo8fnTXIBrFFcNimpOZllqUX6 dglcGU+W1ha0rmCsaDu4iq2BcVkrYxcjB4eEgInEgaO6XYycQKaYxIV769m6GLk4hASWMkq8 f7+EFSJhIrHtxVkWiMQiRokLW36xgSSEBP4ySvz8mQYyiE1AW+LPFlGQsIiAmsSkSTuYQWxm gXqJxeuamUBsYQE/ifOHNjGC2CwCqhJbbv4Ci/MKWErcbjjPCmELSvyYfI8FoldLYv3O40wQ trzE5jVvmSHuUZDYcfY1I8QuPYlnrX/ZIWpEJPa9eMcIcqeEwCF2iXentrBALBOQ+Db5EAvE w7ISmw5AzZGUOLjiBssERrFZSFbPQrJ6FpLVs5CsWMDIsopRNLUguaA4Kb3ISK84Mbe4NC9d Lzk/dxMjMOpO/3vWt4Px5gHrQ4zJQOsnMkuJJucDozavJN7Q2MzIwtTE1NjI3NKMNGElcd5F D5OChATSE0tSs1NTC1KL4otKc1KLDzEycXBKNTCuUYnpDDPtUuXZ99zn37qMa60TbWY5TYtd foZff06Ogzen2/N2j1PyuXXv72g7/Gu8H7LC2cjXr0La1TWA4Y5IZwF/Q9RyhbK0X2vTRN4f WVTE9ei5Df/h8H72fwXnv0pMvsqZeXPhmzyDvefVFjS7bBAoVP5Tp6/1vkj161yV+6Wy/S8M k5RYijMSDbWYi4oTAcsiylXQAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprNKsWRmVeSWpSXmKPExsVy+t9jAd1Cr5Zgg8NvJSyWTrzEbPHuc5XF lmP3GC327D3JYrGo7xajA6vHqUUSHqsvbGX0eL/vKptH35ZVjB6fN8kFsEY1MNpkpCampBYp pOYl56dk5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAO1WUihLzCkFCgUkFhcr 6dthmhAa4qZrAdMYoesbEgTXY2SABhLWMGY8WVpb0LqCsaLt4Cq2BsZlrYxdjJwcEgImEtte nGWBsMUkLtxbz9bFyMUhJLCIUeLCll9sIAkhgb+MEj9/pnUxcnCwCWhL/NkiChIWEVCTmDRp BzOIzSxQL7F4XTMTiC0s4Cdx/tAmsPksAqoSW27+AovzClhK3G44zwphC0r8mHyPBaJXS2L9 zuNMELa8xOY1b5kh7lGQ2HH2NSPELj2JZ61/2SFqRCT2vXjHOIFRYBaSUbOQjJqFZNQsJC0L GFlWMYqmFiQXFCel5xrpFSfmFpfmpesl5+duYgRH9TPpHYyrGiwOMQpwMCrx8E7wbQ4WYk0s K67MPcQowcGsJMLb6dISLMSbklhZlVqUH19UmpNafIgxGejTicxSosn5wISTVxJvaGxiZmRp ZG5oYWRsTpqwkjjvwVbrQCGB9MSS1OzU1ILUIpgtTBycUg2MajvvTgkXWGjT8Ot9p8Xqq5O/ p61hE+b7UZfufXndze++t58ffeokVvDFz3VrXL9LaVL5z7y/sVctihddPVYVFqfOmvW7bbtB yY43swNYhTy2xB+fbPnmzBHRhcFF3t5HXltdV/maGFZ7Sjytp6r2vznru9u80Q5mXfef3nn/ fRXjk9Mf1zG6KLEUZyQaajEXFScCAOMU+7cuAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1401178742 X-Barracuda-Encrypted: RC4-MD5 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 patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 5) Allocate unwritten extents for the hole created in step 4. Cc: Brian Foster <bfoster@redhat.com> Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> --- Changelog v3: - remove XFS_TRANS_RESERVE and assert. - update the comment of blockcount calculation. - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. v2: - remove reserved enable. - add xfs_qm_dqattach. - reset blockcount in xfs_bmap_shift_extents_right. - update i_size to avoid data loss before insert_file_space() is called. - use in-memory extent array size that delayed allocation extents. fs/xfs/xfs_bmap.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 9 +- fs/xfs/xfs_bmap_util.c | 128 ++++++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 38 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 550 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..8023b7e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5419,7 +5419,7 @@ error0: * into, this will be considered invalid operation and we abort immediately. */ int -xfs_bmap_shift_extents( +xfs_bmap_shift_extents_left( struct xfs_trans *tp, struct xfs_inode *ip, int *done, @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmap_shift_extents", + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } @@ -5606,3 +5606,376 @@ del_cursor: xfs_trans_log_inode(tp, ip, logflags); return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be splitted. @split_fsb is a block where the extents is spliited. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* splitted extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + int error = 0; + int logflags; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + /* Add new extent */ + (*current_ext)++; + xfs_iext_insert(ip, *current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *split_ext) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + + if (error) { + /* + * Free the transaction structure. + */ + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, + &firstfsb, &free_list); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return error; +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* + * Shift extent records to the right to make a hole. + * The maximum number of extents to be shifted in a single operation + * is @num_exts, and @current_ext keeps track of the current extent + * index we have shifted. @offset_shift_fsb is the length by which each + * extent is shifted. @end_ext is the last extent to be shifted. + */ +int +xfs_bmap_shift_extents_right( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t offset_shift_fsb, + xfs_extnum_t *current_ext, + xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int num_exts) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec right; + xfs_ifork_t *ifp; + xfs_fileoff_t startoff; + xfs_filblks_t blockcount = 0; + xfs_extnum_t last_extent; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int logflags; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstblock; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + /* start shifting extents to right */ + while (num_exts-- > 0) { + blockcount = 0; + + if (*current_ext < end_ext) { + *done = 1; + break; + } + + gotp = xfs_iext_get_ext(ifp, *current_ext); + xfs_bmbt_get_all(gotp, &got); + startoff = got.br_startoff + offset_shift_fsb; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. This checking has + * to be performed for all except the last extent. + */ + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + if (last_extent != *current_ext) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext + 1), &right); + if (startoff + got.br_blockcount > right.br_startoff) { + error = XFS_ERROR(EINVAL); + if (error) + goto del_cursor; + } + } + + /* Check if we can merge 2 adjacent extents */ + if (last_extent != *current_ext && + right.br_startoff == startoff + got.br_blockcount && + right.br_startblock == + got.br_startblock + got.br_blockcount && + right.br_state == got.br_state && + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { + + /* + * Merge the current extent with the extent to + * the right. Remove the right extent, calculate + * a new block count for the current extent to cover + * the range of both and decrement the number of extents + * in the fork. + */ + blockcount = right.br_blockcount + got.br_blockcount; + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_iext_remove(ip, *current_ext + 1, 1, 0); + if (cur) { + error = xfs_btree_delete(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (blockcount) { + xfs_bmbt_set_blockcount(gotp, blockcount); + got.br_blockcount = blockcount; + } + + xfs_bmbt_set_startoff(gotp, startoff); + got.br_startoff = startoff; + + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + (*current_ext)--; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 38ba36e..af05899 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, int *done, xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, + xfs_extnum_t *split_ext); +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, + int *done, xfs_fsblock_t offset_shift_fsb, + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + int num_exts); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 057f671..b9511dd 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1548,7 +1548,7 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, shift_fsb, ¤t_ext, &first_block, &free_list, XFS_BMAP_MAX_SHIFT_EXTENTS); @@ -1572,6 +1572,132 @@ out: } /* + * xfs_insert_file_space() + * This routine allocate disk space and shift extent for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. Lastly + * allocate an unwritten extent in hole range created by shifting extents. + * + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + xfs_ifork_t *ifp; + int done = 0; + int committed; + int error; + uint rounding; + xfs_fileoff_t start_fsb; + xfs_fileoff_t shift_fsb; + xfs_extnum_t split_ext; + xfs_extnum_t current_ext = 0; + xfs_off_t ioffset; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + error = xfs_qm_dqattach(ip, 0); + if (error) + return error; + + /* wait for the completion of any pending DIOs */ + inode_dio_wait(VFS_I(ip)); + + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, + ioffset, -1); + if (error) + return error; + + truncate_pagecache_range(VFS_I(ip), ioffset, -1); + + start_fsb = XFS_B_TO_FSB(mp, offset); + shift_fsb = XFS_B_TO_FSB(mp, len); + + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); + if (error) + return error; + + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + while (!error && !done) { + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + /* + * We would need to reserve permanent block for transaction. + * This will come into picture when after shifting extent into + * hole we found that adjacent extents can be merged which + * may lead to freeing of a block during record update. + */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + break; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + + /* + * We are using the write transaction in which max 2 bmbt + * updates are allowed + */ + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, + ¤t_ext, split_ext, + &first_block, &free_list, + XFS_BMAP_MAX_SHIFT_EXTENTS); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + } + + /* Add unwritten extent in a hole range. */ + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); + +out: + return error; + +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..d62ab4b 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1f66779..f160cd5 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -756,11 +756,13 @@ xfs_file_fallocate( struct xfs_trans *tp; long error; loff_t new_size = 0; + int do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -790,6 +792,28 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + + new_size = i_size_read(inode) + len; + do_file_insert = 1; } else { if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { @@ -840,8 +864,20 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Some operations are performed after the inode size is updated. For + * example, insert range expands the address space of the file, shifts + * all subsequent extents over and allocates space into the hole. + * Updating the size first ensures that shifted extents aren't left + * hanging past EOF in the event of a crash or failure. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); return -error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 152f827..8943c9f 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.11-rc0 From maksim.kolikov.1990@imagineit.com Tue May 27 05:14:03 2014 Return-Path: <maksim.kolikov.1990@imagineit.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.2 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF 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 D02507F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:14:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 761B530404E for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:14:00 -0700 (PDT) X-ASG-Debug-ID: 1401185635-04bdf0599e15df90001-NocioJ Received: from mail.lib.permregion.ru (mail.lib.permregion.ru [46.146.240.19]) by cuda.sgi.com with ESMTP id uhl5tAUmVFMoGHwl for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:13:56 -0700 (PDT) X-Barracuda-Envelope-From: maksim.kolikov.1990@imagineit.com X-Barracuda-Apparent-Source-IP: 46.146.240.19 Received: from Unknown (unknown [1.85.17.82]) (Authenticated sender: edd@lib.permregion.ru) by mail.lib.permregion.ru (Postfix) with ESMTPA id CFF9F2972D; Tue, 27 May 2014 16:13:02 +0600 (YEKST) Message-ID: <F177EA8DDB3240BBBC27E82957AB0A52@hgua> Reply-To: =?windows-1251?B?zvLk5esgztIg6CDPwQ==?= <lucas@cox.net> From: =?windows-1251?B?zvLk5esgztIg6CDPwQ==?= <maksim.kolikov.1990@imagineit.com> To: <xfs@oss.sgi.com>, <mihail@telegraph.spb.ru>, <mail@szsu.ru>, <cezar-m@neva.spb.ru> Subject: =?windows-1251?B?8fLw4PXu4uDt6OUg7vLi5fLx8uLl7e3u8fLo?= =?windows-1251?B?IO/w6CD96vHv6/Pg8uD26Oggzs/O?= Date: Tue, 27 May 2014 12:13:07 +0200 X-ASG-Orig-Subj: =?windows-1251?B?8fLw4PXu4uDt6OUg7vLi5fLx8uLl7e3u8fLo?= =?windows-1251?B?IO/w6CD96vHv6/Pg8uD26Oggzs/O?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0E85_01CF79A5.04E36590" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 X-Barracuda-Connect: mail.lib.permregion.ru[46.146.240.19] X-Barracuda-Start-Time: 1401185635 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_MESSAGE, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different This is a multi-part message in MIME format. ------=_NextPart_000_0E85_01CF79A5.04E36590 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0E86_01CF79A5.04E36590" ------=_NextPart_001_0E86_01CF79A5.04E36590 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1= =F2=E8 =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =CE=CF=CE ------=_NextPart_001_0E86_01CF79A5.04E36590 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://ww= w.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> <HTML=20 xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>Untitled Document</TI= TLE> <META content=3Dtext/html;charset=3Dwindows-1251 http-equiv=3DContent-Typ= e> <STYLE type=3Dtext/css>.style1 { FONT-FAMILY: "Times New Roman", Times, serif } .style4 { FONT-FAMILY: "Courier New", Courier, monospace } .style8 { FONT-FAMILY: Georgia, "Times New Roman", Times, serif; COLOR: #004999; F= ONT-SIZE: large; FONT-WEIGHT: bold } .style10 { FONT-FAMILY: Georgia, "Times New Roman", Times, serif; FONT-WEIGHT: bold } .style11 { FONT-SIZE: xx-large } .style12 { COLOR: #ff0000; FONT-WEIGHT: bold } .style13 { FONT-SIZE: large } .style14 { FONT-FAMILY: "Courier New", Courier, monospace; FONT-WEIGHT: bold } </STYLE> <META name=3DGENERATOR content=3D"-[OUTLOOK_VER]-"></HEAD> <BODY> <DIV>=F1=F2=F0=E0=F5=EE=E2=E0=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE= =F1=F2=E8 =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =CE=CF=CE</DIV><= /BODY></HTML> ------=_NextPart_001_0E86_01CF79A5.04E36590-- ------=_NextPart_000_0E85_01CF79A5.04E36590 Content-Type: image/jpeg; name="=?windows-1251?B?7+Xw5fDl4+jx8vDg9uj/IO7v4PHt+/Ug7/Du?= =?windows-1251?B?6Ofi7uTx8uLl7e379SDu4frl6vLu4i5qcGc=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?7+Xw5fDl4+jx8vDg9uj/IO7v4PHt+/Ug7/Du?= =?windows-1251?B?6Ofi7uTx8uLl7e379SDu4frl6vLu4i5qcGc=?=" /9j/4AAQSkZJRgABAQEAYABgAAD/4RDQRXhpZgAATU0AKgAAAAgABAE7AAIAAAADaHAAAIdpAAQA AAABAAAISpydAAEAAAAGAAAQwuocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkAMAAgAAABQAABCY kAQAAgAAABQAABCskpEAAgAAAAM0MQAAkpIAAgAAAAM0MQAA6hwABwAACAwAAAiMAAAAABzqAAAA CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAMjAxMzowODoyOSAxMjoyNToxNgAyMDEzOjA4OjI5IDEyOjI1OjE2AAAAaABwAAAA/+IMWElD Q19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3Rw dAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAU ZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gA AAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAA BDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkA AGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0y LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAA AAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZ WiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0 cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2 LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAA AGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA AAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAA AnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBK AE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA 2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGL AZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoC hAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6 A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToF SQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZ BysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJ TwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvI C+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsO tg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHo EgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmR GbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLd IwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3h LhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0 KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqy Ou87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB 7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUlj SalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBR m1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoH WlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBj Q2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yv bQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2 +HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFr gc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOM yo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhM mLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFak x6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFg sdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+ /796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvb gNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb 6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6 V/rn+3f8B/yY/Sn9uv5L/tz/bf///+ELFWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94 cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4Onht cG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDov L3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiBy ZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxu czpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9u IHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht bG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIw MTMtMDgtMjlUMTI6MjU6MTYuNDA3PC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48 cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1k MzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+ PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAy LzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPmhwPC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9k YzpjcmVhdG9yPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0 IGVuZD0ndyc/Pv/bAEMAKBweIx4ZKCMhIy0rKDA8ZEE8Nzc8e1hdSWSRgJmWj4CMiqC05sOgqtqt iozI/8va7vX///+bwf////r/5v3/+P/bAEMBKy0tPDU8dkFBdviljKX4+Pj4+Pj4+Pj4+Pj4+Pj4 +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+P/AABEIBGMDGgMBIgACEQEDEQH/xAAf AAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEF EiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJ SlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEB AAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIy gQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk ZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfI ycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/ANmiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiqctzLb3eJQDA33SOoNAFymGVRMIv4iM 9O1KHDIWTn26c+lZciTzagGGdh5ADdOO9AGglyjByflCnGD1P4VKjb0VvUZrFisroecAPnwBnd7g 1f03ckPlvy33ic547UAXKKinuI4FJfPHPFR2bXEitJOVw3KKOwoAs0UUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQXM3lM gJKoQSzAZx0/xqqkttctvZ5ZCvO1kz/IVcuhm1m/3D/KodipqUexQuYj0HvQBEBczSzBSEBIYYfH Ucdj6VDLYXU0pkG2M98OeT69Ks2zbFlb+7Gp/nUsE0zQpI6Bgwz8nUfhQBn/ANmXn/PZf++j/hU8 FrcxRCJQqjdlnD4LfpxVz7Qh4Tc7f3QOR9fT8aY00q3MKMqhZM8dSMCgCBNzGVLoBlZgvy8kECkS 5hjfyUmlJ7DaMZ9OlTxf8fb/AFb+SVBaxp9mt22jcZTzjnqaALsLl4VZupHPGKfRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAjqHRlPQjFUwGE8U3DMy+XgtgAjv8ApVm4YrbyEHBCnBqF1X7bGm0FfLIwRkdRQBGy+VFdKTnE QGfwNWrYYtYh/sD+VUn3G3uAoLNsUADk9TU8V7b7VQvsYDGGGMUASxf66f8A3h/6CKju/lltm/6a Y/MUR3EKyTMZUALDB3Dn5RUM9xHcNCsO5ysqscKcAUASfMrzSptOxjkMcZGF/wAKS1i2CFc8EmXr nHsPzpyKr3MgYBhuJwfXC0y3P+iwOOvmHp7kigC7RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAyZDJC6DqykCoMO17HIy bAEIwSDVqqtzMiTKpy25SpVeo96AI7W4iEzKXUZUYyevJq4wSQYYKw9DzVGGD7JE7yKSMYy5yAvp ikZ4VUM0UJUkD7ij+tAFxbW3ViwhTJ9qezogyzKoHqcVSle2RSxcSgEBUY5A57DvSq8SyLiOIFjg fKBn8QTQAWlwkt5KFPdiPf7o/pS20cohhjKDarby2fxxj8aSRCl2JzFIQeiqw+8eORU9pMssZGfn BJZe6nNAE9FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFAEVy7pCxjQu/QAVDZWhiBeb5pHGDnnHtVuigCCS1jKHauWx8u5i QP8ACkCndkWiBv72R/8ArqxRQBE3nEfNHG47jP8A9ao/J3kL9mRFzk5xz+VWaKAI0gjRsgHI6ZYn H0zVa7tZBL9ot8bx1X171dooARCWRWIKkjOD2paKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigCOeXylTAyzsFXPqaimneFmQ7STGzqcenUGpZohKoGcFWDKfQi mSW5lLM7DcUKLgcDPWgCA3kojcjYxVFbcAcDPY81NcSSwR7y0eNyjlSMZOD3p0kBe18neAcAbtvp 7Zp08RmjChgpDK2cZ6HNAETzuoVhtKyMFTj9c+nellneJih2klGZTjuOxo+ycFQ+FDB0GPun/D29 6V4DISzMN2wquBwM9TQBHJdstiZQo80ZBU9AR1/lUnnOJ5YztwqqRgcknPv7U2WzEgmw+0yrg8cA 9z+g/KnrARcPMXBLKFA29MZ56+9AEIuJzaRz/u/n2cbT3OPX3p7zSRzpG7xAMrHcR6Ee/vSi1YWk cHmD5NvzbeuCD0z7U94madJVcDapXBXPXHv7UARySzKkbBoyHZV+6e569afPJJDaSSfKXQE9ODRJ C0kaKXAKuGzt9DnHWnXERngeINt3jGcZxQA15JFuY4wVwysScdxj396jt7h5okbfHuZdxUDp+tOe OXz45QyHaCpGMcHHPX2pYYJIoUj8xSEXGdnX9aAI0u2eK2IaPdKRuA7ZBPrTxJOZzEWj4QN909ye OvtQtsyxW6eYP3JBzt64GPX3qQREXLS7hgoFxj0J/wAaAK8d25kVW2EF3UhRgqBnnr7frU1vMZg4 ZdrK3T2PI/SkW3ZYWj3g7nLE7exOSOtKsGy481CqqV2soXr6GgA8yQ3TxAoFVAwyuTyT7+1RwXMk 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 gq7RJgwHbjOfM4/z+dNAuRdkkSn94nABwRjnnpjNAGpRRRQAUABRgDA9KKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAAjIwelAGBgUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVTuJJo7mBBJxK5B4HAqVbhVcRO2XztLAcbsZx+VAE9 FRLcI0/k4YPgtz6A4/nRcS+Uq4+87hFz6mgCWiqIu5Pt32c8NvwFI6pjrn1zUkEs0rXKZQMj7VOO BxQBaoqlFczJbtJNhgkuwsBjcM4z+dS3dz5BjUfecnnBOAOScCgCZo0d1Zhlk6H0p1VJ7rYkJhIc O6gt7E0u+db9YyytG6k4A5XHvQBaoqnqFy0AQK+zd1coWAqN711kYBgyxmNSQPvbup/lQBoUVFcs ywMyOEwM7iM4qrJcXJsYriNo84XKgZ3EnGPagC/RRVD+0V+1d/I2Zzjvuxn6UAX6KhF3EZvLGdxL AcdSOopovoTEsnzBGBOcdAPX8qALFFRpOro7YZdhwwYdO9U576SOKGVvkSVScgZwcfKKANCiqvny i5to22gSISwHqB60ge5F60TMpRk3DC/c54+tAFuiq63a/YTcsMAKSR7jt+dNiut0LMTukHVMYwcZ xz/OgC1RWe1xcnT4riNk3YBK7fvEnGPar7MFUse1AC0VnG+kWHzJBtTzijlRnaB0q5bSM9qkkm0E rk46UAS0VRa+ZDcll4jKhF7kkVat5BLHkPvIODxjB9MUASUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FRXM/kICELsTgAUy2uvPZ0ZDHInVTVcrtcVxZ7czTwyBwvlEnG3OaZ9kZZ5ZI5FXzOeUyVOOoNOn vYbeQJITkjPAp1vdRXO7yyfl65GKOV2vYLkZtJPOMqzAP5ZTOzuTnPWn3MLPHEQdzxOr/XHX+tPu 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 KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAoopsrFInYYyATzQA6iqy3JY24DITL94Dtxmpo5klPyNngHp2PQ0APoqs9yyTvGVHT5D6nuP1F SwyiQY3AuBk4zj8PyoAkooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmyKXjZQcbgRnFOooAg+zti3+cfuf9nrxj 1ogt2icu0gYlAp+XGcZ56+9T0UAV3tvMQiRgW3hwVGMYp8UXlFj8vP8AdUj39T61LRQAzzV9H/74 P+FHmr6P/wB8H/Cn0UAM81fR/wDvg/4Ueavo/wD3wf8ACn0UAM81fR/++D/hR5q+j/8AfB/wp9FA DPNX0f8A74P+FHmr6P8A98H/AAp9FADPNX0f/vg/4Ueavo//AHwf8KfRQAzzl9H/AO+D/hR5q+j/ APfB/wAKfRQAzzV9H/74P+FHnL6P/wB8H/Cn0UAM81fR/wDvg/4Ueavo/wD3wf8ACn0UAM81fR/+ +D/hR5q+j/8AfB/wp9FADPNX0f8A74P+FHmr6P8A98H/AAp9FADPNX0f/vg/4Ueavo//AHwf8KfR QAzzV9H/AO+D/hR5q+j/APfB/wAKfRQAzzV9H/74P+FKsiscAN+KkU6igAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAryTMbpbaM4O3ezeg9vekkle3niV23xynaCQMg9ulNkjaK/W5ClkZNjYGSOcg0Tqbq eAKDsjfezEY5HQCgBGleR8i5ESZwAEz+ZPHNW2YRpuY4A6k1niNlsJrQoxkywXjg5PBzV/G2MBst gDPGc0ANE8ZDHd9zlgQcj8KBcRHZhx+8+771VdGa5kmUuyiEryvUk9BxzUcCzLD5RV/3kAVWKkbG Axg0AXhPEzBQ3JGRx1+nrTftUO0Nv+UnAODgmorWQOkStA6yRrglk+7x2P8AhUCq40+FfLk3CYEj Ycgb8/yoAvPPHH99sepxwPr6U17uCMsHlUFeo9KqkBZp454ZXWRtylc4YYHB/wDr06JkjvbkMp+4 gwAT2PFAFk3MK4y4wcYIGevSlE8RZVDfM2cDB5x1ql5Lw2FtGUYsJFZgoJxzntU1wrte25jVgMNl tpwM4/WgCcXERzhs4bb0PX0pRNGybw2RnHvn0x61VtAI0mDK6jzWKkqc/XmoQsiIsnlSMiTMTjIZ gR96gDRjkSVSUbIBwfY003EYZl3Hcv3gAeKbbBMO8cbIHOSWzlvfmoRkXV4dj4KLg7TzgHpQBMbq ABSZVAYZHuKclxE8XmLICmcZ9/SqMZ2Np29WBVGBBU5BwKGhkDtOiNs88PsA5IxgnH1oAvfaItrM XwE+9kHI+opWmjSMSM4CHGD65qpKpeeWZVYoYgn3T8xz6VDJDKtuYijMkcg8vAJyMg/oOKANFZUa Qxg/OBkjB4pDPEC4LcoMtweBVSUyLdXEkYkB8tduIyQx546Un7wm7LxuGeFRgKSCcHIHr1oAuCeM lAG5cZXg8igXERQuGyoOCcHrVRSRLZHZJhIyG/dtwcD2ohJELxmOQGSViMoem6gC2s8bFgG5QZbI xij7RF83zY2DLAgggetU5Ukdr3YjZJQrkEbsYyAadlJYpZEhmD+UVy4Ofp70AWvPi+T5v9Z93g80 n2mHY77/AJUOGODwaqIjh7AnzSFB3Ap935celRyRyNaXgAly0jbV2fe6e2aANFpo0xknkZxgk49a jlm4i8p0y54znDD0BFRqTFeyO6sUkRdpCk4xnj9arrFLGtqoVsiRm+6SEBzjP50AXoJC7SKzKWVu QoPyj0qO4lff5ccgjwMk7Nx/L/Pam2alJ7kbXALggsDzwKXBh1B5GDFJEABAzgjtQBLHIFhVmm83 d0YDr9AKUXERVWV9wbOMAnOOtUEjkt2jldJDES/ypnKAnI4H0q0gjSElUeIMSQcZbnv3xQBN58ZR XDghvu45zSG4iEYk3jaTjPv6VRt1kia3keIrGFZCADxk5BI680Sxv5czBHxJMrKoU5wCMnH4UAXh PGXK7sMBuIIIwPWlSaORtqtk43YxjI9aqy7vtczLEzj7PgAqcMcniogrySqVWQb7dkBKFQp449qA LwniZgobkgkcdfp60n2mHyxJv+QnAOD1qG1kDpErQOska4JZPu8dj/hVZY5BYxDEuRNkps6DdnPT NAGg88cedzYwMnjp9fSnNIiAEnr0wMk1UTMUl0siMwkO5SFJ3DGMVHGslm1u0is6iLY20btpzn/6 1AFw3UAQP5g2kZyORil+0RZA3ck7QMHr6VWu1zp7iOEqWxhFXnrnoKddhmktjGpJ8zJO08cEZNAF lJUd2RTll+8MdKheZnuxbxnbhdzt6DsBTLRClzc8PgsCCwPPHP60NG0N/wDaNpaN02tgZKkdD9KA HNK8FxHG7b0lyAxAyDTbdpZnnDSsBHIVGAOn5USqbm5hKg+XES5YjGT2AossiS63I65kLDKkZGBQ BGt48dvcSyEuY5TGq4Az6VPIJ44TIJNzqMlcDafb1qoIHntblArK/nmRNykZ5461bknLwEJG/mMu AhU8H3oAlglWeFJV6MM0+orWH7PbRxZyVGCfepaACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAqNIAk8koZiXABBxjjpUlFABRRRQAUUUUAFFFFA EbwB545SzAx5wBjHNSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFUp1FreJc4/dv8j/7JPQ1dqC5jkmUxKqGNwQxY8j6CgCJnEcpn2bt7iJec e2fz/lUgut28CNi6uEIHIye+fSkuLYvDFHEqbUdThj2HbpURtJlD+WUVWdW8oE7cDqM47/SgCZbp nV9kRZo32sFYfmKQXeZJEVN20KRg/ez0xTBBcoLjyzGplIKnJ+XgD0qP+z3R5Gi2KQF8tsnII9eO +eaALEl00aMzQkbEDNk4/AeppZLpV4XaW2hsM23g9PxqKa3nlaXPlkSR7Rkn5Dg5xxQILmKRZIvL JKBXViccdCDQA8XqFoPkIWboT2Poad9pzcSQqmSi7iSeKZPbyTrtYrnYcNno2QRx+FItvKs7ONhB i2ck5JyTnp70ASxzmS1E4TGV3AZ7UwXYaOMgKGkXeAzYAH1qGOymRIgPLUohVtrH5yRjninLbXES wPEYzJHH5bKScMPrQBZt5hcQiQAjPBB7GolumYPtiLOrlAoYckdfwqeMPs/eEFu+OgqmtnMkjTL5 Yk80sOTgqeoPFAErXYETTBCYlOCwPPoTj0p8twYwxCBlVN+d3UVCtrKtvJbDb5bk4bPKg9RinPBK 0UyYQZTy05PTnk8UAS+cxWIhB+89W6cZqNLxWiRyApckKC3p1yfwpY45gYw4TbGvGGOScY9KhW0n jghKGPzYmYgZO1gScigCT7aCm4R8+YIyM9z0IPcU+S4eIqGi5Zwg+bjmmTRXE0abvLDCRXIycAA9 OlOu4ZJxEEIG1wxJOOB6cUAKk/nTTQgY8sDLZ9aTT1K2MIbOdveiGF47mZwECOFCgHpjPt71LCGE ShwoYDBC9BQA+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgu5nh8rZtO+QJyOme9T1T1J1UW25gP36 Hk9qAHzzTQtEMxnzHCfdPH61OZEX7zqO3JqpfugltMsB+9B69sGotluZr4SBO2M/7o6UAaJdQ20s N3pmk82PGfMXH1rPi3pcWqMR5vkEHJ6dKjDILIDeD/pPc/7VAGp5seM+YuPrR5iFS29cDqc1DIYv tEagrvzuI9sHmqccsawgnb/x8thieFOTgmgDS8xNobeu09DnijzEzjevHPWst3T7HdKXBP2gHnju v/16nMsX26c+YmDCBncPU0AXTJGF3F1C+ueKUuqruLAL6k8Vm28sYjtFJVW8o4c9O2QB60yCYRw2 jO5WIKylgPutnjP60Aau9OPmX5unPWgsoIBIBPQE9az5IYnt0jhc/NIWQk98E8e2aFl829tJX+Vm VvlPbgf1zQBo1WE0rXcsI2AIoIJB5z+NWaz90J1OffLt+RRxJt9fQ0AWbe480SBwFaJirc8fWpld XGVYMPUHNZcbLHb3AK77cSLsY8ZyeST3APeiRyTebG3k7GO0feXvj8KANRXR87GDY64OaUnAyarw PbzSmWEhmK4LDpjsKsE4GTQAzzov+eif99ClMiL951H1NZisn9mQ/Mv+uHf/AG6k2W5ur0ShMYU8 /wC72oA0GdUGXYKPUnFMmlKIGTaxJHBbGR7VStS8U0IuTjMACluxzyPrjH5VGf3cMXTb9qzGCcfL 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 u6jdj19KvmCMyCQht4G0HcelN+yQ+UItp2BtwG49evrQBD5xiu7gv5jRxqp4OQvXNERM09yolcJt UoQemRnNTNawszsysS+A3znn9aPssPz/ACkbwA2GIyB+NAENjI8hYSud8YC4ycMP73408MZruaIs yrGq42nGc96lMEZmE2DvA253HpQ8CPIJCCHAxlSQcelAFGCaWaW3WQkZDgsON2DSyvKqXa+a/wC4 GUOfUZ5+lXWt4mRF24Ccrg4IoNvG0TRlSVf73JyfxoAry3flW7LhllWPcN3OR0zS7JVZm8zEZQ8b yTn1FTC2iBJ2ZJXadxJ49OabHZwxKyopAIx948D0HpQBWtXa5REaWRHWMN1HzZHX6U9SwnufnciL aVG72yRVhbaFDGVUgxjCnceB6U5IUSR5FB3P947ic0AUzLILSC5VyzsV3DPBz2xUcs0qG4Ks4CSA Bs5VRxnIq8ltEhG1SADkLk4B9hSG0hO/Kk7zlgWOCfpmgCYHIyKKasarIzgHcwAPPpTqACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii 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 ja2DGV8yS4c7uozV68b5JWR2BWJiNrHginCwtgqKEOIzlRvbg/nTxaQBJECYWT7w3HmgCgtzLssY yzHzcljuwT7ZounuYLaEPIQ/nbcq3JX396vNZW7wpEU+ROV5OR+NK9nBIio6EhDkfMevrQBUilkb ULtGZwqoCqlunFVVuZzZWrF5Nzy4Zt3UZ6Vqi1hEryBTvkGGO48im/YLby0j8s7Ebco3Hg/nQBTl nkea9+dkECfIAcc4zn3prXcpksHLMPMU71U/eNaElrDKzMynLDa2CRuHvStawvJG5T5o/uYJGPwo Aq6XJJI1z5rlishUAnIFNdnfVZYyzKoi3DacE/5yauQ28UBcxqQXOW+YnJ/GiW3jlYMwO7G3IJBx 6UAZsN7NMLNHJ+fduIO3djpzVkpcLZOZWdpEVgNj4PsTU8lnbyRJG0Y2p93BxinNbRtHs+YLjHDE Z+vrQBQiuJJpbKEylkdCzsuRuIzx+lQyXc50yRvMYPHNsDg8kVqfZIQsaqm3y/uFTgikayt2gEJj /dg5xkjmgCsjuNXeLzG8sRbgCxIzUCXEonsyJWcSMys2TtfnsK0vssPnGXad5XaSWPIqNdPtU2bY sbDlfmPBoArQvLeSTlZmjeKXAHbaO2KZJNKt1fqGkISPK4b7pxnNXjZwGczbPnPXBIB+opTZwF5G KHdKMOdx5H50AUEuJWjsIy7fviS7Z5OO2aZJezRQXKbj8k2xXPJAOf8ACtL7JCIkjCYVDleTlT9a PssPktEYwUc5YHufXNADY7dg7Ezu0ZIZV3HI49fSqmntJNYPK8shcFudx9KvQ28cCbYwQOnLEmiK 1hhiaKNSqN1G40AZCXU7W1ofMfLS7Xbceeen5VuVX+wW3lonlnah3KNx4P51YoAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmPN HGcO2DjPToPU+lPqpb/NdXu/1UfhigCea4igAMjhQeneno6yIHRgynkEVUsGC6dFI4+bZj3PPAqa 0hMFuqHg8kgdsnOKAJqKj89PST/v23+FJM5+yyOmQQhIyMHOKAHLNGzbVbJ5x74649aabmETCIyD eTgD39M1Tb5bCxK9d8ePxHNTXxKCJjGGhSQM2DyDng4+tAFuimykrE5U4IBINU0uZGFphv8AWY3n A64zigC9RVD7W6tIhOW84RISvAzjmpHmkinaItuBjLq2BkEdqALdFUUuZGW0+Zsy435TA6Z44psl 1MJ/LLBG84KFC/wHvmgC+zKilmICjkk0yG4inyInDFeo6EVIQGGCMjrVSRSZJrlONsRRT6nrQBYW aNn2hsnnHvjrg0pljEoi3DeRnb3qg3y6fYleu+PH49f61Yl/5CNv/uP/AEoAnkdYkZ3YKqjJJpwI IBHQ1nahcRPFPGzY2KQFweWx1qXzmZ7VYpMJIDnj0HvQBcopEDBcO24564qO6ZktZWT7wQkflQAp nj3EZJxwdqkgfXFPR1kUMjBlPQiobAKLGDb3QE/XvSSZjdY42CKQxwoyxOfT05oAsUVRW6kaKzcn HmnDhVz2PT8qR7mURXjq5/dH5crjtnmgC/RVWN5JyTHKAqnaQU5z3Pt+VJBLIRK8kmVjkZSNvYfT vQBYllSFC8jbVHU46U1rqJF3OzKvqVIH8qrX00c2mzmMkgDnKkd/enan/wAg5/qv/oQoAuA5GR+o oqtJLI80kUW4FFByMdTnrntTJJLhI4mdgjO6oVABAz1oAuUVVaSXzjAGYsF3blAzyTjr9KZ5t0ZI InKRs6NuwM4IxQBcd1RSzsFUdSajhuYpyRE27HU4OKpfaJWZIZNpdZ9hbHB4yDipZpbhJJYUbc6p 5iEgcjOCDQBdoqqZ2kQvC/yiLdyM5J6f1qNZ7hVtZXdWSbarKFxgkdc0AXqKq27TS7yZPuSlcYHI Bq1QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAVE9urOzBmUuNrbe4qWigCCS1DlNsskYQYVUIwPzFSRR+Um3e7nOcucmn0UAFFFF AEKWqJsGWKxnKKegpfIzw8ruuc7TjH8qlooAR13oy5I3DGRUC2aKsCh3Ah+705+vFWKKAK5s4yki szkSNv6jg+o/KnfZwdxZ2Z2XZu4yB7VNRQBALRQsC+Y+Ifu9PTHPFNNkh53vu8zzC3GSR07dKs0U AMlj82MpvZM9160yK28tgTNK4AwFYjH6CpqKAIUtUXYMkrGcop6ClaANcJNvYFAQAMY5qWigBs0Y mieNiQGGDimNbq0sUm9gYgQAMY5qWigCGWFzHIFlky5yMEDb7D2qUA7QGOTjn3paKAII7bysrFK6 JnOzggfTIpWtlMqyK7oyqVOD1HXmpqKAKyWSRrCBJJiIkr0/wpWs0ZZlMkmJvvdP04qxRQBEluqT GVWbcygMOMNjufelggEO/DM29ix3Y6mpKKAI7iBbiFomZlVuu3FNnthPB5LyPt4yRjJx+FTUUAV5 LQPKJVlkSQDaWUj5h78U6S2WRI13MoRgwx3I9c1NRQBBNaiWRZBI8cijG5T1HoahkjIvbcIXAVWy 2M8nHU1dooAgNpG0ZUls79+/vu9aGAtyZWEkrthSVXJx9B2qeigCqkIhspAEILhmKjnBPai1gzb2 5kLkoowrDGDjFWqKAI4IBAHAZm3sWO7HU1JRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFADJwDA4Iz8prL3oulxModZiBh8Ec+56VqyhmiZVxkggZOKqC3uPsAtSIh8u0tuJ/TFAF wZ2DOCcfhVYXhMKS+V8rsFHzc5zirEaeVCsa87FAGe+KprazC0hi/d7kkDn5jjGc+lAEj3jBpVW3 ZjFjdyOmM09boSlRCN5ZN/JxgVDH5hu7wIqnJUZJ6HaKdFaNbSI0OGAjCMCcdO9ADvtgKRsqE738 sgnBVvf8qV7po5EjMLFnJAwRg4GajNpIBHt2EiYyvkkdc8Dj3pbrcLy02gE7m4Jx/DQA5LsurDym EquEKdcZ6HPpQbz91Kwjy0TbSoPX6fnTJLaUl5FK73dSyk8FQMYzQlvMrSnEeHdWABIxjHHT2oAk kvEWOF1BbziAv405LkNdPAV2soyDng/5yKrmykUAIVIWUOoJxtUHOOnrmpJbV5ZN5IUh8gg5ypAB H6UAKl6jxs+3AD7FyeppUui4lCx7pI8cK2Q2fQ1D9km8t8FFfzvNTkkfQ8VYX7T5TMwjEmPlUE4/ E0ATDpRQOnNFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABUUE/neZ8hXY5Tn6D/GparWX37r/rsf5CgCzVb7U/nTRrDuMQBOG659KsKwYZUgj1FU kVn1C8VXKZVOQOehoAsWxhljE8KgeZyTjBP1qaqBRIZ47XKrEI8qHGQTnn8aQRgS2aF/NGXBY98C gDQprRo7BmRSy9CRyKqTKIr22CKTkPge/H+NQK5iibc3ym62u3TC/wBBmgDUoqukEJkfadwyG2Z+ UHGKpbR/Ynm5Ify+SD15oA1aKoSoLe7R0ZwrRuZOc8AdaSAgXUAGArwnIzkt0wT70AaFFZaj/iWw nuZgCf8AgeKlbP2u7RR/AvPZeDmgC/RWaM/Z7Eg7yRzHn7+R1/CrGm/8eMZ7nOfzoAtUVmSZ2X4U Y2knd6fKDx+NaEIHkIMcbRQA+istVH9nwtj5jMAT3I34qRsTyXCSSrGyNwSOVGBgjmgDQoqgsKTX VykrMRsQ/eI7Hmo4JHkEEdwy4aLI3jIY5+vXGKANOis7yh51pEZWkUhwTkjOKZuaAtHvxAJ9uW5A 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 kKJK8ig7n+8dx5piWkKSmRUwSc4ycZ9cdKmooAYIUExmwd5GM7j0+lM+yQHdlSQzbmBYkE/TNTUU AQvaQPN5rJ8x64JAP1HenfZ497vg7nGGO481JRQBCLWFfLwp/dfc+Y8frS/ZocSApkSffBJOaloo AYkKIcjJOMZYknFMitIYX3Rrg9hk4H0HapqKAGLCiyvIoO9/vHceaYtpCpGFPDbgCxIz64zU1FAC MoYYOR7g4qH7HDtA2nIbfuDHOfXNT0UAMigjh3eWuNxyee9J9nj3yPg7pBhjuPNSUUAQi0hHl4Uj yxhcMenp9KgktQktssUbeWjMSQ3TI+tXaKAIWDQL+5iMhZvm+bH4kmljt0W28kj5SPmxxnPWpaKA IRaQgoQHygwvztwPzpDZwGJoimUY7iCxPPrU9FAEP2SHyvKKkrnJyxyT9acYIzKZMNvK7c7j0qSi gCEWkIjjjCnbGcqNx4P50NaQNMZSnzHrgkA/Ud6mooARlDDBz+BxUJtIWDBlJLEEsWOcjpzU9FAE Bs4CHBQ/vBhvmPP6042sLEkpkldpyTyPf1qWigCNIETpuJxtBLEkCmi0hEaRhTsRtyjceD+dTUUA RNbRM7MQQWGGwSN31pBbLlizOS3HDEADsOKmooArpZRLtHzHZkJ8xGB6e4p32SDyfJ2Hy85xuP1q aigCKa2inVRIpO3lTkgj8aFtolZSFOVGB8x/yalooAhNpCUdCp2u25hvPJ/Ol+zQkOCm7eMNuJJI /GpaKAI4beOBSEB57liTSLbRLE0QU7Gzkbj361LRQBEltEjAhSSo2jcScD8aI7aKPbtBwv3QSSF+ lS0UANljSVCki5U0iRKhJGSx4JJyafRQBHJbxyyI7glk5UhiMUPbxySrKwJdPuncRipKKAITaQku cNl/vfO3P604QRhoyFx5YIUA4A/CpKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA 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 gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCpdzzQzwRx+XiVsfMpOP1oW6kS9W2nV SXGUdeAfwqPUM/a7LaQDvOMjNTfZiLg3Ur+Y6qQoAwBQBZorMjga8skkDIJG+bzcfMDmpJEV9SgD hX3REnjgn1oAv0Vn6hDHFbrtAAMyn2Hr+FJLh9StG2AIwfaMdQBwf8KANGiqMCpeG684BiJDGM/w gdMUs1si2UjM3mskRUM3OMZ/X/CgC7RVGKCP+zlkA2sYOSvGeAarNbIdJS4BYTIgZX3dPagDXoqi ds00Zcea5iBMRHyrnuf5VXXJ0OXdyULAd8YNAGtRWfeIogsgFH+tQdOx60TbI9VjJUf6o4AHU54o A0KKz7ND9tvMhQ424wPu5FVOMQxOu6VLlVkk6hs54z/SgDboowMYxx6VnRstjcTxFflceZH7/wCz QBo0Vn3FqUtrcLHvKSK0m0ckd6F2vq6kRlR5OcEY5z1oA0KKyLoKLKeWPLsHz5x4IOeg+nSrbsJd REEmCgi3hT0JzQBcoqtHZxLuQksm/eEPRfbHpUFhBG4mJUZS4baQOQARx9KANCis60AEl2ogLjzC OMcD05NQBR/wj27A3YznvndQBsUVmXW13tNqqIhKFHH3v/rUXTiDUmkWLftt92B2OetAGnRWa4jj NssTEpcuC7Fj83H9akmUW1/bGEBVlJV1HAPvigC9RWQy83wWAuQ3ykYGzj8/yq9FHHdWkBdzJtww YEjJFAFmoDPvujBFglRl2Pb2+tT1maQS0t47feMnP60ASR3slxJcLEUUQ9AwyW/XpxU1tdNcWazr ESxz8oPesqaE3L3NzaZQISGGfv8Aqa09MmE1ijBAmPlwOlACabeNepI7KFAbAAqG8vLyAGWOBfIU 4y3U+/tTNA/49pf9/wDpVq+BuF+yoeXwXP8AdWgBTdk2aXSrlMZde4Ht9Kso6ugdTlWGQahZY1sn jjxsVCv6VX0Vi2nqD2YgUAWLq6W2Vcgs7nCIOrGpIvNxmUpk/wAKjp+Pesu7Hma7AjkhdvGDj1og uprea8iJeZYhlM8nr/8AXoAtXt99nmhhjALuwDE9AP8AGn3ct0vy2sQYgZLN0+g96ybu5RpLUrHM CjlmLrgscj/CtuWcJAHCksw+RO5J7UAQabeteRMXUK6HBx0q5VK2i+w2rBR5sx+dlXqTSxTy3W+K S2lgVlPzk0AQ/a9RkJaC2jaIn5ST1HbvU9xdNHcQWy7fNk5JI4A+lULjTpLBDcWszfJyQfT+tPcs 2t2sjDG+MHHpwaALtndmaSaFwBJE2CR0I9atMdqk4JwOgrHtWePU76REL7c/KO5zV62upZpNr2sk Qxnc1AFee9vLa4j86KPypDgBSSR/9erN3Lcr8trEHbGSWPH0+tU9WSeJ47tJNyxnhSB8taEs3lQh ypLHhV7k+lAFfTb1ryN/MQLIhwcdKu1VsLdbaMoWBlf53xVqgAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKAIJ7VZ5Y5GkdTGcqFxj+VTjp60UUAU106NHYpJKsbHJjDfKama2VrlZ97 hlGABjGPyqaigCG5tluUVXdlAO75cdfxFElsJJ4pjI4aPO0DGOevapqKAKslijTmZJZImb72w43V M8CtbmEFlUjbx1x+NSUUAV3RbexdN5KqhALY6YqCygE2nwq0jNHgZTj8qv8AXrQAB0oAge0Vrjzl d0bbtYKeCKYLCMW8kAkkCOcnkce3SrVFAFWayMkaL9okzGQy5C8EdO1OW23Tx3Du3mKuMDGPftVi igCBbUJJLIssgaXG48cY6Y4phsI/KijV3URMHGMZLep4q1RQAdqpB4b+eJ4xuWIlixBGD2H9fwq7 RQAVD9mBuhceY+4LtxxjH5VNRQBT/s6PyXh8yXy2OQueFp81kkojPmSLJH92QH5qs0UARxQiJCAz Mx6sxyTTbe2Fvv2u7b2LHdjqfwqaigCCK1ERlKyyZkO45xwfbimfYE+x/ZfMk8v8M9c+lWqKAIJb VZfKzI48ogrjHUfhSm2U3X2gu+7bsxxjH5VNRQBVGnxCExbn2bty8j5D7VKkGJFkkdpHUYUnHH5V LRQBWFkFMpE8o805b7v+FONqghjijZ41jII2nr7Gp6KACqcUJtb2VgP3U+Dn+63/ANfNXKKAKosV Qy+VI8ay/eUY/T0qWO3SKAQxEoo7jr+tS0UAVrOySzDCN3IY5IbH+FQS6PBNK0kksxZjknI/wrQo oAqSRC3sfs0ALMylVz79Sfzqa1gFtbpEvO0cn1NS0UAQXFqk7pISVkjOVZetLBbJAzuMs8hyzHqa mooAgubSO5kidywMRyMH6f4VHd6fHeOGlkkGBgKpGB+lW6KAK1nYxWW/yi534zuI7VPIgljaNs4Y YODTqKAKsNkI4/LaaSSP+42MVLPbJMyOSVeM5Vh2qWigCK3t0g3lclnO5mPUmnTRLNC0bEgMMEg4 NPooArR2YVFSSV5UU5Ctj/JpLvT47xlMskgC9FUjH8qtUUAVrOwist/llzvxncRVmiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqJrq3Uf65D9Dn+VNJvYLktFVx f2zcLISfQKaGvoFPzMQPXaePSnyS7C5kWKKgjvbeT7kmfcggD8alSRJBmN1cDjKnNJxa3Q7jqKKK QBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFVJboureUwVF4aU9vTHr1/zkU1FvYTdizJIsY569MD9KrPNK3VhACSF43M2O4H9KWO J2BCbokJPzHl2/w/Hn8alRIoGAUYZ+55LfU1eiFqysbYyghomcE5BmfGPoBzj2NSi2cvvLxq3rHE AfzOabLdFrOOeIlUZhvbGSo6H9altZfOgViwZh8rEHqR/nNNuVrgkgMDHrcSn8h/IU37JwMXE4IO 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 kr/6x9o/up/jUiIqDCgCloouAUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKqTHyrmWbA3LB8uT15J/pVuql4qmaAv9xt0Z+rDAq4b ky2JLpJJY08mQqdwOVPb+oqCXbGmLm/cMOSFIU/kBmpUjE2nrG67yFAKk4yw7Z+oqGOymV2ZJEgy ANqLu4HuauNlo3sBNc4FzayE4Acrz7g/4VO0iIVDOqluACcZqrJJ5mnmSPcTEQSHODlTzn8qRRHP eOsih1eMOh9F6UuW616BcknuZFmEMURLN0ZuB+HrVe5PnRec+8CNgskYfjg5/Pp/kUwF5bcjIE1s +3PXj1/z6VdgiTyW2uzCTJLdDnGD9KrSBOrdhDbqbaRIySr/ADAFuOff0P8AU1WtphBGRNzA5JDn nnPQ1btRKse2VQAPujuB6GnLbxqxYruYndluee386nmSunqOzdmitLFN5BtVi3IeA+4cDPce1TT2 qTyKzk4AIKj+L61PRU876FKIyKGOEYjQLnqR1P19afRRUN3GNlcRRNI3RQScVFYxGGziRs5xk59T zTLj/SJlthyow0v07D8atVb0jYQyaITRMhOM9D6GqN00xe2jkjBcSBwUP3sDnitGqqnzdSY9VgTH PZj6fhTg7fIGSM7yIVNuxVhghiB/WoPsOcbAIMHI2MTz0+lWY5hJNKiqcR4BbsT3H4VJS5nHQDEv YZUaRpGZysa/Nn1b/wCsa0w9sDyyZ/2j/jVG62y3RTcziSdUwOwUc/8AoVa1aVH7quCITKzjEK5/ 2iMAf40C1jABO4v3cEgn8qmorG/YZUkiVGMUYx5uMn2781bAwMDpTTHmYSZ6LgCnU27gFFFFSAUU UUAFFFQ3TERbV+852imld2AZC/mSSSgFsnavpgVKUd/vvgei8frT0QRoEUYAGBS029dAGoip91QK dRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF 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 UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAVJbLDGS0fyJD1A+631FQGSS1H72NoRn70Q3R9e47fh jNaVFaKo+uorFSK7MgwAk3Gf3TDOPdT0/WntNbMCsnyBjk+YpTJGPXr2olsbaY5eFc+o4/lUZspF IMV5OGH987h+VP3H5BqTweVhzE4ZWYnhsgHv/j+NSKoRAoPAGOarvBM33jDKf9tMf57/AJ1GbWQ9 ILVOOoXPP5UrJ9RX8iybmAHBmjz0+8KjkMcrq3lyuU6AAqOoOecA9BTEtrpQALsYx0EQA/SnfYlZ 9zzTOP7pfj9KLRXUNSN52UFEZFKjPlwDe2Mjp0A6+lRxxXU2SoNupGN7ndIf8PpxV9IkjHyIF6Dg dcU6jntsh2IoLaKADy1GcY3HqalooqG29WMKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//2Q== ------=_NextPart_000_0E85_01CF79A5.04E36590-- From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:31:22 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F0DBB7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:31:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA9678F8037 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:31:22 -0700 (PDT) X-ASG-Debug-ID: 1401186679-04bdf059a115f680001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id X0DiQ6WssMonxmag (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:31:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEf9-00072N-2a for xfs@oss.sgi.com; Tue, 27 May 2014 10:31:19 +0000 Date: Tue, 27 May 2014 03:31:19 -0700 From: Christoph Hellwig <hch@infradead.org> To: xfs@oss.sgi.com Subject: [PATCH xfs: tone down writepage/releasepage WARN_ONs Message-ID: <20140527103119.GA26420@infradead.org> X-ASG-Orig-Subj: [PATCH xfs: tone down writepage/releasepage WARN_ONs MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1401186679 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=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 I recently ran into the issue fixed by "xfs: kill buffers over failed write ranges properly" which spams the log with lots of backtraces. Make debugging any issues like that easier by using WARN_ON_ONCE in the writeback code. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/xfs/xfs_aops.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index d1b99b6..e32640e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -975,7 +975,7 @@ xfs_vm_writepage( * Given that we do not allow direct reclaim to call us, we should * never be called while in a filesystem transaction. */ - if (WARN_ON(current->flags & PF_FSTRANS)) + if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) goto redirty; /* Is this page beyond the end of the file? */ @@ -1225,9 +1225,9 @@ xfs_vm_releasepage( xfs_count_page_state(page, &delalloc, &unwritten); - if (WARN_ON(delalloc)) + if (WARN_ON_ONCE(delalloc)) return 0; - if (WARN_ON(unwritten)) + if (WARN_ON_ONCE(unwritten)) return 0; return try_to_free_buffers(page); -- 1.7.10.4 From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:36:50 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2C27B7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:36:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2414AC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:36:46 -0700 (PDT) X-ASG-Debug-ID: 1401187004-04cbb02a0f1503a0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id dTddrV4Othss48F8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:36:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEkO-0000M4-HS; Tue, 27 May 2014 10:36:44 +0000 Date: Tue, 27 May 2014 03:36:44 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com, viro@ZenIV.linux.org.uk Subject: Re: [PATCH] xfs: remove dquot hints Message-ID: <20140527103644.GA928@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove dquot hints References: <1398124565-13299-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1398124565-13299-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401187005 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.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Btw, do you plan to resurrect the other quota scalability patches as well? From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:38:31 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 279267F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:38:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E18C304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:38:31 -0700 (PDT) X-ASG-Debug-ID: 1401187109-04cbb02a111505a0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id JjGOdxcObLloUU61 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:38:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEm5-0000ON-Nb; Tue, 27 May 2014 10:38:29 +0000 Date: Tue, 27 May 2014 03:38:29 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: block allocation work needs to be kswapd aware Message-ID: <20140527103829.GA1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: block allocation work needs to be kswapd aware References: <1401143214-9181-1-git-send-email-david@fromorbit.com> <1401143214-9181-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401143214-9181-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401187110 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.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SARE_STILLSINGLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.66 SARE_STILLSINGLE BODY: Contains phrasing used by spammers On Tue, May 27, 2014 at 08:26:53AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Upon memory pressure, kswapd calls xfs_vm_writepage() from > shrink_page_list(). This can result in delayed allocation occurring > and that gets deferred to the the allocation workqueue. > > The allocation then runs outside kswapd context, which means if it > needs memory (and it does to demand page metadata from disk) it can > block in shrink_inactive_list() waiting for IO congestion. These > blocking waits are normally avoiding in kswapd context, so under > memory pressure writeback from kswapd can be arbitrarily delayed by > memory reclaim. > > To avoid this, pass the kswapd context to the allocation being done > by the workqueue, so that memory reclaim understands correctly that > the work is being done for kswapd and therefore it is not blocked > and does not delay memory reclaim. > > To avoid issues with int->char conversion of flag fields (as noticed > in v1 of this patch) convert the flag fields in the struct > xfs_bmalloca to bool types. pahole indicates these variables are > still single byte variables, so no extra space is consumed by this > change. Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:40:36 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 696577F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E579304039 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:40:36 -0700 (PDT) X-ASG-Debug-ID: 1401187234-04bdf059a01603d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rlDUWkTXzRTn1zRi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:40:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEo6-0001ys-TS; Tue, 27 May 2014 10:40:34 +0000 Date: Tue, 27 May 2014 03:40:34 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: xfs_readsb needs to check for magic numbers Message-ID: <20140527104034.GB1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: xfs_readsb needs to check for magic numbers References: <1401143214-9181-1-git-send-email-david@fromorbit.com> <1401143214-9181-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401143214-9181-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1401187234 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.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.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, May 27, 2014 at 08:26:54AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Commit daba542 ("xfs: skip verification on initial "guess" > superblock read") dropped the use of a verifier for the initial > superblock read so we can probe the sector size of the filesystem > stored in the superblock. It, however, now fails to validate that > what was read initially is actually an XFS superblock and hence will > fail the sector size check and return ENOSYS. > > This causes probe-based mounts to fail because it expects XFS to > return EINVAL when it doesn't recognise the superblock format. Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:44:30 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 BDE5B7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:44:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6CC08AC004 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:44:30 -0700 (PDT) X-ASG-Debug-ID: 1401187468-04cb6c22b6158e30001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id IkLzukVfuXlFHL5v (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:44:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpErs-0002da-G6; Tue, 27 May 2014 10:44:28 +0000 Date: Tue, 27 May 2014 03:44:28 -0700 From: Christoph Hellwig <hch@infradead.org> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140527104428.GC1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400845950-41435-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401187468 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.6153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 07:52:28AM -0400, Brian Foster wrote: > The scan owner field represents an optional inode number that is > responsible for the current scan. The purpose is to identify that an > inode is under iolock and as such, the iolock shouldn't be attempted > when trimming eofblocks. This is an internal only field. xfs_free_eofblocks already does a trylock, and without that calling it from one iolock holding process to another would be a deadlock waiting to happen. I have to say I'm still not very easy with iolock nesting, even if it's a trylock. From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:44:48 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 38CE27F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:44:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EBED9AC004 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:44:47 -0700 (PDT) X-ASG-Debug-ID: 1401187486-04bdf059a0160dd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZOMtRiRHnRj4C8Da (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:44:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEsA-0002el-8i; Tue, 27 May 2014 10:44:46 +0000 Date: Tue, 27 May 2014 03:44:46 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill xfs_buf_geterror() Message-ID: <20140527104446.GD1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill xfs_buf_geterror() References: <1400802807-19936-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400802807-19936-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1401187486 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.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.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, May 23, 2014 at 09:53:27AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Most of the callers are just calling ASSERT(!xfs_buf_geterror()) > which means they are checking for bp->b_error == 0. If bp is null in > this case, we will assert fail, and hence it's no different in > result to oopsing because of a null bp. In some cases, errors have > already been checked for or the function returning the buffer can't > return a buffer with an error, so it's just a redundant assert. > Either way, the assert can either be removed. > > The other two non-assert callers can just test for a buffer and > error properly. Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:46:40 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E07E67F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:46:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8FC3CAC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:46:40 -0700 (PDT) X-ASG-Debug-ID: 1401187598-04cbb02a12151760001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id pvEuFfA043Tr0QFB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:46:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEty-0004Da-Ni; Tue, 27 May 2014 10:46:38 +0000 Date: Tue, 27 May 2014 03:46:38 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-ID: <20140527104638.GE1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401187599 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.6154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 10:03:38AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Because they aren't actually part of the on-disk format, and so > shouldn't be in xfs_da_format.h. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> Maybe it's time to rename the functions and types from xfs_dir2_* to xfs_da_* as we already do for some? If not this should stay in dir2 headers. From BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org Tue May 27 05:47:08 2014 Return-Path: <BATV+ef0a51d8461b114aec68+3929+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 2F1097F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:47:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4B5BAC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:47:07 -0700 (PDT) X-ASG-Debug-ID: 1401187625-04cb6c22b5159370001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id R268wAquTQeFaGe8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 03:47:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+ef0a51d8461b114aec68+3929+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 1WpEuP-0004i1-1D; Tue, 27 May 2014 10:47:05 +0000 Date: Tue, 27 May 2014 03:47:05 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Message-ID: <20140527104705.GF1440@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401187625 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.6153 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 23, 2014 at 10:03:39AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > They are just simple wrappers around xfs_dir2_byte_to_db(), and > we've already removed one usage earlier in the patch set. Kill > the rest before we start removing the xfs_mount from conversion > functions. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From bfoster@redhat.com Tue May 27 07:06:33 2014 Return-Path: <bfoster@redhat.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 ED89A7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 07:06:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A80618F8070 for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:06:29 -0700 (PDT) X-ASG-Debug-ID: 1401192385-04cb6c22b8160c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8iweVDbPemNFoEUK for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:06: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 (8.14.4/8.14.4) with ESMTP id s4RC6O1Q028620 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 08:06:24 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RC6NDt029152; Tue, 27 May 2014 08:06:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E188A1248A9; Tue, 27 May 2014 08:06:22 -0400 (EDT) Date: Tue, 27 May 2014 08:06:22 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 00/20] xfsprogs: introduce the free inode btree Message-ID: <20140527120621.GA63281@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v4 00/20] xfsprogs: introduce the free inode btree References: <1399465319-65066-1-git-send-email-bfoster@redhat.com> <20140526224033.GP18954@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526224033.GP18954@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401192385 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, May 27, 2014 at 08:40:33AM +1000, Dave Chinner wrote: > On Wed, May 07, 2014 at 08:21:39AM -0400, Brian Foster wrote: > > Hi all, > > > > Here's v4 of the finobt series for xfsprogs. Patches 1-10 are unchanged > > as they are based on the corresponding kernel patches, which have now > > been merged. > > > > v4 includes some fairly isolated fixes for mkfs and repair based on > > review feedback for v3: > > > > http://oss.sgi.com/archives/xfs/2014-04/msg00239.html > > > > Some concern was raised over xfs_repair performance based on the > > implementation of patch 17 in v3, so I have run a few repair tests on > > largish filesystems. Tests involved creating a large number of inodes on > > a 1TB 4xraid0, freeing a random percentage to populate the finobt and > > running xfs_repair (e.g., no actual corruptions). xfs_repair was run > > normally (with these patches) and with a change to skip the finobt > > processing via an xfs_sb_version_hasfinobt() hack. The tests were run on > > a 16xcpu, 32GB RAM server. > > I still have some concerns about this simply based on the algorithm > and that it will come back an bite us eventually, but for the moment > I think you've done enough to show that it's not going to an > immediate issue. > Fair enough, it's certainly not the most efficient thing. ;) I'm just hesitant to go and add more complex infrastructure and likely trade off the resource consumption here without a clear cost/benefit win for that approach. Very simple tests suggest we'd just be adding memory overhead. But of course, repair isn't always going to be running against clean and fairly new filesystems. Perhaps we'll see some different characteristics when this hits some more interesting situations and that will help determine how to optimize this algorithm. If anything comes up worth testing in this regard, I'm happy to dig into it... > I haven't seen anything else that needs fixing or causes problems, > so I'm going to merge it for 3.2.1. > Sounds good, thanks! Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Tue May 27 07:18:38 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 377887F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 07:18:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B91C7AC004 for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:18:34 -0700 (PDT) X-ASG-Debug-ID: 1401193113-04bdf059a1169890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gbAFde2xqmdyy1M0 for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:18: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RCICo6024274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 May 2014 08:18:12 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4RCIBiW022580; Tue, 27 May 2014 08:18:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 19B051248A9; Tue, 27 May 2014 08:18:11 -0400 (EDT) Date: Tue, 27 May 2014 08:18:11 -0400 From: Brian Foster <bfoster@redhat.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140527121810.GB63281@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> <20140527104428.GC1440@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527104428.GC1440@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401193113 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, May 27, 2014 at 03:44:28AM -0700, Christoph Hellwig wrote: > On Fri, May 23, 2014 at 07:52:28AM -0400, Brian Foster wrote: > > The scan owner field represents an optional inode number that is > > responsible for the current scan. The purpose is to identify that an > > inode is under iolock and as such, the iolock shouldn't be attempted > > when trimming eofblocks. This is an internal only field. > > xfs_free_eofblocks already does a trylock, and without that calling it > from one iolock holding process to another would be a deadlock waiting > to happen. > > I have to say I'm still not very easy with iolock nesting, even if it's > a trylock. > Right... maybe I'm not parsing your point. The purpose here is to avoid the trylock entirely. E.g., Indicate that we have already acquired the lock and can proceed with xfs_free_eofblocks(), rather than fail a trylock and skip (which appears to be a potential infinite loop scenario here due to how the AG walking code handles EAGAIN). Brian From bfoster@redhat.com Tue May 27 07:48:00 2014 Return-Path: <bfoster@redhat.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 049327F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 07:48:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B82DE8F8073 for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:47:59 -0700 (PDT) X-ASG-Debug-ID: 1401194878-04cbb02a1215ce70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id C6GnElRJQ8MMj99M for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:47: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RClv9X016070 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 08:47:57 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RClu76001736; Tue, 27 May 2014 08:47:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D887C1248A9; Tue, 27 May 2014 08:47:55 -0400 (EDT) Date: Tue, 27 May 2014 08:47:55 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140527124755.GC63281@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-3-git-send-email-bfoster@redhat.com> <20140526225755.GR18954@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140526225755.GR18954@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401194878 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, May 27, 2014 at 08:57:55AM +1000, Dave Chinner wrote: > On Fri, May 23, 2014 at 07:52:29AM -0400, Brian Foster wrote: > > Speculative preallocation and and the associated throttling metrics > > assume we're working with large files on large filesystems. Users have > > reported inefficiencies in these mechanisms when we happen to be dealing > > with large files on smaller filesystems. This can occur because while > > prealloc throttling is aggressive under low free space conditions, it is > > not active until we reach 5% free space or less. > > > > For example, a 40GB filesystem has enough space for several files large > > enough to have multi-GB preallocations at any given time. If those files > > are slow growing, they might reserve preallocation for long periods of > > time as well as avoid the background scanner due to frequent > > modification. If a new file is written under these conditions, said file > > has no access to this already reserved space and premature ENOSPC is > > imminent. > > > > To handle this scenario, modify the buffered write ENOSPC handling and > > retry sequence to invoke an eofblocks scan. In the smaller filesystem > > scenario, the eofblocks scan resets the usage of preallocation such that > > when the 5% free space threshold is met, throttling effectively takes > > over to provide fair and efficient preallocation until legitimate > > ENOSPC. > > > > The eofblocks scan is selective based on the nature of the failure. For > > example, an EDQUOT failure in a particular quota will use a filtered > > scan for that quota. Because we don't know which quota might have caused > > an allocation failure at any given time, we run a scan against each > > applicable quota determined to be under low free space conditions. > > > > Signed-off-by: Brian Foster <bfoster@redhat.com> > > --- > > fs/xfs/xfs_dquot.h | 15 +++++++++++++++ > > fs/xfs/xfs_file.c | 23 +++++++++++++++++++---- > > fs/xfs/xfs_icache.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > > fs/xfs/xfs_icache.h | 1 + > > 4 files changed, 82 insertions(+), 4 deletions(-) > > > > diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h > > index 68a68f7..c24c67e 100644 > > --- a/fs/xfs/xfs_dquot.h > > +++ b/fs/xfs/xfs_dquot.h > > @@ -139,6 +139,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) > > } > > } > > > > +/* > > + * Check whether a dquot is under low free space conditions. We assume the quota > > + * is enabled and enforced. > > + */ > > +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) > > +{ > > + int64_t freesp; > > + > > + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; > > + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) > > + return true; > > + > > + return false; > > +} > > + > > #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) > > #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) > > #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > index 1b8160d..2e0e73b 100644 > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -38,6 +38,7 @@ > > #include "xfs_trace.h" > > #include "xfs_log.h" > > #include "xfs_dinode.h" > > +#include "xfs_icache.h" > > > > #include <linux/aio.h> > > #include <linux/dcache.h> > > @@ -741,14 +742,28 @@ write_retry: > > ret = generic_perform_write(file, &from, pos); > > if (likely(ret >= 0)) > > iocb->ki_pos = pos + ret; > > + > > /* > > - * If we just got an ENOSPC, try to write back all dirty inodes to > > - * convert delalloc space to free up some of the excess reserved > > - * metadata space. > > + * If we hit a space limit, try to free up some lingering preallocated > > + * space before returning an error. In the case of ENOSPC, first try to > > + * write back all dirty inodes to free up some of the excess reserved > > + * metadata space. This reduces the chances that the eofblocks scan > > + * waits on dirty mappings. Since xfs_flush_inodes() is serialized, this > > + * also behaves as a filter to prevent too many eofblocks scans from > > + * running at the same time. > > */ > > - if (ret == -ENOSPC && !enospc) { > > + if (ret == -EDQUOT && !enospc) { > > + enospc = xfs_inode_free_quota_eofblocks(ip); > > + if (enospc) > > + goto write_retry; > > + } else if (ret == -ENOSPC && !enospc) { > > + struct xfs_eofblocks eofb = {0}; > > + > > enospc = 1; > > xfs_flush_inodes(ip->i_mount); > > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC; > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > goto write_retry; > > } > > > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > > index f4191f6..3cceb1b 100644 > > --- a/fs/xfs/xfs_icache.c > > +++ b/fs/xfs/xfs_icache.c > > @@ -33,6 +33,9 @@ > > #include "xfs_trace.h" > > #include "xfs_icache.h" > > #include "xfs_bmap_util.h" > > +#include "xfs_quota.h" > > +#include "xfs_dquot_item.h" > > +#include "xfs_dquot.h" > > > > #include <linux/kthread.h> > > #include <linux/freezer.h> > > @@ -1270,6 +1273,50 @@ xfs_icache_free_eofblocks( > > eofb, XFS_ICI_EOFBLOCKS_TAG); > > } > > > > +/* > > + * Run eofblocks scans on the quotas applicable to the inode. For inodes with > > + * multiple quotas, we don't know exactly which quota caused an allocation > > + * failure. We make a best effort by running scans for each quota considered > > + * to be under low free space conditions (less than 1% available free space). > > + */ > > +int > > +xfs_inode_free_quota_eofblocks( > > + struct xfs_inode *ip) > > +{ > > + int scanned = 0; > > + struct xfs_eofblocks eofb = {0,}; > > + struct xfs_dquot *dq; > > + > > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > > + > > + /* set the scan owner to avoid potential livelock */ > > + eofb.eof_scan_owner = ip->i_ino; > > + > > + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { > > + dq = xfs_inode_dquot(ip, XFS_DQ_USER); > > + if (dq && xfs_dquot_lowsp(dq)) { > > + eofb.eof_uid = VFS_I(ip)->i_uid; > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > + XFS_EOF_FLAGS_UID; > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > + scanned = 1; > > + } > > + } > > + > > + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { > > + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); > > + if (dq && xfs_dquot_lowsp(dq)) { > > + eofb.eof_gid = VFS_I(ip)->i_gid; > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > + XFS_EOF_FLAGS_GID; > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > + scanned = 1; > > + } > > + } > > Rather that doing two scans here, wouldn't it be more efficient > to do: > > eofb.eof_flags = XFS_EOF_FLAGS_SYNC; > scan = false; > if (uquota is low) { > eofb.eof_uid = VFS_I(ip)->i_uid; > eofb.eof_flags |= XFS_EOF_FLAGS_UID; > scan = true; > } > if (gquota is low) { > eofb.eof_gid = VFS_I(ip)->i_gid; > eofb.eof_flags |= XFS_EOF_FLAGS_GID; > scan = true; > } > if (scan) > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > and change xfs_inode_match_id() to be able to check against multiple > flags on a single inode? That way we only scan the inode cache > once, regardless of the number of quota types that are enabled and > are tracking low space thresholds. > Yeah, that would certainly be better from this perspective. We don't care so much about the characteristics of the inode as much as the quotas that are associated with it. If I recall, I was somewhat on the fence about this behavior when we first added the userspace interface here. IOWs, should the combination of flags define an intersection of the set of inodes to scan or a union? The more I think about it, I think the interface kind of suggests the former (from an interface/aesthetic perspective). E.g., I probably wouldn't expect to add a GID flag to a UID flag and have my scan become more broad, rather than more restrictive. Otherwise, the existence of a uid, gid and prid in the request structure seems kind of arbitrary (as opposed to a list/set of generic IDs, for example). I'm not against union behavior in general (and still probably not 100% against switching the default). I suppose another option could be to add a set of union/intersection flags that control the behavior here. I'd be slightly concerned about making this interface too convoluted, but it is a relatively low level thing, I suppose, without much generic use. We could also decide not to expose those extra controls to userspace for the time being. I need to think about this some more. Thoughts on any of that? Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Tue May 27 07:52:45 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AEDAD7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 07:52:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E430FAC002 for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:52:43 -0700 (PDT) X-ASG-Debug-ID: 1401195162-04cb6c22b8166990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1fxm8VWDARxTJlMe for <xfs@oss.sgi.com>; Tue, 27 May 2014 05:52: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RCqfI3007896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 May 2014 08:52:41 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4RCqeru006269; Tue, 27 May 2014 08:52:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 066281248A9; Tue, 27 May 2014 08:52:39 -0400 (EDT) Date: Tue, 27 May 2014 08:52:39 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC Message-ID: <20140527125239.GD63281@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfstests: test speculative preallocation reclaim on ENOSPC References: <1400849911-46606-1-git-send-email-bfoster@redhat.com> <20140527014215.GA6677@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527014215.GA6677@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401195162 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, May 27, 2014 at 11:42:15AM +1000, Dave Chinner wrote: > On Fri, May 23, 2014 at 08:58:31AM -0400, Brian Foster wrote: > > XFS can allocate significant amounts of space to files via speculative > > preallocation. Such preallocation may not be reclaimed automatically on > > file close() if a file is repeatedly opened and extended. For smaller > > filesystems with relatively large and slow growing files, this > > preallocation can linger for some time, including contributing to out of > > space conditions. > > > > Create a situation where an fs is near out of space while several files > > still have lingering, significant preallocations. Verify that new > > writers reclaim the preallocated space rather than return ENOSPC. > > > > Signed-off-by: Brian Foster <bfoster@redhat.com> > > --- > > > > Hi all, > > > > This test is associated with the recently posted eofblocks scan on > > ENOSPC series. It currently fails and should pass with the > > aforementioned patches applied. Thanks. > > > > Brian > > > > tests/xfs/014 | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/014.out | 95 ++++++++++++++++++++++++++++++++++++ > > tests/xfs/group | 1 + > > 3 files changed, 237 insertions(+) > > create mode 100755 tests/xfs/014 > > create mode 100644 tests/xfs/014.out > > > > diff --git a/tests/xfs/014 b/tests/xfs/014 > > new file mode 100755 > > index 0000000..53bc9e1 > > --- /dev/null > > +++ b/tests/xfs/014 > > @@ -0,0 +1,141 @@ > > +#!/bin/bash > > +# FS QA Test No. xfs/014 > > +# > > +# Test the behavior of XFS dynamic speculative preallocation at ENOSPC > > +# conditions. Speculative preallocation allocates post-EOF space to files as > > +# they are extended. This test creates conditions that bypass natural low space > > +# preallocation throttling and verifies that when no other space is available, > > +# writers reclaim the preallocated space and do not fail with premature ENOSPC. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2014 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! > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > + > > +_cleanup() > > +{ > > + cd / > > + umount $SCRATCH_MNT 2>/dev/null > > + rm -f $tmp.* > > +} > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +# create a file that is likely to retain speculative preallocation after close > > +_spec_prealloc_file() > > +{ > > + file=$1 > > + > > + rm -f $file > > + > > + # a few file extending open-write-close cycles should be enough to > > + # trigger the fs to retain preallocation. write 256k in 32k intervals to > > + # be sure > > + for i in $(seq 0 32768 262144) > > + do > > + $XFS_IO_PROG -fc "pwrite $i 32k" $file | _filter_xfs_io > > + done > > + > > + # write a 4k aligned amount of data to keep the calculations simple > > + $XFS_IO_PROG -c "pwrite 0 128m" $file | _filter_xfs_io > > + > > + size=`stat -c "%s" $file` > > + blocks=`stat -c "%b" $file` > > + blocksize=`stat -c "%B" $file` > > + > > + prealloc_size=$((blocks * blocksize - size)) > > + if [ $prealloc_size -eq 0 ] > > + then > > + echo "Warning: No speculative preallocation for $file." \ > > + "Check use of the allocsize= mount option." > > + fi > > + > > + # keep a running total of how much preallocation we've created > > + TOTAL_PREALLOC=$((TOTAL_PREALLOC + prealloc_size)) > > +} > > + > > +_consume_free_space() > > +{ > > + dir=$1 > > + > > + # calculate the rough amount of free space in MB > > + fsblocksize=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bsize | \ > > + awk '{ print $3 }'` > > + blocksavail=`$XFS_IO_PROG -x -c "statfs" $dir | grep f_bavail | \ > > + awk '{ print $3 }'` > > + freesp=$((fsblocksize * blocksavail / 1024 / 1024)) > > + > > + # allocate all but 10MB > > + freesp=$((freesp - 10)) > > + $XFS_IO_PROG -fc "falloc 0 ${freesp}M" $dir/spc > > +} > > + > > +# real QA test starts here > > +_supported_fs xfs > > +_supported_os Linux > > + > > +_require_scratch > > +_require_xfs_io_command "falloc" > > + > > +rm -f $seqres.full > > + > > +# 10GB fs > > +_scratch_mkfs_xfs_opts "-d size=$((1024*1024*1024 * 10))" | \ > > + _filter_mkfs 2>> $seqres.full > > Which will fail on a few of my test machines because they only have > 4GB scratch devices (ram disks). > > What I think is better here is to use a sparse file on the scratch > device and mount via loopback. Most of the space is being used by > fallocate, so it will never get written. hence this test will fit in > most scratch devices without needing to worry about the size of the > filesystem being tested.... > Good idea. This test should work just as well with that approach. > > +_scratch_mount > > + > > +# make sure the background eofblocks scanner doesn't interfere > > +orig_sp_time=`cat /proc/sys/fs/xfs/speculative_prealloc_lifetime` > > +echo 9999 > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > + > > +# create a few files with relatively significant preallocation > > +TOTAL_PREALLOC=0 > > +for i in $(seq 0 3) > > +do > > + _spec_prealloc_file $SCRATCH_MNT/pre$i > > +done > > + > > +# consume most of the remaining free space in the fs to put us near ENOSPC > > +_consume_free_space $SCRATCH_MNT > > + > > +# start a few background writers to consume the bulk of the space that has been > > +# previously preallocated to other files. this space should be reclaimed such > > +# these writers complete without hitting ENOSPC > > +write_size=$((TOTAL_PREALLOC / 2 / 4)) > > +for i in $(seq 0 3) > > +do > > + $XFS_IO_PROG -fc "pwrite 0 $write_size" $SCRATCH_MNT/file.$i | \ > > + _filter_xfs_io & > > +done > > +wait > > + > > +echo $orig_sp_time > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > +umount $SCRATCH_MNT > > I'd recommend checking the filesystem here as well. > Ok, thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Tue May 27 10:59:43 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 21CBA7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 10:59:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63F31AC00A for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59:42 -0700 (PDT) X-ASG-Debug-ID: 1401206376-04cbb02a0f1715d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fBjkW0vyzSIJjZso for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxSAv005578 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 11:59:28 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxRxN015934; Tue, 27 May 2014 11:59:28 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 8BA5F120AC1; Tue, 27 May 2014 11:59:27 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RFxQCc011647; Tue, 27 May 2014 11:59:26 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 11:59:26 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry Message-ID: <20140527155925.GA11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401206376 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, May 23, 2014 at 10:03:45AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- There's a couple places in xfs_dir2_block.c where we dig into the mount for m_dir_geo rather than pass through args. Those should be easy to find if we want to fix them up later on... Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_da_btree.c | 4 ++-- > fs/xfs/xfs_da_btree.h | 8 ++++---- > fs/xfs/xfs_da_format.c | 36 ++++++++++++++++++------------------ > fs/xfs/xfs_dir2.c | 5 ++--- > fs/xfs/xfs_dir2.h | 10 ++++++---- > fs/xfs/xfs_dir2_block.c | 32 ++++++++++++++++---------------- > fs/xfs/xfs_dir2_data.c | 17 ++++++++++------- > fs/xfs/xfs_dir2_leaf.c | 35 ++++++++++++++++++----------------- > fs/xfs/xfs_dir2_node.c | 42 ++++++++++++++++++++++-------------------- > fs/xfs/xfs_dir2_readdir.c | 11 +++++------ > fs/xfs/xfs_dir2_sf.c | 14 ++++++++------ > fs/xfs/xfs_fsops.c | 4 +++- > fs/xfs/xfs_mount.h | 1 - > fs/xfs/xfs_trans_resv.c | 2 +- > 14 files changed, 115 insertions(+), 106 deletions(-) > > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index 4d0a1e8..b9b007d 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -2169,8 +2169,8 @@ xfs_da3_swap_lastblock( > /* > * Copy the last block into the dead buffer and log it. > */ > - memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); > - xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); > + memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); > + xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); > dead_info = dead_buf->b_addr; > /* > * Get values from the moved block. > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index d35b31f..3fdc358 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -277,17 +277,17 @@ xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) > * Directory tail pointer accessor functions. Based on block geometry. > */ > static inline struct xfs_dir2_block_tail * > -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) > +xfs_dir2_block_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_data_hdr *hdr) > { > return ((struct xfs_dir2_block_tail *) > - ((char *)hdr + mp->m_dirblksize)) - 1; > + ((char *)hdr + geo->blksize)) - 1; > } > > static inline struct xfs_dir2_leaf_tail * > -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) > +xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp) > { > return (struct xfs_dir2_leaf_tail *) > - ((char *)lp + mp->m_dirblksize - > + ((char *)lp + geo->blksize - > sizeof(struct xfs_dir2_leaf_tail)); > } > > diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c > index c782f2c..d70c05b 100644 > --- a/fs/xfs/xfs_da_format.c > +++ b/fs/xfs/xfs_da_format.c > @@ -426,9 +426,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) > * Directory Leaf block operations > */ > static int > -xfs_dir2_max_leaf_ents(struct xfs_mount *mp) > +xfs_dir2_max_leaf_ents(struct xfs_da_geometry *geo) > { > - return (mp->m_dirblksize - sizeof(struct xfs_dir2_leaf_hdr)) / > + return (geo->blksize - sizeof(struct xfs_dir2_leaf_hdr)) / > (uint)sizeof(struct xfs_dir2_leaf_entry); > } > > @@ -439,9 +439,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) > } > > static int > -xfs_dir3_max_leaf_ents(struct xfs_mount *mp) > +xfs_dir3_max_leaf_ents(struct xfs_da_geometry *geo) > { > - return (mp->m_dirblksize - sizeof(struct xfs_dir3_leaf_hdr)) / > + return (geo->blksize - sizeof(struct xfs_dir3_leaf_hdr)) / > (uint)sizeof(struct xfs_dir2_leaf_entry); > } > > @@ -592,9 +592,9 @@ xfs_da3_node_hdr_to_disk( > * Directory free space block operations > */ > static int > -xfs_dir2_free_max_bests(struct xfs_mount *mp) > +xfs_dir2_free_max_bests(struct xfs_da_geometry *geo) > { > - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / > + return (geo->blksize - sizeof(struct xfs_dir2_free_hdr)) / > sizeof(xfs_dir2_data_off_t); > } > > @@ -608,25 +608,25 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) > * Convert data space db to the corresponding free db. > */ > static xfs_dir2_db_t > -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > +xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > { > - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + > - (db / xfs_dir2_free_max_bests(mp)); > + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + > + (db / xfs_dir2_free_max_bests(geo)); > } > > /* > * Convert data space db to the corresponding index in a free db. > */ > static int > -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) > +xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > { > - return db % xfs_dir2_free_max_bests(mp); > + return db % xfs_dir2_free_max_bests(geo); > } > > static int > -xfs_dir3_free_max_bests(struct xfs_mount *mp) > +xfs_dir3_free_max_bests(struct xfs_da_geometry *geo) > { > - return (mp->m_dirblksize - sizeof(struct xfs_dir3_free_hdr)) / > + return (geo->blksize - sizeof(struct xfs_dir3_free_hdr)) / > sizeof(xfs_dir2_data_off_t); > } > > @@ -640,19 +640,19 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) > * Convert data space db to the corresponding free db. > */ > static xfs_dir2_db_t > -xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) > +xfs_dir3_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > { > - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + > - (db / xfs_dir3_free_max_bests(mp)); > + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + > + (db / xfs_dir3_free_max_bests(geo)); > } > > /* > * Convert data space db to the corresponding index in a free db. > */ > static int > -xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) > +xfs_dir3_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) > { > - return db % xfs_dir3_free_max_bests(mp); > + return db % xfs_dir3_free_max_bests(geo); > } > > static void > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 200c9c4..be7ad35 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -145,7 +145,6 @@ xfs_da_mount( > mp->m_dirnameops = &xfs_default_nameops; > > /* XXX: these are to be removed as code is converted to use geo */ > - mp->m_dirblksize = mp->m_dir_geo->blksize; > mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > @@ -657,8 +656,8 @@ xfs_dir2_isblock( > mp = dp->i_mount; > if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > return rval; > - rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; > - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); > + rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; > + ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); > *vp = rval; > return 0; > } > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index 7b09ef0..85f6be6 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -80,7 +80,7 @@ struct xfs_dir_ops { > struct xfs_dir3_icleaf_hdr *from); > void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, > struct xfs_dir2_leaf *from); > - int (*leaf_max_ents)(struct xfs_mount *mp); > + int (*leaf_max_ents)(struct xfs_da_geometry *geo); > struct xfs_dir2_leaf_entry * > (*leaf_ents_p)(struct xfs_dir2_leaf *lp); > > @@ -97,10 +97,12 @@ struct xfs_dir_ops { > struct xfs_dir3_icfree_hdr *from); > void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, > struct xfs_dir2_free *from); > - int (*free_max_bests)(struct xfs_mount *mp); > + int (*free_max_bests)(struct xfs_da_geometry *geo); > __be16 * (*free_bests_p)(struct xfs_dir2_free *free); > - xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db); > - int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db); > + xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, > + xfs_dir2_db_t db); > + int (*db_to_fdindex)(struct xfs_da_geometry *geo, > + xfs_dir2_db_t db); > }; > > extern const struct xfs_dir_ops * > diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c > index d950cde..4204df9 100644 > --- a/fs/xfs/xfs_dir2_block.c > +++ b/fs/xfs/xfs_dir2_block.c > @@ -377,7 +377,7 @@ xfs_dir2_block_addname( > * Set up pointers to parts of the block. > */ > hdr = bp->b_addr; > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > > /* > @@ -581,7 +581,7 @@ xfs_dir2_block_log_leaf( > xfs_dir2_leaf_entry_t *blp; > xfs_dir2_block_tail_t *btp; > > - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); > + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), > (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); > @@ -598,7 +598,7 @@ xfs_dir2_block_log_tail( > xfs_dir2_data_hdr_t *hdr = bp->b_addr; > xfs_dir2_block_tail_t *btp; > > - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); > + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); > xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), > (uint)((char *)(btp + 1) - (char *)hdr - 1)); > } > @@ -633,7 +633,7 @@ xfs_dir2_block_lookup( > mp = dp->i_mount; > hdr = bp->b_addr; > xfs_dir3_data_check(dp, bp); > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > /* > * Get the offset from the leaf entry, to point to the data. > @@ -686,7 +686,7 @@ xfs_dir2_block_lookup_int( > > hdr = bp->b_addr; > xfs_dir3_data_check(dp, bp); > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > /* > * Loop doing a binary search for our hash value. > @@ -791,7 +791,7 @@ xfs_dir2_block_removename( > tp = args->trans; > mp = dp->i_mount; > hdr = bp->b_addr; > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > /* > * Point to the data entry using the leaf entry. > @@ -867,7 +867,7 @@ xfs_dir2_block_replace( > dp = args->dp; > mp = dp->i_mount; > hdr = bp->b_addr; > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > /* > * Point to the data entry we need to change. > @@ -941,7 +941,7 @@ xfs_dir2_leaf_to_block( > leaf = lbp->b_addr; > dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); > ents = dp->d_ops->leaf_ents_p(leaf); > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > > ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || > leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); > @@ -951,13 +951,13 @@ xfs_dir2_leaf_to_block( > * been left behind during no-space-reservation operations. > * These will show up in the leaf bests table. > */ > - while (dp->i_d.di_size > mp->m_dirblksize) { > + while (dp->i_d.di_size > args->geo->blksize) { > int hdrsz; > > hdrsz = dp->d_ops->data_entry_offset; > bestsp = xfs_dir2_leaf_bests_p(ltp); > if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == > - mp->m_dirblksize - hdrsz) { > + args->geo->blksize - hdrsz) { > if ((error = > xfs_dir2_leaf_trim_data(args, lbp, > (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) > @@ -985,7 +985,7 @@ xfs_dir2_leaf_to_block( > /* > * Look at the last data entry. > */ > - tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; > + tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1; > dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); > /* > * If it's not free or is too short we can't do it. > @@ -1004,12 +1004,12 @@ xfs_dir2_leaf_to_block( > /* > * Use up the space at the end of the block (blp/btp). > */ > - xfs_dir2_data_use_free(tp, dp, dbp, dup, mp->m_dirblksize - size, size, > + xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, > &needlog, &needscan); > /* > * Initialize the block tail. > */ > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); > btp->stale = 0; > xfs_dir2_block_log_tail(tp, dbp); > @@ -1143,13 +1143,13 @@ xfs_dir2_sf_to_block( > */ > dup = dp->d_ops->data_unused_p(hdr); > needlog = needscan = 0; > - xfs_dir2_data_use_free(tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, > - &needscan); > + xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, > + i, &needlog, &needscan); > ASSERT(needscan == 0); > /* > * Fill in the tail. > */ > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ > btp->stale = 0; > blp = xfs_dir2_block_leaf_p(btp); > diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c > index 6c23f86..b73d61a 100644 > --- a/fs/xfs/xfs_dir2_data.c > +++ b/fs/xfs/xfs_dir2_data.c > @@ -80,7 +80,7 @@ __xfs_dir3_data_check( > switch (hdr->magic) { > case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): > case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(geo, hdr); > lep = xfs_dir2_block_leaf_p(btp); > endp = (char *)lep; > > @@ -96,7 +96,7 @@ __xfs_dir3_data_check( > break; > case cpu_to_be32(XFS_DIR3_DATA_MAGIC): > case cpu_to_be32(XFS_DIR2_DATA_MAGIC): > - endp = (char *)hdr + mp->m_dirblksize; > + endp = (char *)hdr + geo->blksize; > break; > default: > XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); > @@ -511,6 +511,7 @@ xfs_dir2_data_freescan( > struct xfs_dir2_data_free *bf; > char *endp; /* end of block's data */ > char *p; /* current entry pointer */ > + struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; > > ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || > @@ -529,10 +530,10 @@ xfs_dir2_data_freescan( > p = (char *)dp->d_ops->data_entry_p(hdr); > if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { > - btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); > + btp = xfs_dir2_block_tail_p(geo, hdr); > endp = (char *)xfs_dir2_block_leaf_p(btp); > } else > - endp = (char *)hdr + dp->i_mount->m_dirblksize; > + endp = (char *)hdr + geo->blksize; > /* > * Loop over the block's entries. > */ > @@ -622,7 +623,7 @@ xfs_dir3_data_init( > dup = dp->d_ops->data_unused_p(hdr); > dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); > > - t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset; > + t = args->geo->blksize - (uint)dp->d_ops->data_entry_offset; > bf[0].length = cpu_to_be16(t); > dup->length = cpu_to_be16(t); > *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); > @@ -732,22 +733,24 @@ xfs_dir2_data_make_free( > xfs_dir2_data_unused_t *postdup; /* unused entry after us */ > xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ > struct xfs_dir2_data_free *bf; > + struct xfs_da_geometry *geo; > > mp = tp->t_mountp; > hdr = bp->b_addr; > + geo = mp->m_dir_geo; > > /* > * Figure out where the end of the data area is. > */ > if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) > - endptr = (char *)hdr + mp->m_dirblksize; > + endptr = (char *)hdr + geo->blksize; > else { > xfs_dir2_block_tail_t *btp; /* block tail */ > > ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(geo, hdr); > endptr = (char *)xfs_dir2_block_leaf_p(btp); > } > /* > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index a1f1310..e517bd0 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -92,6 +92,7 @@ xfs_dir3_leaf_check_int( > int i; > const struct xfs_dir_ops *ops; > struct xfs_dir3_icleaf_hdr leafhdr; > + struct xfs_da_geometry *geo = mp->m_dir_geo; > > /* > * we can be passed a null dp here from a verifier, so we need to go the > @@ -105,14 +106,14 @@ xfs_dir3_leaf_check_int( > } > > ents = ops->leaf_ents_p(leaf); > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(geo, leaf); > > /* > * XXX (dgc): This value is not restrictive enough. > * Should factor in the size of the bests table as well. > * We can deduce a value for that from di_size. > */ > - if (hdr->count > ops->leaf_max_ents(mp)) > + if (hdr->count > ops->leaf_max_ents(geo)) > return false; > > /* Leaves and bests don't overlap in leaf format. */ > @@ -323,7 +324,7 @@ xfs_dir3_leaf_init( > if (type == XFS_DIR2_LEAF1_MAGIC) { > struct xfs_dir2_leaf_tail *ltp; > > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); > ltp->bestcount = 0; > bp->b_ops = &xfs_dir3_leaf1_buf_ops; > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); > @@ -415,7 +416,7 @@ xfs_dir2_block_to_leaf( > leaf = lbp->b_addr; > hdr = dbp->b_addr; > xfs_dir3_data_check(dp, dbp); > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > bf = dp->d_ops->data_bestfree_p(hdr); > ents = dp->d_ops->leaf_ents_p(leaf); > @@ -443,7 +444,7 @@ xfs_dir2_block_to_leaf( > */ > xfs_dir2_data_make_free(tp, dp, dbp, > (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), > - (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - > + (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - > (char *)blp), > &needlog, &needscan); > /* > @@ -461,7 +462,7 @@ xfs_dir2_block_to_leaf( > /* > * Set up leaf tail and bests table. > */ > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > ltp->bestcount = cpu_to_be32(1); > bestsp = xfs_dir2_leaf_bests_p(ltp); > bestsp[0] = bf[0].length; > @@ -653,7 +654,7 @@ xfs_dir2_leaf_addname( > */ > index = xfs_dir2_leaf_search_hash(args, lbp); > leaf = lbp->b_addr; > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > ents = dp->d_ops->leaf_ents_p(leaf); > dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); > bestsp = xfs_dir2_leaf_bests_p(ltp); > @@ -1066,7 +1067,7 @@ xfs_dir3_leaf_log_bests( > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); > > - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); > + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); > firstb = xfs_dir2_leaf_bests_p(ltp) + first; > lastb = xfs_dir2_leaf_bests_p(ltp) + last; > xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), > @@ -1138,9 +1139,9 @@ xfs_dir3_leaf_log_tail( > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); > xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), > - (uint)(mp->m_dirblksize - 1)); > + (uint)(mp->m_dir_geo->blksize - 1)); > } > > /* > @@ -1388,7 +1389,7 @@ xfs_dir2_leaf_removename( > xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); > needscan = needlog = 0; > oldbest = be16_to_cpu(bf[0].length); > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > bestsp = xfs_dir2_leaf_bests_p(ltp); > ASSERT(be16_to_cpu(bestsp[db]) == oldbest); > /* > @@ -1428,7 +1429,7 @@ xfs_dir2_leaf_removename( > * If the data block is now empty then get rid of the data block. > */ > if (be16_to_cpu(bf[0].length) == > - mp->m_dirblksize - dp->d_ops->data_entry_offset) { > + args->geo->blksize - dp->d_ops->data_entry_offset) { > ASSERT(db != args->geo->datablk); > if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { > /* > @@ -1618,7 +1619,7 @@ xfs_dir2_leaf_trim_data( > return error; > > leaf = lbp->b_addr; > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > > #ifdef DEBUG > { > @@ -1628,7 +1629,7 @@ xfs_dir2_leaf_trim_data( > ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); > ASSERT(be16_to_cpu(bf[0].length) == > - mp->m_dirblksize - dp->d_ops->data_entry_offset); > + args->geo->blksize - dp->d_ops->data_entry_offset); > ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); > } > #endif > @@ -1740,7 +1741,7 @@ xfs_dir2_node_to_leaf( > /* > * If it's not the single leaf block, give up. > */ > - if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) > + if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize) > return 0; > lbp = state->path.blk[0].bp; > leaf = lbp->b_addr; > @@ -1764,7 +1765,7 @@ xfs_dir2_node_to_leaf( > * Now see if the leafn and free data will fit in a leaf1. > * If not, release the buffer and give up. > */ > - if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { > + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) { > xfs_trans_brelse(tp, fbp); > return 0; > } > @@ -1784,7 +1785,7 @@ xfs_dir2_node_to_leaf( > /* > * Set up the leaf tail from the freespace block. > */ > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > ltp->bestcount = cpu_to_be32(freehdr.nvalid); > > /* > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 89777bf..ef34c19 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -327,9 +327,9 @@ xfs_dir2_leaf_to_node( > free = fbp->b_addr; > dp->d_ops->free_hdr_from_disk(&freehdr, free); > leaf = lbp->b_addr; > - ltp = xfs_dir2_leaf_tail_p(mp, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > ASSERT(be32_to_cpu(ltp->bestcount) <= > - (uint)dp->i_d.di_size / mp->m_dirblksize); > + (uint)dp->i_d.di_size / args->geo->blksize); > > /* > * Copy freespace entries from the leaf block to the new block. > @@ -416,7 +416,7 @@ xfs_dir2_leafn_add( > * a compact. > */ > > - if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { > + if (leafhdr.count == dp->d_ops->leaf_max_ents(args->geo)) { > if (!leafhdr.stale) > return XFS_ERROR(ENOSPC); > compact = leafhdr.stale > 1; > @@ -472,7 +472,8 @@ xfs_dir2_free_hdr_check( > > dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); > > - ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0); > + ASSERT((hdr.firstdb % > + dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0); > ASSERT(hdr.firstdb <= db); > ASSERT(db < hdr.firstdb + hdr.nvalid); > } > @@ -595,7 +596,7 @@ xfs_dir2_leafn_lookup_for_addname( > * Convert the data block to the free block > * holding its freespace information. > */ > - newfdb = dp->d_ops->db_to_fdb(mp, newdb); > + newfdb = dp->d_ops->db_to_fdb(args->geo, newdb); > /* > * If it's not the one we have in hand, read it in. > */ > @@ -619,7 +620,7 @@ xfs_dir2_leafn_lookup_for_addname( > /* > * Get the index for our entry. > */ > - fi = dp->d_ops->db_to_fdindex(mp, curdb); > + fi = dp->d_ops->db_to_fdindex(args->geo, curdb); > /* > * If it has room, return it. > */ > @@ -1251,7 +1252,7 @@ xfs_dir2_leafn_remove( > * Convert the data block number to a free block, > * read in the free block. > */ > - fdb = dp->d_ops->db_to_fdb(mp, db); > + fdb = dp->d_ops->db_to_fdb(args->geo, db); > error = xfs_dir2_free_read(tp, dp, > xfs_dir2_db_to_da(args->geo, fdb), > &fbp); > @@ -1262,7 +1263,7 @@ xfs_dir2_leafn_remove( > { > struct xfs_dir3_icfree_hdr freehdr; > dp->d_ops->free_hdr_from_disk(&freehdr, free); > - ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * > + ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(args->geo) * > (fdb - xfs_dir2_byte_to_db(args->geo, > XFS_DIR2_FREE_OFFSET))); > } > @@ -1270,13 +1271,13 @@ xfs_dir2_leafn_remove( > /* > * Calculate which entry we need to fix. > */ > - findex = dp->d_ops->db_to_fdindex(mp, db); > + findex = dp->d_ops->db_to_fdindex(args->geo, db); > longest = be16_to_cpu(bf[0].length); > /* > * If the data block is now empty we can get rid of it > * (usually). > */ > - if (longest == mp->m_dirblksize - > + if (longest == args->geo->blksize - > dp->d_ops->data_entry_offset) { > /* > * Try to punch out the data block. > @@ -1595,7 +1596,7 @@ xfs_dir2_node_addname( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->mp->m_dirblksize; > + state->blocksize = state->args->geo->blksize; > state->node_ents = state->mp->m_dir_node_ents; > /* > * Look up the name. We're not supposed to find it, but > @@ -1843,7 +1844,7 @@ xfs_dir2_node_addname_int( > * Get the freespace block corresponding to the data block > * that was just allocated. > */ > - fbno = dp->d_ops->db_to_fdb(mp, dbno); > + fbno = dp->d_ops->db_to_fdb(args->geo, dbno); > error = xfs_dir2_free_try_read(tp, dp, > xfs_dir2_db_to_da(args->geo, fbno), > &fbp); > @@ -1860,12 +1861,13 @@ xfs_dir2_node_addname_int( > if (error) > return error; > > - if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) { > + if (dp->d_ops->db_to_fdb(args->geo, dbno) != fbno) { > xfs_alert(mp, > "%s: dir ino %llu needed freesp block %lld for\n" > " data block %lld, got %lld ifbno %llu lastfbno %d", > __func__, (unsigned long long)dp->i_ino, > - (long long)dp->d_ops->db_to_fdb(mp, dbno), > + (long long)dp->d_ops->db_to_fdb( > + args->geo, dbno), > (long long)dbno, (long long)fbno, > (unsigned long long)ifbno, lastfbno); > if (fblk) { > @@ -1899,7 +1901,7 @@ xfs_dir2_node_addname_int( > freehdr.firstdb = > (fbno - xfs_dir2_byte_to_db(args->geo, > XFS_DIR2_FREE_OFFSET)) * > - dp->d_ops->free_max_bests(mp); > + dp->d_ops->free_max_bests(args->geo); > } else { > free = fbp->b_addr; > bests = dp->d_ops->free_bests_p(free); > @@ -1909,13 +1911,13 @@ xfs_dir2_node_addname_int( > /* > * Set the freespace block index from the data block number. > */ > - findex = dp->d_ops->db_to_fdindex(mp, dbno); > + findex = dp->d_ops->db_to_fdindex(args->geo, dbno); > /* > * If it's after the end of the current entries in the > * freespace block, extend that table. > */ > if (findex >= freehdr.nvalid) { > - ASSERT(findex < dp->d_ops->free_max_bests(mp)); > + ASSERT(findex < dp->d_ops->free_max_bests(args->geo)); > freehdr.nvalid = findex + 1; > /* > * Tag new entry so nused will go up. > @@ -2040,7 +2042,7 @@ xfs_dir2_node_lookup( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->mp->m_dirblksize; > + state->blocksize = args->geo->blksize; > state->node_ents = state->mp->m_dir_node_ents; > /* > * Fill in the path to the entry in the cursor. > @@ -2095,7 +2097,7 @@ xfs_dir2_node_removename( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->mp->m_dirblksize; > + state->blocksize = args->geo->blksize; > state->node_ents = state->mp->m_dir_node_ents; > > /* Look up the entry we're deleting, set up the cursor. */ > @@ -2165,7 +2167,7 @@ xfs_dir2_node_replace( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->mp->m_dirblksize; > + state->blocksize = args->geo->blksize; > state->node_ents = state->mp->m_dir_node_ents; > inum = args->inumber; > /* > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index 8cb5340..fa393d5 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -216,7 +216,7 @@ xfs_dir2_block_getdents( > /* > * Set up values for the loop. > */ > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(geo, hdr); > ptr = (char *)dp->d_ops->data_entry_p(hdr); > endptr = (char *)xfs_dir2_block_leaf_p(btp); > > @@ -338,7 +338,7 @@ xfs_dir2_leaf_readbuf( > /* > * Recalculate the readahead blocks wanted. > */ > - mip->ra_want = howmany(bufsize + mp->m_dirblksize, > + mip->ra_want = howmany(bufsize + geo->blksize, > mp->m_sb.sb_blocksize) - 1; > ASSERT(mip->ra_want >= 0); > > @@ -526,8 +526,7 @@ xfs_dir2_leaf_getdents( > * buffer size, the directory block size, and the filesystem > * block size. > */ > - length = howmany(bufsize + mp->m_dirblksize, > - mp->m_sb.sb_blocksize); > + length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); > map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + > (length * sizeof(struct xfs_bmbt_irec)), > KM_SLEEP | KM_NOFS); > @@ -557,7 +556,7 @@ xfs_dir2_leaf_getdents( > * If we have no buffer, or we're off the end of the > * current buffer, need to get another one. > */ > - if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { > + if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { > > error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, > &curoff, &bp); > @@ -618,7 +617,7 @@ xfs_dir2_leaf_getdents( > xfs_dir2_db_off_to_byte(geo, > xfs_dir2_byte_to_db(geo, curoff), > (char *)ptr - (char *)hdr); > - if (ptr >= (char *)hdr + mp->m_dirblksize) { > + if (ptr >= (char *)hdr + geo->blksize) { > continue; > } > } > diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c > index 10f4c2a..53c3be6 100644 > --- a/fs/xfs/xfs_dir2_sf.c > +++ b/fs/xfs/xfs_dir2_sf.c > @@ -82,8 +82,10 @@ xfs_dir2_block_sfsize( > xfs_ino_t parent = 0; /* parent inode number */ > int size=0; /* total computed size */ > int has_ftype; > + struct xfs_da_geometry *geo; > > mp = dp->i_mount; > + geo = mp->m_dir_geo; > > /* > * if there is a filetype field, add the extra byte to the namelen > @@ -92,7 +94,7 @@ xfs_dir2_block_sfsize( > has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; > > count = i8count = namelen = 0; > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(geo, hdr); > blp = xfs_dir2_block_leaf_p(btp); > > /* > @@ -105,7 +107,7 @@ xfs_dir2_block_sfsize( > * Calculate the pointer to the entry at hand. > */ > dep = (xfs_dir2_data_entry_t *)((char *)hdr + > - xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); > + xfs_dir2_dataptr_to_off(geo, addr)); > /* > * Detect . and .., so we can special-case them. > * . is not included in sf directories. > @@ -195,7 +197,7 @@ xfs_dir2_block_to_sf( > /* > * Set up to loop over the block's entries. > */ > - btp = xfs_dir2_block_tail_p(mp, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > ptr = (char *)dp->d_ops->data_entry_p(hdr); > endptr = (char *)xfs_dir2_block_leaf_p(btp); > sfep = xfs_dir2_sf_firstentry(sfp); > @@ -586,7 +588,7 @@ xfs_dir2_sf_addname_pick( > * we'll go back, convert to block, then try the insert and convert > * to leaf. > */ > - if (used + (holefit ? 0 : size) > mp->m_dirblksize) > + if (used + (holefit ? 0 : size) > args->geo->blksize) > return 0; > /* > * If changing the inode number size, do it the hard way. > @@ -601,7 +603,7 @@ xfs_dir2_sf_addname_pick( > /* > * If it won't fit at the end then do it the hard way (use the hole). > */ > - if (used + size > mp->m_dirblksize) > + if (used + size > args->geo->blksize) > return 2; > /* > * Do it the easy way. > @@ -652,7 +654,7 @@ xfs_dir2_sf_check( > ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); > ASSERT(offset + > (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + > - (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); > + (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); > } > #endif /* DEBUG */ > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 97886a7..d229556 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -24,6 +24,8 @@ > #include "xfs_sb.h" > #include "xfs_ag.h" > #include "xfs_mount.h" > +#include "xfs_da_format.h" > +#include "xfs_da_btree.h" > #include "xfs_inode.h" > #include "xfs_trans.h" > #include "xfs_inode_item.h" > @@ -105,7 +107,7 @@ xfs_fs_geometry( > geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? > mp->m_sb.sb_logsectsize : BBSIZE; > geo->rtsectsize = mp->m_sb.sb_blocksize; > - geo->dirblocksize = mp->m_dirblksize; > + geo->dirblocksize = mp->m_dir_geo->blksize; > } > if (new_version >= 4) { > geo->flags |= > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 275fed3..bf108a7 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -154,7 +154,6 @@ typedef struct xfs_mount { > const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ > const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ > const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ > - int m_dirblksize; /* directory block sz--bytes */ > uint m_chsize; /* size of next field */ > atomic_t m_active_trans; /* number trans frozen */ > #ifdef HAVE_PERCPU_SB > diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c > index 63a42a1..f2bda7c 100644 > --- a/fs/xfs/xfs_trans_resv.c > +++ b/fs/xfs/xfs_trans_resv.c > @@ -610,7 +610,7 @@ xfs_calc_addafork_reservation( > return XFS_DQUOT_LOGRES(mp) + > xfs_calc_inode_res(mp, 1) + > xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + > - xfs_calc_buf_res(1, mp->m_dirblksize) + > + xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + > xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, > XFS_FSB_TO_B(mp, 1)) + > xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 10:59:45 2014 Return-Path: <bfoster@redhat.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 C39777F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 10:59:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9BDF48F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59:42 -0700 (PDT) X-ASG-Debug-ID: 1401206378-04bdf0599f183970001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YtDeuEgx4rITJm3X for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxaOO015025 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 11:59:37 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxaXl028670; Tue, 27 May 2014 11:59:36 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 2A272120AC1; Tue, 27 May 2014 11:59:36 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RFxZh6011655; Tue, 27 May 2014 11:59:35 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 11:59:35 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry Message-ID: <20140527155934.GB11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-11-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401206378 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, May 23, 2014 at 10:03:46AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_attr_leaf.c | 2 +- > fs/xfs/xfs_dir2.c | 2 -- > fs/xfs/xfs_dir2_node.c | 2 +- > fs/xfs/xfs_mount.h | 2 -- > 4 files changed, 2 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 2c0fdc8..5be77b3 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1949,7 +1949,7 @@ xfs_attr3_leaf_remove( > tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + > ichdr.count * sizeof(xfs_attr_leaf_entry_t); > > - return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ > + return tmp < args->geo->magicpct; /* leaf is < 37% full */ > } > > /* > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index be7ad35..0230342 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -146,9 +146,7 @@ xfs_da_mount( > > /* XXX: these are to be removed as code is converted to use geo */ > mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > - mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > - mp->m_attr_magicpct = mp->m_attr_geo->magicpct; > return 0; > } > > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index ef34c19..de5b2996 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -1312,7 +1312,7 @@ xfs_dir2_leafn_remove( > */ > *rval = (dp->d_ops->leaf_hdr_size + > (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < > - mp->m_dir_magicpct; > + args->geo->magicpct; > return 0; > } > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index bf108a7..3b690c36 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -148,8 +148,6 @@ typedef struct xfs_mount { > int m_dalign; /* stripe unit */ > int m_swidth; /* stripe width */ > int m_sinoalign; /* stripe unit inode alignment */ > - int m_attr_magicpct;/* 37% of the blocksize */ > - int m_dir_magicpct; /* 37% of the dir blocksize */ > __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ > const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ > const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 10:59:49 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 81E4D7F57 for <xfs@oss.sgi.com>; Tue, 27 May 2014 10:59:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47D6E30405F for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59:45 -0700 (PDT) X-ASG-Debug-ID: 1401206384-04cb6c22b617ac80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id J32XODN8RE3vOaAB for <xfs@oss.sgi.com>; Tue, 27 May 2014 08:59: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxhBj015521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 May 2014 11:59:44 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4RFxheW004952; Tue, 27 May 2014 11:59:43 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id EA948120AC1; Tue, 27 May 2014 11:59:42 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RFxg2K011658; Tue, 27 May 2014 11:59:42 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 11:59:41 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Message-ID: <20140527155941.GC11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-12-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401206384 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, May 23, 2014 at 10:03:47AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Are the state->blocksize and node_ents fields redundant with the associated geo fields? On a quick scan, it seems like they don't ever change. Patch looks fine either way... Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_attr.c | 8 ++++---- > fs/xfs/xfs_da_btree.c | 4 ++-- > fs/xfs/xfs_dir2.c | 3 --- > fs/xfs/xfs_dir2_node.c | 10 +++++----- > fs/xfs/xfs_mount.h | 2 -- > 5 files changed, 11 insertions(+), 16 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index c547498..8bb9ae6 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -899,7 +899,7 @@ restart: > state->args = args; > state->mp = mp; > state->blocksize = state->mp->m_sb.sb_blocksize; > - state->node_ents = state->mp->m_attr_node_ents; > + state->node_ents = args->geo->node_ents; > > /* > * Search to see if name already exists, and get back a pointer > @@ -1078,7 +1078,7 @@ restart: > state->args = args; > state->mp = mp; > state->blocksize = state->mp->m_sb.sb_blocksize; > - state->node_ents = state->mp->m_attr_node_ents; > + state->node_ents = args->geo->node_ents; > state->inleaf = 0; > error = xfs_da3_node_lookup_int(state, &retval); > if (error) > @@ -1170,7 +1170,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) > state->args = args; > state->mp = dp->i_mount; > state->blocksize = state->mp->m_sb.sb_blocksize; > - state->node_ents = state->mp->m_attr_node_ents; > + state->node_ents = args->geo->node_ents; > > /* > * Search to see if name exists, and get back a pointer to it. > @@ -1433,7 +1433,7 @@ xfs_attr_node_get(xfs_da_args_t *args) > state->args = args; > state->mp = args->dp->i_mount; > state->blocksize = state->mp->m_sb.sb_blocksize; > - state->node_ents = state->mp->m_attr_node_ents; > + state->node_ents = args->geo->node_ents; > > /* > * Search to see if name exists, and get back a pointer to it. > diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c > index b9b007d..f935370 100644 > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -167,8 +167,8 @@ xfs_da3_node_verify( > * we don't know if the node is for and attribute or directory tree, > * so only fail if the count is outside both bounds > */ > - if (ichdr.count > mp->m_dir_node_ents && > - ichdr.count > mp->m_attr_node_ents) > + if (ichdr.count > mp->m_dir_geo->node_ents && > + ichdr.count > mp->m_attr_geo->node_ents) > return false; > > /* XXX: hash order check? */ > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 0230342..90d426d 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -144,9 +144,6 @@ xfs_da_mount( > else > mp->m_dirnameops = &xfs_default_nameops; > > - /* XXX: these are to be removed as code is converted to use geo */ > - mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > - mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > return 0; > } > > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index de5b2996..eff6b8d 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -1596,8 +1596,8 @@ xfs_dir2_node_addname( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->args->geo->blksize; > - state->node_ents = state->mp->m_dir_node_ents; > + state->blocksize = args->geo->blksize; > + state->node_ents = args->geo->node_ents; > /* > * Look up the name. We're not supposed to find it, but > * this gives us the insertion point. > @@ -2043,7 +2043,7 @@ xfs_dir2_node_lookup( > state->args = args; > state->mp = args->dp->i_mount; > state->blocksize = args->geo->blksize; > - state->node_ents = state->mp->m_dir_node_ents; > + state->node_ents = args->geo->node_ents; > /* > * Fill in the path to the entry in the cursor. > */ > @@ -2098,7 +2098,7 @@ xfs_dir2_node_removename( > state->args = args; > state->mp = args->dp->i_mount; > state->blocksize = args->geo->blksize; > - state->node_ents = state->mp->m_dir_node_ents; > + state->node_ents = args->geo->node_ents; > > /* Look up the entry we're deleting, set up the cursor. */ > error = xfs_da3_node_lookup_int(state, &rval); > @@ -2168,7 +2168,7 @@ xfs_dir2_node_replace( > state->args = args; > state->mp = args->dp->i_mount; > state->blocksize = args->geo->blksize; > - state->node_ents = state->mp->m_dir_node_ents; > + state->node_ents = args->geo->node_ents; > inum = args->inumber; > /* > * Lookup the entry to change in the btree. > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 3b690c36..6d7e5d7 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -134,8 +134,6 @@ typedef struct xfs_mount { > int m_fixedfsid[2]; /* unchanged for life of FS */ > uint m_dmevmask; /* DMI events for this FS */ > __uint64_t m_flags; /* global mount flags */ > - uint m_dir_node_ents; /* #entries in a dir danode */ > - uint m_attr_node_ents; /* #entries in attr danode */ > int m_ialloc_inos; /* inodes in inode allocation */ > int m_ialloc_blks; /* blocks in inode allocation */ > int m_inoalign_mask;/* mask sb_inoalignmt if used */ > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 11:00:42 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DABC97F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:00:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63AC4AC005 for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:00:41 -0700 (PDT) X-ASG-Debug-ID: 1401206439-04bdf0599f183ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uCGc8f3VIs7P8cea for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:00:39 -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 (8.14.4/8.14.4) with ESMTP id s4RFxxXs028345 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 12:00:00 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RFxxAQ009002; Tue, 27 May 2014 11:59:59 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 0A890120AC1; Tue, 27 May 2014 11:59:59 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RFxwxU011661; Tue, 27 May 2014 11:59:58 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 11:59:57 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Message-ID: <20140527155957.GD11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-13-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401206439 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, May 23, 2014 at 10:03:48AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > There are many places in the directory code were we don't pass the > args into and so have to extract the geometry direct from the mount > structure. Push the args or the geometry into these leaf functions > so that we don't need to grab it from the struct xfs_mount. > > This, in turn, brings use to the point where directory geometry is > no longer a property of the struct xfs_mount; it is not a global > property anymore, and hence we can start to consider per-directory > configuration of physical geometries. > > Start by converting the xfs_dir_isblock/leaf code - pass in the > xfs_da_args and convert the readdir code to use xfs_da_args like > the rest of the directory code to pass information around. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- > fs/xfs/xfs_dir2.c | 50 ++++++++++------------ > fs/xfs/xfs_dir2.h | 4 +- > fs/xfs/xfs_dir2_readdir.c | 105 ++++++++++++++++++++++------------------------ > 3 files changed, 74 insertions(+), 85 deletions(-) > > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 90d426d..48ad8b7 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -274,7 +274,7 @@ xfs_dir_createname( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -282,7 +282,7 @@ xfs_dir_createname( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -367,7 +367,7 @@ xfs_dir_lookup( > goto out_check_rval; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -375,7 +375,7 @@ xfs_dir_lookup( > goto out_check_rval; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -440,7 +440,7 @@ xfs_dir_removename( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -448,7 +448,7 @@ xfs_dir_removename( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -505,7 +505,7 @@ xfs_dir_replace( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -513,7 +513,7 @@ xfs_dir_replace( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -565,7 +565,7 @@ xfs_dir_canenter( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -573,7 +573,7 @@ xfs_dir_canenter( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -641,18 +641,16 @@ xfs_dir2_grow_inode( > */ > int > xfs_dir2_isblock( > - xfs_inode_t *dp, > - int *vp) /* out: 1 is block, 0 is not block */ > + struct xfs_da_args *args, > + int *vp) /* out: 1 is block, 0 is not block */ > { > - xfs_fileoff_t last; /* last file offset */ > - xfs_mount_t *mp; > - int rval; > + xfs_fileoff_t last; /* last file offset */ > + int rval; > > - mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) > return rval; > - rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; > - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); > + rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; > + ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); > *vp = rval; > return 0; > } > @@ -662,17 +660,15 @@ xfs_dir2_isblock( > */ > int > xfs_dir2_isleaf( > - xfs_inode_t *dp, > - int *vp) /* out: 1 is leaf, 0 is not leaf */ > + struct xfs_da_args *args, > + int *vp) /* out: 1 is block, 0 is not block */ > { > - xfs_fileoff_t last; /* last file offset */ > - xfs_mount_t *mp; > - int rval; > + xfs_fileoff_t last; /* last file offset */ > + int rval; > > - mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) > return rval; > - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); > + *vp = last == args->geo->leafblk + args->geo->fsbcount; > return 0; > } > > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index 85f6be6..f2f6bb8 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -144,8 +144,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); > /* > * Interface routines used by userspace utilities > */ > -extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); > -extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); > +extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); > +extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); > extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, > struct xfs_buf *bp); > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index fa393d5..6a120ca 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -76,28 +76,24 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { > > STATIC int > xfs_dir2_sf_getdents( > - xfs_inode_t *dp, /* incore directory inode */ > + struct xfs_da_args *args, > struct dir_context *ctx) > { > int i; /* shortform entry number */ > - xfs_mount_t *mp; /* filesystem mount point */ > + struct xfs_inode *dp = args->dp; /* incore directory inode */ > xfs_dir2_dataptr_t off; /* current entry's offset */ > xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ > xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ > xfs_dir2_dataptr_t dot_offset; > xfs_dir2_dataptr_t dotdot_offset; > xfs_ino_t ino; > - struct xfs_da_geometry *geo; > - > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > > ASSERT(dp->i_df.if_flags & XFS_IFINLINE); > /* > * Give up if the directory is way too short. > */ > if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { > - ASSERT(XFS_FORCED_SHUTDOWN(mp)); > + ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); > return XFS_ERROR(EIO); > } > > @@ -111,7 +107,7 @@ xfs_dir2_sf_getdents( > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) > return 0; > > /* > @@ -120,9 +116,9 @@ xfs_dir2_sf_getdents( > * XXX(hch): the second argument is sometimes 0 and sometimes > * geo->datablk > */ > - dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > + dot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, > dp->d_ops->data_dot_offset); > - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > + dotdot_offset = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, > dp->d_ops->data_dotdot_offset); > > /* > @@ -151,7 +147,7 @@ xfs_dir2_sf_getdents( > for (i = 0; i < sfp->count; i++) { > __uint8_t filetype; > > - off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > + off = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, > xfs_dir2_sf_get_offset(sfep)); > > if (ctx->pos > off) { > @@ -163,13 +159,13 @@ xfs_dir2_sf_getdents( > filetype = dp->d_ops->sf_get_ftype(sfep); > ctx->pos = off & 0x7fffffff; > if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, > - xfs_dir3_get_dtype(mp, filetype))) > + xfs_dir3_get_dtype(dp->i_mount, filetype))) > return 0; > sfep = dp->d_ops->sf_nextentry(sfp, sfep); > } > > - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > - 0x7fffffff; > + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, > + args->geo->datablk + 1, 0) & 0x7fffffff; > return 0; > } > > @@ -178,9 +174,10 @@ xfs_dir2_sf_getdents( > */ > STATIC int > xfs_dir2_block_getdents( > - xfs_inode_t *dp, /* incore inode */ > + struct xfs_da_args *args, > struct dir_context *ctx) > { > + struct xfs_inode *dp = args->dp; /* incore directory inode */ > xfs_dir2_data_hdr_t *hdr; /* block header */ > struct xfs_buf *bp; /* buffer for block */ > xfs_dir2_block_tail_t *btp; /* block tail */ > @@ -188,18 +185,14 @@ xfs_dir2_block_getdents( > xfs_dir2_data_unused_t *dup; /* block unused entry */ > char *endptr; /* end of the data entries */ > int error; /* error return value */ > - xfs_mount_t *mp; /* filesystem mount point */ > char *ptr; /* current data entry */ > int wantoff; /* starting block offset */ > xfs_off_t cook; > - struct xfs_da_geometry *geo; > > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > /* > * If the block number in the offset is out of range, we're done. > */ > - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > + if (xfs_dir2_dataptr_to_db(args->geo, ctx->pos) > args->geo->datablk) > return 0; > > error = xfs_dir3_block_read(NULL, dp, &bp); > @@ -210,13 +203,13 @@ xfs_dir2_block_getdents( > * Extract the byte offset we start at from the seek pointer. > * We'll skip entries before this. > */ > - wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); > + wantoff = xfs_dir2_dataptr_to_off(args->geo, ctx->pos); > hdr = bp->b_addr; > xfs_dir3_data_check(dp, bp); > /* > * Set up values for the loop. > */ > - btp = xfs_dir2_block_tail_p(geo, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > ptr = (char *)dp->d_ops->data_entry_p(hdr); > endptr = (char *)xfs_dir2_block_leaf_p(btp); > > @@ -248,7 +241,7 @@ xfs_dir2_block_getdents( > if ((char *)dep - (char *)hdr < wantoff) > continue; > > - cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, > + cook = xfs_dir2_db_off_to_dataptr(args->geo, args->geo->datablk, > (char *)dep - (char *)hdr); > > ctx->pos = cook & 0x7fffffff; > @@ -258,7 +251,7 @@ xfs_dir2_block_getdents( > */ > if (!dir_emit(ctx, (char *)dep->name, dep->namelen, > be64_to_cpu(dep->inumber), > - xfs_dir3_get_dtype(mp, filetype))) { > + xfs_dir3_get_dtype(dp->i_mount, filetype))) { > xfs_trans_brelse(NULL, bp); > return 0; > } > @@ -268,8 +261,8 @@ xfs_dir2_block_getdents( > * Reached the end of the block. > * Set the offset to a non-existent block 1 and return. > */ > - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > - 0x7fffffff; > + ctx->pos = xfs_dir2_db_off_to_dataptr(args->geo, > + args->geo->datablk + 1, 0) & 0x7fffffff; > xfs_trans_brelse(NULL, bp); > return 0; > } > @@ -290,13 +283,13 @@ struct xfs_dir2_leaf_map_info { > > STATIC int > xfs_dir2_leaf_readbuf( > - struct xfs_inode *dp, > + struct xfs_da_args *args, > size_t bufsize, > struct xfs_dir2_leaf_map_info *mip, > xfs_dir2_off_t *curoff, > struct xfs_buf **bpp) > { > - struct xfs_mount *mp = dp->i_mount; > + struct xfs_inode *dp = args->dp; > struct xfs_buf *bp = *bpp; > struct xfs_bmbt_irec *map = mip->map; > struct blk_plug plug; > @@ -304,7 +297,7 @@ xfs_dir2_leaf_readbuf( > int length; > int i; > int j; > - struct xfs_da_geometry *geo = mp->m_dir_geo; > + struct xfs_da_geometry *geo = args->geo; I notice that we remove the local geo pointer in some of the immediately previous fixups. Here we keep it... > > /* > * If we have a buffer, we need to release it and > @@ -314,7 +307,7 @@ xfs_dir2_leaf_readbuf( > if (bp) { > xfs_trans_brelse(NULL, bp); > bp = NULL; > - mip->map_blocks -= geo->fsbcount; > + mip->map_blocks -= args->geo->fsbcount; ... convert some calls to use args... > /* > * Loop to get rid of the extents for the > * directory block. > @@ -338,8 +331,7 @@ xfs_dir2_leaf_readbuf( > /* > * Recalculate the readahead blocks wanted. > */ > - mip->ra_want = howmany(bufsize + geo->blksize, > - mp->m_sb.sb_blocksize) - 1; > + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; > ASSERT(mip->ra_want >= 0); ... and not others. So we should probably at least be consistent within function. :) Otherwise this patch looks good to me. Brian > > /* > @@ -411,8 +403,8 @@ xfs_dir2_leaf_readbuf( > mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); > error = xfs_dir3_data_read(NULL, dp, map->br_startoff, > map->br_blockcount >= geo->fsbcount ? > - XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); > - > + XFS_FSB_TO_DADDR(dp->i_mount, map->br_startblock) : > + -1, &bp); > /* > * Should just skip over the data block instead of giving up. > */ > @@ -441,7 +433,7 @@ xfs_dir2_leaf_readbuf( > map[mip->ra_index].br_blockcount >= geo->fsbcount) { > xfs_dir3_data_readahead(dp, > map[mip->ra_index].br_startoff + mip->ra_offset, > - XFS_FSB_TO_DADDR(mp, > + XFS_FSB_TO_DADDR(dp->i_mount, > map[mip->ra_index].br_startblock + > mip->ra_offset)); > mip->ra_current = i; > @@ -493,23 +485,23 @@ out: > */ > STATIC int > xfs_dir2_leaf_getdents( > - xfs_inode_t *dp, /* incore directory inode */ > + struct xfs_da_args *args, > struct dir_context *ctx, > size_t bufsize) > { > + struct xfs_inode *dp = args->dp; > struct xfs_buf *bp = NULL; /* data block buffer */ > xfs_dir2_data_hdr_t *hdr; /* data block header */ > xfs_dir2_data_entry_t *dep; /* data entry */ > xfs_dir2_data_unused_t *dup; /* unused entry */ > int error = 0; /* error return value */ > int length; /* temporary length value */ > - xfs_mount_t *mp; /* filesystem mount point */ > int byteoff; /* offset in current block */ > xfs_dir2_off_t curoff; /* current overall offset */ > xfs_dir2_off_t newoff; /* new curoff after new blk */ > char *ptr = NULL; /* pointer to current data */ > struct xfs_dir2_leaf_map_info *map_info; > - struct xfs_da_geometry *geo; > + struct xfs_da_geometry *geo = args->geo; > > /* > * If the offset is at or past the largest allowed value, > @@ -518,15 +510,12 @@ xfs_dir2_leaf_getdents( > if (ctx->pos >= XFS_DIR2_MAX_DATAPTR) > return 0; > > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > - > /* > * Set up to bmap a number of blocks based on the caller's > * buffer size, the directory block size, and the filesystem > * block size. > */ > - length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); > + length = howmany(bufsize + geo->blksize, (1 << geo->fsblog)); > map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + > (length * sizeof(struct xfs_bmbt_irec)), > KM_SLEEP | KM_NOFS); > @@ -558,7 +547,7 @@ xfs_dir2_leaf_getdents( > */ > if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { > > - error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, > + error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, > &curoff, &bp); > if (error || !map_info->map_valid) > break; > @@ -566,7 +555,7 @@ xfs_dir2_leaf_getdents( > /* > * Having done a read, we need to set a new offset. > */ > - newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, > + newoff = xfs_dir2_db_off_to_byte(geo, > map_info->curdb, 0); > /* > * Start of the current block. > @@ -585,7 +574,7 @@ xfs_dir2_leaf_getdents( > * Find our position in the block. > */ > ptr = (char *)dp->d_ops->data_entry_p(hdr); > - byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); > + byteoff = xfs_dir2_byte_to_off(geo, curoff); > /* > * Skip past the header. > */ > @@ -644,7 +633,7 @@ xfs_dir2_leaf_getdents( > ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; > if (!dir_emit(ctx, (char *)dep->name, dep->namelen, > be64_to_cpu(dep->inumber), > - xfs_dir3_get_dtype(mp, filetype))) > + xfs_dir3_get_dtype(dp->i_mount, filetype))) > break; > > /* > @@ -674,13 +663,14 @@ xfs_dir2_leaf_getdents( > */ > int > xfs_readdir( > - xfs_inode_t *dp, > - struct dir_context *ctx, > - size_t bufsize) > + struct xfs_inode *dp, > + struct dir_context *ctx, > + size_t bufsize) > { > - int rval; /* return value */ > - int v; /* type-checking value */ > - uint lock_mode; > + struct xfs_da_args args = {0}; > + int rval; > + int v; > + uint lock_mode; > > trace_xfs_readdir(dp); > > @@ -690,15 +680,18 @@ xfs_readdir( > ASSERT(S_ISDIR(dp->i_d.di_mode)); > XFS_STATS_INC(xs_dir_getdents); > > + args.dp = dp; > + args.geo = dp->i_mount->m_dir_geo; > + > lock_mode = xfs_ilock_data_map_shared(dp); > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > - rval = xfs_dir2_sf_getdents(dp, ctx); > - else if ((rval = xfs_dir2_isblock(dp, &v))) > + rval = xfs_dir2_sf_getdents(&args, ctx); > + else if ((rval = xfs_dir2_isblock(&args, &v))) > ; > else if (v) > - rval = xfs_dir2_block_getdents(dp, ctx); > + rval = xfs_dir2_block_getdents(&args, ctx); > else > - rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); > + rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); > xfs_iunlock(dp, lock_mode); > > return rval; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 11:00:59 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 184297F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:00:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 567CDAC00A for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:00:58 -0700 (PDT) X-ASG-Debug-ID: 1401206455-04cb6c22b617ae30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mzwtph7NrdpIg15s for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:00: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RG0rTh025247 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 May 2014 12:00:54 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4RG0qGN005931; Tue, 27 May 2014 12:00:53 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 8009D120AC1; Tue, 27 May 2014 12:00:52 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RG0pwM011676; Tue, 27 May 2014 12:00:51 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 12:00:51 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging Message-ID: <20140527160050.GE11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-14-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401206455 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, May 23, 2014 at 10:03:49AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > We don't pass the xfs_da_args or the geometry all the way down to > the directory buffer logging code, hence we have to use > mp->m_dir_geo here. Fix this to use the geometry passed via the > xfs_da_args, and convert all the directory logging functions for > consistency. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_dir2.h | 12 +++--- > fs/xfs/xfs_dir2_block.c | 39 +++++++++--------- > fs/xfs/xfs_dir2_data.c | 59 ++++++++++++--------------- > fs/xfs/xfs_dir2_leaf.c | 103 +++++++++++++++++++++++++----------------------- > fs/xfs/xfs_dir2_node.c | 68 +++++++++++++++----------------- > fs/xfs/xfs_dir2_priv.h | 4 +- > 6 files changed, 137 insertions(+), 148 deletions(-) > > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index f2f6bb8..608f5b8 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -151,16 +151,16 @@ extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, > > extern void xfs_dir2_data_freescan(struct xfs_inode *dp, > struct xfs_dir2_data_hdr *hdr, int *loghead); > -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir2_data_log_entry(struct xfs_da_args *args, > struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); > -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir2_data_log_header(struct xfs_da_args *args, > struct xfs_buf *bp); > -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, > - struct xfs_dir2_data_unused *dup); > -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir2_data_log_unused(struct xfs_da_args *args, > + struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); > +extern void xfs_dir2_data_make_free(struct xfs_da_args *args, > struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, > xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); > -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir2_data_use_free(struct xfs_da_args *args, > struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, > xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, > int *needlogp, int *needscanp); > diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c > index 4204df9..c7cd315 100644 > --- a/fs/xfs/xfs_dir2_block.c > +++ b/fs/xfs/xfs_dir2_block.c > @@ -281,8 +281,7 @@ out: > */ > static void > xfs_dir2_block_compact( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > struct xfs_dir2_data_hdr *hdr, > struct xfs_dir2_block_tail *btp, > @@ -315,7 +314,7 @@ xfs_dir2_block_compact( > *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); > *lfloghigh -= be32_to_cpu(btp->stale) - 1; > be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); > - xfs_dir2_data_make_free(tp, dp, bp, > + xfs_dir2_data_make_free(args, bp, > (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), > (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), > needlog, &needscan); > @@ -325,7 +324,7 @@ xfs_dir2_block_compact( > * This needs to happen before the next call to use_free. > */ > if (needscan) > - xfs_dir2_data_freescan(dp, hdr, needlog); > + xfs_dir2_data_freescan(args->dp, hdr, needlog); > } > > /* > @@ -420,7 +419,7 @@ xfs_dir2_block_addname( > * If need to compact the leaf entries, do it now. > */ > if (compact) { > - xfs_dir2_block_compact(tp, dp, bp, hdr, btp, blp, &needlog, > + xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog, > &lfloghigh, &lfloglow); > /* recalculate blp post-compaction */ > blp = xfs_dir2_block_leaf_p(btp); > @@ -455,7 +454,7 @@ xfs_dir2_block_addname( > /* > * Mark the space needed for the new leaf entry, now in use. > */ > - xfs_dir2_data_use_free(tp, dp, bp, enddup, > + xfs_dir2_data_use_free(args, bp, enddup, > (xfs_dir2_data_aoff_t) > ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - > sizeof(*blp)), > @@ -542,7 +541,7 @@ xfs_dir2_block_addname( > /* > * Mark space for the data entry used. > */ > - xfs_dir2_data_use_free(tp, dp, bp, dup, > + xfs_dir2_data_use_free(args, bp, dup, > (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), > (xfs_dir2_data_aoff_t)len, &needlog, &needscan); > /* > @@ -560,9 +559,9 @@ xfs_dir2_block_addname( > if (needscan) > xfs_dir2_data_freescan(dp, hdr, &needlog); > if (needlog) > - xfs_dir2_data_log_header(tp, dp, bp); > + xfs_dir2_data_log_header(args, bp); > xfs_dir2_block_log_tail(tp, bp); > - xfs_dir2_data_log_entry(tp, dp, bp, dep); > + xfs_dir2_data_log_entry(args, bp, dep); > xfs_dir3_data_check(dp, bp); > return 0; > } > @@ -803,7 +802,7 @@ xfs_dir2_block_removename( > * Mark the data entry's space free. > */ > needlog = needscan = 0; > - xfs_dir2_data_make_free(tp, dp, bp, > + xfs_dir2_data_make_free(args, bp, > (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), > dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); > /* > @@ -822,7 +821,7 @@ xfs_dir2_block_removename( > if (needscan) > xfs_dir2_data_freescan(dp, hdr, &needlog); > if (needlog) > - xfs_dir2_data_log_header(tp, dp, bp); > + xfs_dir2_data_log_header(args, bp); > xfs_dir3_data_check(dp, bp); > /* > * See if the size as a shortform is good enough. > @@ -881,7 +880,7 @@ xfs_dir2_block_replace( > */ > dep->inumber = cpu_to_be64(args->inumber); > dp->d_ops->data_put_ftype(dep, args->filetype); > - xfs_dir2_data_log_entry(args->trans, dp, bp, dep); > + xfs_dir2_data_log_entry(args, bp, dep); > xfs_dir3_data_check(dp, bp); > return 0; > } > @@ -1004,7 +1003,7 @@ xfs_dir2_leaf_to_block( > /* > * Use up the space at the end of the block (blp/btp). > */ > - xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, > + xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size, > &needlog, &needscan); > /* > * Initialize the block tail. > @@ -1030,7 +1029,7 @@ xfs_dir2_leaf_to_block( > if (needscan) > xfs_dir2_data_freescan(dp, hdr, &needlog); > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > + xfs_dir2_data_log_header(args, dbp); > /* > * Pitch the old leaf block. > */ > @@ -1143,7 +1142,7 @@ xfs_dir2_sf_to_block( > */ > dup = dp->d_ops->data_unused_p(hdr); > needlog = needscan = 0; > - xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, > + xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, > i, &needlog, &needscan); > ASSERT(needscan == 0); > /* > @@ -1157,7 +1156,7 @@ xfs_dir2_sf_to_block( > /* > * Remove the freespace, we'll manage it. > */ > - xfs_dir2_data_use_free(tp, dp, bp, dup, > + xfs_dir2_data_use_free(args, bp, dup, > (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), > be16_to_cpu(dup->length), &needlog, &needscan); > /* > @@ -1170,7 +1169,7 @@ xfs_dir2_sf_to_block( > dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); > tagp = dp->d_ops->data_entry_tag_p(dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > - xfs_dir2_data_log_entry(tp, dp, bp, dep); > + xfs_dir2_data_log_entry(args, bp, dep); > blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); > blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( > (char *)dep - (char *)hdr)); > @@ -1184,7 +1183,7 @@ xfs_dir2_sf_to_block( > dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); > tagp = dp->d_ops->data_entry_tag_p(dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > - xfs_dir2_data_log_entry(tp, dp, bp, dep); > + xfs_dir2_data_log_entry(args, bp, dep); > blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); > blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( > (char *)dep - (char *)hdr)); > @@ -1218,7 +1217,7 @@ xfs_dir2_sf_to_block( > dup->length = cpu_to_be16(newoffset - offset); > *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( > ((char *)dup - (char *)hdr)); > - xfs_dir2_data_log_unused(tp, bp, dup); > + xfs_dir2_data_log_unused(args, bp, dup); > xfs_dir2_data_freeinsert(hdr, > dp->d_ops->data_bestfree_p(hdr), > dup, &dummy); > @@ -1235,7 +1234,7 @@ xfs_dir2_sf_to_block( > memcpy(dep->name, sfep->name, dep->namelen); > tagp = dp->d_ops->data_entry_tag_p(dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > - xfs_dir2_data_log_entry(tp, dp, bp, dep); > + xfs_dir2_data_log_entry(args, bp, dep); > name.name = sfep->name; > name.len = sfep->namelen; > blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> > diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c > index b73d61a..8c2f642 100644 > --- a/fs/xfs/xfs_dir2_data.c > +++ b/fs/xfs/xfs_dir2_data.c > @@ -630,8 +630,8 @@ xfs_dir3_data_init( > /* > * Log it and return it. > */ > - xfs_dir2_data_log_header(tp, dp, bp); > - xfs_dir2_data_log_unused(tp, bp, dup); > + xfs_dir2_data_log_header(args, bp); > + xfs_dir2_data_log_unused(args, bp, dup); > *bpp = bp; > return 0; > } > @@ -641,8 +641,7 @@ xfs_dir3_data_init( > */ > void > xfs_dir2_data_log_entry( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > xfs_dir2_data_entry_t *dep) /* data entry pointer */ > { > @@ -653,8 +652,8 @@ xfs_dir2_data_log_entry( > hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); > > - xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), > - (uint)((char *)(dp->d_ops->data_entry_tag_p(dep) + 1) - > + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dep - (char *)hdr), > + (uint)((char *)(args->dp->d_ops->data_entry_tag_p(dep) + 1) - > (char *)hdr - 1)); > } > > @@ -663,8 +662,7 @@ xfs_dir2_data_log_entry( > */ > void > xfs_dir2_data_log_header( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp) > { > #ifdef DEBUG > @@ -676,7 +674,8 @@ xfs_dir2_data_log_header( > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); > #endif > > - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset - 1); > + xfs_trans_log_buf(args->trans, bp, 0, > + args->dp->d_ops->data_entry_offset - 1); > } > > /* > @@ -684,7 +683,7 @@ xfs_dir2_data_log_header( > */ > void > xfs_dir2_data_log_unused( > - struct xfs_trans *tp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > xfs_dir2_data_unused_t *dup) /* data unused pointer */ > { > @@ -698,13 +697,13 @@ xfs_dir2_data_log_unused( > /* > * Log the first part of the unused entry. > */ > - xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), > + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dup - (char *)hdr), > (uint)((char *)&dup->length + sizeof(dup->length) - > 1 - (char *)hdr)); > /* > * Log the end (tag) of the unused entry. > */ > - xfs_trans_log_buf(tp, bp, > + xfs_trans_log_buf(args->trans, bp, > (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), > (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + > sizeof(xfs_dir2_data_off_t) - 1)); > @@ -716,8 +715,7 @@ xfs_dir2_data_log_unused( > */ > void > xfs_dir2_data_make_free( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > xfs_dir2_data_aoff_t offset, /* starting byte offset */ > xfs_dir2_data_aoff_t len, /* length in bytes */ > @@ -727,37 +725,33 @@ xfs_dir2_data_make_free( > xfs_dir2_data_hdr_t *hdr; /* data block pointer */ > xfs_dir2_data_free_t *dfp; /* bestfree pointer */ > char *endptr; /* end of data area */ > - xfs_mount_t *mp; /* filesystem mount point */ > int needscan; /* need to regen bestfree */ > xfs_dir2_data_unused_t *newdup; /* new unused entry */ > xfs_dir2_data_unused_t *postdup; /* unused entry after us */ > xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ > struct xfs_dir2_data_free *bf; > - struct xfs_da_geometry *geo; > > - mp = tp->t_mountp; > hdr = bp->b_addr; > - geo = mp->m_dir_geo; > > /* > * Figure out where the end of the data area is. > */ > if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) > - endptr = (char *)hdr + geo->blksize; > + endptr = (char *)hdr + args->geo->blksize; > else { > xfs_dir2_block_tail_t *btp; /* block tail */ > > ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || > hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); > - btp = xfs_dir2_block_tail_p(geo, hdr); > + btp = xfs_dir2_block_tail_p(args->geo, hdr); > endptr = (char *)xfs_dir2_block_leaf_p(btp); > } > /* > * If this isn't the start of the block, then back up to > * the previous entry and see if it's free. > */ > - if (offset > dp->d_ops->data_entry_offset) { > + if (offset > args->dp->d_ops->data_entry_offset) { > __be16 *tagp; /* tag just before us */ > > tagp = (__be16 *)((char *)hdr + offset) - 1; > @@ -783,7 +777,7 @@ xfs_dir2_data_make_free( > * Previous and following entries are both free, > * merge everything into a single free entry. > */ > - bf = dp->d_ops->data_bestfree_p(hdr); > + bf = args->dp->d_ops->data_bestfree_p(hdr); > if (prevdup && postdup) { > xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ > > @@ -805,7 +799,7 @@ xfs_dir2_data_make_free( > be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); > *xfs_dir2_data_unused_tag_p(prevdup) = > cpu_to_be16((char *)prevdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, prevdup); > + xfs_dir2_data_log_unused(args, bp, prevdup); > if (!needscan) { > /* > * Has to be the case that entries 0 and 1 are > @@ -840,7 +834,7 @@ xfs_dir2_data_make_free( > be16_add_cpu(&prevdup->length, len); > *xfs_dir2_data_unused_tag_p(prevdup) = > cpu_to_be16((char *)prevdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, prevdup); > + xfs_dir2_data_log_unused(args, bp, prevdup); > /* > * If the previous entry was in the table, the new entry > * is longer, so it will be in the table too. Remove > @@ -868,7 +862,7 @@ xfs_dir2_data_make_free( > newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); > *xfs_dir2_data_unused_tag_p(newdup) = > cpu_to_be16((char *)newdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup); > + xfs_dir2_data_log_unused(args, bp, newdup); > /* > * If the following entry was in the table, the new entry > * is longer, so it will be in the table too. Remove > @@ -895,7 +889,7 @@ xfs_dir2_data_make_free( > newdup->length = cpu_to_be16(len); > *xfs_dir2_data_unused_tag_p(newdup) = > cpu_to_be16((char *)newdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup); > + xfs_dir2_data_log_unused(args, bp, newdup); > xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); > } > *needscanp = needscan; > @@ -906,8 +900,7 @@ xfs_dir2_data_make_free( > */ > void > xfs_dir2_data_use_free( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > xfs_dir2_data_unused_t *dup, /* unused entry */ > xfs_dir2_data_aoff_t offset, /* starting offset to use */ > @@ -938,7 +931,7 @@ xfs_dir2_data_use_free( > * Look up the entry in the bestfree table. > */ > oldlen = be16_to_cpu(dup->length); > - bf = dp->d_ops->data_bestfree_p(hdr); > + bf = args->dp->d_ops->data_bestfree_p(hdr); > dfp = xfs_dir2_data_freefind(hdr, bf, dup); > ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); > /* > @@ -970,7 +963,7 @@ xfs_dir2_data_use_free( > newdup->length = cpu_to_be16(oldlen - len); > *xfs_dir2_data_unused_tag_p(newdup) = > cpu_to_be16((char *)newdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup); > + xfs_dir2_data_log_unused(args, bp, newdup); > /* > * If it was in the table, remove it and add the new one. > */ > @@ -998,7 +991,7 @@ xfs_dir2_data_use_free( > newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); > *xfs_dir2_data_unused_tag_p(newdup) = > cpu_to_be16((char *)newdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup); > + xfs_dir2_data_log_unused(args, bp, newdup); > /* > * If it was in the table, remove it and add the new one. > */ > @@ -1026,13 +1019,13 @@ xfs_dir2_data_use_free( > newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); > *xfs_dir2_data_unused_tag_p(newdup) = > cpu_to_be16((char *)newdup - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup); > + xfs_dir2_data_log_unused(args, bp, newdup); > newdup2 = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); > newdup2->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); > newdup2->length = cpu_to_be16(oldlen - len - be16_to_cpu(newdup->length)); > *xfs_dir2_data_unused_tag_p(newdup2) = > cpu_to_be16((char *)newdup2 - (char *)hdr); > - xfs_dir2_data_log_unused(tp, bp, newdup2); > + xfs_dir2_data_log_unused(args, bp, newdup2); > /* > * If the old entry was in the table, we need to scan > * if the 3rd entry was valid, since these entries > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index e517bd0..fb0aad4 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -41,9 +41,10 @@ > */ > static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, > int *indexp, struct xfs_buf **dbpp); > -static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, > - int first, int last); > -static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); > +static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args, > + struct xfs_buf *bp, int first, int last); > +static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args, > + struct xfs_buf *bp); > > /* > * Check the internal consistency of a leaf1 block. > @@ -357,9 +358,9 @@ xfs_dir3_leaf_get_buf( > return error; > > xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); > - xfs_dir3_leaf_log_header(tp, dp, bp); > + xfs_dir3_leaf_log_header(args, bp); > if (magic == XFS_DIR2_LEAF1_MAGIC) > - xfs_dir3_leaf_log_tail(tp, bp); > + xfs_dir3_leaf_log_tail(args, bp); > *bpp = bp; > return 0; > } > @@ -428,21 +429,21 @@ xfs_dir2_block_to_leaf( > leafhdr.count = be32_to_cpu(btp->count); > leafhdr.stale = be32_to_cpu(btp->stale); > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, lbp); > + xfs_dir3_leaf_log_header(args, lbp); > > /* > * Could compact these but I think we always do the conversion > * after squeezing out stale entries. > */ > memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); > - xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1); > + xfs_dir3_leaf_log_ents(args, lbp, 0, leafhdr.count - 1); > needscan = 0; > needlog = 1; > /* > * Make the space formerly occupied by the leaf entries and block > * tail be free. > */ > - xfs_dir2_data_make_free(tp, dp, dbp, > + xfs_dir2_data_make_free(args, dbp, > (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), > (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - > (char *)blp), > @@ -470,10 +471,10 @@ xfs_dir2_block_to_leaf( > * Log the data header and leaf bests table. > */ > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > + xfs_dir2_data_log_header(args, dbp); > xfs_dir3_leaf_check(dp, lbp); > xfs_dir3_data_check(dp, dbp); > - xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); > + xfs_dir3_leaf_log_bests(args, lbp, 0, 0); > return 0; > } > > @@ -811,14 +812,15 @@ xfs_dir2_leaf_addname( > memmove(&bestsp[0], &bestsp[1], > be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); > be32_add_cpu(<p->bestcount, 1); > - xfs_dir3_leaf_log_tail(tp, lbp); > - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > + xfs_dir3_leaf_log_tail(args, lbp); > + xfs_dir3_leaf_log_bests(args, lbp, 0, > + be32_to_cpu(ltp->bestcount) - 1); > } > /* > * If we're filling in a previously empty block just log it. > */ > else > - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); > + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); > hdr = dbp->b_addr; > bf = dp->d_ops->data_bestfree_p(hdr); > bestsp[use_block] = bf[0].length; > @@ -849,7 +851,7 @@ xfs_dir2_leaf_addname( > /* > * Mark the initial part of our freespace in use for the new entry. > */ > - xfs_dir2_data_use_free(tp, dp, dbp, dup, > + xfs_dir2_data_use_free(args, dbp, dup, > (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, > &needlog, &needscan); > /* > @@ -871,8 +873,8 @@ xfs_dir2_leaf_addname( > * Need to log the data block's header. > */ > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > - xfs_dir2_data_log_entry(tp, dp, dbp, dep); > + xfs_dir2_data_log_header(args, dbp); > + xfs_dir2_data_log_entry(args, dbp, dep); > /* > * If the bests table needs to be changed, do it. > * Log the change unless we've already done that. > @@ -880,7 +882,7 @@ xfs_dir2_leaf_addname( > if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { > bestsp[use_block] = bf[0].length; > if (!grown) > - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); > + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); > } > > lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, > @@ -897,8 +899,8 @@ xfs_dir2_leaf_addname( > * Log the leaf fields and give up the buffers. > */ > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, lbp); > - xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); > + xfs_dir3_leaf_log_header(args, lbp); > + xfs_dir3_leaf_log_ents(args, lbp, lfloglow, lfloghigh); > xfs_dir3_leaf_check(dp, lbp); > xfs_dir3_data_check(dp, dbp); > return 0; > @@ -950,9 +952,9 @@ xfs_dir3_leaf_compact( > leafhdr->stale = 0; > > dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); > - xfs_dir3_leaf_log_header(args->trans, dp, bp); > + xfs_dir3_leaf_log_header(args, bp); > if (loglow != -1) > - xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); > + xfs_dir3_leaf_log_ents(args, bp, loglow, to - 1); > } > > /* > @@ -1054,7 +1056,7 @@ xfs_dir3_leaf_compact_x1( > */ > static void > xfs_dir3_leaf_log_bests( > - xfs_trans_t *tp, /* transaction pointer */ > + struct xfs_da_args *args, > struct xfs_buf *bp, /* leaf buffer */ > int first, /* first entry to log */ > int last) /* last entry to log */ > @@ -1067,10 +1069,11 @@ xfs_dir3_leaf_log_bests( > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); > > - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > firstb = xfs_dir2_leaf_bests_p(ltp) + first; > lastb = xfs_dir2_leaf_bests_p(ltp) + last; > - xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), > + xfs_trans_log_buf(args->trans, bp, > + (uint)((char *)firstb - (char *)leaf), > (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); > } > > @@ -1079,8 +1082,7 @@ xfs_dir3_leaf_log_bests( > */ > void > xfs_dir3_leaf_log_ents( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > int first, > int last) > @@ -1095,10 +1097,11 @@ xfs_dir3_leaf_log_ents( > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > - ents = dp->d_ops->leaf_ents_p(leaf); > + ents = args->dp->d_ops->leaf_ents_p(leaf); > firstlep = &ents[first]; > lastlep = &ents[last]; > - xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), > + xfs_trans_log_buf(args->trans, bp, > + (uint)((char *)firstlep - (char *)leaf), > (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); > } > > @@ -1107,8 +1110,7 @@ xfs_dir3_leaf_log_ents( > */ > void > xfs_dir3_leaf_log_header( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp) > { > struct xfs_dir2_leaf *leaf = bp->b_addr; > @@ -1118,8 +1120,9 @@ xfs_dir3_leaf_log_header( > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > - xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), > - dp->d_ops->leaf_hdr_size - 1); > + xfs_trans_log_buf(args->trans, bp, > + (uint)((char *)&leaf->hdr - (char *)leaf), > + args->dp->d_ops->leaf_hdr_size - 1); > } > > /* > @@ -1127,21 +1130,20 @@ xfs_dir3_leaf_log_header( > */ > STATIC void > xfs_dir3_leaf_log_tail( > - struct xfs_trans *tp, > + struct xfs_da_args *args, > struct xfs_buf *bp) > { > struct xfs_dir2_leaf *leaf = bp->b_addr; > xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ > - struct xfs_mount *mp = tp->t_mountp; > > ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || > leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); > > - ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); > - xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), > - (uint)(mp->m_dir_geo->blksize - 1)); > + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); > + xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf), > + (uint)(args->geo->blksize - 1)); > } > > /* > @@ -1395,7 +1397,7 @@ xfs_dir2_leaf_removename( > /* > * Mark the former data entry unused. > */ > - xfs_dir2_data_make_free(tp, dp, dbp, > + xfs_dir2_data_make_free(args, dbp, > (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), > dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); > /* > @@ -1403,10 +1405,10 @@ xfs_dir2_leaf_removename( > */ > leafhdr.stale++; > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, lbp); > + xfs_dir3_leaf_log_header(args, lbp); > > lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); > - xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index); > + xfs_dir3_leaf_log_ents(args, lbp, index, index); > > /* > * Scan the freespace in the data block again if necessary, > @@ -1415,14 +1417,14 @@ xfs_dir2_leaf_removename( > if (needscan) > xfs_dir2_data_freescan(dp, hdr, &needlog); > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > + xfs_dir2_data_log_header(args, dbp); > /* > * If the longest freespace in the data block has changed, > * put the new value in the bests table and log that. > */ > if (be16_to_cpu(bf[0].length) != oldbest) { > bestsp[db] = bf[0].length; > - xfs_dir3_leaf_log_bests(tp, lbp, db, db); > + xfs_dir3_leaf_log_bests(args, lbp, db, db); > } > xfs_dir3_data_check(dp, dbp); > /* > @@ -1463,8 +1465,9 @@ xfs_dir2_leaf_removename( > memmove(&bestsp[db - i], bestsp, > (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); > be32_add_cpu(<p->bestcount, -(db - i)); > - xfs_dir3_leaf_log_tail(tp, lbp); > - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > + xfs_dir3_leaf_log_tail(args, lbp); > + xfs_dir3_leaf_log_bests(args, lbp, 0, > + be32_to_cpu(ltp->bestcount) - 1); > } else > bestsp[db] = cpu_to_be16(NULLDATAOFF); > } > @@ -1527,7 +1530,7 @@ xfs_dir2_leaf_replace( > dep->inumber = cpu_to_be64(args->inumber); > dp->d_ops->data_put_ftype(dep, args->filetype); > tp = args->trans; > - xfs_dir2_data_log_entry(tp, dp, dbp, dep); > + xfs_dir2_data_log_entry(args, dbp, dep); > xfs_dir3_leaf_check(dp, lbp); > xfs_trans_brelse(tp, lbp); > return 0; > @@ -1648,8 +1651,8 @@ xfs_dir2_leaf_trim_data( > bestsp = xfs_dir2_leaf_bests_p(ltp); > be32_add_cpu(<p->bestcount, -1); > memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); > - xfs_dir3_leaf_log_tail(tp, lbp); > - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > + xfs_dir3_leaf_log_tail(args, lbp); > + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > return 0; > } > > @@ -1795,9 +1798,9 @@ xfs_dir2_node_to_leaf( > freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); > > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, lbp); > - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > - xfs_dir3_leaf_log_tail(tp, lbp); > + xfs_dir3_leaf_log_header(args, lbp); > + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); > + xfs_dir3_leaf_log_tail(args, lbp); > xfs_dir3_leaf_check(dp, lbp); > > /* > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index eff6b8d..65df8cb 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -241,8 +241,7 @@ xfs_dir3_free_get_buf( > */ > STATIC void > xfs_dir2_free_log_bests( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp, > int first, /* first entry to log */ > int last) /* last entry to log */ > @@ -251,10 +250,10 @@ xfs_dir2_free_log_bests( > __be16 *bests; > > free = bp->b_addr; > - bests = dp->d_ops->free_bests_p(free); > + bests = args->dp->d_ops->free_bests_p(free); > ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || > free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); > - xfs_trans_log_buf(tp, bp, > + xfs_trans_log_buf(args->trans, bp, > (uint)((char *)&bests[first] - (char *)free), > (uint)((char *)&bests[last] - (char *)free + > sizeof(bests[0]) - 1)); > @@ -265,8 +264,7 @@ xfs_dir2_free_log_bests( > */ > static void > xfs_dir2_free_log_header( > - struct xfs_trans *tp, > - struct xfs_inode *dp, > + struct xfs_da_args *args, > struct xfs_buf *bp) > { > #ifdef DEBUG > @@ -276,7 +274,8 @@ xfs_dir2_free_log_header( > ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || > free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); > #endif > - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size - 1); > + xfs_trans_log_buf(args->trans, bp, 0, > + args->dp->d_ops->free_hdr_size - 1); > } > > /* > @@ -350,8 +349,8 @@ xfs_dir2_leaf_to_node( > freehdr.nvalid = be32_to_cpu(ltp->bestcount); > > dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); > - xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1); > - xfs_dir2_free_log_header(tp, dp, fbp); > + xfs_dir2_free_log_bests(args, fbp, 0, freehdr.nvalid - 1); > + xfs_dir2_free_log_header(args, fbp); > > /* > * Converting the leaf to a leafnode is just a matter of changing the > @@ -365,7 +364,7 @@ xfs_dir2_leaf_to_node( > leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); > lbp->b_ops = &xfs_dir3_leafn_buf_ops; > xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); > - xfs_dir3_leaf_log_header(tp, dp, lbp); > + xfs_dir3_leaf_log_header(args, lbp); > xfs_dir3_leaf_check(dp, lbp); > return 0; > } > @@ -455,8 +454,8 @@ xfs_dir2_leafn_add( > args->blkno, args->index)); > > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, bp); > - xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); > + xfs_dir3_leaf_log_header(args, bp); > + xfs_dir3_leaf_log_ents(args, bp, lfloglow, lfloghigh); > xfs_dir3_leaf_check(dp, bp); > return 0; > } > @@ -851,7 +850,6 @@ xfs_dir3_leafn_moveents( > int start_d,/* destination leaf index */ > int count) /* count of leaves to copy */ > { > - struct xfs_trans *tp = args->trans; > int stale; /* count stale leaves copied */ > > trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); > @@ -870,7 +868,7 @@ xfs_dir3_leafn_moveents( > if (start_d < dhdr->count) { > memmove(&dents[start_d + count], &dents[start_d], > (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); > - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count, > + xfs_dir3_leaf_log_ents(args, bp_d, start_d + count, > count + dhdr->count - 1); > } > /* > @@ -892,8 +890,7 @@ xfs_dir3_leafn_moveents( > */ > memcpy(&dents[start_d], &sents[start_s], > count * sizeof(xfs_dir2_leaf_entry_t)); > - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, > - start_d, start_d + count - 1); > + xfs_dir3_leaf_log_ents(args, bp_d, start_d, start_d + count - 1); > > /* > * If there are source entries after the ones we copied, > @@ -902,8 +899,7 @@ xfs_dir3_leafn_moveents( > if (start_s + count < shdr->count) { > memmove(&sents[start_s], &sents[start_s + count], > count * sizeof(xfs_dir2_leaf_entry_t)); > - xfs_dir3_leaf_log_ents(tp, args->dp, bp_s, > - start_s, start_s + count - 1); > + xfs_dir3_leaf_log_ents(args, bp_s, start_s, start_s + count - 1); > } > > /* > @@ -1039,8 +1035,8 @@ xfs_dir2_leafn_rebalance( > /* log the changes made when moving the entries */ > dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); > dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); > - xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); > - xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); > + xfs_dir3_leaf_log_header(args, blk1->bp); > + xfs_dir3_leaf_log_header(args, blk2->bp); > > xfs_dir3_leaf_check(dp, blk1->bp); > xfs_dir3_leaf_check(dp, blk2->bp); > @@ -1083,7 +1079,6 @@ xfs_dir3_data_block_free( > struct xfs_buf *fbp, > int longest) > { > - struct xfs_trans *tp = args->trans; > int logfree = 0; > __be16 *bests; > struct xfs_dir3_icfree_hdr freehdr; > @@ -1097,7 +1092,7 @@ xfs_dir3_data_block_free( > * value. > */ > bests[findex] = cpu_to_be16(longest); > - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); > + xfs_dir2_free_log_bests(args, fbp, findex, findex); > return 0; > } > > @@ -1125,7 +1120,7 @@ xfs_dir3_data_block_free( > } > > dp->d_ops->free_hdr_to_disk(free, &freehdr); > - xfs_dir2_free_log_header(tp, dp, fbp); > + xfs_dir2_free_log_header(args, fbp); > > /* > * If there are no useful entries left in the block, get rid of the > @@ -1149,7 +1144,7 @@ xfs_dir3_data_block_free( > > /* Log the free entry that changed, unless we got rid of it. */ > if (logfree) > - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); > + xfs_dir2_free_log_bests(args, fbp, findex, findex); > return 0; > } > > @@ -1211,10 +1206,10 @@ xfs_dir2_leafn_remove( > */ > leafhdr.stale++; > dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); > - xfs_dir3_leaf_log_header(tp, dp, bp); > + xfs_dir3_leaf_log_header(args, bp); > > lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); > - xfs_dir3_leaf_log_ents(tp, dp, bp, index, index); > + xfs_dir3_leaf_log_ents(args, bp, index, index); > > /* > * Make the data entry free. Keep track of the longest freespace > @@ -1226,7 +1221,7 @@ xfs_dir2_leafn_remove( > bf = dp->d_ops->data_bestfree_p(hdr); > longest = be16_to_cpu(bf[0].length); > needlog = needscan = 0; > - xfs_dir2_data_make_free(tp, dp, dbp, off, > + xfs_dir2_data_make_free(args, dbp, off, > dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); > /* > * Rescan the data block freespaces for bestfree. > @@ -1235,7 +1230,7 @@ xfs_dir2_leafn_remove( > if (needscan) > xfs_dir2_data_freescan(dp, hdr, &needlog); > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > + xfs_dir2_data_log_header(args, dbp); > xfs_dir3_data_check(dp, dbp); > /* > * If the longest data block freespace changes, need to update > @@ -1569,8 +1564,8 @@ xfs_dir2_leafn_unbalance( > /* log the changes made when moving the entries */ > dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); > dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); > - xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); > - xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); > + xfs_dir3_leaf_log_header(args, save_blk->bp); > + xfs_dir3_leaf_log_header(args, drop_blk->bp); > > xfs_dir3_leaf_check(dp, save_blk->bp); > xfs_dir3_leaf_check(dp, drop_blk->bp); > @@ -1931,7 +1926,7 @@ xfs_dir2_node_addname_int( > if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { > freehdr.nused++; > dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); > - xfs_dir2_free_log_header(tp, dp, fbp); > + xfs_dir2_free_log_header(args, fbp); > } > /* > * Update the real value in the table. > @@ -1975,7 +1970,7 @@ xfs_dir2_node_addname_int( > /* > * Mark the first part of the unused space, inuse for us. > */ > - xfs_dir2_data_use_free(tp, dp, dbp, dup, > + xfs_dir2_data_use_free(args, dbp, dup, > (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, > &needlog, &needscan); > /* > @@ -1988,7 +1983,7 @@ xfs_dir2_node_addname_int( > dp->d_ops->data_put_ftype(dep, args->filetype); > tagp = dp->d_ops->data_entry_tag_p(dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > - xfs_dir2_data_log_entry(tp, dp, dbp, dep); > + xfs_dir2_data_log_entry(args, dbp, dep); > /* > * Rescan the block for bestfree if needed. > */ > @@ -1998,7 +1993,7 @@ xfs_dir2_node_addname_int( > * Log the data block header if needed. > */ > if (needlog) > - xfs_dir2_data_log_header(tp, dp, dbp); > + xfs_dir2_data_log_header(args, dbp); > /* > * If the freespace entry is now wrong, update it. > */ > @@ -2011,7 +2006,7 @@ xfs_dir2_node_addname_int( > * Log the freespace entry if needed. > */ > if (logfree) > - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); > + xfs_dir2_free_log_bests(args, fbp, findex, findex); > /* > * Return the data block and offset in args, then drop the data block. > */ > @@ -2208,8 +2203,7 @@ xfs_dir2_node_replace( > */ > dep->inumber = cpu_to_be64(inum); > args->dp->d_ops->data_put_ftype(dep, args->filetype); > - xfs_dir2_data_log_entry(args->trans, args->dp, > - state->extrablk.bp, dep); > + xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); > rval = 0; > } > /* > diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h > index 2429960..07bfb4b 100644 > --- a/fs/xfs/xfs_dir2_priv.h > +++ b/fs/xfs/xfs_dir2_priv.h > @@ -77,9 +77,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, > int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); > extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, > struct xfs_buf **bpp, __uint16_t magic); > -extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir3_leaf_log_ents(struct xfs_da_args *args, > struct xfs_buf *bp, int first, int last); > -extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp, > +extern void xfs_dir3_leaf_log_header(struct xfs_da_args *args, > struct xfs_buf *bp); > extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); > extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 11:01:14 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 26CFC7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:01:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB23730405F for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:10 -0700 (PDT) X-ASG-Debug-ID: 1401206469-04cb6c22b817aec0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CCWKWHhiDuMZcx0l for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:10 -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 (8.14.4/8.14.4) with ESMTP id s4RG18wQ028813 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 12:01:08 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RG17UJ010058; Tue, 27 May 2014 12:01:07 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 4AE72120AC1; Tue, 27 May 2014 12:01:07 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RG16Hd011679; Tue, 27 May 2014 12:01:06 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 12:01:01 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code Message-ID: <20140527160100.GF11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-15-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-15-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401206469 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, May 23, 2014 at 10:03:50AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Rather than using the superblock value obtained through the > xfs_mount. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_attr.c | 12 ++++++------ > fs/xfs/xfs_attr_leaf.c | 6 +++--- > fs/xfs/xfs_log_rlimit.c | 2 +- > 3 files changed, 10 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 8bb9ae6..ccfc2c9 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -175,11 +175,11 @@ xfs_attr_calc_size( > * "local" or "remote" (note: local != inline). > */ > size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - mp->m_sb.sb_blocksize, local); > + args->geo->blksize, local); > > nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); > if (*local) { > - if (size > (mp->m_sb.sb_blocksize >> 1)) { > + if (size > (args->geo->blksize / 2)) { > /* Double split possible */ > nblks *= 2; > } > @@ -898,7 +898,7 @@ restart: > state = xfs_da_state_alloc(); > state->args = args; > state->mp = mp; > - state->blocksize = state->mp->m_sb.sb_blocksize; > + state->blocksize = args->geo->blksize; > state->node_ents = args->geo->node_ents; > > /* > @@ -1077,7 +1077,7 @@ restart: > state = xfs_da_state_alloc(); > state->args = args; > state->mp = mp; > - state->blocksize = state->mp->m_sb.sb_blocksize; > + state->blocksize = args->geo->blksize; > state->node_ents = args->geo->node_ents; > state->inleaf = 0; > error = xfs_da3_node_lookup_int(state, &retval); > @@ -1169,7 +1169,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) > state = xfs_da_state_alloc(); > state->args = args; > state->mp = dp->i_mount; > - state->blocksize = state->mp->m_sb.sb_blocksize; > + state->blocksize = args->geo->blksize; > state->node_ents = args->geo->node_ents; > > /* > @@ -1432,7 +1432,7 @@ xfs_attr_node_get(xfs_da_args_t *args) > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > - state->blocksize = state->mp->m_sb.sb_blocksize; > + state->blocksize = args->geo->blksize; > state->node_ents = args->geo->node_ents; > > /* > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 5be77b3..88cd84a 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1077,7 +1077,7 @@ xfs_attr3_leaf_add( > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > ASSERT(args->index >= 0 && args->index <= ichdr.count); > entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - args->trans->t_mountp->m_sb.sb_blocksize, NULL); > + args->geo->blksize, NULL); > > /* > * Search through freemap for first-fit on new name length. > @@ -1180,13 +1180,13 @@ xfs_attr3_leaf_add_work( > ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); > ASSERT(ichdr->freemap[mapindex].size >= > xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - mp->m_sb.sb_blocksize, NULL)); > + args->geo->blksize, NULL)); > ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); > ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); > > ichdr->freemap[mapindex].size -= > xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - mp->m_sb.sb_blocksize, &tmp); > + args->geo->blksize, &tmp); > > entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + > ichdr->freemap[mapindex].size); > diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c > index 2af1a0a..ee7e0e8 100644 > --- a/fs/xfs/xfs_log_rlimit.c > +++ b/fs/xfs/xfs_log_rlimit.c > @@ -42,7 +42,7 @@ xfs_log_calc_max_attrsetm_res( > int size; > int nblks; > > - size = xfs_attr_leaf_entsize_local_max(mp->m_sb.sb_blocksize) - > + size = xfs_attr_leaf_entsize_local_max(mp->m_attr_geo->blksize) - > MAXNAMELEN - 1; > nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); > nblks += XFS_B_TO_FSB(mp, size); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 11:01:18 2014 Return-Path: <bfoster@redhat.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A4D129DFA for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:01:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE5D3304059 for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:17 -0700 (PDT) X-ASG-Debug-ID: 1401206476-04cbb02a11171830001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XTHUbGUXBVeOcvGA for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:17 -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 (8.14.4/8.14.4) with ESMTP id s4RG1F0g015815 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 12:01:16 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RG1Fnx006035; Tue, 27 May 2014 12:01:15 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id ED79F120AC1; Tue, 27 May 2014 12:01:14 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RG1EJQ011702; Tue, 27 May 2014 12:01:14 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 12:01:13 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Message-ID: <20140527160113.GG11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-16-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-16-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401206476 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, May 23, 2014 at 10:03:51AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > As it's only ever called from contexts where the xfs_da_args is > present and contains all the information needed inside the args > structure. > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_attr.c | 4 +--- > fs/xfs/xfs_attr_leaf.c | 47 +++++++++++++++++------------------------------ > fs/xfs/xfs_attr_leaf.h | 3 +-- > 3 files changed, 19 insertions(+), 35 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index ccfc2c9..3d8c03e 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -174,9 +174,7 @@ xfs_attr_calc_size( > * Determine space new attribute will use, and if it would be > * "local" or "remote" (note: local != inline). > */ > - size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - args->geo->blksize, local); > - > + size = xfs_attr_leaf_newentsize(args, local); > nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); > if (*local) { > if (size > (args->geo->blksize / 2)) { > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 88cd84a..7761103 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -1076,8 +1076,7 @@ xfs_attr3_leaf_add( > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > ASSERT(args->index >= 0 && args->index <= ichdr.count); > - entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - args->geo->blksize, NULL); > + entsize = xfs_attr_leaf_newentsize(args, NULL); > > /* > * Search through freemap for first-fit on new name length. > @@ -1179,14 +1178,11 @@ xfs_attr3_leaf_add_work( > ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); > ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); > ASSERT(ichdr->freemap[mapindex].size >= > - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - args->geo->blksize, NULL)); > + xfs_attr_leaf_newentsize(args, NULL)); > ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); > ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); > > - ichdr->freemap[mapindex].size -= > - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, > - args->geo->blksize, &tmp); > + ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); > > entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + > ichdr->freemap[mapindex].size); > @@ -1594,9 +1590,7 @@ xfs_attr3_leaf_figure_balance( > max = ichdr1->count + ichdr2->count; > half = (max + 1) * sizeof(*entry); > half += ichdr1->usedbytes + ichdr2->usedbytes + > - xfs_attr_leaf_newentsize(state->args->namelen, > - state->args->valuelen, > - state->blocksize, NULL); > + xfs_attr_leaf_newentsize(state->args, NULL); > half /= 2; > lastdelta = state->blocksize; > entry = xfs_attr3_leaf_entryp(leaf1); > @@ -1608,10 +1602,7 @@ xfs_attr3_leaf_figure_balance( > */ > if (count == blk1->index) { > tmp = totallen + sizeof(*entry) + > - xfs_attr_leaf_newentsize( > - state->args->namelen, > - state->args->valuelen, > - state->blocksize, NULL); > + xfs_attr_leaf_newentsize(state->args, NULL); > if (XFS_ATTR_ABS(half - tmp) > lastdelta) > break; > lastdelta = XFS_ATTR_ABS(half - tmp); > @@ -1647,10 +1638,7 @@ xfs_attr3_leaf_figure_balance( > totallen -= count * sizeof(*entry); > if (foundit) { > totallen -= sizeof(*entry) + > - xfs_attr_leaf_newentsize( > - state->args->namelen, > - state->args->valuelen, > - state->blocksize, NULL); > + xfs_attr_leaf_newentsize(state->args, NULL); > } > > *countarg = count; > @@ -2441,22 +2429,21 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) > * a "local" or a "remote" attribute. > */ > int > -xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) > +xfs_attr_leaf_newentsize( > + struct xfs_da_args *args, > + int *local) > { > - int size; > + int size; > > - size = xfs_attr_leaf_entsize_local(namelen, valuelen); > - if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { > - if (local) { > + size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen); > + if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) { > + if (local) > *local = 1; > - } > - } else { > - size = xfs_attr_leaf_entsize_remote(namelen); > - if (local) { > - *local = 0; > - } > + return size; > } > - return size; > + if (local) > + *local = 0; > + return xfs_attr_leaf_entsize_remote(args->namelen); > } > > > diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h > index 3ec5ec0..e2929da 100644 > --- a/fs/xfs/xfs_attr_leaf.h > +++ b/fs/xfs/xfs_attr_leaf.h > @@ -96,8 +96,7 @@ int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); > xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); > int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, > struct xfs_buf *leaf2_bp); > -int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, > - int *local); > +int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); > int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, > xfs_dablk_t bno, xfs_daddr_t mappedbno, > struct xfs_buf **bpp); > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 11:01:29 2014 Return-Path: <bfoster@redhat.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 238B07F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:01:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68150AC00A for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:25 -0700 (PDT) X-ASG-Debug-ID: 1401206483-04cb6c22b717af20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uAaVKYhsXTCA0Xq3 for <xfs@oss.sgi.com>; Tue, 27 May 2014 09:01:23 -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 (8.14.4/8.14.4) with ESMTP id s4RG1M8E007256 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 12:01:22 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RG1MKR027648; Tue, 27 May 2014 12:01:22 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id CB4C7120AC1; Tue, 27 May 2014 12:01:21 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RG1LoP011705; Tue, 27 May 2014 12:01:21 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 12:01:20 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry Message-ID: <20140527160120.GH11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-17-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1400803432-20048-17-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401206483 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, May 23, 2014 at 10:03:52AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > fs/xfs/xfs_attr.c | 2 +- > fs/xfs/xfs_attr_leaf.c | 114 ++++++++++++++++++++++++----------------------- > fs/xfs/xfs_attr_remote.c | 55 ++++++++++++----------- > fs/xfs/xfs_da_format.h | 10 ----- > 4 files changed, 89 insertions(+), 92 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 3d8c03e..470a22d 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -863,7 +863,7 @@ xfs_attr_leaf_get(xfs_da_args_t *args) > } > > /*======================================================================== > - * External routines when attribute list size > XFS_LBSIZE(mp). > + * External routines when attribute list size > geo->blksize > *========================================================================*/ > > /* > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 7761103..ae33b14 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -80,11 +80,12 @@ STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, > /* > * Utility routines. > */ > -STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, > +STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args, > + struct xfs_attr_leafblock *src_leaf, > struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, > struct xfs_attr_leafblock *dst_leaf, > struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, > - int move_count, struct xfs_mount *mp); > + int move_count); > STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); > > void > @@ -806,18 +807,18 @@ xfs_attr3_leaf_to_shortform( > > trace_xfs_attr_leaf_to_sf(args); > > - tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); > + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); > if (!tmpbuffer) > return ENOMEM; > > - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); > + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); > > leaf = (xfs_attr_leafblock_t *)tmpbuffer; > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > entry = xfs_attr3_leaf_entryp(leaf); > > /* XXX (dgc): buffer is about to be marked stale - why zero it? */ > - memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); > + memset(bp->b_addr, 0, args->geo->blksize); > > /* > * Clean out the prior contents of the attribute list. > @@ -906,12 +907,12 @@ xfs_attr3_leaf_to_node( > /* copy leaf to new buffer, update identifiers */ > xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); > bp2->b_ops = bp1->b_ops; > - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); > + memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); > if (xfs_sb_version_hascrc(&mp->m_sb)) { > struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; > hdr3->blkno = cpu_to_be64(bp2->b_bn); > } > - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); > + xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); > > /* > * Set up the new root node. > @@ -932,7 +933,7 @@ xfs_attr3_leaf_to_node( > btree[0].before = cpu_to_be32(blkno); > icnodehdr.count = 1; > dp->d_ops->node_hdr_to_disk(node, &icnodehdr); > - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); > + xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1); > error = 0; > out: > return error; > @@ -968,10 +969,10 @@ xfs_attr3_leaf_create( > bp->b_ops = &xfs_attr3_leaf_buf_ops; > xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); > leaf = bp->b_addr; > - memset(leaf, 0, XFS_LBSIZE(mp)); > + memset(leaf, 0, args->geo->blksize); > > memset(&ichdr, 0, sizeof(ichdr)); > - ichdr.firstused = XFS_LBSIZE(mp); > + ichdr.firstused = args->geo->blksize; > > if (xfs_sb_version_hascrc(&mp->m_sb)) { > struct xfs_da3_blkinfo *hdr3 = bp->b_addr; > @@ -990,7 +991,7 @@ xfs_attr3_leaf_create( > ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; > > xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); > - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); > + xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); > > *bpp = bp; > return 0; > @@ -1175,11 +1176,11 @@ xfs_attr3_leaf_add_work( > * Allocate space for the new string (at the end of the run). > */ > mp = args->trans->t_mountp; > - ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); > + ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize); > ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); > ASSERT(ichdr->freemap[mapindex].size >= > xfs_attr_leaf_newentsize(args, NULL)); > - ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); > + ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize); > ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); > > ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); > @@ -1267,14 +1268,13 @@ xfs_attr3_leaf_compact( > struct xfs_attr_leafblock *leaf_dst; > struct xfs_attr3_icleaf_hdr ichdr_src; > struct xfs_trans *trans = args->trans; > - struct xfs_mount *mp = trans->t_mountp; > char *tmpbuffer; > > trace_xfs_attr_leaf_compact(args); > > - tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); > - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); > - memset(bp->b_addr, 0, XFS_LBSIZE(mp)); > + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); > + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); > + memset(bp->b_addr, 0, args->geo->blksize); > leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; > leaf_dst = bp->b_addr; > > @@ -1287,7 +1287,7 @@ xfs_attr3_leaf_compact( > > /* Initialise the incore headers */ > ichdr_src = *ichdr_dst; /* struct copy */ > - ichdr_dst->firstused = XFS_LBSIZE(mp); > + ichdr_dst->firstused = args->geo->blksize; > ichdr_dst->usedbytes = 0; > ichdr_dst->count = 0; > ichdr_dst->holes = 0; > @@ -1302,13 +1302,13 @@ xfs_attr3_leaf_compact( > * Copy all entry's in the same (sorted) order, > * but allocate name/value pairs packed and in sequence. > */ > - xfs_attr3_leaf_moveents(leaf_src, &ichdr_src, 0, leaf_dst, ichdr_dst, 0, > - ichdr_src.count, mp); > + xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0, > + leaf_dst, ichdr_dst, 0, ichdr_src.count); > /* > * this logs the entire buffer, but the caller must write the header > * back to the buffer when it is finished modifying it. > */ > - xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); > + xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1); > > kmem_free(tmpbuffer); > } > @@ -1459,8 +1459,8 @@ xfs_attr3_leaf_rebalance( > /* > * Move high entries from leaf1 to low end of leaf2. > */ > - xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, > - leaf2, &ichdr2, 0, count, state->mp); > + xfs_attr3_leaf_moveents(args, leaf1, &ichdr1, > + ichdr1.count - count, leaf2, &ichdr2, 0, count); > > } else if (count > ichdr1.count) { > /* > @@ -1488,8 +1488,8 @@ xfs_attr3_leaf_rebalance( > /* > * Move low entries from leaf2 to high end of leaf1. > */ > - xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, > - ichdr1.count, count, state->mp); > + xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1, > + ichdr1.count, count); > } > > xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); > @@ -1795,7 +1795,6 @@ xfs_attr3_leaf_remove( > struct xfs_attr_leafblock *leaf; > struct xfs_attr3_icleaf_hdr ichdr; > struct xfs_attr_leaf_entry *entry; > - struct xfs_mount *mp = args->trans->t_mountp; > int before; > int after; > int smallest; > @@ -1809,7 +1808,7 @@ xfs_attr3_leaf_remove( > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > > - ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); > + ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); > ASSERT(args->index >= 0 && args->index < ichdr.count); > ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + > xfs_attr3_leaf_hdr_size(leaf)); > @@ -1817,7 +1816,7 @@ xfs_attr3_leaf_remove( > entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; > > ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); > - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); > + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); > > /* > * Scan through free region table: > @@ -1832,8 +1831,8 @@ xfs_attr3_leaf_remove( > smallest = XFS_ATTR_LEAF_MAPSIZE - 1; > entsize = xfs_attr_leaf_entsize(leaf, args->index); > for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { > - ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); > - ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); > + ASSERT(ichdr.freemap[i].base < args->geo->blksize); > + ASSERT(ichdr.freemap[i].size < args->geo->blksize); > if (ichdr.freemap[i].base == tablesize) { > ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); > ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); > @@ -1910,11 +1909,11 @@ xfs_attr3_leaf_remove( > * removing the name. > */ > if (smallest) { > - tmp = XFS_LBSIZE(mp); > + tmp = args->geo->blksize; > entry = xfs_attr3_leaf_entryp(leaf); > for (i = ichdr.count - 1; i >= 0; entry++, i--) { > ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); > - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); > + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); > > if (be16_to_cpu(entry->nameidx) < tmp) > tmp = be16_to_cpu(entry->nameidx); > @@ -1954,7 +1953,6 @@ xfs_attr3_leaf_unbalance( > struct xfs_attr3_icleaf_hdr drophdr; > struct xfs_attr3_icleaf_hdr savehdr; > struct xfs_attr_leaf_entry *entry; > - struct xfs_mount *mp = state->mp; > > trace_xfs_attr_leaf_unbalance(state->args); > > @@ -1981,13 +1979,15 @@ xfs_attr3_leaf_unbalance( > */ > if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, > drop_blk->bp, &drophdr)) { > - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, > + xfs_attr3_leaf_moveents(state->args, > + drop_leaf, &drophdr, 0, > save_leaf, &savehdr, 0, > - drophdr.count, mp); > + drophdr.count); > } else { > - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, > + xfs_attr3_leaf_moveents(state->args, > + drop_leaf, &drophdr, 0, > save_leaf, &savehdr, > - savehdr.count, drophdr.count, mp); > + savehdr.count, drophdr.count); > } > } else { > /* > @@ -2017,19 +2017,23 @@ xfs_attr3_leaf_unbalance( > > if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, > drop_blk->bp, &drophdr)) { > - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, > + xfs_attr3_leaf_moveents(state->args, > + drop_leaf, &drophdr, 0, > tmp_leaf, &tmphdr, 0, > - drophdr.count, mp); > - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, > + drophdr.count); > + xfs_attr3_leaf_moveents(state->args, > + save_leaf, &savehdr, 0, > tmp_leaf, &tmphdr, tmphdr.count, > - savehdr.count, mp); > + savehdr.count); > } else { > - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, > + xfs_attr3_leaf_moveents(state->args, > + save_leaf, &savehdr, 0, > tmp_leaf, &tmphdr, 0, > - savehdr.count, mp); > - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, > + savehdr.count); > + xfs_attr3_leaf_moveents(state->args, > + drop_leaf, &drophdr, 0, > tmp_leaf, &tmphdr, tmphdr.count, > - drophdr.count, mp); > + drophdr.count); > } > memcpy(save_leaf, tmp_leaf, state->blocksize); > savehdr = tmphdr; /* struct copy */ > @@ -2084,7 +2088,7 @@ xfs_attr3_leaf_lookup_int( > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > entries = xfs_attr3_leaf_entryp(leaf); > - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); > + ASSERT(ichdr.count < args->geo->blksize / 8); > > /* > * Binary search. (note: small blocks will skip this loop) > @@ -2188,7 +2192,7 @@ xfs_attr3_leaf_getvalue( > > leaf = bp->b_addr; > xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); > - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); > + ASSERT(ichdr.count < args->geo->blksize / 8); > ASSERT(args->index < ichdr.count); > > entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; > @@ -2239,14 +2243,14 @@ xfs_attr3_leaf_getvalue( > /*ARGSUSED*/ > STATIC void > xfs_attr3_leaf_moveents( > + struct xfs_da_args *args, > struct xfs_attr_leafblock *leaf_s, > struct xfs_attr3_icleaf_hdr *ichdr_s, > int start_s, > struct xfs_attr_leafblock *leaf_d, > struct xfs_attr3_icleaf_hdr *ichdr_d, > int start_d, > - int count, > - struct xfs_mount *mp) > + int count) > { > struct xfs_attr_leaf_entry *entry_s; > struct xfs_attr_leaf_entry *entry_d; > @@ -2266,10 +2270,10 @@ xfs_attr3_leaf_moveents( > ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || > ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); > ASSERT(ichdr_s->magic == ichdr_d->magic); > - ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); > + ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8); > ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) > + xfs_attr3_leaf_hdr_size(leaf_s)); > - ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); > + ASSERT(ichdr_d->count < args->geo->blksize / 8); > ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) > + xfs_attr3_leaf_hdr_size(leaf_d)); > > @@ -2321,11 +2325,11 @@ xfs_attr3_leaf_moveents( > entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); > entry_d->flags = entry_s->flags; > ASSERT(be16_to_cpu(entry_d->nameidx) + tmp > - <= XFS_LBSIZE(mp)); > + <= args->geo->blksize); > memmove(xfs_attr3_leaf_name(leaf_d, desti), > xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); > ASSERT(be16_to_cpu(entry_s->nameidx) + tmp > - <= XFS_LBSIZE(mp)); > + <= args->geo->blksize); > memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); > ichdr_s->usedbytes -= tmp; > ichdr_d->usedbytes += tmp; > @@ -2346,7 +2350,7 @@ xfs_attr3_leaf_moveents( > tmp = count * sizeof(xfs_attr_leaf_entry_t); > entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; > ASSERT(((char *)entry_s + tmp) <= > - ((char *)leaf_s + XFS_LBSIZE(mp))); > + ((char *)leaf_s + args->geo->blksize)); > memset(entry_s, 0, tmp); > } else { > /* > @@ -2361,7 +2365,7 @@ xfs_attr3_leaf_moveents( > tmp = count * sizeof(xfs_attr_leaf_entry_t); > entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; > ASSERT(((char *)entry_s + tmp) <= > - ((char *)leaf_s + XFS_LBSIZE(mp))); > + ((char *)leaf_s + args->geo->blksize)); > memset(entry_s, 0, tmp); > } > > diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c > index 0f0679a..b5adfec 100644 > --- a/fs/xfs/xfs_attr_remote.c > +++ b/fs/xfs/xfs_attr_remote.c > @@ -125,6 +125,7 @@ xfs_attr3_rmt_read_verify( > char *ptr; > int len; > xfs_daddr_t bno; > + int blksize = mp->m_attr_geo->blksize; > > /* no verification of non-crc buffers */ > if (!xfs_sb_version_hascrc(&mp->m_sb)) > @@ -133,21 +134,20 @@ xfs_attr3_rmt_read_verify( > ptr = bp->b_addr; > bno = bp->b_bn; > len = BBTOB(bp->b_length); > - ASSERT(len >= XFS_LBSIZE(mp)); > + ASSERT(len >= blksize); > > while (len > 0) { > - if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), > - XFS_ATTR3_RMT_CRC_OFF)) { > + if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) { > xfs_buf_ioerror(bp, EFSBADCRC); > break; > } > - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { > + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { > xfs_buf_ioerror(bp, EFSCORRUPTED); > break; > } > - len -= XFS_LBSIZE(mp); > - ptr += XFS_LBSIZE(mp); > - bno += mp->m_bsize; > + len -= blksize; > + ptr += blksize; > + bno += BTOBB(blksize); > } > > if (bp->b_error) > @@ -165,6 +165,7 @@ xfs_attr3_rmt_write_verify( > char *ptr; > int len; > xfs_daddr_t bno; > + int blksize = mp->m_attr_geo->blksize; > > /* no verification of non-crc buffers */ > if (!xfs_sb_version_hascrc(&mp->m_sb)) > @@ -173,10 +174,10 @@ xfs_attr3_rmt_write_verify( > ptr = bp->b_addr; > bno = bp->b_bn; > len = BBTOB(bp->b_length); > - ASSERT(len >= XFS_LBSIZE(mp)); > + ASSERT(len >= blksize); > > while (len > 0) { > - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { > + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { > xfs_buf_ioerror(bp, EFSCORRUPTED); > xfs_verifier_error(bp); > return; > @@ -187,11 +188,11 @@ xfs_attr3_rmt_write_verify( > rmt = (struct xfs_attr3_rmt_hdr *)ptr; > rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); > } > - xfs_update_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF); > + xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF); > > - len -= XFS_LBSIZE(mp); > - ptr += XFS_LBSIZE(mp); > - bno += mp->m_bsize; > + len -= blksize; > + ptr += blksize; > + bno += BTOBB(blksize); > } > ASSERT(len == 0); > } > @@ -240,12 +241,13 @@ xfs_attr_rmtval_copyout( > char *src = bp->b_addr; > xfs_daddr_t bno = bp->b_bn; > int len = BBTOB(bp->b_length); > + int blksize = mp->m_attr_geo->blksize; > > - ASSERT(len >= XFS_LBSIZE(mp)); > + ASSERT(len >= blksize); > > while (len > 0 && *valuelen > 0) { > int hdr_size = 0; > - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); > + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); > > byte_cnt = min(*valuelen, byte_cnt); > > @@ -263,9 +265,9 @@ xfs_attr_rmtval_copyout( > memcpy(*dst, src + hdr_size, byte_cnt); > > /* roll buffer forwards */ > - len -= XFS_LBSIZE(mp); > - src += XFS_LBSIZE(mp); > - bno += mp->m_bsize; > + len -= blksize; > + src += blksize; > + bno += BTOBB(blksize); > > /* roll attribute data forwards */ > *valuelen -= byte_cnt; > @@ -287,12 +289,13 @@ xfs_attr_rmtval_copyin( > char *dst = bp->b_addr; > xfs_daddr_t bno = bp->b_bn; > int len = BBTOB(bp->b_length); > + int blksize = mp->m_attr_geo->blksize; > > - ASSERT(len >= XFS_LBSIZE(mp)); > + ASSERT(len >= blksize); > > while (len > 0 && *valuelen > 0) { > int hdr_size; > - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); > + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); > > byte_cnt = min(*valuelen, byte_cnt); > hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, > @@ -304,17 +307,17 @@ xfs_attr_rmtval_copyin( > * If this is the last block, zero the remainder of it. > * Check that we are actually the last block, too. > */ > - if (byte_cnt + hdr_size < XFS_LBSIZE(mp)) { > + if (byte_cnt + hdr_size < blksize) { > ASSERT(*valuelen - byte_cnt == 0); > - ASSERT(len == XFS_LBSIZE(mp)); > + ASSERT(len == blksize); > memset(dst + hdr_size + byte_cnt, 0, > - XFS_LBSIZE(mp) - hdr_size - byte_cnt); > + blksize - hdr_size - byte_cnt); > } > > /* roll buffer forwards */ > - len -= XFS_LBSIZE(mp); > - dst += XFS_LBSIZE(mp); > - bno += mp->m_bsize; > + len -= blksize; > + dst += blksize; > + bno += BTOBB(blksize); > > /* roll attribute data forwards */ > *valuelen -= byte_cnt; > diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h > index 44d7fac..0a49b02 100644 > --- a/fs/xfs/xfs_da_format.h > +++ b/fs/xfs/xfs_da_format.h > @@ -19,10 +19,6 @@ > #ifndef __XFS_DA_FORMAT_H__ > #define __XFS_DA_FORMAT_H__ > > -/*======================================================================== > - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. > - *========================================================================*/ > - > /* > * This structure is common to both leaf nodes and non-leaf nodes in the Btree. > * > @@ -122,8 +118,6 @@ struct xfs_da3_icnode_hdr { > __uint16_t level; > }; > > -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize > - > /* > * Directory version 2. > * > @@ -620,10 +614,6 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) > * of an attribute name may not be unique, we may have duplicate keys. The > * internal links in the Btree are logical block offsets into the file. > * > - *======================================================================== > - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. > - *======================================================================== > - * > * Struct leaf_entry's are packed from the top. Name/values grow from the > * bottom but are not packed. The freemap contains run-length-encoded entries > * for the free bytes after the leaf_entry's, but only the N largest such, > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 13:40:54 2014 Return-Path: <bfoster@redhat.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 00B4D7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 13:40:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D95618F8081 for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:40:50 -0700 (PDT) X-ASG-Debug-ID: 1401216048-04cb6c22b718b6e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HWETff6Sxn3EpgGh for <xfs@oss.sgi.com>; Tue, 27 May 2014 11:40: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RIekgX030767 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 27 May 2014 14:40:46 -0400 Received: from laptop.bfoster (vpn-60-249.rdu2.redhat.com [10.10.60.249]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4RIejPm008937; Tue, 27 May 2014 14:40:45 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 4A42B120AC1; Tue, 27 May 2014 14:40:45 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4RIeh1P012278; Tue, 27 May 2014 14:40:43 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Tue, 27 May 2014 14:40:43 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: Dave Chinner <david@fromorbit.com>, linux-fsdevel@vger.kernel.org, Ashish Sangwan <a.sangwan@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140527184042.GI11265@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401216049 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, May 27, 2014 at 05:18:57PM +0900, Namjae Jeon wrote: > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > 5) Allocate unwritten extents for the hole created in step 4. > > Cc: Brian Foster <bfoster@redhat.com> > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > --- This version looks pretty good to me. Thanks Namje. Reviewed-by: Brian Foster <bfoster@redhat.com> > > Changelog > v3: > - remove XFS_TRANS_RESERVE and assert. > - update the comment of blockcount calculation. > - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. > - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. > > v2: > - remove reserved enable. > - add xfs_qm_dqattach. > - reset blockcount in xfs_bmap_shift_extents_right. > - update i_size to avoid data loss before insert_file_space() is called. > - use in-memory extent array size that delayed allocation extents. > > fs/xfs/xfs_bmap.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 128 ++++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 38 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 550 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 1ff0da6..8023b7e 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -5419,7 +5419,7 @@ error0: > * into, this will be considered invalid operation and we abort immediately. > */ > int > -xfs_bmap_shift_extents( > +xfs_bmap_shift_extents_left( > struct xfs_trans *tp, > struct xfs_inode *ip, > int *done, > @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > - XFS_ERROR_REPORT("xfs_bmap_shift_extents", > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", > XFS_ERRLEVEL_LOW, mp); > return XFS_ERROR(EFSCORRUPTED); > } > @@ -5606,3 +5606,376 @@ del_cursor: > xfs_trans_log_inode(tp, ip, logflags); > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be splitted. @split_fsb is a block where the extents is spliited. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *current_ext, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* splitted extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + int error = 0; > + int logflags; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_bmbt_set_blockcount(gotp, gotblkcnt); > + got.br_blockcount = gotblkcnt; > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + /* Add new extent */ > + (*current_ext)++; > + xfs_iext_insert(ip, *current_ext, 1, &new, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, > + new.br_startblock, new.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); > + cur->bc_rec.b.br_state = new.br_state; > + > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + /* > + * Convert to a btree if necessary. > + */ > + if (xfs_bmap_needs_btree(ip, whichfork)) { > + int tmp_logflags; /* partial log flag return val */ > + > + ASSERT(cur == NULL); > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + &cur, 0, &tmp_logflags, whichfork); > + logflags |= tmp_logflags; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > + > +int > +xfs_bmap_split_extent( > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *split_ext) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t firstfsb; > + int committed; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + > + if (error) { > + /* > + * Free the transaction structure. > + */ > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + xfs_bmap_init(&free_list, &firstfsb); > + > + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, > + &firstfsb, &free_list); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + return error; > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > + * Shift extent records to the right to make a hole. > + * The maximum number of extents to be shifted in a single operation > + * is @num_exts, and @current_ext keeps track of the current extent > + * index we have shifted. @offset_shift_fsb is the length by which each > + * extent is shifted. @end_ext is the last extent to be shifted. > + */ > +int > +xfs_bmap_shift_extents_right( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + int *done, > + xfs_fileoff_t offset_shift_fsb, > + xfs_extnum_t *current_ext, > + xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, > + struct xfs_bmap_free *flist, > + int num_exts) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec right; > + xfs_ifork_t *ifp; > + xfs_fileoff_t startoff; > + xfs_filblks_t blockcount = 0; > + xfs_extnum_t last_extent; > + int error = 0; > + int i; > + int whichfork = XFS_DATA_FORK; > + int logflags; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + ifp = XFS_IFORK_PTR(ip, whichfork); > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstblock; > + cur->bc_private.b.flist = flist; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + /* start shifting extents to right */ > + while (num_exts-- > 0) { > + blockcount = 0; > + > + if (*current_ext < end_ext) { > + *done = 1; > + break; > + } > + > + gotp = xfs_iext_get_ext(ifp, *current_ext); > + xfs_bmbt_get_all(gotp, &got); > + startoff = got.br_startoff + offset_shift_fsb; > + > + /* > + * Before shifting extent into hole, make sure that the hole > + * is large enough to accomodate the shift. This checking has > + * to be performed for all except the last extent. > + */ > + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + if (last_extent != *current_ext) { > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > + *current_ext + 1), &right); > + if (startoff + got.br_blockcount > right.br_startoff) { > + error = XFS_ERROR(EINVAL); > + if (error) > + goto del_cursor; > + } > + } > + > + /* Check if we can merge 2 adjacent extents */ > + if (last_extent != *current_ext && > + right.br_startoff == startoff + got.br_blockcount && > + right.br_startblock == > + got.br_startblock + got.br_blockcount && > + right.br_state == got.br_state && > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > + > + /* > + * Merge the current extent with the extent to > + * the right. Remove the right extent, calculate > + * a new block count for the current extent to cover > + * the range of both and decrement the number of extents > + * in the fork. > + */ > + blockcount = right.br_blockcount + got.br_blockcount; > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + right.br_startoff, > + right.br_startblock, > + right.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > + if (cur) { > + error = xfs_btree_delete(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + if (blockcount) { > + xfs_bmbt_set_blockcount(gotp, blockcount); > + got.br_blockcount = blockcount; > + } > + > + xfs_bmbt_set_startoff(gotp, startoff); > + got.br_startoff = startoff; > + > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + (*current_ext)--; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index 38ba36e..af05899 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, > int *done, xfs_fileoff_t start_fsb, > xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, > xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > int num_exts); > +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, > + xfs_extnum_t *split_ext); > +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, > + int *done, xfs_fsblock_t offset_shift_fsb, > + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > + int num_exts); > > #endif /* __XFS_BMAP_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 057f671..b9511dd 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1548,7 +1548,7 @@ xfs_collapse_file_space( > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, > + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, > shift_fsb, ¤t_ext, > &first_block, &free_list, > XFS_BMAP_MAX_SHIFT_EXTENTS); > @@ -1572,6 +1572,132 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine allocate disk space and shift extent for the given file. > + * The first thing we do is to sync dirty data and invalidate page cache > + * over the region on which insert range is working. And split an extent > + * to two extents at given offset by calling xfs_bmap_split_extent. > + * And shift all extent records which are laying between [offset, > + * last allocated extent] to the right to reserve hole range. Lastly > + * allocate an unwritten extent in hole range created by shifting extents. > + * > + * RETURNS: > + * 0 on success > + * errno on error > + * > + */ > +int > +xfs_insert_file_space( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t len) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t first_block; > + xfs_ifork_t *ifp; > + int done = 0; > + int committed; > + int error; > + uint rounding; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t shift_fsb; > + xfs_extnum_t split_ext; > + xfs_extnum_t current_ext = 0; > + xfs_off_t ioffset; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + trace_xfs_insert_file_space(ip); > + > + error = xfs_qm_dqattach(ip, 0); > + if (error) > + return error; > + > + /* wait for the completion of any pending DIOs */ > + inode_dio_wait(VFS_I(ip)); > + > + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); > + ioffset = offset & ~(rounding - 1); > + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > + ioffset, -1); > + if (error) > + return error; > + > + truncate_pagecache_range(VFS_I(ip), ioffset, -1); > + > + start_fsb = XFS_B_TO_FSB(mp, offset); > + shift_fsb = XFS_B_TO_FSB(mp, len); > + > + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); > + if (error) > + return error; > + > + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + while (!error && !done) { > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + /* > + * We would need to reserve permanent block for transaction. > + * This will come into picture when after shifting extent into > + * hole we found that adjacent extents can be merged which > + * may lead to freeing of a block during record update. > + */ > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + break; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + > + /* > + * We are using the write transaction in which max 2 bmbt > + * updates are allowed > + */ > + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, > + ¤t_ext, split_ext, > + &first_block, &free_list, > + XFS_BMAP_MAX_SHIFT_EXTENTS); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + if (error) > + goto out; > + } > + > + /* Add unwritten extent in a hole range. */ > + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); > + > +out: > + return error; > + > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > * We need to check that the format of the data fork in the temporary inode is > * valid for the target inode before doing the swap. This is not a problem with > * attr1 because of the fixed fork offset, but attr2 has a dynamically sized > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..d62ab4b 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, > xfs_off_t len); > int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, > xfs_off_t len); > +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, > + xfs_off_t len); > > /* EOF block manipulation functions */ > bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..f160cd5 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -756,11 +756,13 @@ xfs_file_fallocate( > struct xfs_trans *tp; > long error; > loff_t new_size = 0; > + int do_file_insert = 0; > > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -790,6 +792,28 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* Check for wrap through zero */ > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > + error = -EFBIG; > + goto out_unlock; > + } > + > + /* Offset should be less than i_size */ > + if (offset >= i_size_read(inode)) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + new_size = i_size_read(inode) + len; > + do_file_insert = 1; > } else { > if (!(mode & FALLOC_FL_KEEP_SIZE) && > offset + len > i_size_read(inode)) { > @@ -840,8 +864,20 @@ xfs_file_fallocate( > iattr.ia_valid = ATTR_SIZE; > iattr.ia_size = new_size; > error = xfs_setattr_size(ip, &iattr); > + if (error) > + goto out_unlock; > } > > + /* > + * Some operations are performed after the inode size is updated. For > + * example, insert range expands the address space of the file, shifts > + * all subsequent extents over and allocates space into the hole. > + * Updating the size first ensures that shifted extents aren't left > + * hanging past EOF in the event of a crash or failure. > + */ > + if (do_file_insert) > + error = xfs_insert_file_space(ip, offset, len); > + > out_unlock: > xfs_iunlock(ip, XFS_IOLOCK_EXCL); > return -error; > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 152f827..8943c9f 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); > DEFINE_INODE_EVENT(xfs_free_file_space); > DEFINE_INODE_EVENT(xfs_zero_file_space); > DEFINE_INODE_EVENT(xfs_collapse_file_space); > +DEFINE_INODE_EVENT(xfs_insert_file_space); > DEFINE_INODE_EVENT(xfs_readdir); > #ifdef CONFIG_XFS_POSIX_ACL > DEFINE_INODE_EVENT(xfs_get_acl); > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue May 27 16:00:19 2014 Return-Path: <bfoster@redhat.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 7E02D7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:00:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B20F8F8035 for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:00:16 -0700 (PDT) X-ASG-Debug-ID: 1401224410-04bdf0599e1a3ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oZaN3dMj69DWVxIn for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:00: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4RL02H6003057 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 27 May 2014 17:00:02 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4RL01sv007490; Tue, 27 May 2014 17:00:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0DF661248A9; Tue, 27 May 2014 17:00:00 -0400 (EDT) Date: Tue, 27 May 2014 16:59:59 -0400 From: Brian Foster <bfoster@redhat.com> To: Namjae Jeon <namjae.jeon@samsung.com> Cc: Dave Chinner <david@fromorbit.com>, linux-fsdevel@vger.kernel.org, Ashish Sangwan <a.sangwan@samsung.com>, xfs@oss.sgi.com Subject: Re: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140527205959.GA26393@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401224410 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, May 27, 2014 at 05:18:57PM +0900, Namjae Jeon wrote: > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > 5) Allocate unwritten extents for the hole created in step 4. > > Cc: Brian Foster <bfoster@redhat.com> > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > --- FYI, while I didn't notice any test failures so far, a run through some of the generic xfstests do produce some assert failures and whatnot. I noticed output from generic/013,091,127,263. I haven't looked at these much at all so far, I just wanted to get them on the list... Namjae, I reproduced these issues running ./check -g auto with CONFIG_XFS_WARN enabled for XFS (to warn on assert failures). Below is a quick dump of output from generic/091, as an example. That one reproduces consistently for me. We'll probably want to run through and squash this and any others before this gets merged. Brian root: run xfstest generic/091 kernel: [ 8507.476387] XFS: Assertion failed: cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_private.b.allocated == 0, file: fs/xfs/xfs_btree.c, line: 314 kernel: [ 8507.476392] ------------[ cut here ]------------ kernel: [ 8507.476430] WARNING: CPU: 2 PID: 4648 at fs/xfs/xfs_message.c:99 asswarn+0x33/0x40 [xfs]() kernel: [ 8507.476433] Modules linked in: xfs loop ip6t_rpfilter ip6t_REJECT xt_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw snd_hda_codec_generic snd_hda_intel snd_hda_controller snd_hda_codec joydev snd_hwdep snd_seq ppdev snd_seq_device snd_pcm virtio_console serio_raw virtio_balloon parport_pc snd_timer parport pvpanic snd soundcore i2c_piix4 sunrpc virtio_net virtio_blk qxl drm_kms_helper virtio_pci ttm virtio_ring virtio drm ata_generic i2c_core pata_acpi [last unloaded: xfs] kernel: [ 8507.476520] CPU: 2 PID: 4648 Comm: fsx Tainted: G W O 3.15.0-rc5+ #87 kernel: [ 8507.476522] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 kernel: [ 8507.476525] 0000000000000000 00000000cca654ac ffff88009c415c00 ffffffff817bc80e kernel: [ 8507.476529] 0000000000000000 ffff88009c415c38 ffffffff81095c4d ffff880035ee41a0 kernel: [ 8507.476533] 0000000000000000 ffff880035ee41a0 0000000000000000 ffff8800af5d0000 kernel: [ 8507.476537] Call Trace: kernel: [ 8507.476545] [<ffffffff817bc80e>] dump_stack+0x4d/0x66 kernel: [ 8507.476549] [<ffffffff81095c4d>] warn_slowpath_common+0x7d/0xa0 kernel: [ 8507.476553] [<ffffffff81095d7a>] warn_slowpath_null+0x1a/0x20 kernel: [ 8507.476575] [<ffffffffa03a9173>] asswarn+0x33/0x40 [xfs] kernel: [ 8507.476600] [<ffffffffa03d5739>] xfs_btree_del_cursor+0x89/0xb0 [xfs] kernel: [ 8507.476624] [<ffffffffa03c485e>] xfs_bmap_split_extent_at.constprop.19+0x30e/0x500 [xfs] kernel: [ 8507.476648] [<ffffffffa03d1c4e>] xfs_bmap_split_extent+0x13e/0x1c0 [xfs] kernel: [ 8507.476668] [<ffffffffa0390578>] xfs_insert_file_space+0x188/0x410 [xfs] kernel: [ 8507.476695] [<ffffffffa03f5f97>] ? xfs_iunlock+0x157/0x230 [xfs] kernel: [ 8507.476717] [<ffffffffa03a71e1>] ? xfs_setattr_size+0x381/0x4b0 [xfs] kernel: [ 8507.476737] [<ffffffffa0398fe3>] xfs_file_fallocate+0x3c3/0x470 [xfs] kernel: [ 8507.476742] [<ffffffff8122ca28>] ? do_fallocate+0x118/0x1d0 kernel: [ 8507.476745] [<ffffffff8122ca3e>] do_fallocate+0x12e/0x1d0 kernel: [ 8507.476748] [<ffffffff8122cb24>] SyS_fallocate+0x44/0x70 kernel: [ 8507.476752] [<ffffffff817d0329>] system_call_fastpath+0x16/0x1b kernel: [ 8507.476755] ---[ end trace cf941380ff6e4058 ]--- > > Changelog > v3: > - remove XFS_TRANS_RESERVE and assert. > - update the comment of blockcount calculation. > - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. > - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. > > v2: > - remove reserved enable. > - add xfs_qm_dqattach. > - reset blockcount in xfs_bmap_shift_extents_right. > - update i_size to avoid data loss before insert_file_space() is called. > - use in-memory extent array size that delayed allocation extents. > > fs/xfs/xfs_bmap.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 128 ++++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 38 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 550 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 1ff0da6..8023b7e 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -5419,7 +5419,7 @@ error0: > * into, this will be considered invalid operation and we abort immediately. > */ > int > -xfs_bmap_shift_extents( > +xfs_bmap_shift_extents_left( > struct xfs_trans *tp, > struct xfs_inode *ip, > int *done, > @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > - XFS_ERROR_REPORT("xfs_bmap_shift_extents", > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", > XFS_ERRLEVEL_LOW, mp); > return XFS_ERROR(EFSCORRUPTED); > } > @@ -5606,3 +5606,376 @@ del_cursor: > xfs_trans_log_inode(tp, ip, logflags); > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be splitted. @split_fsb is a block where the extents is spliited. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *current_ext, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* splitted extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + int error = 0; > + int logflags; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_bmbt_set_blockcount(gotp, gotblkcnt); > + got.br_blockcount = gotblkcnt; > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + /* Add new extent */ > + (*current_ext)++; > + xfs_iext_insert(ip, *current_ext, 1, &new, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, > + new.br_startblock, new.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); > + cur->bc_rec.b.br_state = new.br_state; > + > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + /* > + * Convert to a btree if necessary. > + */ > + if (xfs_bmap_needs_btree(ip, whichfork)) { > + int tmp_logflags; /* partial log flag return val */ > + > + ASSERT(cur == NULL); > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + &cur, 0, &tmp_logflags, whichfork); > + logflags |= tmp_logflags; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > + > +int > +xfs_bmap_split_extent( > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *split_ext) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t firstfsb; > + int committed; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + > + if (error) { > + /* > + * Free the transaction structure. > + */ > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + xfs_bmap_init(&free_list, &firstfsb); > + > + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, > + &firstfsb, &free_list); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + return error; > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > + * Shift extent records to the right to make a hole. > + * The maximum number of extents to be shifted in a single operation > + * is @num_exts, and @current_ext keeps track of the current extent > + * index we have shifted. @offset_shift_fsb is the length by which each > + * extent is shifted. @end_ext is the last extent to be shifted. > + */ > +int > +xfs_bmap_shift_extents_right( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + int *done, > + xfs_fileoff_t offset_shift_fsb, > + xfs_extnum_t *current_ext, > + xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, > + struct xfs_bmap_free *flist, > + int num_exts) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec right; > + xfs_ifork_t *ifp; > + xfs_fileoff_t startoff; > + xfs_filblks_t blockcount = 0; > + xfs_extnum_t last_extent; > + int error = 0; > + int i; > + int whichfork = XFS_DATA_FORK; > + int logflags; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + ifp = XFS_IFORK_PTR(ip, whichfork); > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstblock; > + cur->bc_private.b.flist = flist; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + /* start shifting extents to right */ > + while (num_exts-- > 0) { > + blockcount = 0; > + > + if (*current_ext < end_ext) { > + *done = 1; > + break; > + } > + > + gotp = xfs_iext_get_ext(ifp, *current_ext); > + xfs_bmbt_get_all(gotp, &got); > + startoff = got.br_startoff + offset_shift_fsb; > + > + /* > + * Before shifting extent into hole, make sure that the hole > + * is large enough to accomodate the shift. This checking has > + * to be performed for all except the last extent. > + */ > + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + if (last_extent != *current_ext) { > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > + *current_ext + 1), &right); > + if (startoff + got.br_blockcount > right.br_startoff) { > + error = XFS_ERROR(EINVAL); > + if (error) > + goto del_cursor; > + } > + } > + > + /* Check if we can merge 2 adjacent extents */ > + if (last_extent != *current_ext && > + right.br_startoff == startoff + got.br_blockcount && > + right.br_startblock == > + got.br_startblock + got.br_blockcount && > + right.br_state == got.br_state && > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > + > + /* > + * Merge the current extent with the extent to > + * the right. Remove the right extent, calculate > + * a new block count for the current extent to cover > + * the range of both and decrement the number of extents > + * in the fork. > + */ > + blockcount = right.br_blockcount + got.br_blockcount; > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + right.br_startoff, > + right.br_startblock, > + right.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > + if (cur) { > + error = xfs_btree_delete(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + if (blockcount) { > + xfs_bmbt_set_blockcount(gotp, blockcount); > + got.br_blockcount = blockcount; > + } > + > + xfs_bmbt_set_startoff(gotp, startoff); > + got.br_startoff = startoff; > + > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + (*current_ext)--; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index 38ba36e..af05899 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, > int *done, xfs_fileoff_t start_fsb, > xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, > xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > int num_exts); > +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, > + xfs_extnum_t *split_ext); > +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, > + int *done, xfs_fsblock_t offset_shift_fsb, > + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > + int num_exts); > > #endif /* __XFS_BMAP_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 057f671..b9511dd 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1548,7 +1548,7 @@ xfs_collapse_file_space( > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, > + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, > shift_fsb, ¤t_ext, > &first_block, &free_list, > XFS_BMAP_MAX_SHIFT_EXTENTS); > @@ -1572,6 +1572,132 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine allocate disk space and shift extent for the given file. > + * The first thing we do is to sync dirty data and invalidate page cache > + * over the region on which insert range is working. And split an extent > + * to two extents at given offset by calling xfs_bmap_split_extent. > + * And shift all extent records which are laying between [offset, > + * last allocated extent] to the right to reserve hole range. Lastly > + * allocate an unwritten extent in hole range created by shifting extents. > + * > + * RETURNS: > + * 0 on success > + * errno on error > + * > + */ > +int > +xfs_insert_file_space( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t len) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t first_block; > + xfs_ifork_t *ifp; > + int done = 0; > + int committed; > + int error; > + uint rounding; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t shift_fsb; > + xfs_extnum_t split_ext; > + xfs_extnum_t current_ext = 0; > + xfs_off_t ioffset; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + trace_xfs_insert_file_space(ip); > + > + error = xfs_qm_dqattach(ip, 0); > + if (error) > + return error; > + > + /* wait for the completion of any pending DIOs */ > + inode_dio_wait(VFS_I(ip)); > + > + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); > + ioffset = offset & ~(rounding - 1); > + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > + ioffset, -1); > + if (error) > + return error; > + > + truncate_pagecache_range(VFS_I(ip), ioffset, -1); > + > + start_fsb = XFS_B_TO_FSB(mp, offset); > + shift_fsb = XFS_B_TO_FSB(mp, len); > + > + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); > + if (error) > + return error; > + > + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + while (!error && !done) { > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + /* > + * We would need to reserve permanent block for transaction. > + * This will come into picture when after shifting extent into > + * hole we found that adjacent extents can be merged which > + * may lead to freeing of a block during record update. > + */ > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + break; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + > + /* > + * We are using the write transaction in which max 2 bmbt > + * updates are allowed > + */ > + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, > + ¤t_ext, split_ext, > + &first_block, &free_list, > + XFS_BMAP_MAX_SHIFT_EXTENTS); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + if (error) > + goto out; > + } > + > + /* Add unwritten extent in a hole range. */ > + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); > + > +out: > + return error; > + > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > * We need to check that the format of the data fork in the temporary inode is > * valid for the target inode before doing the swap. This is not a problem with > * attr1 because of the fixed fork offset, but attr2 has a dynamically sized > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..d62ab4b 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, > xfs_off_t len); > int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, > xfs_off_t len); > +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, > + xfs_off_t len); > > /* EOF block manipulation functions */ > bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..f160cd5 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -756,11 +756,13 @@ xfs_file_fallocate( > struct xfs_trans *tp; > long error; > loff_t new_size = 0; > + int do_file_insert = 0; > > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -790,6 +792,28 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* Check for wrap through zero */ > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > + error = -EFBIG; > + goto out_unlock; > + } > + > + /* Offset should be less than i_size */ > + if (offset >= i_size_read(inode)) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + new_size = i_size_read(inode) + len; > + do_file_insert = 1; > } else { > if (!(mode & FALLOC_FL_KEEP_SIZE) && > offset + len > i_size_read(inode)) { > @@ -840,8 +864,20 @@ xfs_file_fallocate( > iattr.ia_valid = ATTR_SIZE; > iattr.ia_size = new_size; > error = xfs_setattr_size(ip, &iattr); > + if (error) > + goto out_unlock; > } > > + /* > + * Some operations are performed after the inode size is updated. For > + * example, insert range expands the address space of the file, shifts > + * all subsequent extents over and allocates space into the hole. > + * Updating the size first ensures that shifted extents aren't left > + * hanging past EOF in the event of a crash or failure. > + */ > + if (do_file_insert) > + error = xfs_insert_file_space(ip, offset, len); > + > out_unlock: > xfs_iunlock(ip, XFS_IOLOCK_EXCL); > return -error; > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 152f827..8943c9f 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); > DEFINE_INODE_EVENT(xfs_free_file_space); > DEFINE_INODE_EVENT(xfs_zero_file_space); > DEFINE_INODE_EVENT(xfs_collapse_file_space); > +DEFINE_INODE_EVENT(xfs_insert_file_space); > DEFINE_INODE_EVENT(xfs_readdir); > #ifdef CONFIG_XFS_POSIX_ACL > DEFINE_INODE_EVENT(xfs_get_acl); > -- > 1.7.11-rc0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue May 27 16:14:27 2014 Return-Path: <david@fromorbit.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 746CB7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:14:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B6C68F808F for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:14:23 -0700 (PDT) X-ASG-Debug-ID: 1401225260-04bdf0599f1a5650001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NMNTqWSHA21dryZ5 for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:14:20 -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: AkNKAP3+hFN5LL1sPGdsb2JhbABZgweIS6JkAQEBAQEGmAwBgQ0XAwEBAQE4NYIlAQEFJxMcIxAIAw4KCSUPBSUDBxoTiEHVWBcWhT+DXoRICk0HgyuBFQSZcpZyK4Ex Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 06:44:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpOhM-0004eG-Kt; Wed, 28 May 2014 07:14:16 +1000 Date: Wed, 28 May 2014 07:14:16 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140527211416.GB6677@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-3-git-send-email-bfoster@redhat.com> <20140526225755.GR18954@dastard> <20140527124755.GC63281@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527124755.GC63281@bfoster.bfoster> 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: 1401225260 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.6168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 08:47:55AM -0400, Brian Foster wrote: > On Tue, May 27, 2014 at 08:57:55AM +1000, Dave Chinner wrote: > > On Fri, May 23, 2014 at 07:52:29AM -0400, Brian Foster wrote: > > > +/* > > > + * Run eofblocks scans on the quotas applicable to the inode. For inodes with > > > + * multiple quotas, we don't know exactly which quota caused an allocation > > > + * failure. We make a best effort by running scans for each quota considered > > > + * to be under low free space conditions (less than 1% available free space). > > > + */ > > > +int > > > +xfs_inode_free_quota_eofblocks( > > > + struct xfs_inode *ip) > > > +{ > > > + int scanned = 0; > > > + struct xfs_eofblocks eofb = {0,}; > > > + struct xfs_dquot *dq; > > > + > > > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > > > + > > > + /* set the scan owner to avoid potential livelock */ > > > + eofb.eof_scan_owner = ip->i_ino; > > > + > > > + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { > > > + dq = xfs_inode_dquot(ip, XFS_DQ_USER); > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > + eofb.eof_uid = VFS_I(ip)->i_uid; > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > + XFS_EOF_FLAGS_UID; > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > + scanned = 1; > > > + } > > > + } > > > + > > > + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { > > > + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > + eofb.eof_gid = VFS_I(ip)->i_gid; > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > + XFS_EOF_FLAGS_GID; > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > + scanned = 1; > > > + } > > > + } > > > > Rather that doing two scans here, wouldn't it be more efficient > > to do: > > > > eofb.eof_flags = XFS_EOF_FLAGS_SYNC; > > scan = false; > > if (uquota is low) { > > eofb.eof_uid = VFS_I(ip)->i_uid; > > eofb.eof_flags |= XFS_EOF_FLAGS_UID; > > scan = true; > > } > > if (gquota is low) { > > eofb.eof_gid = VFS_I(ip)->i_gid; > > eofb.eof_flags |= XFS_EOF_FLAGS_GID; > > scan = true; > > } > > if (scan) > > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > and change xfs_inode_match_id() to be able to check against multiple > > flags on a single inode? That way we only scan the inode cache > > once, regardless of the number of quota types that are enabled and > > are tracking low space thresholds. > > > > Yeah, that would certainly be better from this perspective. We don't > care so much about the characteristics of the inode as much as the > quotas that are associated with it. If I recall, I was somewhat on the > fence about this behavior when we first added the userspace interface > here. IOWs, should the combination of flags define an intersection of > the set of inodes to scan or a union? The more I think about it, I think > the interface kind of suggests the former (from an interface/aesthetic > perspective). E.g., I probably wouldn't expect to add a GID flag to a > UID flag and have my scan become more broad, rather than more > restrictive. Otherwise, the existence of a uid, gid and prid in the > request structure seems kind of arbitrary (as opposed to a list/set of > generic IDs, for example). > > I'm not against union behavior in general (and still probably not 100% > against switching the default). I suppose another option could be to add > a set of union/intersection flags that control the behavior here. I'd > be slightly concerned about making this interface too convoluted, but it > is a relatively low level thing, I suppose, without much generic use. We > could also decide not to expose those extra controls to userspace for > the time being. > > I need to think about this some more. Thoughts on any of that? What we expose to userspace is orthoganol to what we implment internally. It makes sense to limit the userspace interface to a single type at a time, but when we are doing internal cleaner work it makes sense to match all criteria in a single cache pass. i.e. Restrict the capability of the user interface at the input layer rather than restricting the capability of the infrastructure to do work efficiently... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 27 16:27:08 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B0397F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:27:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA88B304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:27:04 -0700 (PDT) X-ASG-Debug-ID: 1401226018-04cb6c22b719cd10001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ILwOZ9ByYbMmg6zo for <xfs@oss.sgi.com>; Tue, 27 May 2014 14:26:59 -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: AkNKALgChVN5LL1sPGdsb2JhbABPCoMHiEuiZAEBAQEBBpgMAYENFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEHVVRcWhT+IIVwHgyuBFQSZcosYi1or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 06:56:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpOtZ-0004hC-NR; Wed, 28 May 2014 07:26:53 +1000 Date: Wed, 28 May 2014 07:26:53 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140527212653.GC6677@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> <20140527104428.GC1440@infradead.org> <20140527121810.GB63281@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527121810.GB63281@bfoster.bfoster> 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: 1401226019 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.6168 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 08:18:11AM -0400, Brian Foster wrote: > On Tue, May 27, 2014 at 03:44:28AM -0700, Christoph Hellwig wrote: > > On Fri, May 23, 2014 at 07:52:28AM -0400, Brian Foster wrote: > > > The scan owner field represents an optional inode number that is > > > responsible for the current scan. The purpose is to identify that an > > > inode is under iolock and as such, the iolock shouldn't be attempted > > > when trimming eofblocks. This is an internal only field. > > > > xfs_free_eofblocks already does a trylock, and without that calling it > > from one iolock holding process to another would be a deadlock waiting > > to happen. > > > > I have to say I'm still not very easy with iolock nesting, even if it's > > a trylock. > > > > Right... maybe I'm not parsing your point. The purpose here is to avoid > the trylock entirely. E.g., Indicate that we have already acquired the > lock and can proceed with xfs_free_eofblocks(), rather than fail a > trylock and skip (which appears to be a potential infinite loop scenario > here due to how the AG walking code handles EAGAIN). I think Christoph's concern here is that we are calling a function that can take the iolock while we already hold the iolock. i.e. the reason we have to add the anti-deadlock code in the first place. To address that, can we restructure xfs_file_buffered_aio_write() such that the ENOSPC/EDQUOT flush is done outside the iolock? >From a quick check, I don't think there is any problem with dropping the iolock, doing the flushes and then going all the way back to the start of the function again, but closer examination and testing is warranted... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Tue May 27 17:20:05 2014 Return-Path: <tinguely@sgi.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=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 B2C307F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:20:05 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F431304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 15:20:02 -0700 (PDT) Message-ID: <53850F92.7010401@sgi.com> Date: Tue, 27 May 2014 17:20:02 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> In-Reply-To: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/13 09:29, Namjae Jeon wrote: > From: Namjae Jeon<namjae.jeon@samsung.com> > > Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. > > Signed-off-by: Namjae Jeon<namjae.jeon@samsung.com> > Signed-off-by: Ashish Sangwan<a.sangwan@samsung.com> > --- > + /* Check if we can merge 2 adjacent extents */ > + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && > + left.br_startoff + left.br_blockcount == startoff && > + left.br_startblock + left.br_blockcount == > + xfs_bmbt_get_startblock(gotp) && > + xfs_bmbt_get_state(gotp) == left.br_state && > + left.br_blockcount + xfs_bmbt_get_blockcount(gotp) <= > + MAXEXTLEN) { > + blockcount = > + left.br_blockcount + xfs_bmbt_get_blockcount(gotp); > + state |= BMAP_LEFT_CONTIG; > + xfs_iext_remove(ip, *current_ext, 1, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + gotp = xfs_iext_get_ext(ifp, --*current_ext); > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + xfs_bmbt_get_startoff(gotp), > + xfs_bmbt_get_startblock(gotp), > + xfs_bmbt_get_blockcount(gotp), > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a fsstress that fills the filesystem: xfstests > ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192 & xfstests > xfs_info /mnt/scratch meta-data=/dev/sda7 isize=256 agcount=4, agsize=2228515 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 data = bsize=4096 blocks=8914059, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=4352, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 XFS: Assertion failed: fs_is_ok, file: fs/xfs/xfs_bmap.c, line: 5511 ------------[ cut here ]------------ kernel BUG at fs/xfs/xfs_message.c:107! invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC Modules linked in: e1000e xfs exportfs libcrc32c ext3 jbd CPU: 3 PID: 6341 Comm: fsstress Not tainted 3.15.0-rc5+ #1 Hardware name: SGI.COM AltixXE210/S5000PAL0, BIOS S5000.86B.11.00.0096.011320091422 01/13/2009 task: ffff88081ec991a0 ti: ffff88081ecca000 task.ti: ffff88081ecca000 RIP: 0010:[<ffffffffa005a7cd>] [<ffffffffa005a7cd>] assfail+0x1d/0x30 [xfs] RSP: 0018:ffff88081eccbcd8 EFLAGS: 00010296 RAX: 0000000000000044 RBX: 0000000000000000 RCX: 0000000000000000 RDX: ffff88085bccda50 RSI: ffff88085bccd1c8 RDI: ffff88085bccd1c8 RBP: ffff88081eccbcd8 R08: 0000000000000316 R09: 0000000000000003 R10: 0000000000000316 R11: 0000000000000006 R12: 00000000000002d6 R13: ffff88009f778d00 R14: ffff88081eccbe10 R15: ffff8807fa0d4000 FS: 00007fd496c57700(0000) GS:ffff88085bcc0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: 00007fd4902e0e88 CR3: 000000081ecbc000 CR4: 00000000000007e0 Stack: ffff88081eccbda8 ffffffffa00769f4 ffff8805df5bbba0 0000000000000079 ffff88081eccbe14 ffff8805ddff5b00 0000000000000000 ffff8807fa0d4040 0000000100000001 ffff88066a5ddef0 00000000000002c5 0000000000c11a01 Call Trace: [<ffffffffa00769f4>] xfs_bmap_shift_extents+0x184/0x5a0 [xfs] [<ffffffffa0047c7c>] xfs_collapse_file_space+0x15c/0x250 [xfs] [<ffffffffa004e094>] xfs_file_fallocate+0x354/0x380 [xfs] [<ffffffff81142564>] ? __sb_start_write+0x64/0xf0 [<ffffffff81274e0c>] ? selinux_file_permission+0xec/0x130 [<ffffffff8113f270>] do_fallocate+0x150/0x170 [<ffffffff8113f2de>] SyS_fallocate+0x4e/0x80 [<ffffffff817b42e2>] system_call_fastpath+0x16/0x1b Code: 00 00 00 48 89 45 c8 e8 42 fc ff ff c9 c3 55 41 89 d0 48 89 f1 48 89 fa 48 c7 c6 d0 3b 0d a0 31 ff 48 89 e5 31 c0 e8 93 ff ff ff <0f> 0b eb fe 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 0f RIP [<ffffffffa005a7cd>] assfail+0x1d/0x30 [xfs] RSP <ffff88081eccbcd8> ---[ end trace 40b8d37513d3de71 ]--- Kernel panic - not syncing: Fatal exception Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff) ---[ end Kernel panic - not syncing: Fatal exception --Mark. From david@fromorbit.com Tue May 27 17:52:37 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 504A77F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:52:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E170E304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 15:52:36 -0700 (PDT) X-ASG-Debug-ID: 1401231154-04cb6c22b81a3ca0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 8zi6p4aV2A6XimEG for <xfs@oss.sgi.com>; Tue, 27 May 2014 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: ArVIANAWhVN5LL1sPGdsb2JhbAA/GoMHUqpRDAEBAQEBBpgMAYEHFwMBAQEBODWCJQEBBTocIxAIAxUDCSUPBSUDBxoTiEEONtUcFxaFP4g0SQeDK4EVBIReA5URixiLWisvgQI Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 08:21:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpQDa-0004w8-K4; Wed, 28 May 2014 08:51:38 +1000 Date: Wed, 28 May 2014 08:51:38 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <20140527225138.GD8554@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53850F92.7010401@sgi.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: 1401231154 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6170 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, May 27, 2014 at 05:20:02PM -0500, Mark Tinguely wrote: > On 09/02/13 09:29, Namjae Jeon wrote: > >From: Namjae Jeon<namjae.jeon@samsung.com> > > > >Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. > > > >Signed-off-by: Namjae Jeon<namjae.jeon@samsung.com> > >Signed-off-by: Ashish Sangwan<a.sangwan@samsung.com> > >--- > > >+ /* Check if we can merge 2 adjacent extents */ > >+ if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && > >+ left.br_startoff + left.br_blockcount == startoff && > >+ left.br_startblock + left.br_blockcount == > >+ xfs_bmbt_get_startblock(gotp) && > >+ xfs_bmbt_get_state(gotp) == left.br_state && > >+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp) <= > >+ MAXEXTLEN) { > >+ blockcount = > >+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp); > >+ state |= BMAP_LEFT_CONTIG; > >+ xfs_iext_remove(ip, *current_ext, 1, 0); > >+ XFS_IFORK_NEXT_SET(ip, whichfork, > >+ XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > >+ gotp = xfs_iext_get_ext(ifp, --*current_ext); > >+ } > >+ > >+ if (cur) { > >+ error = xfs_bmbt_lookup_eq(cur, > >+ xfs_bmbt_get_startoff(gotp), > >+ xfs_bmbt_get_startblock(gotp), > >+ xfs_bmbt_get_blockcount(gotp), > >+ &i); > >+ if (error) > >+ goto del_cursor; > >+ XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a > fsstress that fills the filesystem: > > xfstests > ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192 & Hasn't reproduced after 10 minutes of running at ENOSPC here - how long does it take to reproduce? What storage hardware are you testing on? How many CPUs? RAM? .... http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Tue May 27 17:56:55 2014 Return-Path: <tinguely@sgi.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=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 5B99D29DF8 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:56:55 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6B89304043; Tue, 27 May 2014 15:56:54 -0700 (PDT) Message-ID: <53851836.2070301@sgi.com> Date: Tue, 27 May 2014 17:56:54 -0500 From: Mark Tinguely <tinguely@sgi.com> User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner <david@fromorbit.com> CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> In-Reply-To: <20140527225138.GD8554@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/27/14 17:51, Dave Chinner wrote: > On Tue, May 27, 2014 at 05:20:02PM -0500, Mark Tinguely wrote: >> On 09/02/13 09:29, Namjae Jeon wrote: >>> From: Namjae Jeon<namjae.jeon@samsung.com> >>> >>> Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. >>> >>> Signed-off-by: Namjae Jeon<namjae.jeon@samsung.com> >>> Signed-off-by: Ashish Sangwan<a.sangwan@samsung.com> >>> --- >> >>> + /* Check if we can merge 2 adjacent extents */ >>> + if ((state& BMAP_LEFT_VALID)&& !(state& BMAP_LEFT_DELAY)&& >>> + left.br_startoff + left.br_blockcount == startoff&& >>> + left.br_startblock + left.br_blockcount == >>> + xfs_bmbt_get_startblock(gotp)&& >>> + xfs_bmbt_get_state(gotp) == left.br_state&& >>> + left.br_blockcount + xfs_bmbt_get_blockcount(gotp)<= >>> + MAXEXTLEN) { >>> + blockcount = >>> + left.br_blockcount + xfs_bmbt_get_blockcount(gotp); >>> + state |= BMAP_LEFT_CONTIG; >>> + xfs_iext_remove(ip, *current_ext, 1, 0); >>> + XFS_IFORK_NEXT_SET(ip, whichfork, >>> + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); >>> + gotp = xfs_iext_get_ext(ifp, --*current_ext); >>> + } >>> + >>> + if (cur) { >>> + error = xfs_bmbt_lookup_eq(cur, >>> + xfs_bmbt_get_startoff(gotp), >>> + xfs_bmbt_get_startblock(gotp), >>> + xfs_bmbt_get_blockcount(gotp), >>> + &i); >>> + if (error) >>> + goto del_cursor; >>> + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); >> >> I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a >> fsstress that fills the filesystem: >> >> xfstests> ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192& > > Hasn't reproduced after 10 minutes of running at ENOSPC here - how > long does it take to reproduce? What storage hardware are you > testing on? How many CPUs? RAM? .... > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > Cheers, > > Dave. A 7-8 hours on spinning rust. This is my burn in test. --Mark. From david@fromorbit.com Tue May 27 18:07:04 2014 Return-Path: <david@fromorbit.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 BCCFA7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 18:07:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 98E198F8094 for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:07:04 -0700 (PDT) X-ASG-Debug-ID: 1401232018-04bdf059a01aebe0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id KJqkRVdALkwgPcTI for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:06:58 -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: AkNKAO8ZhVN5LL1sPGdsb2JhbABZgweIS6JkAQEBAQEGmAwBgQcXAwEBAQE4NYIlAQEFOhwjEAgDDgcDCSUPBSUDBxoTiEHVRxcWhT+IfQeDK4EVAQOZcosYi1or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 08:36:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpQS4-0004z7-FO; Wed, 28 May 2014 09:06:36 +1000 Date: Wed, 28 May 2014 09:06:36 +1000 From: Dave Chinner <david@fromorbit.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-ID: <20140527230636.GE8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-3-git-send-email-david@fromorbit.com> <20140527104638.GE1440@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527104638.GE1440@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: 1401232018 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.6171 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 03:46:38AM -0700, Christoph Hellwig wrote: > On Fri, May 23, 2014 at 10:03:38AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > Because they aren't actually part of the on-disk format, and so > > shouldn't be in xfs_da_format.h. > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > Maybe it's time to rename the functions and types from xfs_dir2_* to > xfs_da_* as we already do for some? If not this should stay in dir2 > headers. Fair call - they really are dir2 specific, so probably should be in xfs_dir2_priv.h, not xfs_da_btree.h. OK, I can update this patch to do that. I'll need to repost the series, because I'll have to rework a significant number of the patches... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 27 18:47:48 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F19AF7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 18:47:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3AE1304039 for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:47:45 -0700 (PDT) X-ASG-Debug-ID: 1401234462-04cb6c22b61aa630001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GryBEInaHNn8NM7T for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:47:43 -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: AkNKAIojhVN5LL1sPGdsb2JhbABZgweIS6JrAQEBAQEGmAwBgQcXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hB1UwXFoU/iH0HgyuBFQEDmXKLGItaKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 09:17:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpR5V-00053v-8R; Wed, 28 May 2014 09:47:21 +1000 Date: Wed, 28 May 2014 09:47:21 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Message-ID: <20140527234721.GF8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-12-git-send-email-david@fromorbit.com> <20140527155941.GC11265@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527155941.GC11265@laptop.bfoster> 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: 1401234462 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.6172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 11:59:41AM -0400, Brian Foster wrote: > On Fri, May 23, 2014 at 10:03:47AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> > > --- > > Are the state->blocksize and node_ents fields redundant with the > associated geo fields? On a quick scan, it seems like they don't ever > change. Patch looks fine either way... Until the conversion of the args structure is complete they aren't redundant. I can probably add a patch to the end removing them, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue May 27 18:53:16 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 43B2F7F51 for <xfs@oss.sgi.com>; Tue, 27 May 2014 18:53:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16063304048 for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:53:15 -0700 (PDT) X-ASG-Debug-ID: 1401234793-04bdf0599e1b4120001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WdalW5P3qBOCQO5i for <xfs@oss.sgi.com>; Tue, 27 May 2014 16:53:13 -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: AkNKALckhVN5LL1sPGdsb2JhbABZgweIS6JsAQEBAQEGmAwBgQcXAwEBAQE4NYIlAQEFJxMcIxAIAw4HAwklDwUlAwcaE4hB1UwXFoU/iH0HhEAEmXKLGItaKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 09:23:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpRB5-00054d-7K; Wed, 28 May 2014 09:53:07 +1000 Date: Wed, 28 May 2014 09:53:07 +1000 From: Dave Chinner <david@fromorbit.com> To: Brian Foster <bfoster@redhat.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Message-ID: <20140527235307.GG8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-13-git-send-email-david@fromorbit.com> <20140527155957.GD11265@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527155957.GD11265@laptop.bfoster> 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: 1401234793 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.6172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 11:59:57AM -0400, Brian Foster wrote: > On Fri, May 23, 2014 at 10:03:48AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@redhat.com> > > > > There are many places in the directory code were we don't pass the > > args into and so have to extract the geometry direct from the mount > > structure. Push the args or the geometry into these leaf functions > > so that we don't need to grab it from the struct xfs_mount. > > > > This, in turn, brings use to the point where directory geometry is > > no longer a property of the struct xfs_mount; it is not a global > > property anymore, and hence we can start to consider per-directory > > configuration of physical geometries. > > > > Start by converting the xfs_dir_isblock/leaf code - pass in the > > xfs_da_args and convert the readdir code to use xfs_da_args like > > the rest of the directory code to pass information around. > > > > Signed-off-by: Dave Chinner <dchinner@redhat.com> ..... > > STATIC int > > xfs_dir2_leaf_readbuf( > > - struct xfs_inode *dp, > > + struct xfs_da_args *args, > > size_t bufsize, > > struct xfs_dir2_leaf_map_info *mip, > > xfs_dir2_off_t *curoff, > > struct xfs_buf **bpp) > > { > > - struct xfs_mount *mp = dp->i_mount; > > + struct xfs_inode *dp = args->dp; > > struct xfs_buf *bp = *bpp; > > struct xfs_bmbt_irec *map = mip->map; > > struct blk_plug plug; > > @@ -304,7 +297,7 @@ xfs_dir2_leaf_readbuf( > > int length; > > int i; > > int j; > > - struct xfs_da_geometry *geo = mp->m_dir_geo; > > + struct xfs_da_geometry *geo = args->geo; > > I notice that we remove the local geo pointer in some of the immediately > previous fixups. Here we keep it... > > > > > /* > > * If we have a buffer, we need to release it and > > @@ -314,7 +307,7 @@ xfs_dir2_leaf_readbuf( > > if (bp) { > > xfs_trans_brelse(NULL, bp); > > bp = NULL; > > - mip->map_blocks -= geo->fsbcount; > > + mip->map_blocks -= args->geo->fsbcount; > > ... convert some calls to use args... > > > /* > > * Loop to get rid of the extents for the > > * directory block. > > @@ -338,8 +331,7 @@ xfs_dir2_leaf_readbuf( > > /* > > * Recalculate the readahead blocks wanted. > > */ > > - mip->ra_want = howmany(bufsize + geo->blksize, > > - mp->m_sb.sb_blocksize) - 1; > > + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; > > ASSERT(mip->ra_want >= 0); > > ... and not others. So we should probably at least be consistent within > function. :) Otherwise this patch looks good to me. Yup, brain fart. i converted each function in the entire file to use a local geo variable.... -Dave -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Tue May 27 19:10:44 2014 Return-Path: <namjae.jeon@samsung.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A4DC7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 19:10:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 990D3AC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:10:40 -0700 (PDT) X-ASG-Debug-ID: 1401235836-04cb6c22b61abc50001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id jxlKA7MeZOqxZlFe (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:10:38 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N69008PHCHOTO20@mailout1.samsung.com> for xfs@oss.sgi.com; Wed, 28 May 2014 09:10:36 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.112]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id AD.11.19452.C7925835; Wed, 28 May 2014 09:10:36 +0900 (KST) X-AuditID: cbfee68e-b7fb96d000004bfc-da-5385297cba35 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id AD.8E.07139.C7925835; Wed, 28 May 2014 09:10:36 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N6900C25CHN7880@mmp2.samsung.com>; Wed, 28 May 2014 09:10:35 +0900 (KST) From: Namjae Jeon <namjae.jeon@samsung.com> To: 'Brian Foster' <bfoster@redhat.com> Cc: 'Dave Chinner' <david@fromorbit.com>, linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' <a.sangwan@samsung.com>, xfs@oss.sgi.com References: <001401cf7984$4e3e1850$eaba48f0$@samsung.com> <20140527205959.GA26393@bfoster.bfoster> In-reply-to: <20140527205959.GA26393@bfoster.bfoster> Subject: RE: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Wed, 28 May 2014 09:10:35 +0900 X-ASG-Orig-Subj: RE: [PATCH v3 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <000401cf7a09$3fb514c0$bf1f3e40$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQJ/qvClO6UUMGpszt4oIbN64VB0+gGcdMg+mefYbRA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKIsWRmVeSWpSXmKPExsWyRsSkQLdGszXY4McVQYulEy8xW7z7XGWx 5dg9Ros9e0+yWCzqu8XowOpxapGEx+oLWxk93u+7yubRt2UVo8fnTXIBrFFcNimpOZllqUX6 dglcGb2/tjEXvOOtWLZTsYHxH1cXIyeHhICJxNUzDewQtpjEhXvr2boYuTiEBJYySuza9pAZ pqhrRj8LRGI6o8SESX1Qzl9GiVvP2oDaOTjYBLQl/mwRBWkQEVCXuDNvAlgNs0ALo0TvnP9g K4QEUiRm9R5mArE5BUwl3lycBxYXFgiRmLB0K9g2FgFViSsXj7CA2LwClhKNx34wQdiCEj8m 3wOLMwtoSazfeZwJwpaX2LzmLdSlChI7zr5mBLlHRMBK4mxTFUSJiMS+F+8YQe6RELjHLtG2 vp0dYpeAxLfJh1hA6iUEZCU2HYAaIylxcMUNlgmMErOQbJ6FZPMsJJtnIVmxgJFlFaNoakFy QXFSepGRXnFibnFpXrpecn7uJkZglJ7+96xvB+PNA9aHGJOB1k9klhJNzgdGeV5JvKGxmZGF qYmpsZG5pRlpwkrivIseJgUJCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYJTviTshnvmz616H /oNZeZGvlhmpbbTWTy2SufrvZ5y64dtutZe7K6Kl6k8qC005luZx8Nq2mxHPtJhz3yRpbf8y 9eyK9vVNpzjVlNK/HypK/hXBwBX1v+xUvcNqj/Omuv/0WszfXayzVj3COflT+dGnR4pF+/rY t3I47Hgklh8tc8mxQHv2TiWW4oxEQy3mouJEAK0/6pHoAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEKsWRmVeSWpSXmKPExsVy+t9jQd0azdZgg+sXOC2WTrzEbPHuc5XF lmP3GC327D3JYrGo7xajA6vHqUUSHqsvbGX0eL/vKptH35ZVjB6fN8kFsEY1MNpkpCampBYp pOYl56dk5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAO1WUihLzCkFCgUkFhcr 6dthmhAa4qZrAdMYoesbEgTXY2SABhLWMGb0/trGXPCOt2LZTsUGxn9cXYycHBICJhJdM/pZ IGwxiQv31rN1MXJxCAlMZ5SYMKmPBcL5yyhx61kbexcjBwebgLbEny2iIA0iAuoSd+ZNAKth FmhhlOid858dJCEkkCIxq/cwE4jNKWAq8ebiPLC4sECIxISlW5lBbBYBVYkrF4+AbeYVsJRo PPaDCcIWlPgx+R5YnFlAS2L9zuNMELa8xOY1b5khLlWQ2HH2NSPIPSICVhJnm6ogSkQk9r14 xziBUWgWkkmzkEyahWTSLCQtCxhZVjGKphYkFxQnpeca6RUn5haX5qXrJefnbmIEp4Bn0jsY VzVYHGIU4GBU4uE9sLglWIg1say4MvcQowQHs5II7yKB1mAh3pTEyqrUovz4otKc1OJDjMlA j05klhJNzgemp7ySeENjEzMjSyNzQwsjY3PShJXEeQ+2WgcKCaQnlqRmp6YWpBbBbGHi4JRq YJxx7sRLgRPFCukBs508aycoGOyILHmdKHSu/pGVxiF3o85PLBd+fg+0WPRxdfA0w5d1d42O +d5YEnnxQVDCg9Qte5p0T903nhJgbv+qPuD8thNe/9ef9HpptPrfGq3r3xa1BZ84UlJQbmoj v/Jm2LZpy3cJ85Vofj9jFfnD3ebRDqc7DycmKUgqsRRnJBpqMRcVJwIAOa7t40UDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1401235838 X-Barracuda-Encrypted: RC4-MD5 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, May 27, 2014 at 05:18:57PM +0900, Namjae Jeon wrote: > > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > > > 1) Make sure that both offset and len are block size aligned. > > 2) Update the i_size of inode by len bytes. > > 3) Compute the file's logical block number against offset. If the computed > > block number is not the starting block of the extent, split the extent > > such that the block number is the starting block of the extent. > > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > > towards right by len bytes. This step will make a hole of len bytes > > at offset. > > 5) Allocate unwritten extents for the hole created in step 4. > > > > Cc: Brian Foster <bfoster@redhat.com> > > Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> > > Signed-off-by: Ashish Sangwan <a.sangwan@samsung.com> > > --- > > FYI, while I didn't notice any test failures so far, a run through some > of the generic xfstests do produce some assert failures and whatnot. I > noticed output from generic/013,091,127,263. I haven't looked at these > much at all so far, I just wanted to get them on the list... > > Namjae, I reproduced these issues running ./check -g auto with > CONFIG_XFS_WARN enabled for XFS (to warn on assert failures). Below is a > quick dump of output from generic/091, as an example. That one > reproduces consistently for me. We'll probably want to run through and > squash this and any others before this gets merged. Hi Brian. I will check this problem. Thanks for your help! > > Brian > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Tue May 27 19:12:57 2014 Return-Path: <sandeen@redhat.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 732FA7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 19:12:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 605C28F807A for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:12:54 -0700 (PDT) X-ASG-Debug-ID: 1401235972-04cb6c22b71ac080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RXYRt0oW221FRvvM for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:12:53 -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 (8.14.4/8.14.4) with ESMTP id s4S0CrDV014142 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for <xfs@oss.sgi.com>; Tue, 27 May 2014 20:12:53 -0400 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 s4S0CpUl010321 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 20:12:52 -0400 Message-ID: <53852A05.5040006@redhat.com> Date: Tue, 27 May 2014 19:12:53 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs-oss <xfs@oss.sgi.com> Subject: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device Content-Type: text/plain; charset=ISO-8859-1 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: 1401235973 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 Today if you mkfs.xfs <filename> where the file resides on a hard-4k filesystem, we fail because it tries to do 512 direct IO when 4k is required; this is a bit cryptic: # mkfs.xfs -f mnt/fsfile meta-data=mnt/fsfile isize=256 agcount=4, agsize=8192 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 data = bsize=4096 blocks=32768, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=853, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 existing superblock read failed: Invalid argument mkfs.xfs: pwrite64 failed: Invalid argument We can modify platform_findsizes() to use the fsgeom call to get the "sector size" which should be used here, and warn that mismatches might exist if it fails. This does mean there'll be a new warning emitted on fs images hosted on non-xfs filesystems; I'm not really quite sure it's worth it, hence the RFC nature of this lightly tested 2-patch series... From sandeen@sandeen.net Tue May 27 19:14:29 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 1B6267F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 19:14:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C965304039 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:14:25 -0700 (PDT) X-ASG-Debug-ID: 1401236064-04cb6c22b61ac460001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DDutHLO1O5CbO0DA for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:14: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 390B263C5FEF; Tue, 27 May 2014 19:14:24 -0500 (CDT) Message-ID: <53852A61.90400@sandeen.net> Date: Tue, 27 May 2014 19:14:25 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: [PATCH 1/2, RFC] xfsprogs: check fs sector size in platform_findsizes() References: <53852A05.5040006@redhat.com> X-ASG-Orig-Subj: [PATCH 1/2, RFC] xfsprogs: check fs sector size in platform_findsizes() In-Reply-To: <53852A05.5040006@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1401236064 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.6172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Try the xfs geometry ioctl if the mkfs target resides in a file; this gives us the equivalent of a device sector size. This does, however, emit a warning if the target file exists on a non-XFS filesystem, and that might not be super. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/libxfs/linux.c b/libxfs/linux.c index 2e07d54..d66a90f 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -141,10 +141,19 @@ platform_findsizes(char *path, int fd, long long *sz, int *bsz) exit(1); } if ((st.st_mode & S_IFMT) == S_IFREG) { + struct xfs_fsop_geom_v1 geom = { 0 }; + *sz = (long long)(st.st_size >> 9); - *bsz = BBSIZE; - if (BBSIZE > max_block_alignment) - max_block_alignment = BBSIZE; + if (ioctl(fd, XFS_IOC_FSGEOMETRY_V1, &geom) < 0) { + fprintf(stderr, _("Cannot get host filesystem geometry.\n" + "mkfs may fail if there is a sector size mismatch between\n" + "the image and the host filesystem.\n")); + *bsz = BBSIZE; + } else + *bsz = geom.sectsize; + + if (*bsz > max_block_alignment) + max_block_alignment = *bsz; return; } From sandeen@sandeen.net Tue May 27 19:15:20 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C8BFB7F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 19:15:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B42E68F8084 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:15:20 -0700 (PDT) X-ASG-Debug-ID: 1401236119-04cbb02a101a3560001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5inuqX3joabPBKH9 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:15: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 048EE63C5FEF; Tue, 27 May 2014 19:15:19 -0500 (CDT) Message-ID: <53852A98.7000809@sandeen.net> Date: Tue, 27 May 2014 19:15:20 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files References: <53852A05.5040006@redhat.com> X-ASG-Orig-Subj: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files In-Reply-To: <53852A05.5040006@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1401236119 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.6172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If we encounter a target that's really a regular file, even without "-d file..." on the cmdline, call platform_findsizes() instead of blkid_get_topology to try to discover the "sector size" via the fsgeom() call. Signed-off-by: Eric Sandeen <sandeen@redhat.com> --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 37c05a9..74180c9 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -454,12 +454,26 @@ static void get_topology( struct fs_topology *ft, int force_overwrite) { - if (!xi->disfile) { - const char *dfile = xi->volname ? xi->volname : xi->dname; + int is_a_file = 0; + struct stat statbuf; + char *dfile = xi->volname ? xi->volname : xi->dname; + if (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode)) + is_a_file = 1; + + if (!xi->disfile && !is_a_file) { blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, &ft->lsectorsize, &ft->psectorsize, force_overwrite); + } else { + int fd; + long long dummy; + + fd = open(dfile, O_RDONLY); + if (fd >= 0) { + platform_findsizes(dfile, fd, &dummy, &ft->lsectorsize); + close(fd); + } } if (xi->rtname && !xi->risfile) { From david@fromorbit.com Tue May 27 19:30:00 2014 Return-Path: <david@fromorbit.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 09CF57F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 19:30:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E7B4C8F8096 for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:29:59 -0700 (PDT) X-ASG-Debug-ID: 1401236997-04cb6c22b61ad850001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id uBh0S8LeyxkAiGJF for <xfs@oss.sgi.com>; Tue, 27 May 2014 17:29:57 -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: ArVIACAthVN5LL1sPGdsb2JhbAA/GoMHUqpbDAEBAQEBBpgMAYEHFwMBAQEBODWCJQEBBTocIxAIAxUDCSUPBSUDBxoTiEEONtUeFoU/iDRJB4RABIReA5URixiLWisvgQI Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 28 May 2014 09:59:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpRju-00059v-FV; Wed, 28 May 2014 10:29:06 +1000 Date: Wed, 28 May 2014 10:29:06 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <20140528002906.GH8554@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53851836.2070301@sgi.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: 1401236997 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: > On 05/27/14 17:51, Dave Chinner wrote: > >On Tue, May 27, 2014 at 05:20:02PM -0500, Mark Tinguely wrote: > >>On 09/02/13 09:29, Namjae Jeon wrote: > >>>From: Namjae Jeon<namjae.jeon@samsung.com> > >>> > >>>Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. > >>> > >>>Signed-off-by: Namjae Jeon<namjae.jeon@samsung.com> > >>>Signed-off-by: Ashish Sangwan<a.sangwan@samsung.com> > >>>--- > >> > >>>+ /* Check if we can merge 2 adjacent extents */ > >>>+ if ((state& BMAP_LEFT_VALID)&& !(state& BMAP_LEFT_DELAY)&& > >>>+ left.br_startoff + left.br_blockcount == startoff&& > >>>+ left.br_startblock + left.br_blockcount == > >>>+ xfs_bmbt_get_startblock(gotp)&& > >>>+ xfs_bmbt_get_state(gotp) == left.br_state&& > >>>+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp)<= > >>>+ MAXEXTLEN) { > >>>+ blockcount = > >>>+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp); > >>>+ state |= BMAP_LEFT_CONTIG; > >>>+ xfs_iext_remove(ip, *current_ext, 1, 0); > >>>+ XFS_IFORK_NEXT_SET(ip, whichfork, > >>>+ XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > >>>+ gotp = xfs_iext_get_ext(ifp, --*current_ext); > >>>+ } > >>>+ > >>>+ if (cur) { > >>>+ error = xfs_bmbt_lookup_eq(cur, > >>>+ xfs_bmbt_get_startoff(gotp), > >>>+ xfs_bmbt_get_startblock(gotp), > >>>+ xfs_bmbt_get_blockcount(gotp), > >>>+ &i); > >>>+ if (error) > >>>+ goto del_cursor; > >>>+ XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > >> > >>I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a > >>fsstress that fills the filesystem: > >> > >>xfstests> ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192& > > > >Hasn't reproduced after 10 minutes of running at ENOSPC here - how > >long does it take to reproduce? What storage hardware are you > >testing on? How many CPUs? RAM? .... > > > >http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > > >Cheers, > > > >Dave. > > A 7-8 hours on spinning rust. This is my burn in test. Can you try to narrow the problem down? Otherwise it's going to be a case of looking for a needle in a haystack.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From junxiao.bi@oracle.com Tue May 27 22:28:12 2014 Return-Path: <junxiao.bi@oracle.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=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 ACDA17F4E for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:28:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 919D28F8087 for <xfs@oss.sgi.com>; Tue, 27 May 2014 20:28:09 -0700 (PDT) X-ASG-Debug-ID: 1401247676-04cb6c22b71bb050001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id aFzGMDLlgYjfEfiF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 20:27:57 -0700 (PDT) X-Barracuda-Envelope-From: junxiao.bi@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4S3RN6a030584 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 28 May 2014 03:27:23 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s4S3RLoo001684 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 28 May 2014 03:27:22 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4S3RL32007509; Wed, 28 May 2014 03:27:21 GMT Received: from bijx-OptiPlex-780.cn.oracle.com (/10.182.39.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 27 May 2014 20:27:20 -0700 From: Junxiao Bi <junxiao.bi@oracle.com> To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, joe.jin@oracle.com, junxiao.bi@oracle.com Subject: [PATCH] xfsprogs: xfs_copy: fix data corruption of target Date: Wed, 28 May 2014 11:28:07 +0800 X-ASG-Orig-Subj: [PATCH] xfsprogs: xfs_copy: fix data corruption of target Message-Id: <1401247687-6444-1-git-send-email-junxiao.bi@oracle.com> X-Mailer: git-send-email 1.7.9.5 X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1401247677 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15: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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6175 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The unit of XFS_AGFL_DADDR(mp) is "basic block" whose size is "BBSIZE" (512 bytes), so when "source_sectorsize" is not 512, it will cause the target a corrupted filesystem. Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com> --- copy/xfs_copy.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 39bb9d7..6b3396d 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -687,7 +687,7 @@ main(int argc, char **argv) if (source_blocksize > source_sectorsize) { /* get number of leftover sectors in last block of ag header */ - tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * source_sectorsize) + tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) % source_blocksize; first_residue = (tmp_residue == 0) ? 0 : source_blocksize - tmp_residue; @@ -700,10 +700,10 @@ main(int argc, char **argv) exit(1); } - first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * source_sectorsize) + first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) + first_residue) / source_blocksize; ASSERT(first_agbno != 0); - ASSERT( ((((XFS_AGFL_DADDR(mp) + 1) * source_sectorsize) + ASSERT(((((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) + first_residue) % source_blocksize) == 0); /* now open targets */ -- 1.7.1 From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:28:51 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 406B07F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:28:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BE86FAC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:28:50 -0700 (PDT) X-ASG-Debug-ID: 1401254925-04cb6c22b51c2d20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id uGoaAPr6rJEOPacT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:28:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWPt-0000zy-4r; Wed, 28 May 2014 05:28:45 +0000 Date: Tue, 27 May 2014 22:28:45 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-ID: <20140528052845.GA3816@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-3-git-send-email-david@fromorbit.com> <20140527104638.GE1440@infradead.org> <20140527230636.GE8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527230636.GE8554@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1401254925 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.6177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, May 28, 2014 at 09:06:36AM +1000, Dave Chinner wrote: > Fair call - they really are dir2 specific, so probably should be in > xfs_dir2_priv.h, not xfs_da_btree.h. > > OK, I can update this patch to do that. I'll need to repost the > series, because I'll have to rework a significant number of the > patches... I'd be fine with fixing that after the series, but let me review some more of the patches first. From guz.fnst@cn.fujitsu.com Wed May 28 00:30:05 2014 Return-Path: <guz.fnst@cn.fujitsu.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=LOCALPART_IN_SUBJECT 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 1DAAD7F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:30:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF7D7304048 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:30:01 -0700 (PDT) X-ASG-Debug-ID: 1401254994-04bdf0599f1cc610001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id tHIEjiKOOVJZzIiN for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:29:55 -0700 (PDT) X-Barracuda-Envelope-From: guz.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.98,925,1392134400"; d="scan'208";a="31110582" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 28 May 2014 13:27:17 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s4S5TpxF006650; Wed, 28 May 2014 13:29:51 +0800 Received: from [10.167.226.100] (10.167.226.100) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.146.2; Wed, 28 May 2014 13:29:56 +0800 Message-ID: <538571D4.70904@cn.fujitsu.com> Date: Wed, 28 May 2014 13:19:16 +0800 From: Gu Zheng <guz.fnst@cn.fujitsu.com> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1 MIME-Version: 1.0 To: <xfs@oss.sgi.com> CC: Dave Chinner <david@fromorbit.com>, linux-kernel <linux-kernel@vger.kernel.org> Subject: xfs: possible deadlock warning Content-Type: text/plain; charset="ISO-8859-1" X-ASG-Orig-Subj: xfs: possible deadlock warning Content-Transfer-Encoding: 7bit X-Originating-IP: [10.167.226.100] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1401254995 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: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=LOCALPART_IN_SUBJECT, LOCALPART_IN_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject 1.00 LOCALPART_IN_SUBJECT_2 Local part of To: address appears in Subject Hi all, When running the latest Linus' tree, the following possible deadlock warning occurs. [ 140.949000] ====================================================== [ 140.949000] [ INFO: possible circular locking dependency detected ] [ 140.949000] 3.15.0-rc7+ #93 Not tainted [ 140.949000] ------------------------------------------------------- [ 140.949000] qemu-kvm/5056 is trying to acquire lock: [ 140.949000] (&isec->lock){+.+.+.}, at: [<ffffffff8128c835>] inode_doinit_with_dentry+0xa5/0x640 [ 140.949000] [ 140.949000] but task is already holding lock: [ 140.949000] (&mm->mmap_sem){++++++}, at: [<ffffffff81182bcf>] vm_mmap_pgoff+0x6f/0xc0 [ 140.949000] [ 140.949000] which lock already depends on the new lock. [ 140.949000] [ 140.949000] [ 140.949000] the existing dependency chain (in reverse order) is: [ 140.949000] [ 140.949000] -> #2 (&mm->mmap_sem){++++++}: [ 140.949000] [<ffffffff810c214c>] __lock_acquire+0xadc/0x12f0 [ 140.949000] [<ffffffff810c3152>] lock_acquire+0xa2/0x130 [ 140.949000] [<ffffffff8118dbdc>] might_fault+0x8c/0xb0 [ 140.949000] [<ffffffff811f1371>] filldir+0x91/0x120 [ 140.949000] [<ffffffffa01ff788>] xfs_dir2_block_getdents+0x1e8/0x250 [xfs] [ 140.949000] [<ffffffffa01ff92a>] xfs_readdir+0xda/0x120 [xfs] [ 140.949000] [<ffffffffa02017db>] xfs_file_readdir+0x2b/0x40 [xfs] [ 140.949000] [<ffffffff811f11b8>] iterate_dir+0xa8/0xe0 [ 140.949000] [<ffffffff811f165a>] SyS_getdents+0x8a/0x120 [ 140.949000] [<ffffffff8164b269>] system_call_fastpath+0x16/0x1b [ 140.949000] [ 140.949000] -> #1 (&xfs_dir_ilock_class){++++.+}: [ 140.949000] [<ffffffff810c214c>] __lock_acquire+0xadc/0x12f0 [ 140.949000] [<ffffffff810c3152>] lock_acquire+0xa2/0x130 [ 140.949000] [<ffffffff810bc547>] down_read_nested+0x57/0xa0 [ 140.949000] [<ffffffffa0247602>] xfs_ilock+0xf2/0x120 [xfs] [ 140.949000] [<ffffffffa02476a4>] xfs_ilock_attr_map_shared+0x34/0x40 [xfs] [ 140.949000] [<ffffffffa021d229>] xfs_attr_get+0x79/0xb0 [xfs] [ 140.949000] [<ffffffffa02162f7>] xfs_xattr_get+0x37/0x50 [xfs] [ 140.949000] [<ffffffff812034cf>] generic_getxattr+0x4f/0x70 [ 140.949000] [<ffffffff8128c8e0>] inode_doinit_with_dentry+0x150/0x640 [ 140.949000] [<ffffffff8128cea8>] sb_finish_set_opts+0xd8/0x270 [ 140.949000] [<ffffffff8128d2cf>] selinux_set_mnt_opts+0x28f/0x5e0 [ 140.949000] [<ffffffff8128d688>] superblock_doinit+0x68/0xd0 [ 140.949000] [<ffffffff8128d700>] delayed_superblock_init+0x10/0x20 [ 140.949000] [<ffffffff811e0a82>] iterate_supers+0xb2/0x110 [ 140.949000] [<ffffffff8128ef33>] selinux_complete_init+0x33/0x40 [ 140.949000] [<ffffffff8129d6b4>] security_load_policy+0xf4/0x600 [ 140.949000] [<ffffffff812908bc>] sel_write_load+0xac/0x750 [ 140.949000] [<ffffffff811dd0ad>] vfs_write+0xbd/0x1f0 [ 140.949000] [<ffffffff811ddc29>] SyS_write+0x49/0xb0 [ 140.949000] [<ffffffff8164b269>] system_call_fastpath+0x16/0x1b [ 140.949000] [ 140.949000] -> #0 (&isec->lock){+.+.+.}: [ 140.949000] [<ffffffff810c0c51>] check_prevs_add+0x951/0x970 [ 140.949000] [<ffffffff810c214c>] __lock_acquire+0xadc/0x12f0 [ 140.949000] [<ffffffff810c3152>] lock_acquire+0xa2/0x130 [ 140.949000] [<ffffffff8163e038>] mutex_lock_nested+0x78/0x4f0 [ 140.949000] [<ffffffff8128c835>] inode_doinit_with_dentry+0xa5/0x640 [ 140.949000] [<ffffffff8128d97c>] selinux_d_instantiate+0x1c/0x20 [ 140.949000] [<ffffffff81283a1b>] security_d_instantiate+0x1b/0x30 [ 140.949000] [<ffffffff811f4fb0>] d_instantiate+0x50/0x70 [ 140.950000] [<ffffffff8117eb10>] __shmem_file_setup+0xe0/0x1d0 [ 140.950000] [<ffffffff81181488>] shmem_zero_setup+0x28/0x70 [ 140.950000] [<ffffffff811999f3>] mmap_region+0x543/0x5a0 [ 140.950000] [<ffffffff81199d51>] do_mmap_pgoff+0x301/0x3d0 [ 140.950000] [<ffffffff81182bf0>] vm_mmap_pgoff+0x90/0xc0 [ 140.950000] [<ffffffff81182c4d>] vm_mmap+0x2d/0x40 [ 140.950000] [<ffffffffa0765177>] kvm_arch_prepare_memory_region+0x47/0x60 [kvm] [ 140.950000] [<ffffffffa074ed6f>] __kvm_set_memory_region+0x1ff/0x770 [kvm] [ 140.950000] [<ffffffffa074f30d>] kvm_set_memory_region+0x2d/0x50 [kvm] [ 140.950000] [<ffffffffa0b2e0da>] vmx_set_tss_addr+0x4a/0x190 [kvm_intel] [ 140.950000] [<ffffffffa0760bc0>] kvm_arch_vm_ioctl+0x9c0/0xb80 [kvm] [ 140.950000] [<ffffffffa074f3be>] kvm_vm_ioctl+0x8e/0x730 [kvm] [ 140.950000] [<ffffffff811f0e50>] do_vfs_ioctl+0x300/0x520 [ 140.950000] [<ffffffff811f10f1>] SyS_ioctl+0x81/0xa0 [ 140.950000] [<ffffffff8164b269>] system_call_fastpath+0x16/0x1b [ 140.950000] [ 140.950000] other info that might help us debug this: [ 140.950000] [ 140.950000] Chain exists of: [ 140.950000] &isec->lock --> &xfs_dir_ilock_class --> &mm->mmap_sem [ 140.950000] [ 140.950000] Possible unsafe locking scenario: [ 140.950000] [ 140.950000] CPU0 CPU1 [ 140.950000] ---- ---- [ 140.950000] lock(&mm->mmap_sem); [ 140.950000] lock(&xfs_dir_ilock_class); [ 140.950000] lock(&mm->mmap_sem); [ 140.950000] lock(&isec->lock); [ 140.950000] [ 140.950000] *** DEADLOCK *** [ 140.950000] [ 140.950000] 2 locks held by qemu-kvm/5056: [ 140.950000] #0: (&kvm->slots_lock){+.+.+.}, at: [<ffffffffa074f302>] kvm_set_memory_region+0x22/0x50 [kvm] [ 140.950000] #1: (&mm->mmap_sem){++++++}, at: [<ffffffff81182bcf>] vm_mmap_pgoff+0x6f/0xc0 [ 140.950000] [ 140.950000] stack backtrace: [ 140.950000] CPU: 76 PID: 5056 Comm: qemu-kvm Not tainted 3.15.0-rc7+ #93 [ 140.950000] Hardware name: FUJITSU PRIMEQUEST2800E/SB, BIOS PRIMEQUEST 2000 Series BIOS Version 01.48 05/07/2014 [ 140.950000] ffffffff823925a0 ffff880830ba7750 ffffffff81638c00 ffffffff82321bc0 [ 140.950000] ffff880830ba7790 ffffffff81632d63 ffff880830ba77c0 0000000000000001 [ 140.950000] ffff8808359540d8 ffff8808359540d8 ffff880835953480 0000000000000002 [ 140.950000] Call Trace: [ 140.950000] [<ffffffff81638c00>] dump_stack+0x4d/0x66 [ 140.950000] [<ffffffff81632d63>] print_circular_bug+0x1f9/0x207 [ 140.950000] [<ffffffff810c0c51>] check_prevs_add+0x951/0x970 [ 140.950000] [<ffffffff810c214c>] __lock_acquire+0xadc/0x12f0 [ 140.950000] [<ffffffff810c3152>] lock_acquire+0xa2/0x130 [ 140.950000] [<ffffffff8128c835>] ? inode_doinit_with_dentry+0xa5/0x640 [ 140.950000] [<ffffffff8163e038>] mutex_lock_nested+0x78/0x4f0 [ 140.950000] [<ffffffff8128c835>] ? inode_doinit_with_dentry+0xa5/0x640 [ 140.950000] [<ffffffff8128c835>] ? inode_doinit_with_dentry+0xa5/0x640 [ 140.950000] [<ffffffff8101cd69>] ? sched_clock+0x9/0x10 [ 140.950000] [<ffffffff810a6545>] ? local_clock+0x25/0x30 [ 140.950000] [<ffffffff8128c835>] inode_doinit_with_dentry+0xa5/0x640 [ 140.950000] [<ffffffff8128d97c>] selinux_d_instantiate+0x1c/0x20 [ 140.950000] [<ffffffff81283a1b>] security_d_instantiate+0x1b/0x30 [ 140.950000] [<ffffffff811f4fb0>] d_instantiate+0x50/0x70 [ 140.950000] [<ffffffff8117eb10>] __shmem_file_setup+0xe0/0x1d0 [ 140.950000] [<ffffffff81181488>] shmem_zero_setup+0x28/0x70 [ 140.950000] [<ffffffff811999f3>] mmap_region+0x543/0x5a0 [ 140.950000] [<ffffffff81199d51>] do_mmap_pgoff+0x301/0x3d0 [ 140.950000] [<ffffffff81182bf0>] vm_mmap_pgoff+0x90/0xc0 [ 140.950000] [<ffffffff81182c4d>] vm_mmap+0x2d/0x40 [ 140.950000] [<ffffffffa0765177>] kvm_arch_prepare_memory_region+0x47/0x60 [kvm] [ 140.950000] [<ffffffffa074ed6f>] __kvm_set_memory_region+0x1ff/0x770 [kvm] [ 140.950000] [<ffffffff810c1085>] ? mark_held_locks+0x75/0xa0 [ 140.950000] [<ffffffffa074f30d>] kvm_set_memory_region+0x2d/0x50 [kvm] [ 140.950000] [<ffffffffa0b2e0da>] vmx_set_tss_addr+0x4a/0x190 [kvm_intel] [ 140.950000] [<ffffffffa0760bc0>] kvm_arch_vm_ioctl+0x9c0/0xb80 [kvm] [ 140.950000] [<ffffffff810c1920>] ? __lock_acquire+0x2b0/0x12f0 [ 140.950000] [<ffffffff810c34e8>] ? lock_release_non_nested+0x308/0x350 [ 140.950000] [<ffffffff8101cd69>] ? sched_clock+0x9/0x10 [ 140.950000] [<ffffffff810a6545>] ? local_clock+0x25/0x30 [ 140.950000] [<ffffffff810bde3f>] ? lock_release_holdtime.part.28+0xf/0x190 [ 140.950000] [<ffffffffa074f3be>] kvm_vm_ioctl+0x8e/0x730 [kvm] [ 140.950000] [<ffffffff811f0e50>] do_vfs_ioctl+0x300/0x520 [ 140.950000] [<ffffffff81287e86>] ? file_has_perm+0x86/0xa0 [ 140.950000] [<ffffffff811f10f1>] SyS_ioctl+0x81/0xa0 [ 140.950000] [<ffffffff8111383c>] ? __audit_syscall_entry+0x9c/0xf0 [ 140.950000] [<ffffffff8164b269>] system_call_fastpath+0x16/0x1b Thanks, Gu From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:30:22 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CAE307F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:30:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2E578F8087 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:30:22 -0700 (PDT) X-ASG-Debug-ID: 1401255021-04bdf0599f1cc6e0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 8x86lFoGLxCUUpL8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:30:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWRP-000279-Q2; Wed, 28 May 2014 05:30:19 +0000 Date: Tue, 27 May 2014 22:30:19 -0700 From: Christoph Hellwig <hch@infradead.org> To: Dave Chinner <david@fromorbit.com> Cc: Brian Foster <bfoster@redhat.com>, Christoph Hellwig <hch@infradead.org>, xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140528053019.GB3816@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> <20140527104428.GC1440@infradead.org> <20140527121810.GB63281@bfoster.bfoster> <20140527212653.GC6677@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527212653.GC6677@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401255021 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 28, 2014 at 07:26:53AM +1000, Dave Chinner wrote: > > Right... maybe I'm not parsing your point. The purpose here is to avoid > > the trylock entirely. E.g., Indicate that we have already acquired the > > lock and can proceed with xfs_free_eofblocks(), rather than fail a > > trylock and skip (which appears to be a potential infinite loop scenario > > here due to how the AG walking code handles EAGAIN). > > I think Christoph's concern here is that we are calling a function > that can take the iolock while we already hold the iolock. i.e. the > reason we have to add the anti-deadlock code in the first place. Indeed. > To > address that, can we restructure xfs_file_buffered_aio_write() such > that the ENOSPC/EDQUOT flush is done outside the iolock? > > >From a quick check, I don't think there is any problem with dropping > the iolock, doing the flushes and then going all the way back to the > start of the function again, but closer examination and testing is > warranted... I think we'd need some form of early space reservation, otherwise we'd get non-atomic writes. Time to get those batches write patches out again.. From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:32:42 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C982F7F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:32:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B46D930404E for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:32:42 -0700 (PDT) X-ASG-Debug-ID: 1401255161-04cb6c22b51c30b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id m3JwzvEvCCqDWNY9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:32:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWTh-0002KX-8i; Wed, 28 May 2014 05:32:41 +0000 Date: Tue, 27 May 2014 22:32:41 -0700 From: Christoph Hellwig <hch@infradead.org> To: Junxiao Bi <junxiao.bi@oracle.com> Cc: xfs@oss.sgi.com, hch@infradead.org, joe.jin@oracle.com Subject: Re: [PATCH] xfsprogs: xfs_copy: fix data corruption of target Message-ID: <20140528053241.GC3816@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_copy: fix data corruption of target References: <1401247687-6444-1-git-send-email-junxiao.bi@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401247687-6444-1-git-send-email-junxiao.bi@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1401255161 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.6177 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, May 28, 2014 at 11:28:07AM +0800, Junxiao Bi wrote: > The unit of XFS_AGFL_DADDR(mp) is "basic block" whose size is "BBSIZE" > (512 bytes), so when "source_sectorsize" is not 512, it will cause the > target a corrupted filesystem. > > Signed-off-by: Junxiao Bi <junxiao.bi@oracle.com> Looks good. Any chance you could create a testcase for this as well? Reviewed-by: Christoph Hellwig <hch@lst.de> From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:39:16 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 4AE257F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23F31304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:39:16 -0700 (PDT) X-ASG-Debug-ID: 1401255554-04bdf0599e1cce30001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id kr4tm22csJUEIzVZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:39:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWa0-0003qI-Ev; Wed, 28 May 2014 05:39:12 +0000 Date: Tue, 27 May 2014 22:39:12 -0700 From: Christoph Hellwig <hch@infradead.org> To: Eric Sandeen <sandeen@sandeen.net> Cc: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH 1/2, RFC] xfsprogs: check fs sector size in platform_findsizes() Message-ID: <20140528053912.GA13166@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2, RFC] xfsprogs: check fs sector size in platform_findsizes() References: <53852A05.5040006@redhat.com> <53852A61.90400@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53852A61.90400@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401255554 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 07:14:25PM -0500, Eric Sandeen wrote: > Try the xfs geometry ioctl if the mkfs target resides > in a file; this gives us the equivalent of a device > sector size. > > This does, however, emit a warning if the target file > exists on a non-XFS filesystem, and that might not be super. You could simple not print the warning in case this bothers you.. > Signed-off-by: Eric Sandeen <sandeen@redhat.com> Otherwise looks good, Reviewed-by: Christoph Hellwig <hch@lst.de> From david@fromorbit.com Wed May 28 00:39:23 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F85E7F54 for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A2E5304048 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:39:23 -0700 (PDT) X-ASG-Debug-ID: 1401255560-04cbb02a101bc960001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id vDc4pGlSyVlJpMb4 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:39:20 -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: Am1SAE91hVN5LL1sPGdsb2JhbABZgweDRIUIongBAQEBAQEGmA0BgQkXAwEBAQE4NYIlAQEFOhwjEAgDDgoJJQ8FJQMHGhOIQdVLFxaFP4h9B4RAAQOZc4sYi1or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:09:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpWa5-0005l3-3W; Wed, 28 May 2014 15:39:17 +1000 Date: Wed, 28 May 2014 15:39:17 +1000 From: Dave Chinner <david@fromorbit.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h Message-ID: <20140528053917.GJ8554@dastard> X-ASG-Orig-Subj: Re: [PATCH 02/16] xfs: move directory block translatiosn to xfs_da_btree.h References: <1400803432-20048-1-git-send-email-david@fromorbit.com> <1400803432-20048-3-git-send-email-david@fromorbit.com> <20140527104638.GE1440@infradead.org> <20140527230636.GE8554@dastard> <20140528052845.GA3816@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528052845.GA3816@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: 1401255560 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 10:28:45PM -0700, Christoph Hellwig wrote: > On Wed, May 28, 2014 at 09:06:36AM +1000, Dave Chinner wrote: > > Fair call - they really are dir2 specific, so probably should be in > > xfs_dir2_priv.h, not xfs_da_btree.h. > > > > OK, I can update this patch to do that. I'll need to repost the > > series, because I'll have to rework a significant number of the > > patches... > > I'd be fine with fixing that after the series, but let me review some > more of the patches first. Already done..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:40:36 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E4A7D7F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9ED68F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:40:36 -0700 (PDT) X-ASG-Debug-ID: 1401255635-04cbb02a111bcbd0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 2E6yMgxo4BXS9oVb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:40:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWbK-0005MG-6G; Wed, 28 May 2014 05:40:34 +0000 Date: Tue, 27 May 2014 22:40:34 -0700 From: Christoph Hellwig <hch@infradead.org> To: Eric Sandeen <sandeen@sandeen.net> Cc: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files Message-ID: <20140528054034.GB13166@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files References: <53852A05.5040006@redhat.com> <53852A98.7000809@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53852A98.7000809@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401255635 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, May 27, 2014 at 07:15:20PM -0500, Eric Sandeen wrote: > If we encounter a target that's really a regular file, > even without "-d file..." on the cmdline, call > platform_findsizes() instead of blkid_get_topology to > try to discover the "sector size" via the fsgeom() call. > > Signed-off-by: Eric Sandeen <sandeen@redhat.com> > --- > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 37c05a9..74180c9 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -454,12 +454,26 @@ static void get_topology( > struct fs_topology *ft, > int force_overwrite) > { > - if (!xi->disfile) { > - const char *dfile = xi->volname ? xi->volname : xi->dname; > + int is_a_file = 0; > + struct stat statbuf; > + char *dfile = xi->volname ? xi->volname : xi->dname; > > + if (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode)) > + is_a_file = 1; > + > + if (!xi->disfile && !is_a_file) { Why do need both xi->disfile and a local flag/ Why do we do the that even if xi->disfile is set? From BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org Wed May 28 00:41:46 2014 Return-Path: <BATV+8b03864131badcc78e66+3930+infradead.org+hch@bombadil.srs.infradead.org> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 5AE547F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 00:41:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6842AC005 for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:41:45 -0700 (PDT) X-ASG-Debug-ID: 1401255703-04cbb02a101bce40001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id I7Iuzv2cABCxLk3e (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 22:41:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+8b03864131badcc78e66+3930+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 1WpWcQ-0005NL-Vn; Wed, 28 May 2014 05:41:42 +0000 Date: Tue, 27 May 2014 22:41:42 -0700 From: Christoph Hellwig <hch@infradead.org> To: Eric Sandeen <sandeen@redhat.com> Cc: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device Message-ID: <20140528054142.GC13166@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device References: <53852A05.5040006@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53852A05.5040006@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from <hch@infradead.org> by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1401255703 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > We can modify platform_findsizes() to use the fsgeom call to get the > "sector size" which should be used here, and warn that mismatches > might exist if it fails. > > This does mean there'll be a new warning emitted on fs images hosted > on non-xfs filesystems; I'm not really quite sure it's worth it, > hence the RFC nature of this lightly tested 2-patch series... Might be time to introduce some generic VFS-level ioctl for the sector size and dio alignment. Any beer or chocolate that could motivate you to get this done? :) Also it would be nice to have a test case that exercises this new code. From david@fromorbit.com Wed May 28 01:01:21 2014 Return-Path: <david@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F55E29DF8 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:01:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68888304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:01:18 -0700 (PDT) X-ASG-Debug-ID: 1401256875-04cb6c22b61c5370001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RnoHezdIQX8ufCcs for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:01:15 -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: AmxSADN7hVN5LL1sPGdsb2JhbABZgweDRIUIongBAQEBAQEGmA0BgQkXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hB1VgXFoU/iH0HhEAEmXOWcis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:30:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpWuw-0005ny-Ot; Wed, 28 May 2014 16:00:50 +1000 Date: Wed, 28 May 2014 16:00:50 +1000 From: Dave Chinner <david@fromorbit.com> To: Gu Zheng <guz.fnst@cn.fujitsu.com> Cc: xfs@oss.sgi.com, linux-kernel <linux-kernel@vger.kernel.org> Subject: Re: xfs: possible deadlock warning Message-ID: <20140528060050.GK8554@dastard> X-ASG-Orig-Subj: Re: xfs: possible deadlock warning References: <538571D4.70904@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538571D4.70904@cn.fujitsu.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: 1401256875 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 28, 2014 at 01:19:16PM +0800, Gu Zheng wrote: > Hi all, > When running the latest Linus' tree, the following possible deadlock warning occurs. false positive. There isn't a deadlock between inode locks on different filesystems. i.e. there is no dependency between shmem inodes and xfs inodes, nor on their security contexts. Nor can you take a page fault on a directory inode, which is the XFS inode lock class it's complaining about. Fundamentally, the problem here is shmem instantiating a new inode with the mmap_sem held. That's just plain wrong... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed May 28 01:04:52 2014 Return-Path: <dave@fromorbit.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 268067F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F0E318F808F for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GxdouzdBRqaFHLv3 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:50 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005oe-1X for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lJ-0h for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry Date: Wed, 28 May 2014 16:04:31 +1000 X-ASG-Orig-Subj: [PATCH 04/16] xfs: convert dir byte/off conversion to xfs_da_geometry Message-Id: <1401257083-13433-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257089 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_priv.h | 18 +++++++++--------- fs/xfs/xfs_dir2_readdir.c | 7 ++++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index d48d477..73b6c46 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -749,7 +749,7 @@ xfs_dir2_shrink_inode( /* * If the block isn't the last one in the directory, we're done. */ - if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(mp, db + 1, 0)) + if (dp->i_d.di_size > xfs_dir2_db_off_to_byte(args->geo, db + 1, 0)) return 0; bno = da; if ((error = xfs_bmap_last_before(tp, dp, &bno, XFS_DATA_FORK))) { diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 492edb6..6838289 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -67,10 +67,9 @@ xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) * Convert byte in space to offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); + return (xfs_dir2_data_aoff_t)(by & (geo->blksize - 1)); } /* @@ -79,18 +78,17 @@ xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) static inline xfs_dir2_data_aoff_t xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); } /* * Convert block and offset to byte in space */ static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; + return ((xfs_dir2_off_t)db << geo->blklog) + o; } /* @@ -118,7 +116,8 @@ static inline xfs_dir2_dataptr_t xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); + return xfs_dir2_byte_to_dataptr( + xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); } /* @@ -136,7 +135,8 @@ xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) static inline xfs_dir2_off_t xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(mp->m_dir_geo, + xfs_dir2_da_to_db(mp, da), 0); } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index bf7a5ce..ec912c8 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -560,7 +560,8 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp, map_info->curdb, 0); + newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + map_info->curdb, 0); /* * Start of the current block. */ @@ -578,7 +579,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp, curoff); + byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); /* * Skip past the header. */ @@ -607,7 +608,7 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp, + xfs_dir2_db_off_to_byte(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:53 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 718677F50 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEFB1AC002 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-ASG-Debug-ID: 1401257088-04cbb02a0f1bef30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kxH3HHVYIGxF3XRP for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:49 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005of-20 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lO-1C for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Date: Wed, 28 May 2014 16:04:32 +1000 X-ASG-Orig-Subj: [PATCH 05/16] xfs: convert directory dablk conversion to xfs_da_geometry Message-Id: <1401257083-13433-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257088 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_dir2.c | 4 ++-- fs/xfs/xfs_dir2_data.c | 4 ++-- fs/xfs/xfs_dir2_leaf.c | 21 +++++++++++---------- fs/xfs/xfs_dir2_node.c | 41 +++++++++++++++++++++++------------------ fs/xfs/xfs_dir2_priv.h | 15 +++++++-------- fs/xfs/xfs_dir2_readdir.c | 6 +++--- 6 files changed, 48 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 73b6c46..ae94617 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -632,7 +632,7 @@ xfs_dir2_grow_inode( if (error) return error; - *dbp = xfs_dir2_da_to_db(mp, (xfs_dablk_t)bno); + *dbp = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)bno); /* * Update file's size if this is the data space and it grew. @@ -713,7 +713,7 @@ xfs_dir2_shrink_inode( dp = args->dp; mp = dp->i_mount; tp = args->trans; - da = xfs_dir2_db_to_da(mp, db); + da = xfs_dir2_db_to_da(args->geo, db); /* * Unmap the fsblock(s). */ diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index bae8b5b..890c940 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -584,8 +584,8 @@ xfs_dir3_data_init( /* * Get the buffer set up for the block. */ - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, blkno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, blkno), + -1, &bp, XFS_DATA_FORK); if (error) return error; bp->b_ops = &xfs_dir3_data_buf_ops; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index dc4ef19..046ba4a 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -350,8 +350,8 @@ xfs_dir3_leaf_get_buf( ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, - XFS_DATA_FORK); + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), + -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -403,7 +403,7 @@ xfs_dir2_block_to_leaf( if ((error = xfs_da_grow_inode(args, &blkno))) { return error; } - ldb = xfs_dir2_da_to_db(mp, blkno); + ldb = xfs_dir2_da_to_db(args->geo, blkno); ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. @@ -828,8 +828,8 @@ xfs_dir2_leaf_addname( * Just read that one in. */ error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, use_block), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, use_block), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1269,8 +1269,8 @@ xfs_dir2_leaf_lookup_int( if (dbp) xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, newdb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1310,8 +1310,8 @@ xfs_dir2_leaf_lookup_int( if (cidb != curdb) { xfs_trans_brelse(tp, dbp); error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, cidb), - -1, &dbp); + xfs_dir2_db_to_da(args->geo, cidb), + -1, &dbp); if (error) { xfs_trans_brelse(tp, lbp); return error; @@ -1609,7 +1609,8 @@ xfs_dir2_leaf_trim_data( /* * Read the offending data block. We need its buffer. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, db), -1, &dbp); + error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(args->geo, db), + -1, &dbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 1bcaaa0..3b70d56 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -195,17 +195,18 @@ xfs_dir2_free_try_read( static int xfs_dir3_free_get_buf( - struct xfs_trans *tp, - struct xfs_inode *dp, + xfs_da_args_t *args, xfs_dir2_db_t fbno, struct xfs_buf **bpp) { + struct xfs_trans *tp = args->trans; + struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; struct xfs_buf *bp; int error; struct xfs_dir3_icfree_hdr hdr; - error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, fbno), + error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), -1, &bp, XFS_DATA_FORK); if (error) return error; @@ -319,7 +320,7 @@ xfs_dir2_leaf_to_node( /* * Get the buffer for the new freespace block. */ - error = xfs_dir3_free_get_buf(tp, dp, fdb, &fbp); + error = xfs_dir3_free_get_buf(args, fdb, &fbp); if (error) return error; @@ -605,7 +606,8 @@ xfs_dir2_leafn_lookup_for_addname( xfs_trans_brelse(tp, curbp); error = xfs_dir2_free_read(tp, dp, - xfs_dir2_db_to_da(mp, newfdb), + xfs_dir2_db_to_da(args->geo, + newfdb), &curbp); if (error) return error; @@ -746,7 +748,8 @@ xfs_dir2_leafn_lookup_for_entry( curbp = state->extrablk.bp; } else { error = xfs_dir3_data_read(tp, dp, - xfs_dir2_db_to_da(mp, newdb), + xfs_dir2_db_to_da(args->geo, + newdb), -1, &curbp); if (error) return error; @@ -1246,7 +1249,8 @@ xfs_dir2_leafn_remove( * read in the free block. */ fdb = dp->d_ops->db_to_fdb(mp, db); - error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), + error = xfs_dir2_free_read(tp, dp, + xfs_dir2_db_to_da(args->geo, fdb), &fbp); if (error) return error; @@ -1336,7 +1340,7 @@ xfs_dir2_leafn_split( /* * Initialize the new leaf block. */ - error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(mp, blkno), + error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(args->geo, blkno), &newblk->bp, XFS_DIR2_LEAFN_MAGIC); if (error) return error; @@ -1729,7 +1733,7 @@ xfs_dir2_node_addname_int( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) return error; - lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); + lastfbno = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo); fbno = ifbno; } /* @@ -1766,8 +1770,8 @@ xfs_dir2_node_addname_int( * to avoid it. */ error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; if (!fbp) @@ -1837,8 +1841,8 @@ xfs_dir2_node_addname_int( */ fbno = dp->d_ops->db_to_fdb(mp, dbno); error = xfs_dir2_free_try_read(tp, dp, - xfs_dir2_db_to_da(mp, fbno), - &fbp); + xfs_dir2_db_to_da(args->geo, fbno), + &fbp); if (error) return error; @@ -1878,7 +1882,7 @@ xfs_dir2_node_addname_int( /* * Get a buffer for the new block. */ - error = xfs_dir3_free_get_buf(tp, dp, fbno, &fbp); + error = xfs_dir3_free_get_buf(args, fbno, &fbp); if (error) return error; free = fbp->b_addr; @@ -1946,7 +1950,8 @@ xfs_dir2_node_addname_int( /* * Read the data block in. */ - error = xfs_dir3_data_read(tp, dp, xfs_dir2_db_to_da(mp, dbno), + error = xfs_dir3_data_read(tp, dp, + xfs_dir2_db_to_da(args->geo, dbno), -1, &dbp); if (error) return error; @@ -2265,9 +2270,9 @@ xfs_dir2_node_trim_free( /* * Blow the block away. */ - if ((error = - xfs_dir2_shrink_inode(args, xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo), - bp))) { + error = xfs_dir2_shrink_inode(args, + xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo), bp); + if (error) { /* * Can't fail with ENOSPC since that only happens with no * space reservation, when breaking up an extent into two diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 6838289..18e3086 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -95,9 +95,9 @@ xfs_dir2_db_off_to_byte(struct xfs_da_geometry *geo, xfs_dir2_db_t db, * Convert block (DB) to block (dablk) */ static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); + return (xfs_dablk_t)(db << (geo->blklog - geo->fsblog)); } /* @@ -106,7 +106,7 @@ xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) static inline xfs_dablk_t xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); } /* @@ -124,19 +124,18 @@ xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, * Convert block (dablk) to block (DB) */ static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_db(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); + return (xfs_dir2_db_t)(da >> (geo->blklog - geo->fsblog)); } /* * Convert block (dablk) to byte offset in space */ static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) { - return xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_da_to_db(mp, da), 0); + return xfs_dir2_db_off_to_byte(geo, xfs_dir2_da_to_db(geo, da), 0); } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index ec912c8..57e9247 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -396,14 +396,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp, mip->map_off); + *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -536,7 +536,7 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp, + map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, curoff)); /* -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:53 2014 Return-Path: <dave@fromorbit.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 712527F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4E3908F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:53 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OQPEzFM0CqMID0BD for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBAQQnLzMIGDE5AwcUGYhB1W+FVYkahCoEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005op-4u for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lo-3u for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry Date: Wed, 28 May 2014 16:04:37 +1000 X-ASG-Orig-Subj: [PATCH 10/16] xfs: convert dir/attr btree threshold to xfs_da_geometry Message-Id: <1401257083-13433-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257091 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_dir2.c | 2 -- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_mount.h | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 2c0fdc8..5be77b3 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1949,7 +1949,7 @@ xfs_attr3_leaf_remove( tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + ichdr.count * sizeof(xfs_attr_leaf_entry_t); - return tmp < mp->m_attr_magicpct; /* leaf is < 37% full */ + return tmp < args->geo->magicpct; /* leaf is < 37% full */ } /* diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 99df2a2..4eabe51 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -146,9 +146,7 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; - mp->m_attr_magicpct = mp->m_attr_geo->magicpct; return 0; } diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index ef34c19..de5b2996 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1312,7 +1312,7 @@ xfs_dir2_leafn_remove( */ *rval = (dp->d_ops->leaf_hdr_size + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < - mp->m_dir_magicpct; + args->geo->magicpct; return 0; } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 4e3f6ce..78ae7e4 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -148,8 +148,6 @@ typedef struct xfs_mount { int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:53 2014 Return-Path: <dave@fromorbit.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 A24037F50 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88CB28F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:53 -0700 (PDT) X-ASG-Debug-ID: 1401257088-04cbb02a0f1bef30002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GBJrXtTYqvkgBd52 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmRPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpgNgQoXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQdVvhVWIeIRMBLBlKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyj-0005ob-W7 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyj-0003l4-VD for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:45 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 01/16] xfs: introduce directory geometry structure Date: Wed, 28 May 2014 16:04:28 +1000 X-ASG-Orig-Subj: [PATCH 01/16] xfs: introduce directory geometry structure Message-Id: <1401257083-13433-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257090 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> The directory code has a dependency on the struct xfs_mount to supply the directory block geometry. Block size, block log size, and other parameters are pre-caclulated in the struct xfs_mount or access directly from the superblock embedded in the struct xfs_mount. Extract all of this geometry information out of the struct xfs_mount and superblock and place it into a new struct xfs_da_geometry defined by the directory code. Allocate and initialise it at mount time, and attach it to the struct xfs_mount so it canbe passed back into the directory code appropriately rather than using the struct xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_leaf.c | 2 ++ fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_da_btree.h | 18 +++++++++++++ fs/xfs/xfs_dir2.c | 73 +++++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_dir2.h | 4 ++- fs/xfs/xfs_mount.c | 16 ++++++----- fs/xfs/xfs_mount.h | 3 +++ 8 files changed, 97 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 1fc1f06..c547498 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -88,6 +88,7 @@ xfs_attr_args_init( return EINVAL; memset(args, 0, sizeof(*args)); + args->geo = dp->i_mount->m_attr_geo; args->whichfork = XFS_ATTR_FORK; args->dp = dp; args->flags = flags; diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 511c283..2c0fdc8 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) memset((char *)&nargs, 0, sizeof(nargs)); nargs.dp = dp; + nargs.geo = args->geo; nargs.firstblock = args->firstblock; nargs.flist = args->flist; nargs.total = args->total; @@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform( * Copy the attributes */ memset((char *)&nargs, 0, sizeof(nargs)); + nargs.geo = args->geo; nargs.dp = dp; nargs.firstblock = args->firstblock; nargs.flist = args->flist; diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 833fe5d..90e2eeb 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int( xfs_da_args_t args; memset((char *)&args, 0, sizeof(args)); + args.geo = context->dp->i_mount->m_attr_geo; args.dp = context->dp; args.whichfork = XFS_ATTR_FORK; args.valuelen = valuelen; diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index c824a0a..0ac63ad 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -25,6 +25,23 @@ struct xfs_trans; struct zone; struct xfs_dir_ops; +/* + * Directory/attribute geometry information. There will be one of these for each + * data fork type, and it will be passed around via the xfs_da_args. Global + * structures will be attached to the xfs_mount. + */ +struct xfs_da_geometry { + int blksize; /* da block size in bytes */ + int fsbcount; /* da block size in filesystem blocks */ + uint8_t fsblog; /* log2 of _filesystem_ block size */ + uint8_t blklog; /* log2 of da block size */ + uint node_ents; /* # of entries in a danode */ + int magicpct; /* 37% of block size in bytes */ + xfs_dablk_t datablk; /* blockno of dir data v2 */ + xfs_dablk_t leafblk; /* blockno of leaf data v2 */ + xfs_dablk_t freeblk; /* blockno of free data v2 */ +}; + /*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ @@ -42,6 +59,7 @@ enum xfs_dacmp { * Structure to ease passing around component names. */ typedef struct xfs_da_args { + struct xfs_da_geometry *geo; /* da block geometry */ const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ __uint8_t filetype; /* filetype of inode for directories */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 93fcebd..acd940d 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { .compname = xfs_ascii_ci_compname, }; -void -xfs_dir_mount( - xfs_mount_t *mp) +int +xfs_da_mount( + struct xfs_mount *mp) { - int nodehdr_size; + struct xfs_da_geometry *dageo; + int nodehdr_size; ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); @@ -99,24 +100,64 @@ xfs_dir_mount( mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), + KM_SLEEP | KM_MAYFAIL); + if (!mp->m_dir_geo || !mp->m_attr_geo) { + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); + return ENOMEM; + } + + /* set up directory geometry */ + dageo = mp->m_dir_geo; + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; + dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / + dageo->magicpct = (dageo->blksize * 37) / 100; + + /* set up attribute geometry - single fsb only */ + dageo = mp->m_attr_geo; + dageo->blklog = mp->m_sb.sb_blocklog; + dageo->fsblog = mp->m_sb.sb_blocklog; + dageo->blksize = 1 << dageo->blklog; + dageo->fsbcount = 1; + dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); + dageo->magicpct = (dageo->blksize * 37) / 100; - mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; if (xfs_sb_version_hasasciici(&mp->m_sb)) mp->m_dirnameops = &xfs_ascii_ci_nameops; else mp->m_dirnameops = &xfs_default_nameops; + /* XXX: these are to be removed as code is converted to use geo */ + mp->m_dirblksize = mp->m_dir_geo->blksize; + mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; + mp->m_dirdatablk = mp->m_dir_geo->datablk; + mp->m_dirleafblk = mp->m_dir_geo->leafblk; + mp->m_dirfreeblk = mp->m_dir_geo->freeblk; + mp->m_dir_node_ents = mp->m_dir_geo->node_ents; + mp->m_dir_magicpct = mp->m_dir_geo->magicpct; + mp->m_attr_node_ents = mp->m_attr_geo->node_ents; + mp->m_attr_magicpct = mp->m_attr_geo->magicpct; + return 0; +} + +void +xfs_da_unmount( + struct xfs_mount *mp) +{ + kmem_free(mp->m_dir_geo); + kmem_free(mp->m_attr_geo); } /* @@ -192,6 +233,7 @@ xfs_dir_init( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->dp = dp; args->trans = tp; error = xfs_dir2_sf_create(args, pdp->i_ino); @@ -226,6 +268,7 @@ xfs_dir_createname( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -320,6 +363,7 @@ xfs_dir_lookup( * annotations into the reclaim path for the ilock. */ args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -391,6 +435,7 @@ xfs_dir_removename( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -455,6 +500,7 @@ xfs_dir_replace( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; @@ -516,6 +562,7 @@ xfs_dir_canenter( if (!args) return ENOMEM; + args->geo = dp->i_mount->m_dir_geo; args->name = name->name; args->namelen = name->len; args->filetype = name->type; diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 64a6b19..7a85b9c 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -112,7 +112,9 @@ extern const struct xfs_dir_ops * * Generic directory interface routines */ extern void xfs_dir_startup(void); -extern void xfs_dir_mount(struct xfs_mount *mp); +extern int xfs_da_mount(struct xfs_mount *mp); +extern void xfs_da_unmount(struct xfs_mount *mp); + extern int xfs_dir_isempty(struct xfs_inode *dp); extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_inode *pdp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index fa8a420..3507cd0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -791,12 +791,11 @@ xfs_mountfs( mp->m_dmevmask = 0; /* not persistent; set after each mount */ - xfs_dir_mount(mp); - - /* - * Initialize the attribute manager's entries. - */ - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize * 37) / 100; + error = xfs_da_mount(mp); + if (error) { + xfs_warn(mp, "Failed dir/attr init: %d", error); + goto out_remove_uuid; + } /* * Initialize the precomputed transaction reservations values. @@ -811,7 +810,7 @@ xfs_mountfs( error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { xfs_warn(mp, "Failed per-ag init: %d", error); - goto out_remove_uuid; + goto out_free_dir; } if (!sbp->sb_logblocks) { @@ -986,6 +985,8 @@ xfs_mountfs( xfs_wait_buftarg(mp->m_ddev_targp); out_free_perag: xfs_free_perag(mp); + out_free_dir: + xfs_da_unmount(mp); out_remove_uuid: xfs_uuid_unmount(mp); out: @@ -1063,6 +1064,7 @@ xfs_unmountfs( "Freespace may not be correct on next mount."); xfs_log_unmount(mp); + xfs_da_unmount(mp); xfs_uuid_unmount(mp); #if defined(DEBUG) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a466c5e..27cce7b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -27,6 +27,7 @@ struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; struct xfs_dir_ops; +struct xfs_da_geometry; #ifdef HAVE_PERCPU_SB @@ -96,6 +97,8 @@ typedef struct xfs_mount { uint m_readio_blocks; /* min read size blocks */ uint m_writeio_log; /* min write size log bytes */ uint m_writeio_blocks; /* min write size blocks */ + struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ + struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ struct xlog *m_log; /* log specific stuff */ int m_logbufs; /* number of log buffers */ int m_logbsize; /* size of each log buffer */ -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:53 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D50417F51 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 725E8AC002 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:50 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iRiiSuXOoufpxR4C for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:47 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkVQADN7hVN5LL1sPGdsb2JhbABZgwdSqlsCCgsBAQEBAQEGmRcXAwEBAQE4NYMCO4ECAweIbg6hWbQIhVWHA4IXhCoEpQuJUYIJKy8 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyj-0005oa-VZ for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyj-0003l1-UQ for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:45 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry Date: Wed, 28 May 2014 16:04:27 +1000 X-ASG-Orig-Subj: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry Message-Id: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257087 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, Version three of the patchset first posted here: http://oss.sgi.com/pipermail/xfs/2014-May/036125.html This version addresses the review comments so far. Changelog: Version 3: - added xfs_da_unmount - moved dir2 conversion functions to xfs_dir2_priv.h - converted xfs_dir2_readdir.c to use local geo variables - added a patch to remove newly redundant geometry fields from the struct xfs_da_state Version 2: - patch removing checks from xfs_da_read_buf() sent separately - dropped patch adding xfs_da_geometry to the inode forks as it's not currently needed - cleared up all the "XXX" notations added in the RFC series - fixed several bugs in different patches as a result of incorrect conversions - ensured each patch compiled and passes xfstests individually From dave@fromorbit.com Wed May 28 01:04:55 2014 Return-Path: <dave@fromorbit.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 662867F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C8678F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:54 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id bys6tOKUJqZK5C9c for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar5PADN7hVN5LL1sPGdsb2JhbABZgwdSh3qibQsBAQEBAQEGmRcXAwEBAQE4NYIlAQEFJy8zCBgxOQMHFBmIQdVvhVWNRASbMYlai1or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005oi-3K for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lY-2S for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry Date: Wed, 28 May 2014 16:04:34 +1000 X-ASG-Orig-Subj: [PATCH 07/16] xfs: convert directory segment limits to xfs_da_geometry Message-Id: <1401257083-13433-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257090 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_da_btree.c | 22 +++++++++++----------- fs/xfs/xfs_dir2.c | 7 ++----- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_data.c | 9 +++++---- fs/xfs/xfs_dir2_leaf.c | 12 ++++++------ fs/xfs/xfs_dir2_readdir.c | 18 +++++++++--------- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_mount.h | 3 --- 8 files changed, 37 insertions(+), 42 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4db5102..8621202 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -598,7 +598,7 @@ xfs_da3_root_split( * Set up the new root node. */ error = xfs_da3_node_create(args, - (args->whichfork == XFS_DATA_FORK) ? mp->m_dirleafblk : 0, + (args->whichfork == XFS_DATA_FORK) ? args->geo->leafblk : 0, level + 1, &bp, args->whichfork); if (error) return error; @@ -616,10 +616,10 @@ xfs_da3_root_split( #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - ASSERT(blk1->blkno >= mp->m_dirleafblk && - blk1->blkno < mp->m_dirfreeblk); - ASSERT(blk2->blkno >= mp->m_dirleafblk && - blk2->blkno < mp->m_dirfreeblk); + ASSERT(blk1->blkno >= args->geo->leafblk && + blk1->blkno < args->geo->freeblk); + ASSERT(blk2->blkno >= args->geo->leafblk && + blk2->blkno < args->geo->freeblk); } #endif @@ -894,8 +894,8 @@ xfs_da3_node_add( ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); if (state->args->whichfork == XFS_DATA_FORK) - ASSERT(newblk->blkno >= state->mp->m_dirleafblk && - newblk->blkno < state->mp->m_dirfreeblk); + ASSERT(newblk->blkno >= state->args->geo->leafblk && + newblk->blkno < state->args->geo->freeblk); /* * We may need to make some room before we insert the new node. @@ -1472,7 +1472,7 @@ xfs_da3_node_lookup_int( * Descend thru the B-tree searching each level for the right * node to use, until the right hashval is found. */ - blkno = (args->whichfork == XFS_DATA_FORK)? state->mp->m_dirleafblk : 0; + blkno = (args->whichfork == XFS_DATA_FORK)? args->geo->leafblk : 0; for (blk = &state->path.blk[0], state->path.active = 1; state->path.active <= XFS_DA_NODE_MAXDEPTH; blk++, state->path.active++) { @@ -2096,7 +2096,7 @@ xfs_da_grow_inode( trace_xfs_da_grow_inode(args); if (args->whichfork == XFS_DATA_FORK) { - bno = args->dp->i_mount->m_dirleafblk; + bno = args->geo->leafblk; count = args->dp->i_mount->m_dirblkfsbs; } else { bno = 0; @@ -2158,7 +2158,7 @@ xfs_da3_swap_lastblock( w = args->whichfork; ASSERT(w == XFS_DATA_FORK); mp = dp->i_mount; - lastoff = mp->m_dirfreeblk; + lastoff = args->geo->freeblk; error = xfs_bmap_last_before(tp, dp, &lastoff, w); if (error) return error; @@ -2247,7 +2247,7 @@ xfs_da3_swap_lastblock( sizeof(sib_info->back))); sib_buf = NULL; } - par_blkno = mp->m_dirleafblk; + par_blkno = args->geo->leafblk; level = -1; /* * Walk down the tree looking for the parent of the moved block. diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 866a671..cecb3e8 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -147,9 +147,6 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; - mp->m_dirdatablk = mp->m_dir_geo->datablk; - mp->m_dirleafblk = mp->m_dir_geo->leafblk; - mp->m_dirfreeblk = mp->m_dir_geo->freeblk; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -690,7 +687,7 @@ xfs_dir2_isleaf( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); return 0; } @@ -763,7 +760,7 @@ xfs_dir2_shrink_inode( */ return error; } - if (db == mp->m_dirdatablk) + if (db == args->geo->datablk) ASSERT(bno == 0); else ASSERT(bno > 0); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index bc08216..d950cde 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -136,7 +136,7 @@ xfs_dir3_block_read( struct xfs_mount *mp = dp->i_mount; int err; - err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, + err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, XFS_DATA_FORK, &xfs_dir3_block_buf_ops); if (!err && tp) xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); @@ -969,7 +969,7 @@ xfs_dir2_leaf_to_block( * Read the data block if we don't already have it, give up if it fails. */ if (!dbp) { - error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); + error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp); if (error) return error; } @@ -1034,7 +1034,7 @@ xfs_dir2_leaf_to_block( /* * Pitch the old leaf block. */ - error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); + error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp); if (error) return error; diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index d355ec7..6c23f86 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -63,8 +63,10 @@ __xfs_dir3_data_check( int stale; /* count of stale leaves */ struct xfs_name name; const struct xfs_dir_ops *ops; + struct xfs_da_geometry *geo; mp = bp->b_target->bt_mount; + geo = mp->m_dir_geo; /* * We can be passed a null dp here from a verifier, so we need to go the @@ -172,10 +174,9 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, - mp->m_dirdatablk, - (xfs_dir2_data_aoff_t) - ((char *)dep - (char *)hdr)); + addr = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, + (xfs_dir2_data_aoff_t) + ((char *)dep - (char *)hdr)); name.name = dep->name; name.len = dep->namelen; hash = mp->m_dirnameops->hashname(&name); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 2b3ddd0..3eb8b24 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -641,7 +641,7 @@ xfs_dir2_leaf_addname( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1232,7 +1232,7 @@ xfs_dir2_leaf_lookup_int( tp = args->trans; mp = dp->i_mount; - error = xfs_dir3_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp); + error = xfs_dir3_leaf_read(tp, dp, args->geo->leafblk, -1, &lbp); if (error) return error; @@ -1429,7 +1429,7 @@ xfs_dir2_leaf_removename( */ if (be16_to_cpu(bf[0].length) == mp->m_dirblksize - dp->d_ops->data_entry_offset) { - ASSERT(db != mp->m_dirdatablk); + ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* * Nope, can't get rid of it because it caused @@ -1470,7 +1470,7 @@ xfs_dir2_leaf_removename( /* * If the data block was not the first one, drop it. */ - else if (db != mp->m_dirdatablk) + else if (db != args->geo->datablk) dbp = NULL; xfs_dir3_leaf_check(dp, lbp); @@ -1722,7 +1722,7 @@ xfs_dir2_node_to_leaf( * that may have been left behind during no-space-reservation * operations. */ - while (fo > mp->m_dirfreeblk) { + while (fo > args->geo->freeblk) { if ((error = xfs_dir2_node_trim_free(args, fo, &rval))) { return error; } @@ -1752,7 +1752,7 @@ xfs_dir2_node_to_leaf( /* * Read the freespace block. */ - error = xfs_dir2_free_read(tp, dp, mp->m_dirfreeblk, &fbp); + error = xfs_dir2_free_read(tp, dp, args->geo->freeblk, &fbp); if (error) return error; free = fbp->b_addr; diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index c2a6387..0c8c09c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -111,18 +111,18 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; /* * Precalculate offsets for . and .. as we will always need them. * * XXX(hch): the second argument is sometimes 0 and sometimes - * mp->m_dirdatablk. + * geo->datablk */ - dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, dp->d_ops->data_dotdot_offset); /* @@ -151,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -168,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; return 0; } @@ -199,7 +199,7 @@ xfs_dir2_block_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -248,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -268,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 4dc4193..10f4c2a 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -247,7 +247,7 @@ xfs_dir2_block_to_sf( /* now we are done with the block, we can shrink the inode */ logflags = XFS_ILOG_CORE; - error = xfs_dir2_shrink_inode(args, mp->m_dirdatablk, bp); + error = xfs_dir2_shrink_inode(args, args->geo->datablk, bp); if (error) { ASSERT(error != ENOSPC); goto out; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 27cce7b..0a32de0 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -156,9 +156,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:56 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 3003E7F5A for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19A6D304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:55 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id APhnNJamZdGXFCIv for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ow-6v for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003m8-67 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code Date: Wed, 28 May 2014 16:04:41 +1000 X-ASG-Orig-Subj: [PATCH 14/16] xfs: use xfs_da_geometry for block size in attr code Message-Id: <1401257083-13433-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257092 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Rather than using the superblock value obtained through the xfs_mount. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_attr.c | 12 ++++++------ fs/xfs/xfs_attr_leaf.c | 6 +++--- fs/xfs/xfs_log_rlimit.c | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 8bb9ae6..ccfc2c9 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -175,11 +175,11 @@ xfs_attr_calc_size( * "local" or "remote" (note: local != inline). */ size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, local); + args->geo->blksize, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { - if (size > (mp->m_sb.sb_blocksize >> 1)) { + if (size > (args->geo->blksize / 2)) { /* Double split possible */ nblks *= 2; } @@ -898,7 +898,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1077,7 +1077,7 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); @@ -1169,7 +1169,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* @@ -1432,7 +1432,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_sb.sb_blocksize; + state->blocksize = args->geo->blksize; state->node_ents = args->geo->node_ents; /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 5be77b3..88cd84a 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1077,7 +1077,7 @@ xfs_attr3_leaf_add( xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->trans->t_mountp->m_sb.sb_blocksize, NULL); + args->geo->blksize, NULL); /* * Search through freemap for first-fit on new name length. @@ -1180,13 +1180,13 @@ xfs_attr3_leaf_add_work( ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, NULL)); + args->geo->blksize, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - mp->m_sb.sb_blocksize, &tmp); + args->geo->blksize, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index 2af1a0a..ee7e0e8 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -42,7 +42,7 @@ xfs_log_calc_max_attrsetm_res( int size; int nblks; - size = xfs_attr_leaf_entsize_local_max(mp->m_sb.sb_blocksize) - + size = xfs_attr_leaf_entsize_local_max(mp->m_attr_geo->blksize) - MAXNAMELEN - 1; nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); nblks += XFS_B_TO_FSB(mp, size); -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:55 2014 Return-Path: <dave@fromorbit.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 13E187F50 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC0D78F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:51 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id xIFhPRBBpLmMhHWp for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:49 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005od-14 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lE-0H for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Date: Wed, 28 May 2014 16:04:30 +1000 X-ASG-Orig-Subj: [PATCH 03/16] xfs: kill XFS_DIR2...FIRSTDB macros Message-Id: <1401257083-13433-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257088 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> They are just simple wrappers around xfs_dir2_byte_to_db(), and we've already removed one usage earlier in the patch set. Kill the rest before we start removing the xfs_mount from conversion functions. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> --- fs/xfs/xfs_da_format.c | 6 ++++-- fs/xfs/xfs_da_format.h | 6 ------ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 9 +++++---- fs/xfs/xfs_dir2_node.c | 11 +++++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index f4a783b..a2d0682 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -611,7 +611,8 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(mp)); } /* @@ -642,7 +643,8 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); + return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(mp)); } /* diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 32b415c..44d7fac 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -330,8 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_DATA_SPACE 0 #define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) /* * Describe a free area in the data block. @@ -456,8 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) */ #define XFS_DIR2_LEAF_SPACE 1 #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) /* * Leaf block header. @@ -531,8 +527,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) */ #define XFS_DIR2_FREE_SPACE 2 #define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) typedef struct xfs_dir2_free_hdr { __be32 magic; /* XFS_DIR2_FREE_MAGIC */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index acd940d..d48d477 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -744,7 +744,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= XFS_DIR2_LEAF_FIRSTDB(mp)) + if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index f571723..dc4ef19 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= XFS_DIR2_LEAF_FIRSTDB(mp) && - bno < XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(mp, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(mp, blkno); - ASSERT(ldb == XFS_DIR2_LEAF_FIRSTDB(mp)); + ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -1798,7 +1798,8 @@ xfs_dir2_node_to_leaf( /* * Get rid of the freespace block. */ - error = xfs_dir2_shrink_inode(args, XFS_DIR2_FREE_FIRSTDB(mp), fbp); + error = xfs_dir2_shrink_inode(args, + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 9cb91ee..1bcaaa0 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -315,7 +315,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == XFS_DIR2_FREE_FIRSTDB(mp)); + ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -1256,7 +1256,7 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1747,7 +1747,8 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = XFS_DIR2_FREE_FIRSTDB(mp); + fbno = xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. */ @@ -1887,7 +1888,9 @@ xfs_dir2_node_addname_int( /* * Remember the first slot as our empty slot. */ - freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * + freehdr.firstdb = + (fbno - xfs_dir2_byte_to_db(mp, + XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { free = fbp->b_addr; -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:57 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08B817F66 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7C90FAC002 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:55 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qZ3skM3cQ2DfbwoZ for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZGYgo1W+FVY1EBJVzjxiLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005or-5F for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lt-4O for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Date: Wed, 28 May 2014 16:04:38 +1000 X-ASG-Orig-Subj: [PATCH 11/16] xfs: move node entry counts to xfs_da_geometry Message-Id: <1401257083-13433-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257092 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_attr.c | 8 ++++---- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_dir2.c | 3 --- fs/xfs/xfs_dir2_node.c | 10 +++++----- fs/xfs/xfs_mount.h | 2 -- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index c547498..8bb9ae6 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -899,7 +899,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name already exists, and get back a pointer @@ -1078,7 +1078,7 @@ restart: state->args = args; state->mp = mp; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); if (error) @@ -1170,7 +1170,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) state->args = args; state->mp = dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. @@ -1433,7 +1433,7 @@ xfs_attr_node_get(xfs_da_args_t *args) state->args = args; state->mp = args->dp->i_mount; state->blocksize = state->mp->m_sb.sb_blocksize; - state->node_ents = state->mp->m_attr_node_ents; + state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index b9b007d..f935370 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -167,8 +167,8 @@ xfs_da3_node_verify( * we don't know if the node is for and attribute or directory tree, * so only fail if the count is outside both bounds */ - if (ichdr.count > mp->m_dir_node_ents && - ichdr.count > mp->m_attr_node_ents) + if (ichdr.count > mp->m_dir_geo->node_ents && + ichdr.count > mp->m_attr_geo->node_ents) return false; /* XXX: hash order check? */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 4eabe51..f62d2e5 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -144,9 +144,6 @@ xfs_da_mount( else mp->m_dirnameops = &xfs_default_nameops; - /* XXX: these are to be removed as code is converted to use geo */ - mp->m_dir_node_ents = mp->m_dir_geo->node_ents; - mp->m_attr_node_ents = mp->m_attr_geo->node_ents; return 0; } diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index de5b2996..eff6b8d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1596,8 +1596,8 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->blocksize = args->geo->blksize; + state->node_ents = args->geo->node_ents; /* * Look up the name. We're not supposed to find it, but * this gives us the insertion point. @@ -2043,7 +2043,7 @@ xfs_dir2_node_lookup( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* * Fill in the path to the entry in the cursor. */ @@ -2098,7 +2098,7 @@ xfs_dir2_node_removename( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; /* Look up the entry we're deleting, set up the cursor. */ error = xfs_da3_node_lookup_int(state, &rval); @@ -2168,7 +2168,7 @@ xfs_dir2_node_replace( state->args = args; state->mp = args->dp->i_mount; state->blocksize = args->geo->blksize; - state->node_ents = state->mp->m_dir_node_ents; + state->node_ents = args->geo->node_ents; inum = args->inumber; /* * Lookup the entry to change in the btree. diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 78ae7e4..7295a0b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -134,8 +134,6 @@ typedef struct xfs_mount { int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:58 2014 Return-Path: <dave@fromorbit.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 7C0FC7F4E for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 62B568F808F for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:57 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EETkZNp6Mw46B50r for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:54 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWiuBMCQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ou-5m for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003ly-4w for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Date: Wed, 28 May 2014 16:04:39 +1000 X-ASG-Orig-Subj: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Message-Id: <1401257083-13433-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257094 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> There are many places in the directory code were we don't pass the args into and so have to extract the geometry direct from the mount structure. Push the args or the geometry into these leaf functions so that we don't need to grab it from the struct xfs_mount. This, in turn, brings use to the point where directory geometry is no longer a property of the struct xfs_mount; it is not a global property anymore, and hence we can start to consider per-directory configuration of physical geometries. Start by converting the xfs_dir_isblock/leaf code - pass in the xfs_da_args and convert the readdir code to use xfs_da_args like the rest of the directory code to pass information around. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_dir2.c | 50 +++++++++++++--------------- fs/xfs/xfs_dir2.h | 4 +-- fs/xfs/xfs_dir2_readdir.c | 85 ++++++++++++++++++++++------------------------- 3 files changed, 65 insertions(+), 74 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index f62d2e5..79670cd 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -282,7 +282,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -290,7 +290,7 @@ xfs_dir_createname( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -375,7 +375,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -383,7 +383,7 @@ xfs_dir_lookup( goto out_check_rval; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -448,7 +448,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -456,7 +456,7 @@ xfs_dir_removename( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -513,7 +513,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -521,7 +521,7 @@ xfs_dir_replace( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -573,7 +573,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isblock(dp, &v); + rval = xfs_dir2_isblock(args, &v); if (rval) goto out_free; if (v) { @@ -581,7 +581,7 @@ xfs_dir_canenter( goto out_free; } - rval = xfs_dir2_isleaf(dp, &v); + rval = xfs_dir2_isleaf(args, &v); if (rval) goto out_free; if (v) @@ -649,18 +649,16 @@ xfs_dir2_grow_inode( */ int xfs_dir2_isblock( - xfs_inode_t *dp, - int *vp) /* out: 1 is block, 0 is not block */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); + rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; + ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); *vp = rval; return 0; } @@ -670,17 +668,15 @@ xfs_dir2_isblock( */ int xfs_dir2_isleaf( - xfs_inode_t *dp, - int *vp) /* out: 1 is leaf, 0 is not leaf */ + struct xfs_da_args *args, + int *vp) /* out: 1 is block, 0 is not block */ { - xfs_fileoff_t last; /* last file offset */ - xfs_mount_t *mp; - int rval; + xfs_fileoff_t last; /* last file offset */ + int rval; - mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) return rval; - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); + *vp = last == args->geo->leafblk + args->geo->fsbcount; return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 9b709ae..1292e78 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -146,8 +146,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); +extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); +extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index fa393d5..ca1f43c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -76,28 +76,25 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { STATIC int xfs_dir2_sf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx) { int i; /* shortform entry number */ - xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_dataptr_t off; /* current entry's offset */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; - struct xfs_da_geometry *geo; - - mp = dp->i_mount; - geo = mp->m_dir_geo; + struct xfs_da_geometry *geo = args->geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* * Give up if the directory is way too short. */ if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); + ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); return XFS_ERROR(EIO); } @@ -163,13 +160,13 @@ xfs_dir2_sf_getdents( filetype = dp->d_ops->sf_get_ftype(sfep); ctx->pos = off & 0x7fffffff; if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) return 0; sfep = dp->d_ops->sf_nextentry(sfp, sfep); } ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + 0x7fffffff; return 0; } @@ -178,9 +175,10 @@ xfs_dir2_sf_getdents( */ STATIC int xfs_dir2_block_getdents( - xfs_inode_t *dp, /* incore inode */ + struct xfs_da_args *args, struct dir_context *ctx) { + struct xfs_inode *dp = args->dp; /* incore directory inode */ xfs_dir2_data_hdr_t *hdr; /* block header */ struct xfs_buf *bp; /* buffer for block */ xfs_dir2_block_tail_t *btp; /* block tail */ @@ -188,14 +186,11 @@ xfs_dir2_block_getdents( xfs_dir2_data_unused_t *dup; /* block unused entry */ char *endptr; /* end of the data entries */ int error; /* error return value */ - xfs_mount_t *mp; /* filesystem mount point */ char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; - struct xfs_da_geometry *geo; + struct xfs_da_geometry *geo = args->geo; - mp = dp->i_mount; - geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ @@ -258,7 +253,7 @@ xfs_dir2_block_getdents( */ if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) { + xfs_dir3_get_dtype(dp->i_mount, filetype))) { xfs_trans_brelse(NULL, bp); return 0; } @@ -269,7 +264,7 @@ xfs_dir2_block_getdents( * Set the offset to a non-existent block 1 and return. */ ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & - 0x7fffffff; + 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; } @@ -290,13 +285,13 @@ struct xfs_dir2_leaf_map_info { STATIC int xfs_dir2_leaf_readbuf( - struct xfs_inode *dp, + struct xfs_da_args *args, size_t bufsize, struct xfs_dir2_leaf_map_info *mip, xfs_dir2_off_t *curoff, struct xfs_buf **bpp) { - struct xfs_mount *mp = dp->i_mount; + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = *bpp; struct xfs_bmbt_irec *map = mip->map; struct blk_plug plug; @@ -304,7 +299,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; - struct xfs_da_geometry *geo = mp->m_dir_geo; + struct xfs_da_geometry *geo = args->geo; /* * If we have a buffer, we need to release it and @@ -338,8 +333,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + geo->blksize, - mp->m_sb.sb_blocksize) - 1; + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; ASSERT(mip->ra_want >= 0); /* @@ -411,8 +405,8 @@ xfs_dir2_leaf_readbuf( mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= geo->fsbcount ? - XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); - + XFS_FSB_TO_DADDR(dp->i_mount, map->br_startblock) : + -1, &bp); /* * Should just skip over the data block instead of giving up. */ @@ -441,7 +435,7 @@ xfs_dir2_leaf_readbuf( map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, - XFS_FSB_TO_DADDR(mp, + XFS_FSB_TO_DADDR(dp->i_mount, map[mip->ra_index].br_startblock + mip->ra_offset)); mip->ra_current = i; @@ -493,23 +487,23 @@ out: */ STATIC int xfs_dir2_leaf_getdents( - xfs_inode_t *dp, /* incore directory inode */ + struct xfs_da_args *args, struct dir_context *ctx, size_t bufsize) { + struct xfs_inode *dp = args->dp; struct xfs_buf *bp = NULL; /* data block buffer */ xfs_dir2_data_hdr_t *hdr; /* data block header */ xfs_dir2_data_entry_t *dep; /* data entry */ xfs_dir2_data_unused_t *dup; /* unused entry */ int error = 0; /* error return value */ int length; /* temporary length value */ - xfs_mount_t *mp; /* filesystem mount point */ int byteoff; /* offset in current block */ xfs_dir2_off_t curoff; /* current overall offset */ xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; - struct xfs_da_geometry *geo; + struct xfs_da_geometry *geo = args->geo; /* * If the offset is at or past the largest allowed value, @@ -518,15 +512,12 @@ xfs_dir2_leaf_getdents( if (ctx->pos >= XFS_DIR2_MAX_DATAPTR) return 0; - mp = dp->i_mount; - geo = mp->m_dir_geo; - /* * Set up to bmap a number of blocks based on the caller's * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, (1 << geo->fsblog)); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -558,7 +549,7 @@ xfs_dir2_leaf_getdents( */ if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { - error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, + error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, &curoff, &bp); if (error || !map_info->map_valid) break; @@ -566,7 +557,7 @@ xfs_dir2_leaf_getdents( /* * Having done a read, we need to set a new offset. */ - newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, + newoff = xfs_dir2_db_off_to_byte(geo, map_info->curdb, 0); /* * Start of the current block. @@ -585,7 +576,7 @@ xfs_dir2_leaf_getdents( * Find our position in the block. */ ptr = (char *)dp->d_ops->data_entry_p(hdr); - byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); + byteoff = xfs_dir2_byte_to_off(geo, curoff); /* * Skip past the header. */ @@ -644,7 +635,7 @@ xfs_dir2_leaf_getdents( ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; if (!dir_emit(ctx, (char *)dep->name, dep->namelen, be64_to_cpu(dep->inumber), - xfs_dir3_get_dtype(mp, filetype))) + xfs_dir3_get_dtype(dp->i_mount, filetype))) break; /* @@ -674,13 +665,14 @@ xfs_dir2_leaf_getdents( */ int xfs_readdir( - xfs_inode_t *dp, - struct dir_context *ctx, - size_t bufsize) + struct xfs_inode *dp, + struct dir_context *ctx, + size_t bufsize) { - int rval; /* return value */ - int v; /* type-checking value */ - uint lock_mode; + struct xfs_da_args args = {0}; + int rval; + int v; + uint lock_mode; trace_xfs_readdir(dp); @@ -690,15 +682,18 @@ xfs_readdir( ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_getdents); + args.dp = dp; + args.geo = dp->i_mount->m_dir_geo; + lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) - rval = xfs_dir2_sf_getdents(dp, ctx); - else if ((rval = xfs_dir2_isblock(dp, &v))) + rval = xfs_dir2_sf_getdents(&args, ctx); + else if ((rval = xfs_dir2_isblock(&args, &v))) ; else if (v) - rval = xfs_dir2_block_getdents(dp, ctx); + rval = xfs_dir2_block_getdents(&args, ctx); else - rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); + rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); xfs_iunlock(dp, lock_mode); return rval; -- 1.9.0 From dave@fromorbit.com Wed May 28 01:04:56 2014 Return-Path: <dave@fromorbit.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 F082E7F51 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D6F5D8F8074 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:55 -0700 (PDT) X-ASG-Debug-ID: 1401257088-04cbb02a0f1bef30003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0sq3nuJ4UaIlkEnB for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao+6ADN7hVN5LL1sPGdsb2JhbABZgwdShHSDBqJtCwEBAQEBAQaZFxcDAQEBATg1giUBAQUaDS8zCBgxOQMHFBmIQdVvhVWNRASbMYlai1or Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005og-2q for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lT-1d for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry Date: Wed, 28 May 2014 16:04:33 +1000 X-ASG-Orig-Subj: [PATCH 06/16] xfs: convert directory db conversion to xfs_da_geometry Message-Id: <1401257083-13433-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257092 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_da_format.c | 4 ++-- fs/xfs/xfs_dir2.c | 13 +++++++++---- fs/xfs/xfs_dir2_block.c | 15 +++++++++------ fs/xfs/xfs_dir2_data.c | 3 ++- fs/xfs/xfs_dir2_leaf.c | 30 +++++++++++++++++------------- fs/xfs/xfs_dir2_node.c | 27 ++++++++++++++++----------- fs/xfs/xfs_dir2_priv.h | 22 ++++++++++------------ fs/xfs/xfs_dir2_readdir.c | 45 ++++++++++++++++++++++++++------------------- fs/xfs/xfs_dir2_sf.c | 4 ++-- 9 files changed, 93 insertions(+), 70 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index a2d0682..ac8474e 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -611,7 +611,7 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir2_free_max_bests(mp)); } @@ -643,7 +643,7 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) static xfs_dir2_db_t xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + + return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + (db / xfs_dir3_free_max_bests(mp)); } diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index ae94617..866a671 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -117,9 +117,14 @@ xfs_da_mount( dageo->fsblog = mp->m_sb.sb_blocklog; dageo->blksize = 1 << dageo->blklog; dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; - dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); - dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); - dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); + + /* + * Now we've set up the block conversion variables, we can calculate the + * segment block constants using the geometry structure. + */ + dageo->datablk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_DATA_OFFSET); + dageo->leafblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_LEAF_OFFSET); + dageo->freeblk = xfs_dir2_byte_to_da(dageo, XFS_DIR2_FREE_OFFSET); dageo->node_ents = (dageo->blksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); dageo->magicpct = (dageo->blksize * 37) / 100; @@ -744,7 +749,7 @@ xfs_dir2_shrink_inode( /* * If it's not a data block, we're done. */ - if (db >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)) + if (db >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)) return 0; /* * If the block isn't the last one in the directory, we're done. diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index dd9d005..bc08216 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -639,7 +639,8 @@ xfs_dir2_block_lookup( * Get the offset from the leaf entry, to point to the data. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Fill in inode number, CI name if appropriate, release the block. */ @@ -723,7 +724,7 @@ xfs_dir2_block_lookup_int( * Get pointer to the entry from the leaf. */ dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr)); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -795,8 +796,9 @@ xfs_dir2_block_removename( /* * Point to the data entry using the leaf entry. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); /* * Mark the data entry's space free. */ @@ -870,8 +872,9 @@ xfs_dir2_block_replace( /* * Point to the data entry we need to change. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(blp[ent].address))); ASSERT(be64_to_cpu(dep->inumber) != args->inumber); /* * Change the inode number to the new value. diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 890c940..d355ec7 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -172,7 +172,8 @@ __xfs_dir3_data_check( lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, + mp->m_dirdatablk, (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); name.name = dep->name; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 046ba4a..2b3ddd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -347,8 +347,8 @@ xfs_dir3_leaf_get_buf( int error; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - ASSERT(bno >= xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) && - bno < xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(bno >= xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET) && + bno < xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, bno), -1, &bp, XFS_DATA_FORK); @@ -404,7 +404,7 @@ xfs_dir2_block_to_leaf( return error; } ldb = xfs_dir2_da_to_db(args->geo, blkno); - ASSERT(ldb == xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET)); + ASSERT(ldb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_LEAF_OFFSET)); /* * Initialize the leaf block, get a buffer for it. */ @@ -670,7 +670,7 @@ xfs_dir2_leaf_addname( index++, lep++) { if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR) continue; - i = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + i = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(i < be32_to_cpu(ltp->bestcount)); ASSERT(bestsp[i] != cpu_to_be16(NULLDATAOFF)); if (be16_to_cpu(bestsp[i]) >= length) { @@ -889,7 +889,8 @@ xfs_dir2_leaf_addname( * Fill in the new leaf entry. */ lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, use_block, + lep->address = cpu_to_be32( + xfs_dir2_db_off_to_dataptr(args->geo, use_block, be16_to_cpu(*tagp))); /* * Log the leaf fields and give up the buffers. @@ -1185,7 +1186,7 @@ xfs_dir2_leaf_lookup( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); /* * Return the found inode number & CI name if appropriate */ @@ -1260,7 +1261,8 @@ xfs_dir2_leaf_lookup_int( /* * Get the new data block number. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * If it's not the same as the old data block number, * need to pitch the old one and read the new one. @@ -1281,7 +1283,8 @@ xfs_dir2_leaf_lookup_int( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare name and if it's an exact match, return the index * and buffer. If it's the first case-insensitive match, store @@ -1380,9 +1383,9 @@ xfs_dir2_leaf_removename( * Point to the leaf entry, use that to point to the data entry. */ lep = &ents[index]; - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); ltp = xfs_dir2_leaf_tail_p(mp, leaf); @@ -1515,7 +1518,7 @@ xfs_dir2_leaf_replace( */ dep = (xfs_dir2_data_entry_t *) ((char *)dbp->b_addr + - xfs_dir2_dataptr_to_off(dp->i_mount, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); ASSERT(args->inumber != be64_to_cpu(dep->inumber)); /* * Put the new inode number in, log it. @@ -1800,7 +1803,8 @@ xfs_dir2_node_to_leaf( * Get rid of the freespace block. */ error = xfs_dir2_shrink_inode(args, - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET), fbp); + xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET), + fbp); if (error) { /* * This can't fail here because it can only happen when diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 3b70d56..89777bf 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -316,7 +316,7 @@ xfs_dir2_leaf_to_node( if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) { return error; } - ASSERT(fdb == xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET)); + ASSERT(fdb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)); /* * Get the buffer for the new freespace block. */ @@ -451,7 +451,7 @@ xfs_dir2_leafn_add( highstale, &lfloglow, &lfloghigh); lep->hashval = cpu_to_be32(args->hashval); - lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, + lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo, args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); @@ -577,7 +577,8 @@ xfs_dir2_leafn_lookup_for_addname( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * For addname, we're looking for a place to put the new entry. * We want to use a data block with an entry of equal @@ -723,7 +724,8 @@ xfs_dir2_leafn_lookup_for_entry( /* * Pull the data block number from the entry. */ - newdb = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + newdb = xfs_dir2_dataptr_to_db(args->geo, + be32_to_cpu(lep->address)); /* * Not adding a new entry, so we really want to find * the name given to us. @@ -761,7 +763,8 @@ xfs_dir2_leafn_lookup_for_entry( * Point to the data entry. */ dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr + - xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); /* * Compare the entry and if it's an exact match, return * EEXIST immediately. If it's the first case-insensitive @@ -1196,9 +1199,9 @@ xfs_dir2_leafn_remove( /* * Extract the data block and offset from the entry. */ - db = xfs_dir2_dataptr_to_db(mp, be32_to_cpu(lep->address)); + db = xfs_dir2_dataptr_to_db(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->blkno == db); - off = xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)); + off = xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address)); ASSERT(dblk->index == off); /* @@ -1260,7 +1263,8 @@ xfs_dir2_leafn_remove( struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * - (fdb - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET))); + (fdb - xfs_dir2_byte_to_db(args->geo, + XFS_DIR2_FREE_OFFSET))); } #endif /* @@ -1751,7 +1755,7 @@ xfs_dir2_node_addname_int( * us a freespace block to start with. */ if (++fbno == 0) - fbno = xfs_dir2_byte_to_db(mp, + fbno = xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET); /* * If it's ifbno we already looked at it. @@ -1893,7 +1897,7 @@ xfs_dir2_node_addname_int( * Remember the first slot as our empty slot. */ freehdr.firstdb = - (fbno - xfs_dir2_byte_to_db(mp, + (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * dp->d_ops->free_max_bests(mp); } else { @@ -2194,7 +2198,8 @@ xfs_dir2_node_replace( hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); dep = (xfs_dir2_data_entry_t *) ((char *)hdr + - xfs_dir2_dataptr_to_off(state->mp, be32_to_cpu(lep->address))); + xfs_dir2_dataptr_to_off(args->geo, + be32_to_cpu(lep->address))); ASSERT(inum != be64_to_cpu(dep->inumber)); /* * Fill in the new inode number and log the entry. diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 18e3086..071b685 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -48,19 +48,18 @@ xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) * Convert byte in space to (DB) block */ static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_db(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); + return (xfs_dir2_db_t)(by >> geo->blklog); } /* * Convert dataptr to a block number */ static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_db(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_db(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -76,9 +75,9 @@ xfs_dir2_byte_to_off(struct xfs_da_geometry *geo, xfs_dir2_off_t by) * Convert dataptr to a byte offset in a block */ static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +xfs_dir2_dataptr_to_off(struct xfs_da_geometry *geo, xfs_dir2_dataptr_t dp) { - return xfs_dir2_byte_to_off(mp->m_dir_geo, xfs_dir2_dataptr_to_byte(dp)); + return xfs_dir2_byte_to_off(geo, xfs_dir2_dataptr_to_byte(dp)); } /* @@ -104,20 +103,19 @@ xfs_dir2_db_to_da(struct xfs_da_geometry *geo, xfs_dir2_db_t db) * Convert byte in space to (DA) block */ static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +xfs_dir2_byte_to_da(struct xfs_da_geometry *geo, xfs_dir2_off_t by) { - return xfs_dir2_db_to_da(mp->m_dir_geo, xfs_dir2_byte_to_db(mp, by)); + return xfs_dir2_db_to_da(geo, xfs_dir2_byte_to_db(geo, by)); } /* * Convert block and offset to dataptr */ static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, +xfs_dir2_db_off_to_dataptr(struct xfs_da_geometry *geo, xfs_dir2_db_t db, xfs_dir2_data_aoff_t o) { - return xfs_dir2_byte_to_dataptr( - xfs_dir2_db_off_to_byte(mp->m_dir_geo, db, o)); + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(geo, db, o)); } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 57e9247..c2a6387 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -87,8 +87,10 @@ xfs_dir2_sf_getdents( xfs_dir2_dataptr_t dot_offset; xfs_dir2_dataptr_t dotdot_offset; xfs_ino_t ino; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; ASSERT(dp->i_df.if_flags & XFS_IFINLINE); /* @@ -109,7 +111,7 @@ xfs_dir2_sf_getdents( /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; /* @@ -118,9 +120,9 @@ xfs_dir2_sf_getdents( * XXX(hch): the second argument is sometimes 0 and sometimes * mp->m_dirdatablk. */ - dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dot_offset); - dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + dotdot_offset = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, dp->d_ops->data_dotdot_offset); /* @@ -149,7 +151,7 @@ xfs_dir2_sf_getdents( for (i = 0; i < sfp->count; i++) { __uint8_t filetype; - off = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + off = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { @@ -166,7 +168,7 @@ xfs_dir2_sf_getdents( sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; return 0; } @@ -190,12 +192,14 @@ xfs_dir2_block_getdents( char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * If the block number in the offset is out of range, we're done. */ - if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) + if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > mp->m_dirdatablk) return 0; error = xfs_dir3_block_read(NULL, dp, &bp); @@ -206,7 +210,7 @@ xfs_dir2_block_getdents( * Extract the byte offset we start at from the seek pointer. * We'll skip entries before this. */ - wantoff = xfs_dir2_dataptr_to_off(mp, ctx->pos); + wantoff = xfs_dir2_dataptr_to_off(geo, ctx->pos); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); /* @@ -244,7 +248,7 @@ xfs_dir2_block_getdents( if ((char *)dep - (char *)hdr < wantoff) continue; - cook = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, + cook = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk, (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; @@ -264,7 +268,7 @@ xfs_dir2_block_getdents( * Reached the end of the block. * Set the offset to a non-existent block 1 and return. */ - ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & + ctx->pos = xfs_dir2_db_off_to_dataptr(geo, mp->m_dirdatablk + 1, 0) & 0x7fffffff; xfs_trans_brelse(NULL, bp); return 0; @@ -300,6 +304,7 @@ xfs_dir2_leaf_readbuf( int length; int i; int j; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * If we have a buffer, we need to release it and @@ -342,14 +347,14 @@ xfs_dir2_leaf_readbuf( * run out of data blocks, get some more mappings. */ if (1 + mip->ra_want > mip->map_blocks && - mip->map_off < xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET)) { + mip->map_off < xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET)) { /* * Get more bmaps, fill in after the ones * we already have in the table. */ mip->nmap = mip->map_size - mip->map_valid; error = xfs_bmapi_read(dp, mip->map_off, - xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET) - + xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET) - mip->map_off, &map[mip->map_valid], &mip->nmap, 0); @@ -370,7 +375,7 @@ xfs_dir2_leaf_readbuf( i = mip->map_valid + mip->nmap - 1; mip->map_off = map[i].br_startoff + map[i].br_blockcount; } else - mip->map_off = xfs_dir2_byte_to_da(mp, + mip->map_off = xfs_dir2_byte_to_da(geo, XFS_DIR2_LEAF_OFFSET); /* @@ -396,14 +401,14 @@ xfs_dir2_leaf_readbuf( * No valid mappings, so no more data blocks. */ if (!mip->map_valid) { - *curoff = xfs_dir2_da_to_byte(mp->m_dir_geo, mip->map_off); + *curoff = xfs_dir2_da_to_byte(geo, mip->map_off); goto out; } /* * Read the directory block starting at the first mapping. */ - mip->curdb = xfs_dir2_da_to_db(mp->m_dir_geo, map->br_startoff); + mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, map->br_blockcount >= mp->m_dirblkfsbs ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); @@ -504,6 +509,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_off_t newoff; /* new curoff after new blk */ char *ptr = NULL; /* pointer to current data */ struct xfs_dir2_leaf_map_info *map_info; + struct xfs_da_geometry *geo; /* * If the offset is at or past the largest allowed value, @@ -513,6 +519,7 @@ xfs_dir2_leaf_getdents( return 0; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * Set up to bmap a number of blocks based on the caller's @@ -536,8 +543,8 @@ xfs_dir2_leaf_getdents( * Force this conversion through db so we truncate the offset * down to get the start of the data block. */ - map_info->map_off = xfs_dir2_db_to_da(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff)); + map_info->map_off = xfs_dir2_db_to_da(geo, + xfs_dir2_byte_to_db(geo, curoff)); /* * Loop over directory entries until we reach the end offset. @@ -571,7 +578,7 @@ xfs_dir2_leaf_getdents( * Make sure we're in the right block. */ else if (curoff > newoff) - ASSERT(xfs_dir2_byte_to_db(mp, curoff) == + ASSERT(xfs_dir2_byte_to_db(geo, curoff) == map_info->curdb); hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); @@ -608,8 +615,8 @@ xfs_dir2_leaf_getdents( * Now set our real offset. */ curoff = - xfs_dir2_db_off_to_byte(mp->m_dir_geo, - xfs_dir2_byte_to_db(mp, curoff), + xfs_dir2_db_off_to_byte(geo, + xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); if (ptr >= (char *)hdr + mp->m_dirblksize) { continue; diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 7aab8ec..4dc4193 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -104,8 +104,8 @@ xfs_dir2_block_sfsize( /* * Calculate the pointer to the entry at hand. */ - dep = (xfs_dir2_data_entry_t *) - ((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); + dep = (xfs_dir2_data_entry_t *)((char *)hdr + + xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. -- 1.9.0 From dave@fromorbit.com Wed May 28 01:05:00 2014 Return-Path: <dave@fromorbit.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 6536F7F7D for <xfs@oss.sgi.com>; Wed, 28 May 2014 01: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 4B7CA8F8092 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:05:00 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id cSRJyaO02ydHKogD for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:57 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ok-3q for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003le-30 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry Date: Wed, 28 May 2014 16:04:35 +1000 X-ASG-Orig-Subj: [PATCH 08/16] xfs: convert m_dirblkfsbs to xfs_da_geometry Message-Id: <1401257083-13433-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257097 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.13 X-Barracuda-Spam-Status: No, SCORE=0.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJECT_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.13 SUBJECT_NOVOWEL Subject: has long non-vowel letter sequence From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_bmap.c | 3 ++- fs/xfs/xfs_da_btree.c | 24 ++++++++---------------- fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2_leaf.c | 4 ++-- fs/xfs/xfs_dir2_readdir.c | 16 ++++++++-------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_symlink.c | 1 + fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_trans_space.h | 5 +++-- 9 files changed, 27 insertions(+), 33 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..96175df 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1098,10 +1098,11 @@ xfs_bmap_add_attrfork_local( if (S_ISDIR(ip->i_d.di_mode)) { memset(&dargs, 0, sizeof(dargs)); + dargs.geo = ip->i_mount->m_dir_geo; dargs.dp = ip; dargs.firstblock = firstblock; dargs.flist = flist; - dargs.total = ip->i_mount->m_dirblkfsbs; + dargs.total = dargs.geo->fsbcount; dargs.whichfork = XFS_DATA_FORK; dargs.trans = tp; return xfs_dir2_sf_to_block(&dargs); diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 8621202..4d0a1e8 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2090,20 +2090,12 @@ xfs_da_grow_inode( xfs_dablk_t *new_blkno) { xfs_fileoff_t bno; - int count; int error; trace_xfs_da_grow_inode(args); - if (args->whichfork == XFS_DATA_FORK) { - bno = args->geo->leafblk; - count = args->dp->i_mount->m_dirblkfsbs; - } else { - bno = 0; - count = 1; - } - - error = xfs_da_grow_inode_int(args, &bno, count); + bno = args->geo->leafblk; + error = xfs_da_grow_inode_int(args, &bno, args->geo->fsbcount); if (!error) *new_blkno = (xfs_dablk_t)bno; return error; @@ -2170,7 +2162,7 @@ xfs_da3_swap_lastblock( /* * Read the last block in the btree space. */ - last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; + last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount; error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); if (error) return error; @@ -2357,10 +2349,7 @@ xfs_da_shrink_inode( w = args->whichfork; tp = args->trans; mp = dp->i_mount; - if (w == XFS_DATA_FORK) - count = mp->m_dirblkfsbs; - else - count = 1; + count = args->geo->fsbcount; for (;;) { /* * Remove extents. If we get ENOSPC for a dir we have to move @@ -2479,7 +2468,10 @@ xfs_dabuf_map( ASSERT(map && *map); ASSERT(*nmaps == 1); - nfsb = (whichfork == XFS_DATA_FORK) ? mp->m_dirblkfsbs : 1; + if (whichfork == XFS_DATA_FORK) + nfsb = mp->m_dir_geo->fsbcount; + else + nfsb = mp->m_attr_geo->fsbcount; /* * Caller doesn't have a mapping. -2 means don't complain diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index cecb3e8..d167beb 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -146,7 +146,6 @@ xfs_da_mount( /* XXX: these are to be removed as code is converted to use geo */ mp->m_dirblksize = mp->m_dir_geo->blksize; - mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -628,7 +627,7 @@ xfs_dir2_grow_inode( * Set lowest possible block in the space requested. */ bno = XFS_B_TO_FSBT(mp, space * XFS_DIR2_SPACE_SIZE); - count = mp->m_dirblkfsbs; + count = args->geo->fsbcount; error = xfs_da_grow_inode_int(args, &bno, count); if (error) @@ -719,7 +718,7 @@ xfs_dir2_shrink_inode( /* * Unmap the fsblock(s). */ - if ((error = xfs_bunmapi(tp, dp, da, mp->m_dirblkfsbs, + if ((error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, XFS_BMAPI_METADATA, 0, args->firstblock, args->flist, &done))) { /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 3eb8b24..a1f1310 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1715,7 +1715,7 @@ xfs_dir2_node_to_leaf( if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { return error; } - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; /* * If there are freespace blocks other than the first one, * take this opportunity to remove trailing empty freespace blocks @@ -1727,7 +1727,7 @@ xfs_dir2_node_to_leaf( return error; } if (rval) - fo -= mp->m_dirblkfsbs; + fo -= args->geo->fsbcount; else return 0; } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 0c8c09c..8cb5340 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -314,12 +314,12 @@ xfs_dir2_leaf_readbuf( if (bp) { xfs_trans_brelse(NULL, bp); bp = NULL; - mip->map_blocks -= mp->m_dirblkfsbs; + mip->map_blocks -= geo->fsbcount; /* * Loop to get rid of the extents for the * directory block. */ - for (i = mp->m_dirblkfsbs; i > 0; ) { + for (i = geo->fsbcount; i > 0; ) { j = min_t(int, map->br_blockcount, i); map->br_blockcount -= j; map->br_startblock += j; @@ -410,7 +410,7 @@ xfs_dir2_leaf_readbuf( */ mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); error = xfs_dir3_data_read(NULL, dp, map->br_startoff, - map->br_blockcount >= mp->m_dirblkfsbs ? + map->br_blockcount >= geo->fsbcount ? XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); /* @@ -424,7 +424,7 @@ xfs_dir2_leaf_readbuf( * was previously ra. */ if (mip->ra_current) - mip->ra_current -= mp->m_dirblkfsbs; + mip->ra_current -= geo->fsbcount; /* * Do we need more readahead? @@ -432,13 +432,13 @@ xfs_dir2_leaf_readbuf( blk_start_plug(&plug); for (mip->ra_index = mip->ra_offset = i = 0; mip->ra_want > mip->ra_current && i < mip->map_blocks; - i += mp->m_dirblkfsbs) { + i += geo->fsbcount) { ASSERT(mip->ra_index < mip->map_valid); /* * Read-ahead a contiguous directory block. */ if (i > mip->ra_current && - map[mip->ra_index].br_blockcount >= mp->m_dirblkfsbs) { + map[mip->ra_index].br_blockcount >= geo->fsbcount) { xfs_dir3_data_readahead(dp, map[mip->ra_index].br_startoff + mip->ra_offset, XFS_FSB_TO_DADDR(mp, @@ -461,12 +461,12 @@ xfs_dir2_leaf_readbuf( /* * Advance offset through the mapping table. */ - for (j = 0; j < mp->m_dirblkfsbs; j += length ) { + for (j = 0; j < geo->fsbcount; j += length ) { /* * The rest of this extent but not more than a dir * block. */ - length = min_t(int, mp->m_dirblkfsbs, + length = min_t(int, geo->fsbcount, map[mip->ra_index].br_blockcount - mip->ra_offset); mip->ra_offset += length; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 0a32de0..a23e7b6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -155,7 +155,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 0816b40..d69363c 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -27,6 +27,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_dir2.h" #include "xfs_inode.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 52b6c3e..63a42a1 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -26,6 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index df4c1f8..bf9c457 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -28,7 +28,8 @@ (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ XFS_EXTENTADD_SPACE_RES(mp,w)) -#define XFS_DAENTER_1B(mp,w) ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1) +#define XFS_DAENTER_1B(mp,w) \ + ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) #define XFS_DAENTER_DBS(mp,w) \ (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) #define XFS_DAENTER_BLOCKS(mp,w) \ @@ -55,7 +56,7 @@ * Space reservation values for various transactions. */ #define XFS_ADDAFORK_SPACE_RES(mp) \ - ((mp)->m_dirblkfsbs + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) + ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) #define XFS_ATTRRM_SPACE_RES(mp) \ XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) /* This macro is not used - see inline code in xfs_attr_set */ -- 1.9.0 From dave@fromorbit.com Wed May 28 01:05:00 2014 Return-Path: <dave@fromorbit.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=T_FILL_THIS_FORM_SHORT 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 C60327F6B for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:04:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3697CAC005 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:59 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6WGXzhlz6ylzyzUW for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:54 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AltPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBRoBDC8zCBgxOQMHFBmIQdVvhVWNRASlC4taKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ol-4T for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003lj-3S for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry Date: Wed, 28 May 2014 16:04:36 +1000 X-ASG-Orig-Subj: [PATCH 09/16] xfs: convert m_dirblksize to xfs_da_geometry Message-Id: <1401257083-13433-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257094 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_da_btree.c | 4 ++-- fs/xfs/xfs_da_format.c | 36 ++++++++++++++++++------------------ fs/xfs/xfs_dir2.c | 5 ++--- fs/xfs/xfs_dir2.h | 10 ++++++---- fs/xfs/xfs_dir2_block.c | 32 ++++++++++++++++---------------- fs/xfs/xfs_dir2_data.c | 17 ++++++++++------- fs/xfs/xfs_dir2_leaf.c | 35 ++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 42 ++++++++++++++++++++++-------------------- fs/xfs/xfs_dir2_priv.h | 8 ++++---- fs/xfs/xfs_dir2_readdir.c | 11 +++++------ fs/xfs/xfs_dir2_sf.c | 14 ++++++++------ fs/xfs/xfs_fsops.c | 4 +++- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_trans_resv.c | 2 +- 14 files changed, 115 insertions(+), 106 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4d0a1e8..b9b007d 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -2169,8 +2169,8 @@ xfs_da3_swap_lastblock( /* * Copy the last block into the dead buffer and log it. */ - memcpy(dead_buf->b_addr, last_buf->b_addr, mp->m_dirblksize); - xfs_trans_log_buf(tp, dead_buf, 0, mp->m_dirblksize - 1); + memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); + xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); dead_info = dead_buf->b_addr; /* * Get values from the moved block. diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index ac8474e..c9aee52 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -427,9 +427,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * Directory Leaf block operations */ static int -xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +xfs_dir2_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -440,9 +440,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) } static int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp) +xfs_dir3_max_leaf_ents(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_leaf_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -593,9 +593,9 @@ xfs_da3_node_hdr_to_disk( * Directory free space block operations */ static int -xfs_dir2_free_max_bests(struct xfs_mount *mp) +xfs_dir2_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir2_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -609,25 +609,25 @@ xfs_dir2_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir2_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir2_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir2_free_max_bests(mp); + return db % xfs_dir2_free_max_bests(geo); } static int -xfs_dir3_free_max_bests(struct xfs_mount *mp) +xfs_dir3_free_max_bests(struct xfs_da_geometry *geo) { - return (mp->m_dirblksize - sizeof(struct xfs_dir3_free_hdr)) / + return (geo->blksize - sizeof(struct xfs_dir3_free_hdr)) / sizeof(xfs_dir2_data_off_t); } @@ -641,19 +641,19 @@ xfs_dir3_free_bests_p(struct xfs_dir2_free *free) * Convert data space db to the corresponding free db. */ static xfs_dir2_db_t -xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET) + - (db / xfs_dir3_free_max_bests(mp)); + return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) + + (db / xfs_dir3_free_max_bests(geo)); } /* * Convert data space db to the corresponding index in a free db. */ static int -xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +xfs_dir3_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db) { - return db % xfs_dir3_free_max_bests(mp); + return db % xfs_dir3_free_max_bests(geo); } static void diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index d167beb..99df2a2 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -145,7 +145,6 @@ xfs_da_mount( mp->m_dirnameops = &xfs_default_nameops; /* XXX: these are to be removed as code is converted to use geo */ - mp->m_dirblksize = mp->m_dir_geo->blksize; mp->m_dir_node_ents = mp->m_dir_geo->node_ents; mp->m_dir_magicpct = mp->m_dir_geo->magicpct; mp->m_attr_node_ents = mp->m_attr_geo->node_ents; @@ -665,8 +664,8 @@ xfs_dir2_isblock( mp = dp->i_mount; if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; - rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); + rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; + ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); *vp = rval; return 0; } diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 7a85b9c..9b709ae 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -80,7 +80,7 @@ struct xfs_dir_ops { struct xfs_dir3_icleaf_hdr *from); void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, struct xfs_dir2_leaf *from); - int (*leaf_max_ents)(struct xfs_mount *mp); + int (*leaf_max_ents)(struct xfs_da_geometry *geo); struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); @@ -97,10 +97,12 @@ struct xfs_dir_ops { struct xfs_dir3_icfree_hdr *from); void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, struct xfs_dir2_free *from); - int (*free_max_bests)(struct xfs_mount *mp); + int (*free_max_bests)(struct xfs_da_geometry *geo); __be16 * (*free_bests_p)(struct xfs_dir2_free *free); - xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db); - int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db); + xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); + int (*db_to_fdindex)(struct xfs_da_geometry *geo, + xfs_dir2_db_t db); }; extern const struct xfs_dir_ops * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index d950cde..4204df9 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -377,7 +377,7 @@ xfs_dir2_block_addname( * Set up pointers to parts of the block. */ hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -581,7 +581,7 @@ xfs_dir2_block_log_leaf( xfs_dir2_leaf_entry_t *blp; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); blp = xfs_dir2_block_leaf_p(btp); xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); @@ -598,7 +598,7 @@ xfs_dir2_block_log_tail( xfs_dir2_data_hdr_t *hdr = bp->b_addr; xfs_dir2_block_tail_t *btp; - btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); + btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), (uint)((char *)(btp + 1) - (char *)hdr - 1)); } @@ -633,7 +633,7 @@ xfs_dir2_block_lookup( mp = dp->i_mount; hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Get the offset from the leaf entry, to point to the data. @@ -686,7 +686,7 @@ xfs_dir2_block_lookup_int( hdr = bp->b_addr; xfs_dir3_data_check(dp, bp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Loop doing a binary search for our hash value. @@ -791,7 +791,7 @@ xfs_dir2_block_removename( tp = args->trans; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry using the leaf entry. @@ -867,7 +867,7 @@ xfs_dir2_block_replace( dp = args->dp; mp = dp->i_mount; hdr = bp->b_addr; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* * Point to the data entry we need to change. @@ -941,7 +941,7 @@ xfs_dir2_leaf_to_block( leaf = lbp->b_addr; dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); @@ -951,13 +951,13 @@ xfs_dir2_leaf_to_block( * been left behind during no-space-reservation operations. * These will show up in the leaf bests table. */ - while (dp->i_d.di_size > mp->m_dirblksize) { + while (dp->i_d.di_size > args->geo->blksize) { int hdrsz; hdrsz = dp->d_ops->data_entry_offset; bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == - mp->m_dirblksize - hdrsz) { + args->geo->blksize - hdrsz) { if ((error = xfs_dir2_leaf_trim_data(args, lbp, (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -985,7 +985,7 @@ xfs_dir2_leaf_to_block( /* * Look at the last data entry. */ - tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; + tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1; dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); /* * If it's not free or is too short we can't do it. @@ -1004,12 +1004,12 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, mp->m_dirblksize - size, size, + xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); btp->stale = 0; xfs_dir2_block_log_tail(tp, dbp); @@ -1143,13 +1143,13 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, - &needscan); + xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + i, &needlog, &needscan); ASSERT(needscan == 0); /* * Fill in the tail. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ btp->stale = 0; blp = xfs_dir2_block_leaf_p(btp); diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 6c23f86..b73d61a 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -80,7 +80,7 @@ __xfs_dir3_data_check( switch (hdr->magic) { case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; @@ -96,7 +96,7 @@ __xfs_dir3_data_check( break; case cpu_to_be32(XFS_DIR3_DATA_MAGIC): case cpu_to_be32(XFS_DIR2_DATA_MAGIC): - endp = (char *)hdr + mp->m_dirblksize; + endp = (char *)hdr + geo->blksize; break; default: XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); @@ -511,6 +511,7 @@ xfs_dir2_data_freescan( struct xfs_dir2_data_free *bf; char *endp; /* end of block's data */ char *p; /* current entry pointer */ + struct xfs_da_geometry *geo = dp->i_mount->m_dir_geo; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -529,10 +530,10 @@ xfs_dir2_data_freescan( p = (char *)dp->d_ops->data_entry_p(hdr); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else - endp = (char *)hdr + dp->i_mount->m_dirblksize; + endp = (char *)hdr + geo->blksize; /* * Loop over the block's entries. */ @@ -622,7 +623,7 @@ xfs_dir3_data_init( dup = dp->d_ops->data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset; + t = args->geo->blksize - (uint)dp->d_ops->data_entry_offset; bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); @@ -732,22 +733,24 @@ xfs_dir2_data_make_free( xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; + struct xfs_da_geometry *geo; mp = tp->t_mountp; hdr = bp->b_addr; + geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + mp->m_dirblksize; + endptr = (char *)hdr + geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index a1f1310..e517bd0 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -92,6 +92,7 @@ xfs_dir3_leaf_check_int( int i; const struct xfs_dir_ops *ops; struct xfs_dir3_icleaf_hdr leafhdr; + struct xfs_da_geometry *geo = mp->m_dir_geo; /* * we can be passed a null dp here from a verifier, so we need to go the @@ -105,14 +106,14 @@ xfs_dir3_leaf_check_int( } ents = ops->leaf_ents_p(leaf); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(geo, leaf); /* * XXX (dgc): This value is not restrictive enough. * Should factor in the size of the bests table as well. * We can deduce a value for that from di_size. */ - if (hdr->count > ops->leaf_max_ents(mp)) + if (hdr->count > ops->leaf_max_ents(geo)) return false; /* Leaves and bests don't overlap in leaf format. */ @@ -323,7 +324,7 @@ xfs_dir3_leaf_init( if (type == XFS_DIR2_LEAF1_MAGIC) { struct xfs_dir2_leaf_tail *ltp; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); ltp->bestcount = 0; bp->b_ops = &xfs_dir3_leaf1_buf_ops; xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAF1_BUF); @@ -415,7 +416,7 @@ xfs_dir2_block_to_leaf( leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = dp->d_ops->data_bestfree_p(hdr); ents = dp->d_ops->leaf_ents_p(leaf); @@ -443,7 +444,7 @@ xfs_dir2_block_to_leaf( */ xfs_dir2_data_make_free(tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), - (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - + (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), &needlog, &needscan); /* @@ -461,7 +462,7 @@ xfs_dir2_block_to_leaf( /* * Set up leaf tail and bests table. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(1); bestsp = xfs_dir2_leaf_bests_p(ltp); bestsp[0] = bf[0].length; @@ -653,7 +654,7 @@ xfs_dir2_leaf_addname( */ index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ents = dp->d_ops->leaf_ents_p(leaf); dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); @@ -1066,7 +1067,7 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp, leaf); + ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), @@ -1138,9 +1139,9 @@ xfs_dir3_leaf_log_tail( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dirblksize - 1)); + (uint)(mp->m_dir_geo->blksize - 1)); } /* @@ -1388,7 +1389,7 @@ xfs_dir2_leaf_removename( xfs_dir2_dataptr_to_off(args->geo, be32_to_cpu(lep->address))); needscan = needlog = 0; oldbest = be16_to_cpu(bf[0].length); - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); ASSERT(be16_to_cpu(bestsp[db]) == oldbest); /* @@ -1428,7 +1429,7 @@ xfs_dir2_leaf_removename( * If the data block is now empty then get rid of the data block. */ if (be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset) { + args->geo->blksize - dp->d_ops->data_entry_offset) { ASSERT(db != args->geo->datablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1618,7 +1619,7 @@ xfs_dir2_leaf_trim_data( return error; leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); #ifdef DEBUG { @@ -1628,7 +1629,7 @@ xfs_dir2_leaf_trim_data( ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); ASSERT(be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset); + args->geo->blksize - dp->d_ops->data_entry_offset); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif @@ -1740,7 +1741,7 @@ xfs_dir2_node_to_leaf( /* * If it's not the single leaf block, give up. */ - if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + mp->m_dirblksize) + if (XFS_FSB_TO_B(mp, fo) > XFS_DIR2_LEAF_OFFSET + args->geo->blksize) return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; @@ -1764,7 +1765,7 @@ xfs_dir2_node_to_leaf( * Now see if the leafn and free data will fit in a leaf1. * If not, release the buffer and give up. */ - if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > mp->m_dirblksize) { + if (xfs_dir3_leaf_size(&leafhdr, freehdr.nvalid) > args->geo->blksize) { xfs_trans_brelse(tp, fbp); return 0; } @@ -1784,7 +1785,7 @@ xfs_dir2_node_to_leaf( /* * Set up the leaf tail from the freespace block. */ - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ltp->bestcount = cpu_to_be32(freehdr.nvalid); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 89777bf..ef34c19 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -327,9 +327,9 @@ xfs_dir2_leaf_to_node( free = fbp->b_addr; dp->d_ops->free_hdr_from_disk(&freehdr, free); leaf = lbp->b_addr; - ltp = xfs_dir2_leaf_tail_p(mp, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); ASSERT(be32_to_cpu(ltp->bestcount) <= - (uint)dp->i_d.di_size / mp->m_dirblksize); + (uint)dp->i_d.di_size / args->geo->blksize); /* * Copy freespace entries from the leaf block to the new block. @@ -416,7 +416,7 @@ xfs_dir2_leafn_add( * a compact. */ - if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { + if (leafhdr.count == dp->d_ops->leaf_max_ents(args->geo)) { if (!leafhdr.stale) return XFS_ERROR(ENOSPC); compact = leafhdr.stale > 1; @@ -472,7 +472,8 @@ xfs_dir2_free_hdr_check( dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); - ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0); + ASSERT((hdr.firstdb % + dp->d_ops->free_max_bests(dp->i_mount->m_dir_geo)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } @@ -595,7 +596,7 @@ xfs_dir2_leafn_lookup_for_addname( * Convert the data block to the free block * holding its freespace information. */ - newfdb = dp->d_ops->db_to_fdb(mp, newdb); + newfdb = dp->d_ops->db_to_fdb(args->geo, newdb); /* * If it's not the one we have in hand, read it in. */ @@ -619,7 +620,7 @@ xfs_dir2_leafn_lookup_for_addname( /* * Get the index for our entry. */ - fi = dp->d_ops->db_to_fdindex(mp, curdb); + fi = dp->d_ops->db_to_fdindex(args->geo, curdb); /* * If it has room, return it. */ @@ -1251,7 +1252,7 @@ xfs_dir2_leafn_remove( * Convert the data block number to a free block, * read in the free block. */ - fdb = dp->d_ops->db_to_fdb(mp, db); + fdb = dp->d_ops->db_to_fdb(args->geo, db); error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(args->geo, fdb), &fbp); @@ -1262,7 +1263,7 @@ xfs_dir2_leafn_remove( { struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); - ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * + ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(args->geo) * (fdb - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET))); } @@ -1270,13 +1271,13 @@ xfs_dir2_leafn_remove( /* * Calculate which entry we need to fix. */ - findex = dp->d_ops->db_to_fdindex(mp, db); + findex = dp->d_ops->db_to_fdindex(args->geo, db); longest = be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it * (usually). */ - if (longest == mp->m_dirblksize - + if (longest == args->geo->blksize - dp->d_ops->data_entry_offset) { /* * Try to punch out the data block. @@ -1595,7 +1596,7 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = state->args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Look up the name. We're not supposed to find it, but @@ -1843,7 +1844,7 @@ xfs_dir2_node_addname_int( * Get the freespace block corresponding to the data block * that was just allocated. */ - fbno = dp->d_ops->db_to_fdb(mp, dbno); + fbno = dp->d_ops->db_to_fdb(args->geo, dbno); error = xfs_dir2_free_try_read(tp, dp, xfs_dir2_db_to_da(args->geo, fbno), &fbp); @@ -1860,12 +1861,13 @@ xfs_dir2_node_addname_int( if (error) return error; - if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) { + if (dp->d_ops->db_to_fdb(args->geo, dbno) != fbno) { xfs_alert(mp, "%s: dir ino %llu needed freesp block %lld for\n" " data block %lld, got %lld ifbno %llu lastfbno %d", __func__, (unsigned long long)dp->i_ino, - (long long)dp->d_ops->db_to_fdb(mp, dbno), + (long long)dp->d_ops->db_to_fdb( + args->geo, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { @@ -1899,7 +1901,7 @@ xfs_dir2_node_addname_int( freehdr.firstdb = (fbno - xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET)) * - dp->d_ops->free_max_bests(mp); + dp->d_ops->free_max_bests(args->geo); } else { free = fbp->b_addr; bests = dp->d_ops->free_bests_p(free); @@ -1909,13 +1911,13 @@ xfs_dir2_node_addname_int( /* * Set the freespace block index from the data block number. */ - findex = dp->d_ops->db_to_fdindex(mp, dbno); + findex = dp->d_ops->db_to_fdindex(args->geo, dbno); /* * If it's after the end of the current entries in the * freespace block, extend that table. */ if (findex >= freehdr.nvalid) { - ASSERT(findex < dp->d_ops->free_max_bests(mp)); + ASSERT(findex < dp->d_ops->free_max_bests(args->geo)); freehdr.nvalid = findex + 1; /* * Tag new entry so nused will go up. @@ -2040,7 +2042,7 @@ xfs_dir2_node_lookup( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* * Fill in the path to the entry in the cursor. @@ -2095,7 +2097,7 @@ xfs_dir2_node_removename( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; /* Look up the entry we're deleting, set up the cursor. */ @@ -2165,7 +2167,7 @@ xfs_dir2_node_replace( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = state->mp->m_dirblksize; + state->blocksize = args->geo->blksize; state->node_ents = state->mp->m_dir_node_ents; inum = args->inumber; /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 071b685..436135f 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -140,17 +140,17 @@ xfs_dir2_da_to_byte(struct xfs_da_geometry *geo, xfs_dablk_t da) * Directory tail pointer accessor functions. Based on block geometry. */ static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +xfs_dir2_block_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_data_hdr *hdr) { return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; + ((char *)hdr + geo->blksize)) - 1; } static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp) { return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - + ((char *)lp + geo->blksize - sizeof(struct xfs_dir2_leaf_tail)); } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8cb5340..fa393d5 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -216,7 +216,7 @@ xfs_dir2_block_getdents( /* * Set up values for the loop. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); @@ -338,7 +338,7 @@ xfs_dir2_leaf_readbuf( /* * Recalculate the readahead blocks wanted. */ - mip->ra_want = howmany(bufsize + mp->m_dirblksize, + mip->ra_want = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize) - 1; ASSERT(mip->ra_want >= 0); @@ -526,8 +526,7 @@ xfs_dir2_leaf_getdents( * buffer size, the directory block size, and the filesystem * block size. */ - length = howmany(bufsize + mp->m_dirblksize, - mp->m_sb.sb_blocksize); + length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + (length * sizeof(struct xfs_bmbt_irec)), KM_SLEEP | KM_NOFS); @@ -557,7 +556,7 @@ xfs_dir2_leaf_getdents( * If we have no buffer, or we're off the end of the * current buffer, need to get another one. */ - if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { + if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, &curoff, &bp); @@ -618,7 +617,7 @@ xfs_dir2_leaf_getdents( xfs_dir2_db_off_to_byte(geo, xfs_dir2_byte_to_db(geo, curoff), (char *)ptr - (char *)hdr); - if (ptr >= (char *)hdr + mp->m_dirblksize) { + if (ptr >= (char *)hdr + geo->blksize) { continue; } } diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 10f4c2a..53c3be6 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -82,8 +82,10 @@ xfs_dir2_block_sfsize( xfs_ino_t parent = 0; /* parent inode number */ int size=0; /* total computed size */ int has_ftype; + struct xfs_da_geometry *geo; mp = dp->i_mount; + geo = mp->m_dir_geo; /* * if there is a filetype field, add the extra byte to the namelen @@ -92,7 +94,7 @@ xfs_dir2_block_sfsize( has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; count = i8count = namelen = 0; - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(geo, hdr); blp = xfs_dir2_block_leaf_p(btp); /* @@ -105,7 +107,7 @@ xfs_dir2_block_sfsize( * Calculate the pointer to the entry at hand. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + - xfs_dir2_dataptr_to_off(mp->m_dir_geo, addr)); + xfs_dir2_dataptr_to_off(geo, addr)); /* * Detect . and .., so we can special-case them. * . is not included in sf directories. @@ -195,7 +197,7 @@ xfs_dir2_block_to_sf( /* * Set up to loop over the block's entries. */ - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); @@ -586,7 +588,7 @@ xfs_dir2_sf_addname_pick( * we'll go back, convert to block, then try the insert and convert * to leaf. */ - if (used + (holefit ? 0 : size) > mp->m_dirblksize) + if (used + (holefit ? 0 : size) > args->geo->blksize) return 0; /* * If changing the inode number size, do it the hard way. @@ -601,7 +603,7 @@ xfs_dir2_sf_addname_pick( /* * If it won't fit at the end then do it the hard way (use the hole). */ - if (used + size > mp->m_dirblksize) + if (used + size > args->geo->blksize) return 2; /* * Do it the easy way. @@ -652,7 +654,7 @@ xfs_dir2_sf_check( ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= args->geo->blksize); } #endif /* DEBUG */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 97886a7..d229556 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -24,6 +24,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -105,7 +107,7 @@ xfs_fs_geometry( geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; - geo->dirblocksize = mp->m_dirblksize; + geo->dirblocksize = mp->m_dir_geo->blksize; } if (new_version >= 4) { geo->flags |= diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a23e7b6..4e3f6ce 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -154,7 +154,6 @@ typedef struct xfs_mount { const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ - int m_dirblksize; /* directory block sz--bytes */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 63a42a1..f2bda7c 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -610,7 +610,7 @@ xfs_calc_addafork_reservation( return XFS_DQUOT_LOGRES(mp) + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), -- 1.9.0 From dave@fromorbit.com Wed May 28 01:05:01 2014 Return-Path: <dave@fromorbit.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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 847497F82 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:05:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E8D1304043 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:05:00 -0700 (PDT) X-ASG-Debug-ID: 1401257088-04cbb02a0f1bef30004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id y3sqdK9jBfAilU9V for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:55 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005oc-0b for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyj-0003l9-Vo for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:45 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 02/16] xfs: move directory block translatiosn to xfs_dir2_priv.h Date: Wed, 28 May 2014 16:04:29 +1000 X-ASG-Orig-Subj: [PATCH 02/16] xfs: move directory block translatiosn to xfs_dir2_priv.h Message-Id: <1401257083-13433-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257094 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Because they aren't actually part of the on-disk format, and so shouldn't be in xfs_da_format.h. Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_da_format.c | 2 + fs/xfs/xfs_da_format.h | 138 ------------------------------------------------- fs/xfs/xfs_dir2_priv.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 138 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index e6c83e1..f4a783b 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -26,8 +26,10 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_inode.h" #include "xfs_dir2.h" +#include "xfs_dir2_priv.h" /* * Shortform directory ops diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 1432b57..32b415c 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -514,17 +514,6 @@ struct xfs_dir3_leaf { #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) /* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* * Get address of the bests array in the single-leaf block. */ static inline __be16 * @@ -534,123 +523,6 @@ xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) } /* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* * Free space block defintions for the node format. */ @@ -736,16 +608,6 @@ typedef struct xfs_dir2_block_tail { } xfs_dir2_block_tail_t; /* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* * Pointer to the leaf entries embedded in a data block (1-block format) */ static inline struct xfs_dir2_leaf_entry * diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 2429960..492edb6 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -20,6 +20,143 @@ struct dir_context; +/* + * Directory offset/block conversion functions. + * + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Directory tail pointer accessor functions. Based on block geometry. + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + /* xfs_dir2.c */ extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, -- 1.9.0 From dave@fromorbit.com Wed May 28 01:05:02 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7C7227F7D for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:05:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1C47AC003 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:05:01 -0700 (PDT) X-ASG-Debug-ID: 1401257087-04cb6c22b81c5970006-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iYHBZgLf1TpzSZNE for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:56 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPADN7hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkXFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVb4VVjUQElXOPGItaKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005oy-7w for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003mI-77 for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry Date: Wed, 28 May 2014 16:04:43 +1000 X-ASG-Orig-Subj: [PATCH 16/16] xfs: repalce attr LBSIZE with xfs_da_geometry Message-Id: <1401257083-13433-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257096 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> --- fs/xfs/xfs_attr.c | 2 +- fs/xfs/xfs_attr_leaf.c | 114 ++++++++++++++++++++++++----------------------- fs/xfs/xfs_attr_remote.c | 55 ++++++++++++----------- fs/xfs/xfs_da_format.h | 10 ----- 4 files changed, 89 insertions(+), 92 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 3d8c03e..470a22d 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -863,7 +863,7 @@ xfs_attr_leaf_get(xfs_da_args_t *args) } /*======================================================================== - * External routines when attribute list size > XFS_LBSIZE(mp). + * External routines when attribute list size > geo->blksize *========================================================================*/ /* diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 7761103..ae33b14 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -80,11 +80,12 @@ STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, /* * Utility routines. */ -STATIC void xfs_attr3_leaf_moveents(struct xfs_attr_leafblock *src_leaf, +STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args, + struct xfs_attr_leafblock *src_leaf, struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, struct xfs_attr_leafblock *dst_leaf, struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, - int move_count, struct xfs_mount *mp); + int move_count); STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); void @@ -806,18 +807,18 @@ xfs_attr3_leaf_to_shortform( trace_xfs_attr_leaf_to_sf(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(dp->i_mount), KM_SLEEP); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); if (!tmpbuffer) return ENOMEM; - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(dp->i_mount)); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); leaf = (xfs_attr_leafblock_t *)tmpbuffer; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entry = xfs_attr3_leaf_entryp(leaf); /* XXX (dgc): buffer is about to be marked stale - why zero it? */ - memset(bp->b_addr, 0, XFS_LBSIZE(dp->i_mount)); + memset(bp->b_addr, 0, args->geo->blksize); /* * Clean out the prior contents of the attribute list. @@ -906,12 +907,12 @@ xfs_attr3_leaf_to_node( /* copy leaf to new buffer, update identifiers */ xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp)); + memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; hdr3->blkno = cpu_to_be64(bp2->b_bn); } - xfs_trans_log_buf(args->trans, bp2, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); /* * Set up the new root node. @@ -932,7 +933,7 @@ xfs_attr3_leaf_to_node( btree[0].before = cpu_to_be32(blkno); icnodehdr.count = 1; dp->d_ops->node_hdr_to_disk(node, &icnodehdr); - xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1); error = 0; out: return error; @@ -968,10 +969,10 @@ xfs_attr3_leaf_create( bp->b_ops = &xfs_attr3_leaf_buf_ops; xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); leaf = bp->b_addr; - memset(leaf, 0, XFS_LBSIZE(mp)); + memset(leaf, 0, args->geo->blksize); memset(&ichdr, 0, sizeof(ichdr)); - ichdr.firstused = XFS_LBSIZE(mp); + ichdr.firstused = args->geo->blksize; if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp->b_addr; @@ -990,7 +991,7 @@ xfs_attr3_leaf_create( ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); - xfs_trans_log_buf(args->trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); *bpp = bp; return 0; @@ -1175,11 +1176,11 @@ xfs_attr3_leaf_add_work( * Allocate space for the new string (at the end of the run). */ mp = args->trans->t_mountp; - ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= xfs_attr_leaf_newentsize(args, NULL)); - ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); + ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); @@ -1267,14 +1268,13 @@ xfs_attr3_leaf_compact( struct xfs_attr_leafblock *leaf_dst; struct xfs_attr3_icleaf_hdr ichdr_src; struct xfs_trans *trans = args->trans; - struct xfs_mount *mp = trans->t_mountp; char *tmpbuffer; trace_xfs_attr_leaf_compact(args); - tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); - memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp)); - memset(bp->b_addr, 0, XFS_LBSIZE(mp)); + tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); + memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); + memset(bp->b_addr, 0, args->geo->blksize); leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; leaf_dst = bp->b_addr; @@ -1287,7 +1287,7 @@ xfs_attr3_leaf_compact( /* Initialise the incore headers */ ichdr_src = *ichdr_dst; /* struct copy */ - ichdr_dst->firstused = XFS_LBSIZE(mp); + ichdr_dst->firstused = args->geo->blksize; ichdr_dst->usedbytes = 0; ichdr_dst->count = 0; ichdr_dst->holes = 0; @@ -1302,13 +1302,13 @@ xfs_attr3_leaf_compact( * Copy all entry's in the same (sorted) order, * but allocate name/value pairs packed and in sequence. */ - xfs_attr3_leaf_moveents(leaf_src, &ichdr_src, 0, leaf_dst, ichdr_dst, 0, - ichdr_src.count, mp); + xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0, + leaf_dst, ichdr_dst, 0, ichdr_src.count); /* * this logs the entire buffer, but the caller must write the header * back to the buffer when it is finished modifying it. */ - xfs_trans_log_buf(trans, bp, 0, XFS_LBSIZE(mp) - 1); + xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1); kmem_free(tmpbuffer); } @@ -1459,8 +1459,8 @@ xfs_attr3_leaf_rebalance( /* * Move high entries from leaf1 to low end of leaf2. */ - xfs_attr3_leaf_moveents(leaf1, &ichdr1, ichdr1.count - count, - leaf2, &ichdr2, 0, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf1, &ichdr1, + ichdr1.count - count, leaf2, &ichdr2, 0, count); } else if (count > ichdr1.count) { /* @@ -1488,8 +1488,8 @@ xfs_attr3_leaf_rebalance( /* * Move low entries from leaf2 to high end of leaf1. */ - xfs_attr3_leaf_moveents(leaf2, &ichdr2, 0, leaf1, &ichdr1, - ichdr1.count, count, state->mp); + xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1, + ichdr1.count, count); } xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); @@ -1795,7 +1795,6 @@ xfs_attr3_leaf_remove( struct xfs_attr_leafblock *leaf; struct xfs_attr3_icleaf_hdr ichdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = args->trans->t_mountp; int before; int after; int smallest; @@ -1809,7 +1808,7 @@ xfs_attr3_leaf_remove( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count > 0 && ichdr.count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); ASSERT(args->index >= 0 && args->index < ichdr.count); ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + xfs_attr3_leaf_hdr_size(leaf)); @@ -1817,7 +1816,7 @@ xfs_attr3_leaf_remove( entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); /* * Scan through free region table: @@ -1832,8 +1831,8 @@ xfs_attr3_leaf_remove( smallest = XFS_ATTR_LEAF_MAPSIZE - 1; entsize = xfs_attr_leaf_entsize(leaf, args->index); for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { - ASSERT(ichdr.freemap[i].base < XFS_LBSIZE(mp)); - ASSERT(ichdr.freemap[i].size < XFS_LBSIZE(mp)); + ASSERT(ichdr.freemap[i].base < args->geo->blksize); + ASSERT(ichdr.freemap[i].size < args->geo->blksize); if (ichdr.freemap[i].base == tablesize) { ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); @@ -1910,11 +1909,11 @@ xfs_attr3_leaf_remove( * removing the name. */ if (smallest) { - tmp = XFS_LBSIZE(mp); + tmp = args->geo->blksize; entry = xfs_attr3_leaf_entryp(leaf); for (i = ichdr.count - 1; i >= 0; entry++, i--) { ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); - ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp)); + ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); if (be16_to_cpu(entry->nameidx) < tmp) tmp = be16_to_cpu(entry->nameidx); @@ -1954,7 +1953,6 @@ xfs_attr3_leaf_unbalance( struct xfs_attr3_icleaf_hdr drophdr; struct xfs_attr3_icleaf_hdr savehdr; struct xfs_attr_leaf_entry *entry; - struct xfs_mount *mp = state->mp; trace_xfs_attr_leaf_unbalance(state->args); @@ -1981,13 +1979,15 @@ xfs_attr3_leaf_unbalance( */ if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, 0, - drophdr.count, mp); + drophdr.count); } else { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, save_leaf, &savehdr, - savehdr.count, drophdr.count, mp); + savehdr.count, drophdr.count); } } else { /* @@ -2017,19 +2017,23 @@ xfs_attr3_leaf_unbalance( if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, 0, - drophdr.count, mp); - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + drophdr.count); + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - savehdr.count, mp); + savehdr.count); } else { - xfs_attr3_leaf_moveents(save_leaf, &savehdr, 0, + xfs_attr3_leaf_moveents(state->args, + save_leaf, &savehdr, 0, tmp_leaf, &tmphdr, 0, - savehdr.count, mp); - xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, + savehdr.count); + xfs_attr3_leaf_moveents(state->args, + drop_leaf, &drophdr, 0, tmp_leaf, &tmphdr, tmphdr.count, - drophdr.count, mp); + drophdr.count); } memcpy(save_leaf, tmp_leaf, state->blocksize); savehdr = tmphdr; /* struct copy */ @@ -2084,7 +2088,7 @@ xfs_attr3_leaf_lookup_int( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); /* * Binary search. (note: small blocks will skip this loop) @@ -2188,7 +2192,7 @@ xfs_attr3_leaf_getvalue( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); - ASSERT(ichdr.count < XFS_LBSIZE(args->dp->i_mount) / 8); + ASSERT(ichdr.count < args->geo->blksize / 8); ASSERT(args->index < ichdr.count); entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; @@ -2239,14 +2243,14 @@ xfs_attr3_leaf_getvalue( /*ARGSUSED*/ STATIC void xfs_attr3_leaf_moveents( + struct xfs_da_args *args, struct xfs_attr_leafblock *leaf_s, struct xfs_attr3_icleaf_hdr *ichdr_s, int start_s, struct xfs_attr_leafblock *leaf_d, struct xfs_attr3_icleaf_hdr *ichdr_d, int start_d, - int count, - struct xfs_mount *mp) + int count) { struct xfs_attr_leaf_entry *entry_s; struct xfs_attr_leaf_entry *entry_d; @@ -2266,10 +2270,10 @@ xfs_attr3_leaf_moveents( ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); ASSERT(ichdr_s->magic == ichdr_d->magic); - ASSERT(ichdr_s->count > 0 && ichdr_s->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8); ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) + xfs_attr3_leaf_hdr_size(leaf_s)); - ASSERT(ichdr_d->count < XFS_LBSIZE(mp) / 8); + ASSERT(ichdr_d->count < args->geo->blksize / 8); ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) + xfs_attr3_leaf_hdr_size(leaf_d)); @@ -2321,11 +2325,11 @@ xfs_attr3_leaf_moveents( entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); entry_d->flags = entry_s->flags; ASSERT(be16_to_cpu(entry_d->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memmove(xfs_attr3_leaf_name(leaf_d, desti), xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); ASSERT(be16_to_cpu(entry_s->nameidx) + tmp - <= XFS_LBSIZE(mp)); + <= args->geo->blksize); memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); ichdr_s->usedbytes -= tmp; ichdr_d->usedbytes += tmp; @@ -2346,7 +2350,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } else { /* @@ -2361,7 +2365,7 @@ xfs_attr3_leaf_moveents( tmp = count * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; ASSERT(((char *)entry_s + tmp) <= - ((char *)leaf_s + XFS_LBSIZE(mp))); + ((char *)leaf_s + args->geo->blksize)); memset(entry_s, 0, tmp); } diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 0f0679a..b5adfec 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -125,6 +125,7 @@ xfs_attr3_rmt_read_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -133,21 +134,20 @@ xfs_attr3_rmt_read_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), - XFS_ATTR3_RMT_CRC_OFF)) { + if (!xfs_verify_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF)) { xfs_buf_ioerror(bp, EFSBADCRC); break; } - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); break; } - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } if (bp->b_error) @@ -165,6 +165,7 @@ xfs_attr3_rmt_write_verify( char *ptr; int len; xfs_daddr_t bno; + int blksize = mp->m_attr_geo->blksize; /* no verification of non-crc buffers */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -173,10 +174,10 @@ xfs_attr3_rmt_write_verify( ptr = bp->b_addr; bno = bp->b_bn; len = BBTOB(bp->b_length); - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0) { - if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { + if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) { xfs_buf_ioerror(bp, EFSCORRUPTED); xfs_verifier_error(bp); return; @@ -187,11 +188,11 @@ xfs_attr3_rmt_write_verify( rmt = (struct xfs_attr3_rmt_hdr *)ptr; rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); } - xfs_update_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF); + xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF); - len -= XFS_LBSIZE(mp); - ptr += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + ptr += blksize; + bno += BTOBB(blksize); } ASSERT(len == 0); } @@ -240,12 +241,13 @@ xfs_attr_rmtval_copyout( char *src = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size = 0; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); @@ -263,9 +265,9 @@ xfs_attr_rmtval_copyout( memcpy(*dst, src + hdr_size, byte_cnt); /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - src += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + src += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; @@ -287,12 +289,13 @@ xfs_attr_rmtval_copyin( char *dst = bp->b_addr; xfs_daddr_t bno = bp->b_bn; int len = BBTOB(bp->b_length); + int blksize = mp->m_attr_geo->blksize; - ASSERT(len >= XFS_LBSIZE(mp)); + ASSERT(len >= blksize); while (len > 0 && *valuelen > 0) { int hdr_size; - int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); byte_cnt = min(*valuelen, byte_cnt); hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, @@ -304,17 +307,17 @@ xfs_attr_rmtval_copyin( * If this is the last block, zero the remainder of it. * Check that we are actually the last block, too. */ - if (byte_cnt + hdr_size < XFS_LBSIZE(mp)) { + if (byte_cnt + hdr_size < blksize) { ASSERT(*valuelen - byte_cnt == 0); - ASSERT(len == XFS_LBSIZE(mp)); + ASSERT(len == blksize); memset(dst + hdr_size + byte_cnt, 0, - XFS_LBSIZE(mp) - hdr_size - byte_cnt); + blksize - hdr_size - byte_cnt); } /* roll buffer forwards */ - len -= XFS_LBSIZE(mp); - dst += XFS_LBSIZE(mp); - bno += mp->m_bsize; + len -= blksize; + dst += blksize; + bno += BTOBB(blksize); /* roll attribute data forwards */ *valuelen -= byte_cnt; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 44d7fac..0a49b02 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -19,10 +19,6 @@ #ifndef __XFS_DA_FORMAT_H__ #define __XFS_DA_FORMAT_H__ -/*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - /* * This structure is common to both leaf nodes and non-leaf nodes in the Btree. * @@ -122,8 +118,6 @@ struct xfs_da3_icnode_hdr { __uint16_t level; }; -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - /* * Directory version 2. * @@ -620,10 +614,6 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) * of an attribute name may not be unique, we may have duplicate keys. The * internal links in the Btree are logical block offsets into the file. * - *======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *======================================================================== - * * Struct leaf_entry's are packed from the top. Name/values grow from the * bottom but are not packed. The freemap contains run-length-encoded entries * for the free bytes after the leaf_entry's, but only the N largest such, -- 1.9.0 From dave@fromorbit.com Wed May 28 01:05:06 2014 Return-Path: <dave@fromorbit.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 D88A07F53 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:05:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BECE88F808F for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:05:06 -0700 (PDT) X-ASG-Debug-ID: 1401257089-04cbb02a0f1bef40006-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ZT0RNGFQG62tgGd3 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:04:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsBPADN7hVN5LL1sPGdsb2JhbABZgwdSh3qibQsBAQEBAQEGmRcXAwEBAQE4NYIlAQEFGgEMLzMIGDE5AwcUGYhB1W+FVY1EBJsxiVqLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:34:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ov-6R for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003m3-5Q for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging Date: Wed, 28 May 2014 16:04:40 +1000 X-ASG-Orig-Subj: [PATCH 13/16] xfs: remove mp->m_dir_geo from directory logging Message-Id: <1401257083-13433-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257099 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> We don't pass the xfs_da_args or the geometry all the way down to the directory buffer logging code, hence we have to use mp->m_dir_geo here. Fix this to use the geometry passed via the xfs_da_args, and convert all the directory logging functions for consistency. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_dir2.h | 12 +++--- fs/xfs/xfs_dir2_block.c | 39 +++++++++--------- fs/xfs/xfs_dir2_data.c | 59 ++++++++++++--------------- fs/xfs/xfs_dir2_leaf.c | 103 +++++++++++++++++++++++++----------------------- fs/xfs/xfs_dir2_node.c | 68 +++++++++++++++----------------- fs/xfs/xfs_dir2_priv.h | 4 +- 6 files changed, 137 insertions(+), 148 deletions(-) diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 1292e78..c8e86b0 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -153,16 +153,16 @@ extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, extern void xfs_dir2_data_freescan(struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_entry(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_header(struct xfs_da_args *args, struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_log_unused(struct xfs_da_args *args, + struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); +extern void xfs_dir2_data_make_free(struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir2_data_use_free(struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 4204df9..c7cd315 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -281,8 +281,7 @@ out: */ static void xfs_dir2_block_compact( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp, @@ -315,7 +314,7 @@ xfs_dir2_block_compact( *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); *lfloghigh -= be32_to_cpu(btp->stale) - 1; be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), needlog, &needscan); @@ -325,7 +324,7 @@ xfs_dir2_block_compact( * This needs to happen before the next call to use_free. */ if (needscan) - xfs_dir2_data_freescan(dp, hdr, needlog); + xfs_dir2_data_freescan(args->dp, hdr, needlog); } /* @@ -420,7 +419,7 @@ xfs_dir2_block_addname( * If need to compact the leaf entries, do it now. */ if (compact) { - xfs_dir2_block_compact(tp, dp, bp, hdr, btp, blp, &needlog, + xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); /* recalculate blp post-compaction */ blp = xfs_dir2_block_leaf_p(btp); @@ -455,7 +454,7 @@ xfs_dir2_block_addname( /* * Mark the space needed for the new leaf entry, now in use. */ - xfs_dir2_data_use_free(tp, dp, bp, enddup, + xfs_dir2_data_use_free(args, bp, enddup, (xfs_dir2_data_aoff_t) ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), @@ -542,7 +541,7 @@ xfs_dir2_block_addname( /* * Mark space for the data entry used. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* @@ -560,9 +559,9 @@ xfs_dir2_block_addname( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -803,7 +802,7 @@ xfs_dir2_block_removename( * Mark the data entry's space free. */ needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, bp, + xfs_dir2_data_make_free(args, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -822,7 +821,7 @@ xfs_dir2_block_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, bp); + xfs_dir2_data_log_header(args, bp); xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. @@ -881,7 +880,7 @@ xfs_dir2_block_replace( */ dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -1004,7 +1003,7 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, args->geo->blksize - size, size, + xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size, &needlog, &needscan); /* * Initialize the block tail. @@ -1030,7 +1029,7 @@ xfs_dir2_leaf_to_block( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * Pitch the old leaf block. */ @@ -1143,7 +1142,7 @@ xfs_dir2_sf_to_block( */ dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, dp, bp, dup, args->geo->blksize - i, + xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, i, &needlog, &needscan); ASSERT(needscan == 0); /* @@ -1157,7 +1156,7 @@ xfs_dir2_sf_to_block( /* * Remove the freespace, we'll manage it. */ - xfs_dir2_data_use_free(tp, dp, bp, dup, + xfs_dir2_data_use_free(args, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* @@ -1170,7 +1169,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1184,7 +1183,7 @@ xfs_dir2_sf_to_block( dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( (char *)dep - (char *)hdr)); @@ -1218,7 +1217,7 @@ xfs_dir2_sf_to_block( dup->length = cpu_to_be16(newoffset - offset); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( ((char *)dup - (char *)hdr)); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_unused(args, bp, dup); xfs_dir2_data_freeinsert(hdr, dp->d_ops->data_bestfree_p(hdr), dup, &dummy); @@ -1235,7 +1234,7 @@ xfs_dir2_sf_to_block( memcpy(dep->name, sfep->name, dep->namelen); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, bp, dep); + xfs_dir2_data_log_entry(args, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index b73d61a..8c2f642 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -630,8 +630,8 @@ xfs_dir3_data_init( /* * Log it and return it. */ - xfs_dir2_data_log_header(tp, dp, bp); - xfs_dir2_data_log_unused(tp, bp, dup); + xfs_dir2_data_log_header(args, bp); + xfs_dir2_data_log_unused(args, bp, dup); *bpp = bp; return 0; } @@ -641,8 +641,7 @@ xfs_dir3_data_init( */ void xfs_dir2_data_log_entry( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { @@ -653,8 +652,8 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(dp->d_ops->data_entry_tag_p(dep) + 1) - + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dep - (char *)hdr), + (uint)((char *)(args->dp->d_ops->data_entry_tag_p(dep) + 1) - (char *)hdr - 1)); } @@ -663,8 +662,7 @@ xfs_dir2_data_log_entry( */ void xfs_dir2_data_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -676,7 +674,8 @@ xfs_dir2_data_log_header( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->data_entry_offset - 1); } /* @@ -684,7 +683,7 @@ xfs_dir2_data_log_header( */ void xfs_dir2_data_log_unused( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup) /* data unused pointer */ { @@ -698,13 +697,13 @@ xfs_dir2_data_log_unused( /* * Log the first part of the unused entry. */ - xfs_trans_log_buf(tp, bp, (uint)((char *)dup - (char *)hdr), + xfs_trans_log_buf(args->trans, bp, (uint)((char *)dup - (char *)hdr), (uint)((char *)&dup->length + sizeof(dup->length) - 1 - (char *)hdr)); /* * Log the end (tag) of the unused entry. */ - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr), (uint)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)hdr + sizeof(xfs_dir2_data_off_t) - 1)); @@ -716,8 +715,7 @@ xfs_dir2_data_log_unused( */ void xfs_dir2_data_make_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ @@ -727,37 +725,33 @@ xfs_dir2_data_make_free( xfs_dir2_data_hdr_t *hdr; /* data block pointer */ xfs_dir2_data_free_t *dfp; /* bestfree pointer */ char *endptr; /* end of data area */ - xfs_mount_t *mp; /* filesystem mount point */ int needscan; /* need to regen bestfree */ xfs_dir2_data_unused_t *newdup; /* new unused entry */ xfs_dir2_data_unused_t *postdup; /* unused entry after us */ xfs_dir2_data_unused_t *prevdup; /* unused entry before us */ struct xfs_dir2_data_free *bf; - struct xfs_da_geometry *geo; - mp = tp->t_mountp; hdr = bp->b_addr; - geo = mp->m_dir_geo; /* * Figure out where the end of the data area is. */ if (hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)) - endptr = (char *)hdr + geo->blksize; + endptr = (char *)hdr + args->geo->blksize; else { xfs_dir2_block_tail_t *btp; /* block tail */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - btp = xfs_dir2_block_tail_p(geo, hdr); + btp = xfs_dir2_block_tail_p(args->geo, hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); } /* * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > dp->d_ops->data_entry_offset) { + if (offset > args->dp->d_ops->data_entry_offset) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; @@ -783,7 +777,7 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ @@ -805,7 +799,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); if (!needscan) { /* * Has to be the case that entries 0 and 1 are @@ -840,7 +834,7 @@ xfs_dir2_data_make_free( be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, prevdup); + xfs_dir2_data_log_unused(args, bp, prevdup); /* * If the previous entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -868,7 +862,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If the following entry was in the table, the new entry * is longer, so it will be in the table too. Remove @@ -895,7 +889,7 @@ xfs_dir2_data_make_free( newdup->length = cpu_to_be16(len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); } *needscanp = needscan; @@ -906,8 +900,7 @@ xfs_dir2_data_make_free( */ void xfs_dir2_data_use_free( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ @@ -938,7 +931,7 @@ xfs_dir2_data_use_free( * Look up the entry in the bestfree table. */ oldlen = be16_to_cpu(dup->length); - bf = dp->d_ops->data_bestfree_p(hdr); + bf = args->dp->d_ops->data_bestfree_p(hdr); dfp = xfs_dir2_data_freefind(hdr, bf, dup); ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); /* @@ -970,7 +963,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(oldlen - len); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -998,7 +991,7 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); /* * If it was in the table, remove it and add the new one. */ @@ -1026,13 +1019,13 @@ xfs_dir2_data_use_free( newdup->length = cpu_to_be16(((char *)hdr + offset) - (char *)newdup); *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup); + xfs_dir2_data_log_unused(args, bp, newdup); newdup2 = (xfs_dir2_data_unused_t *)((char *)hdr + offset + len); newdup2->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup2->length = cpu_to_be16(oldlen - len - be16_to_cpu(newdup->length)); *xfs_dir2_data_unused_tag_p(newdup2) = cpu_to_be16((char *)newdup2 - (char *)hdr); - xfs_dir2_data_log_unused(tp, bp, newdup2); + xfs_dir2_data_log_unused(args, bp, newdup2); /* * If the old entry was in the table, we need to scan * if the 3rd entry was valid, since these entries diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index e517bd0..fb0aad4 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -41,9 +41,10 @@ */ static int xfs_dir2_leaf_lookup_int(xfs_da_args_t *args, struct xfs_buf **lbpp, int *indexp, struct xfs_buf **dbpp); -static void xfs_dir3_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, - int first, int last); -static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); +static void xfs_dir3_leaf_log_bests(struct xfs_da_args *args, + struct xfs_buf *bp, int first, int last); +static void xfs_dir3_leaf_log_tail(struct xfs_da_args *args, + struct xfs_buf *bp); /* * Check the internal consistency of a leaf1 block. @@ -357,9 +358,9 @@ xfs_dir3_leaf_get_buf( return error; xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (magic == XFS_DIR2_LEAF1_MAGIC) - xfs_dir3_leaf_log_tail(tp, bp); + xfs_dir3_leaf_log_tail(args, bp); *bpp = bp; return 0; } @@ -428,21 +429,21 @@ xfs_dir2_block_to_leaf( leafhdr.count = be32_to_cpu(btp->count); leafhdr.stale = be32_to_cpu(btp->stale); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1); + xfs_dir3_leaf_log_ents(args, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* * Make the space formerly occupied by the leaf entries and block * tail be free. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((char *)hdr + args->geo->blksize - (char *)blp), @@ -470,10 +471,10 @@ xfs_dir2_block_to_leaf( * Log the data header and leaf bests table. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); + xfs_dir3_leaf_log_bests(args, lbp, 0, 0); return 0; } @@ -811,14 +812,15 @@ xfs_dir2_leaf_addname( memmove(&bestsp[0], &bestsp[1], be32_to_cpu(ltp->bestcount) * sizeof(bestsp[0])); be32_add_cpu(<p->bestcount, 1); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } /* * If we're filling in a previously empty block just log it. */ else - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); hdr = dbp->b_addr; bf = dp->d_ops->data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; @@ -849,7 +851,7 @@ xfs_dir2_leaf_addname( /* * Mark the initial part of our freespace in use for the new entry. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -871,8 +873,8 @@ xfs_dir2_leaf_addname( * Need to log the data block's header. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_header(args, dbp); + xfs_dir2_data_log_entry(args, dbp, dep); /* * If the bests table needs to be changed, do it. * Log the change unless we've already done that. @@ -880,7 +882,7 @@ xfs_dir2_leaf_addname( if (be16_to_cpu(bestsp[use_block]) != be16_to_cpu(bf[0].length)) { bestsp[use_block] = bf[0].length; if (!grown) - xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); + xfs_dir3_leaf_log_bests(args, lbp, use_block, use_block); } lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, @@ -897,8 +899,8 @@ xfs_dir2_leaf_addname( * Log the leaf fields and give up the buffers. */ dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_ents(args, lbp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); return 0; @@ -950,9 +952,9 @@ xfs_dir3_leaf_compact( leafhdr->stale = 0; dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); - xfs_dir3_leaf_log_header(args->trans, dp, bp); + xfs_dir3_leaf_log_header(args, bp); if (loglow != -1) - xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args, bp, loglow, to - 1); } /* @@ -1054,7 +1056,7 @@ xfs_dir3_leaf_compact_x1( */ static void xfs_dir3_leaf_log_bests( - xfs_trans_t *tp, /* transaction pointer */ + struct xfs_da_args *args, struct xfs_buf *bp, /* leaf buffer */ int first, /* first entry to log */ int last) /* last entry to log */ @@ -1067,10 +1069,11 @@ xfs_dir3_leaf_log_bests( ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(tp->t_mountp->m_dir_geo, leaf); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); firstb = xfs_dir2_leaf_bests_p(ltp) + first; lastb = xfs_dir2_leaf_bests_p(ltp) + last; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstb - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstb - (char *)leaf), (uint)((char *)lastb - (char *)leaf + sizeof(*lastb) - 1)); } @@ -1079,8 +1082,7 @@ xfs_dir3_leaf_log_bests( */ void xfs_dir3_leaf_log_ents( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, int last) @@ -1095,10 +1097,11 @@ xfs_dir3_leaf_log_ents( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ents = dp->d_ops->leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); firstlep = &ents[first]; lastlep = &ents[last]; - xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)firstlep - (char *)leaf), (uint)((char *)lastlep - (char *)leaf + sizeof(*lastlep) - 1)); } @@ -1107,8 +1110,7 @@ xfs_dir3_leaf_log_ents( */ void xfs_dir3_leaf_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -1118,8 +1120,9 @@ xfs_dir3_leaf_log_header( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - dp->d_ops->leaf_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, + (uint)((char *)&leaf->hdr - (char *)leaf), + args->dp->d_ops->leaf_hdr_size - 1); } /* @@ -1127,21 +1130,20 @@ xfs_dir3_leaf_log_header( */ STATIC void xfs_dir3_leaf_log_tail( - struct xfs_trans *tp, + struct xfs_da_args *args, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ - struct xfs_mount *mp = tp->t_mountp; ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); - xfs_trans_log_buf(tp, bp, (uint)((char *)ltp - (char *)leaf), - (uint)(mp->m_dir_geo->blksize - 1)); + ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); + xfs_trans_log_buf(args->trans, bp, (uint)((char *)ltp - (char *)leaf), + (uint)(args->geo->blksize - 1)); } /* @@ -1395,7 +1397,7 @@ xfs_dir2_leaf_removename( /* * Mark the former data entry unused. */ - xfs_dir2_data_make_free(tp, dp, dbp, + xfs_dir2_data_make_free(args, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -1403,10 +1405,10 @@ xfs_dir2_leaf_removename( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index); + xfs_dir3_leaf_log_ents(args, lbp, index, index); /* * Scan the freespace in the data block again if necessary, @@ -1415,14 +1417,14 @@ xfs_dir2_leaf_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. */ if (be16_to_cpu(bf[0].length) != oldbest) { bestsp[db] = bf[0].length; - xfs_dir3_leaf_log_bests(tp, lbp, db, db); + xfs_dir3_leaf_log_bests(args, lbp, db, db); } xfs_dir3_data_check(dp, dbp); /* @@ -1463,8 +1465,9 @@ xfs_dir2_leaf_removename( memmove(&bestsp[db - i], bestsp, (be32_to_cpu(ltp->bestcount) - (db - i)) * sizeof(*bestsp)); be32_add_cpu(<p->bestcount, -(db - i)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, + be32_to_cpu(ltp->bestcount) - 1); } else bestsp[db] = cpu_to_be16(NULLDATAOFF); } @@ -1527,7 +1530,7 @@ xfs_dir2_leaf_replace( dep->inumber = cpu_to_be64(args->inumber); dp->d_ops->data_put_ftype(dep, args->filetype); tp = args->trans; - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); xfs_dir3_leaf_check(dp, lbp); xfs_trans_brelse(tp, lbp); return 0; @@ -1648,8 +1651,8 @@ xfs_dir2_leaf_trim_data( bestsp = xfs_dir2_leaf_bests_p(ltp); be32_add_cpu(<p->bestcount, -1); memmove(&bestsp[1], &bestsp[0], be32_to_cpu(ltp->bestcount) * sizeof(*bestsp)); - xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); return 0; } @@ -1795,9 +1798,9 @@ xfs_dir2_node_to_leaf( freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, lbp); - xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); - xfs_dir3_leaf_log_tail(tp, lbp); + xfs_dir3_leaf_log_header(args, lbp); + xfs_dir3_leaf_log_bests(args, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); + xfs_dir3_leaf_log_tail(args, lbp); xfs_dir3_leaf_check(dp, lbp); /* diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index eff6b8d..65df8cb 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -241,8 +241,7 @@ xfs_dir3_free_get_buf( */ STATIC void xfs_dir2_free_log_bests( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ @@ -251,10 +250,10 @@ xfs_dir2_free_log_bests( __be16 *bests; free = bp->b_addr; - bests = dp->d_ops->free_bests_p(free); + bests = args->dp->d_ops->free_bests_p(free); ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); - xfs_trans_log_buf(tp, bp, + xfs_trans_log_buf(args->trans, bp, (uint)((char *)&bests[first] - (char *)free), (uint)((char *)&bests[last] - (char *)free + sizeof(bests[0]) - 1)); @@ -265,8 +264,7 @@ xfs_dir2_free_log_bests( */ static void xfs_dir2_free_log_header( - struct xfs_trans *tp, - struct xfs_inode *dp, + struct xfs_da_args *args, struct xfs_buf *bp) { #ifdef DEBUG @@ -276,7 +274,8 @@ xfs_dir2_free_log_header( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size - 1); + xfs_trans_log_buf(args->trans, bp, 0, + args->dp->d_ops->free_hdr_size - 1); } /* @@ -350,8 +349,8 @@ xfs_dir2_leaf_to_node( freehdr.nvalid = be32_to_cpu(ltp->bestcount); dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_bests(args, fbp, 0, freehdr.nvalid - 1); + xfs_dir2_free_log_header(args, fbp); /* * Converting the leaf to a leafnode is just a matter of changing the @@ -365,7 +364,7 @@ xfs_dir2_leaf_to_node( leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); - xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_header(args, lbp); xfs_dir3_leaf_check(dp, lbp); return 0; } @@ -455,8 +454,8 @@ xfs_dir2_leafn_add( args->blkno, args->index)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); - xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_log_header(args, bp); + xfs_dir3_leaf_log_ents(args, bp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, bp); return 0; } @@ -851,7 +850,6 @@ xfs_dir3_leafn_moveents( int start_d,/* destination leaf index */ int count) /* count of leaves to copy */ { - struct xfs_trans *tp = args->trans; int stale; /* count stale leaves copied */ trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count); @@ -870,7 +868,7 @@ xfs_dir3_leafn_moveents( if (start_d < dhdr->count) { memmove(&dents[start_d + count], &dents[start_d], (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count, + xfs_dir3_leaf_log_ents(args, bp_d, start_d + count, count + dhdr->count - 1); } /* @@ -892,8 +890,7 @@ xfs_dir3_leafn_moveents( */ memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, - start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(args, bp_d, start_d, start_d + count - 1); /* * If there are source entries after the ones we copied, @@ -902,8 +899,7 @@ xfs_dir3_leafn_moveents( if (start_s + count < shdr->count) { memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, args->dp, bp_s, - start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(args, bp_s, start_s, start_s + count - 1); } /* @@ -1039,8 +1035,8 @@ xfs_dir2_leafn_rebalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); - xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); - xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); + xfs_dir3_leaf_log_header(args, blk1->bp); + xfs_dir3_leaf_log_header(args, blk2->bp); xfs_dir3_leaf_check(dp, blk1->bp); xfs_dir3_leaf_check(dp, blk2->bp); @@ -1083,7 +1079,6 @@ xfs_dir3_data_block_free( struct xfs_buf *fbp, int longest) { - struct xfs_trans *tp = args->trans; int logfree = 0; __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; @@ -1097,7 +1092,7 @@ xfs_dir3_data_block_free( * value. */ bests[findex] = cpu_to_be16(longest); - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1125,7 +1120,7 @@ xfs_dir3_data_block_free( } dp->d_ops->free_hdr_to_disk(free, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); /* * If there are no useful entries left in the block, get rid of the @@ -1149,7 +1144,7 @@ xfs_dir3_data_block_free( /* Log the free entry that changed, unless we got rid of it. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); return 0; } @@ -1211,10 +1206,10 @@ xfs_dir2_leafn_remove( */ leafhdr.stale++; dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_header(args, bp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, dp, bp, index, index); + xfs_dir3_leaf_log_ents(args, bp, index, index); /* * Make the data entry free. Keep track of the longest freespace @@ -1226,7 +1221,7 @@ xfs_dir2_leafn_remove( bf = dp->d_ops->data_bestfree_p(hdr); longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dp, dbp, off, + xfs_dir2_data_make_free(args, dbp, off, dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. @@ -1235,7 +1230,7 @@ xfs_dir2_leafn_remove( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update @@ -1569,8 +1564,8 @@ xfs_dir2_leafn_unbalance( /* log the changes made when moving the entries */ dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); - xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); - xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); + xfs_dir3_leaf_log_header(args, save_blk->bp); + xfs_dir3_leaf_log_header(args, drop_blk->bp); xfs_dir3_leaf_check(dp, save_blk->bp); xfs_dir3_leaf_check(dp, drop_blk->bp); @@ -1931,7 +1926,7 @@ xfs_dir2_node_addname_int( if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { freehdr.nused++; dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_header(tp, dp, fbp); + xfs_dir2_free_log_header(args, fbp); } /* * Update the real value in the table. @@ -1975,7 +1970,7 @@ xfs_dir2_node_addname_int( /* * Mark the first part of the unused space, inuse for us. */ - xfs_dir2_data_use_free(tp, dp, dbp, dup, + xfs_dir2_data_use_free(args, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -1988,7 +1983,7 @@ xfs_dir2_node_addname_int( dp->d_ops->data_put_ftype(dep, args->filetype); tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dp, dbp, dep); + xfs_dir2_data_log_entry(args, dbp, dep); /* * Rescan the block for bestfree if needed. */ @@ -1998,7 +1993,7 @@ xfs_dir2_node_addname_int( * Log the data block header if needed. */ if (needlog) - xfs_dir2_data_log_header(tp, dp, dbp); + xfs_dir2_data_log_header(args, dbp); /* * If the freespace entry is now wrong, update it. */ @@ -2011,7 +2006,7 @@ xfs_dir2_node_addname_int( * Log the freespace entry if needed. */ if (logfree) - xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); + xfs_dir2_free_log_bests(args, fbp, findex, findex); /* * Return the data block and offset in args, then drop the data block. */ @@ -2208,8 +2203,7 @@ xfs_dir2_node_replace( */ dep->inumber = cpu_to_be64(inum); args->dp->d_ops->data_put_ftype(dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, args->dp, - state->extrablk.bp, dep); + xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); rval = 0; } /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 436135f..27ce079 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -211,9 +211,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); -extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_ents(struct xfs_da_args *args, struct xfs_buf *bp, int first, int last); -extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp, +extern void xfs_dir3_leaf_log_header(struct xfs_da_args *args, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); -- 1.9.0 From dave@fromorbit.com Wed May 28 01:06:26 2014 Return-Path: <dave@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC2947F5A for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:06:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 499F3AC006 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:06:25 -0700 (PDT) X-ASG-Debug-ID: 1401257182-04cbb02a111bf210001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id psP7t32okBnFFvJ5 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:06:22 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AllPAFt8hVN5LL1sPGdsb2JhbABZgweITKJ4AQEBAQEBBpkYFwMBAQEBODWCJQEBBScvMwgYMTkDBxQZiEHVZoVVjUQEpQuLWis Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 15:35:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from <dave@fromorbit.com>) id 1WpWyk-0005ox-7Q for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 Received: from dave by disappointment with local (Exim 4.82) (envelope-from <dave@disappointment.disaster>) id 1WpWyk-0003mD-6Z for xfs@oss.sgi.com; Wed, 28 May 2014 16:04:46 +1000 From: Dave Chinner <david@fromorbit.com> To: xfs@oss.sgi.com Subject: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Date: Wed, 28 May 2014 16:04:42 +1000 X-ASG-Orig-Subj: [PATCH 15/16] xfs: pass xfs_da_args to xfs_attr_leaf_newentsize Message-Id: <1401257083-13433-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.com> References: <1401257083-13433-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401257182 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.6178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner <dchinner@redhat.com> As it's only ever called from contexts where the xfs_da_args is present and contains all the information needed inside the args structure. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> --- fs/xfs/xfs_attr.c | 4 +--- fs/xfs/xfs_attr_leaf.c | 47 +++++++++++++++++------------------------------ fs/xfs/xfs_attr_leaf.h | 3 +-- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ccfc2c9..3d8c03e 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -174,9 +174,7 @@ xfs_attr_calc_size( * Determine space new attribute will use, and if it would be * "local" or "remote" (note: local != inline). */ - size = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, local); - + size = xfs_attr_leaf_newentsize(args, local); nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); if (*local) { if (size > (args->geo->blksize / 2)) { diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 88cd84a..7761103 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1076,8 +1076,7 @@ xfs_attr3_leaf_add( leaf = bp->b_addr; xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); - entsize = xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL); + entsize = xfs_attr_leaf_newentsize(args, NULL); /* * Search through freemap for first-fit on new name length. @@ -1179,14 +1178,11 @@ xfs_attr3_leaf_add_work( ASSERT(ichdr->freemap[mapindex].base < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); ASSERT(ichdr->freemap[mapindex].size >= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, NULL)); + xfs_attr_leaf_newentsize(args, NULL)); ASSERT(ichdr->freemap[mapindex].size < XFS_LBSIZE(mp)); ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); - ichdr->freemap[mapindex].size -= - xfs_attr_leaf_newentsize(args->namelen, args->valuelen, - args->geo->blksize, &tmp); + ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); @@ -1594,9 +1590,7 @@ xfs_attr3_leaf_figure_balance( max = ichdr1->count + ichdr2->count; half = (max + 1) * sizeof(*entry); half += ichdr1->usedbytes + ichdr2->usedbytes + - xfs_attr_leaf_newentsize(state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); half /= 2; lastdelta = state->blocksize; entry = xfs_attr3_leaf_entryp(leaf1); @@ -1608,10 +1602,7 @@ xfs_attr3_leaf_figure_balance( */ if (count == blk1->index) { tmp = totallen + sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); if (XFS_ATTR_ABS(half - tmp) > lastdelta) break; lastdelta = XFS_ATTR_ABS(half - tmp); @@ -1647,10 +1638,7 @@ xfs_attr3_leaf_figure_balance( totallen -= count * sizeof(*entry); if (foundit) { totallen -= sizeof(*entry) + - xfs_attr_leaf_newentsize( - state->args->namelen, - state->args->valuelen, - state->blocksize, NULL); + xfs_attr_leaf_newentsize(state->args, NULL); } *countarg = count; @@ -2441,22 +2429,21 @@ xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) * a "local" or a "remote" attribute. */ int -xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) +xfs_attr_leaf_newentsize( + struct xfs_da_args *args, + int *local) { - int size; + int size; - size = xfs_attr_leaf_entsize_local(namelen, valuelen); - if (size < xfs_attr_leaf_entsize_local_max(blocksize)) { - if (local) { + size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen); + if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) { + if (local) *local = 1; - } - } else { - size = xfs_attr_leaf_entsize_remote(namelen); - if (local) { - *local = 0; - } + return size; } - return size; + if (local) + *local = 0; + return xfs_attr_leaf_entsize_remote(args->namelen); } diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index 3ec5ec0..e2929da 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -96,8 +96,7 @@ int xfs_attr3_root_inactive(struct xfs_trans **trans, struct xfs_inode *dp); xfs_dahash_t xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count); int xfs_attr_leaf_order(struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); -int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, - int *local); +int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); -- 1.9.0 From felipemonteiro.carvalho@gmail.com Wed May 28 01:40:48 2014 Return-Path: <felipemonteiro.carvalho@gmail.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,T_DKIM_INVALID, T_FRT_BELOW2 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 5807E7F57 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:40:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2F1938F807A for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:40:48 -0700 (PDT) X-ASG-Debug-ID: 1401259246-04cbb02a111c21a0001-NocioJ Received: from mail-pa0-f45.google.com (mail-pa0-f45.google.com [209.85.220.45]) by cuda.sgi.com with ESMTP id 6zdbhjCxjOvPqXUX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:40:46 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.45 Received: by mail-pa0-f45.google.com with SMTP id ey11so10478605pad.18 for <xfs@oss.sgi.com>; Tue, 27 May 2014 23:40:46 -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=tSq2pJ84OXbjlEM0p+GzTN4RtVhw/HnEKazdehL+Uz4=; b=ogeIzSAIihTUP5102eH6dknOiP71oOSD7YGTWt+NqswqIc4T5Celd+IAQCMw17mWUt URCBgrfHl1O0QzJK7aygwqvLyuFa3rtZ3JZ2xx4U2aqztx7IJ1F/61zFSoXPnA5QqmlJ 0XC1qMKjD4I6UUk7aA/BNneeKnjYaGzS72OzM4m7DSi8uNjd9XJr5Fa0A7MQ8c/LkdAw ron8Y6o99rfE5UzLL6RuGUQ1yeRaFQQjE/UC/ubOCYM3cIWvoTYIZy53Axlxb/ODGE85 tZae67tlN9WO5ZHR1rt+hmxHshj/ElhkcTW71ZklJ2Py4YvXNW/WbZ+5vKqWNCAyTck1 56uA== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.68.166.36 with SMTP id zd4mr43850155pbb.54.1401259246200; Tue, 27 May 2014 23:40:46 -0700 (PDT) Received: by 10.66.12.69 with HTTP; Tue, 27 May 2014 23:40:46 -0700 (PDT) Date: Wed, 28 May 2014 08:40:46 +0200 Message-ID: <CACyNnZM7o2Sqzt+ygThJn=ibWsy+eUVLJ9d1+03kjVXW=t-b3Q@mail.gmail.com> Subject: Finding the pointer array in XFS_DINODE_FMT_BTREE inodes From: Felipe Monteiro de Carvalho <felipemonteiro.carvalho@gmail.com> X-ASG-Orig-Subj: Finding the pointer array in XFS_DINODE_FMT_BTREE inodes To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f45.google.com[209.85.220.45] X-Barracuda-Start-Time: 1401259246 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.6179 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, I am writing an application which reads XFS partitions, so I am trying to understand the internal working of XFS. I read the documentation. But there is one issue which I cannot figure out. In an inode which is a directory with data format XFS_DINODE_FMT_BTREE I see that the first structure is the 4-byte header, which in my case has these values: xfs_bmdr_block = packed record bb_level = 1; // 0 is a leaf */ bb_numrecs = 1; // current # of data records */ And after that I get the key array as expected. But after the key array there is a lot of empty space, $40 bytes of empty space to be exact, enough for 8 more keys, even while my inode has "bb_numrecs = 1" and only after that empty space I get the pointers array. My current "guess" is that the key array has at least 9 elements in it, being that only bb_numrecs are valid, but I'd prefer to know what is going on instead of doing random guesses =D So my question is: How can I know the start point of the pointer array? In this case it starts at offset $B0 from the inode start while I would expect $70 (just after the key array) Please see my xfs_db values bellow: xfs_db> inode 1067904 xfs_db> print core.magic = 0x494e core.mode = 040755 core.version = 2 core.format = 3 (btree) core.nlinkv2 = 2 core.onlink = 0 core.projid_lo = 0 core.projid_hi = 0 core.uid = 0 core.gid = 0 core.flushiter = 1 core.atime.sec = Mon Dec 30 09:40:08 2013 core.atime.nsec = 000000000 core.mtime.sec = Mon Dec 30 09:40:08 2013 core.mtime.nsec = 000000000 core.ctime.sec = Sat May 3 14:55:10 2014 core.ctime.nsec = 657000000 core.size = 323584 core.nblocks = 116 core.extsize = 0 core.nextents = 82 core.naextents = 0 core.forkoff = 0 core.aformat = 2 (extents) core.dmevmask = 0 core.dmstate = 0 core.newrtbm = 0 core.prealloc = 0 core.realtime = 0 core.immutable = 0 core.append = 0 core.sync = 0 core.noatime = 0 core.nodump = 0 core.rtinherit = 0 core.projinherit = 0 core.nosymlinks = 0 core.extsz = 0 core.extszinherit = 0 core.nodefrag = 0 core.filestream = 0 core.gen = 247601121 next_unlinked = null u.bmbt.level = 1 u.bmbt.numrecs = 1 u.bmbt.keys[1] = [startoff] 1:[0] u.bmbt.ptrs[1] = 1:66821 xfs_db> type text xfs_db> p 00: 49 4e 41 ed 02 03 00 00 00 00 00 00 00 00 00 00 INA............. 10: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 01 ................ 20: 52 c1 31 68 00 00 00 00 52 c1 31 68 00 00 00 00 R.1h....R.1h.... 30: 53 64 e7 2e 27 29 06 40 00 00 00 00 00 04 f0 00 Sd.............. 40: 00 00 00 00 00 00 00 74 00 00 00 00 00 00 00 52 .......t.......R 50: 00 00 00 02 00 00 00 00 00 00 00 00 0e c2 17 e1 ................ Here I get the terminator FF FF FF FF, then the 4 byte header then the key value 60: ff ff ff ff 00 01 00 01 00 00 00 00 00 00 00 00 ................ Unexpected empty space!?!? 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Here starts the pointer array: b0: 00 00 00 00 00 01 05 05 00 00 00 00 00 00 00 00 ................ c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Just for reference purposes, someone has already asked this same question many years ago somewhere, but he never got any answer =D http://permalink.gmane.org/gmane.comp.file-systems.xfs.general/15285 thanks, -- Felipe Monteiro de Carvalho From david@fromorbit.com Wed May 28 03:37:50 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A9B57F50 for <xfs@oss.sgi.com>; Wed, 28 May 2014 03:37:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A32DEAC002 for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:37:46 -0700 (PDT) X-ASG-Debug-ID: 1401266262-04cb6c22b71d0f00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id X3IbSizxEvl6njnH for <xfs@oss.sgi.com>; Wed, 28 May 2014 01:37:43 -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: AmxSALufhVN5LL1sPGdsb2JhbABZgweDRIUIomcBAQEBAQEGmA0BgQoXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hB1V4XFoU/iBlkB4RABJlzixiLWiuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 18:07:40 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpZMg-0006E9-Tq; Wed, 28 May 2014 18:37:38 +1000 Date: Wed, 28 May 2014 18:37:38 +1000 From: Dave Chinner <david@fromorbit.com> To: Minchan Kim <minchan@kernel.org> Cc: linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, linux-mm@kvack.org, "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <a.p.zijlstra@chello.nl>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Johannes Weiner <hannes@cmpxchg.org>, Hugh Dickins <hughd@google.com>, rusty@rustcorp.com.au, mst@redhat.com, Dave Hansen <dave.hansen@intel.com>, Steven Rostedt <rostedt@goodmis.org>, xfs@oss.sgi.com Subject: Re: [RFC 2/2] x86_64: expand kernel stack to 16K Message-ID: <20140528083738.GL8554@dastard> X-ASG-Orig-Subj: Re: [RFC 2/2] x86_64: expand kernel stack to 16K References: <1401260039-18189-1-git-send-email-minchan@kernel.org> <1401260039-18189-2-git-send-email-minchan@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401260039-18189-2-git-send-email-minchan@kernel.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: 1401266262 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.6180 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [ cc XFS list ] On Wed, May 28, 2014 at 03:53:59PM +0900, Minchan Kim wrote: > While I play inhouse patches with much memory pressure on qemu-kvm, > 3.14 kernel was randomly crashed. The reason was kernel stack overflow. > > When I investigated the problem, the callstack was a little bit deeper > by involve with reclaim functions but not direct reclaim path. > > I tried to diet stack size of some functions related with alloc/reclaim > so did a hundred of byte but overflow was't disappeard so that I encounter > overflow by another deeper callstack on reclaim/allocator path. > > Of course, we might sweep every sites we have found for reducing > stack usage but I'm not sure how long it saves the world(surely, > lots of developer start to add nice features which will use stack > agains) and if we consider another more complex feature in I/O layer > and/or reclaim path, it might be better to increase stack size( > meanwhile, stack usage on 64bit machine was doubled compared to 32bit > while it have sticked to 8K. Hmm, it's not a fair to me and arm64 > already expaned to 16K. ) > > So, my stupid idea is just let's expand stack size and keep an eye > toward stack consumption on each kernel functions via stacktrace of ftrace. > For example, we can have a bar like that each funcion shouldn't exceed 200K > and emit the warning when some function consumes more in runtime. > Of course, it could make false positive but at least, it could make a > chance to think over it. > > I guess this topic was discussed several time so there might be > strong reason not to increase kernel stack size on x86_64, for me not > knowing so Ccing x86_64 maintainers, other MM guys and virtio > maintainers. > > [ 1065.604404] kworker/-5766 0d..2 1071625990us : stack_trace_call: Depth Size Location (51 entries) > [ 1065.604404] ----- ---- -------- > [ 1065.604404] kworker/-5766 0d..2 1071625991us : stack_trace_call: 0) 7696 16 lookup_address+0x28/0x30 > [ 1065.604404] kworker/-5766 0d..2 1071625991us : stack_trace_call: 1) 7680 16 _lookup_address_cpa.isra.3+0x3b/0x40 > [ 1065.604404] kworker/-5766 0d..2 1071625991us : stack_trace_call: 2) 7664 24 __change_page_attr_set_clr+0xe0/0xb50 > [ 1065.604404] kworker/-5766 0d..2 1071625991us : stack_trace_call: 3) 7640 392 kernel_map_pages+0x6c/0x120 > [ 1065.604404] kworker/-5766 0d..2 1071625992us : stack_trace_call: 4) 7248 256 get_page_from_freelist+0x489/0x920 > [ 1065.604404] kworker/-5766 0d..2 1071625992us : stack_trace_call: 5) 6992 352 __alloc_pages_nodemask+0x5e1/0xb20 > [ 1065.604404] kworker/-5766 0d..2 1071625992us : stack_trace_call: 6) 6640 8 alloc_pages_current+0x10f/0x1f0 > [ 1065.604404] kworker/-5766 0d..2 1071625992us : stack_trace_call: 7) 6632 168 new_slab+0x2c5/0x370 > [ 1065.604404] kworker/-5766 0d..2 1071625992us : stack_trace_call: 8) 6464 8 __slab_alloc+0x3a9/0x501 > [ 1065.604404] kworker/-5766 0d..2 1071625993us : stack_trace_call: 9) 6456 80 __kmalloc+0x1cb/0x200 > [ 1065.604404] kworker/-5766 0d..2 1071625993us : stack_trace_call: 10) 6376 376 vring_add_indirect+0x36/0x200 > [ 1065.604404] kworker/-5766 0d..2 1071625993us : stack_trace_call: 11) 6000 144 virtqueue_add_sgs+0x2e2/0x320 > [ 1065.604404] kworker/-5766 0d..2 1071625993us : stack_trace_call: 12) 5856 288 __virtblk_add_req+0xda/0x1b0 > [ 1065.604404] kworker/-5766 0d..2 1071625993us : stack_trace_call: 13) 5568 96 virtio_queue_rq+0xd3/0x1d0 > [ 1065.604404] kworker/-5766 0d..2 1071625994us : stack_trace_call: 14) 5472 128 __blk_mq_run_hw_queue+0x1ef/0x440 > [ 1065.604404] kworker/-5766 0d..2 1071625994us : stack_trace_call: 15) 5344 16 blk_mq_run_hw_queue+0x35/0x40 > [ 1065.604404] kworker/-5766 0d..2 1071625994us : stack_trace_call: 16) 5328 96 blk_mq_insert_requests+0xdb/0x160 > [ 1065.604404] kworker/-5766 0d..2 1071625994us : stack_trace_call: 17) 5232 112 blk_mq_flush_plug_list+0x12b/0x140 > [ 1065.604404] kworker/-5766 0d..2 1071625994us : stack_trace_call: 18) 5120 112 blk_flush_plug_list+0xc7/0x220 > [ 1065.604404] kworker/-5766 0d..2 1071625995us : stack_trace_call: 19) 5008 64 io_schedule_timeout+0x88/0x100 > [ 1065.604404] kworker/-5766 0d..2 1071625995us : stack_trace_call: 20) 4944 128 mempool_alloc+0x145/0x170 > [ 1065.604404] kworker/-5766 0d..2 1071625995us : stack_trace_call: 21) 4816 96 bio_alloc_bioset+0x10b/0x1d0 > [ 1065.604404] kworker/-5766 0d..2 1071625995us : stack_trace_call: 22) 4720 48 get_swap_bio+0x30/0x90 > [ 1065.604404] kworker/-5766 0d..2 1071625995us : stack_trace_call: 23) 4672 160 __swap_writepage+0x150/0x230 > [ 1065.604404] kworker/-5766 0d..2 1071625996us : stack_trace_call: 24) 4512 32 swap_writepage+0x42/0x90 > [ 1065.604404] kworker/-5766 0d..2 1071625996us : stack_trace_call: 25) 4480 320 shrink_page_list+0x676/0xa80 > [ 1065.604404] kworker/-5766 0d..2 1071625996us : stack_trace_call: 26) 4160 208 shrink_inactive_list+0x262/0x4e0 > [ 1065.604404] kworker/-5766 0d..2 1071625996us : stack_trace_call: 27) 3952 304 shrink_lruvec+0x3e1/0x6a0 > [ 1065.604404] kworker/-5766 0d..2 1071625996us : stack_trace_call: 28) 3648 80 shrink_zone+0x3f/0x110 > [ 1065.604404] kworker/-5766 0d..2 1071625997us : stack_trace_call: 29) 3568 128 do_try_to_free_pages+0x156/0x4c0 > [ 1065.604404] kworker/-5766 0d..2 1071625997us : stack_trace_call: 30) 3440 208 try_to_free_pages+0xf7/0x1e0 > [ 1065.604404] kworker/-5766 0d..2 1071625997us : stack_trace_call: 31) 3232 352 __alloc_pages_nodemask+0x783/0xb20 > [ 1065.604404] kworker/-5766 0d..2 1071625997us : stack_trace_call: 32) 2880 8 alloc_pages_current+0x10f/0x1f0 > [ 1065.604404] kworker/-5766 0d..2 1071625997us : stack_trace_call: 33) 2872 200 __page_cache_alloc+0x13f/0x160 > [ 1065.604404] kworker/-5766 0d..2 1071625998us : stack_trace_call: 34) 2672 80 find_or_create_page+0x4c/0xb0 > [ 1065.604404] kworker/-5766 0d..2 1071625998us : stack_trace_call: 35) 2592 80 ext4_mb_load_buddy+0x1e9/0x370 > [ 1065.604404] kworker/-5766 0d..2 1071625998us : stack_trace_call: 36) 2512 176 ext4_mb_regular_allocator+0x1b7/0x460 > [ 1065.604404] kworker/-5766 0d..2 1071625998us : stack_trace_call: 37) 2336 128 ext4_mb_new_blocks+0x458/0x5f0 > [ 1065.604404] kworker/-5766 0d..2 1071625998us : stack_trace_call: 38) 2208 256 ext4_ext_map_blocks+0x70b/0x1010 > [ 1065.604404] kworker/-5766 0d..2 1071625999us : stack_trace_call: 39) 1952 160 ext4_map_blocks+0x325/0x530 > [ 1065.604404] kworker/-5766 0d..2 1071625999us : stack_trace_call: 40) 1792 384 ext4_writepages+0x6d1/0xce0 > [ 1065.604404] kworker/-5766 0d..2 1071625999us : stack_trace_call: 41) 1408 16 do_writepages+0x23/0x40 > [ 1065.604404] kworker/-5766 0d..2 1071625999us : stack_trace_call: 42) 1392 96 __writeback_single_inode+0x45/0x2e0 > [ 1065.604404] kworker/-5766 0d..2 1071625999us : stack_trace_call: 43) 1296 176 writeback_sb_inodes+0x2ad/0x500 > [ 1065.604404] kworker/-5766 0d..2 1071626000us : stack_trace_call: 44) 1120 80 __writeback_inodes_wb+0x9e/0xd0 > [ 1065.604404] kworker/-5766 0d..2 1071626000us : stack_trace_call: 45) 1040 160 wb_writeback+0x29b/0x350 > [ 1065.604404] kworker/-5766 0d..2 1071626000us : stack_trace_call: 46) 880 208 bdi_writeback_workfn+0x11c/0x480 > [ 1065.604404] kworker/-5766 0d..2 1071626000us : stack_trace_call: 47) 672 144 process_one_work+0x1d2/0x570 > [ 1065.604404] kworker/-5766 0d..2 1071626000us : stack_trace_call: 48) 528 112 worker_thread+0x116/0x370 > [ 1065.604404] kworker/-5766 0d..2 1071626001us : stack_trace_call: 49) 416 240 kthread+0xf3/0x110 > [ 1065.604404] kworker/-5766 0d..2 1071626001us : stack_trace_call: 50) 176 176 ret_from_fork+0x7c/0xb0 > > Signed-off-by: Minchan Kim <minchan@kernel.org> > --- > arch/x86/include/asm/page_64_types.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h > index 8de6d9cf3b95..678205195ae1 100644 > --- a/arch/x86/include/asm/page_64_types.h > +++ b/arch/x86/include/asm/page_64_types.h > @@ -1,7 +1,7 @@ > #ifndef _ASM_X86_PAGE_64_DEFS_H > #define _ASM_X86_PAGE_64_DEFS_H > > -#define THREAD_SIZE_ORDER 1 > +#define THREAD_SIZE_ORDER 2 > #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) > #define CURRENT_MASK (~(THREAD_SIZE - 1)) -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed May 28 04:13:53 2014 Return-Path: <david@fromorbit.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 BED7C7F51 for <xfs@oss.sgi.com>; Wed, 28 May 2014 04:13:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC4DC8F8033 for <xfs@oss.sgi.com>; Wed, 28 May 2014 02:13:53 -0700 (PDT) X-ASG-Debug-ID: 1401268430-04cb6c22b71d44f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6jrOhL608EFQKdQM for <xfs@oss.sgi.com>; Wed, 28 May 2014 02:13: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: AhldAPanhVN5LL1sPGdsb2JhbABZgweDRIUIomcBAQEBAQEGmA0BgQoXAwEBAQE4NYIlAQEEAScTHCMFCwgDEgYJJQ8FJQMHBhQTHogcB9VvFxaFP4gZZAeDK4EVBJl0ixiLWiuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 28 May 2014 18:43:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpZvd-0006Kz-Qy; Wed, 28 May 2014 19:13:45 +1000 Date: Wed, 28 May 2014 19:13:45 +1000 From: Dave Chinner <david@fromorbit.com> To: Minchan Kim <minchan@kernel.org> Cc: linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, linux-mm@kvack.org, "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <a.p.zijlstra@chello.nl>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Johannes Weiner <hannes@cmpxchg.org>, Hugh Dickins <hughd@google.com>, rusty@rustcorp.com.au, mst@redhat.com, Dave Hansen <dave.hansen@intel.com>, Steven Rostedt <rostedt@goodmis.org>, xfs@oss.sgi.com Subject: Re: [RFC 2/2] x86_64: expand kernel stack to 16K Message-ID: <20140528091345.GD6677@dastard> X-ASG-Orig-Subj: Re: [RFC 2/2] x86_64: expand kernel stack to 16K References: <1401260039-18189-1-git-send-email-minchan@kernel.org> <1401260039-18189-2-git-send-email-minchan@kernel.org> <20140528083738.GL8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528083738.GL8554@dastard> 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: 1401268430 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.6180 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 28, 2014 at 06:37:38PM +1000, Dave Chinner wrote: > [ cc XFS list ] [and now there is a complete copy on the XFs list, I'll add my 2c] > On Wed, May 28, 2014 at 03:53:59PM +0900, Minchan Kim wrote: > > While I play inhouse patches with much memory pressure on qemu-kvm, > > 3.14 kernel was randomly crashed. The reason was kernel stack overflow. > > > > When I investigated the problem, the callstack was a little bit deeper > > by involve with reclaim functions but not direct reclaim path. > > > > I tried to diet stack size of some functions related with alloc/reclaim > > so did a hundred of byte but overflow was't disappeard so that I encounter > > overflow by another deeper callstack on reclaim/allocator path. That's a no win situation. The stack overruns through ->writepage we've been seeing with XFS over the past *4 years* are much larger than a few bytes. The worst case stack usage on a virtio block device was about 10.5KB of stack usage. And, like this one, it came from the flusher thread as well. The difference was that the allocation that triggered the reclaim path you've reported occurred when 5k of the stack had already been used... > > Of course, we might sweep every sites we have found for reducing > > stack usage but I'm not sure how long it saves the world(surely, > > lots of developer start to add nice features which will use stack > > agains) and if we consider another more complex feature in I/O layer > > and/or reclaim path, it might be better to increase stack size( > > meanwhile, stack usage on 64bit machine was doubled compared to 32bit > > while it have sticked to 8K. Hmm, it's not a fair to me and arm64 > > already expaned to 16K. ) Yup, that's all been pointed out previously. 8k stacks were never large enough to fit the linux IO architecture on x86-64, but nobody outside filesystem and IO developers has been willing to accept that argument as valid, despite regular stack overruns and filesystem having to add workaround after workaround to prevent stack overruns. That's why stuff like this appears in various filesystem's ->writepage: /* * Refuse to write the page out if we are called from reclaim context. * * This avoids stack overflows when called from deeply used stacks in * random callers for direct reclaim or memcg reclaim. We explicitly * allow reclaim from kswapd as the stack usage there is relatively low. * * This should never happen except in the case of a VM regression so * warn about it. */ if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == PF_MEMALLOC)) goto redirty; That still doesn't guarantee us enough stack space to do writeback, though, because memory allocation can occur when reading in metadata needed to do delayed allocation, and so we could trigger GFP_NOFS memory allocation from the flusher thread with 4-5k of stack already consumed, so that would still overrun teh stack. So, a couple of years ago we started defering half the writeback stack usage to a worker thread (commit c999a22 "xfs: introduce an allocation workqueue"), under the assumption that the worst stack usage when we call memory allocation is around 3-3.5k of stack used. We thought that would be safe, but the stack trace you've posted shows that alloc_page(GFP_NOFS) can consume upwards of 5k of stack, which means we're still screwed despite all the workarounds we have in place. We've also had recent reports of allocation from direct IO blowing the stack, as well as block allocation adding an entry to a directory. We're basically at the point where we have to push every XFS operation that requires block allocation off to another thread to get enough stack space for normal operation..... > > So, my stupid idea is just let's expand stack size and keep an eye Not stupid: it's been what I've been advocating we need to do for the past 3-4 years. XFS has always been the stack usage canary and this issue is basically a repeat of the 4k stack on i386 kernel debacle. > > toward stack consumption on each kernel functions via stacktrace of ftrace. > > For example, we can have a bar like that each funcion shouldn't exceed 200K > > and emit the warning when some function consumes more in runtime. > > Of course, it could make false positive but at least, it could make a > > chance to think over it. I don't think that's a good idea. There are reasons for putting a 150-200 byte structure on the stack (e.g. used in a context where allocation cannot be guaranteed to succeed because forward progress cannot be guaranteed). hence having these users warn all the time will quickly get very annoying and that functionality switched off or removed.... > > I guess this topic was discussed several time so there might be > > strong reason not to increase kernel stack size on x86_64, for me not > > knowing so Ccing x86_64 maintainers, other MM guys and virtio > > maintainers. > > > > Depth Size Location (51 entries) > > > > 0) 7696 16 lookup_address+0x28/0x30 > > 1) 7680 16 _lookup_address_cpa.isra.3+0x3b/0x40 > > 2) 7664 24 __change_page_attr_set_clr+0xe0/0xb50 > > 3) 7640 392 kernel_map_pages+0x6c/0x120 > > 4) 7248 256 get_page_from_freelist+0x489/0x920 > > 5) 6992 352 __alloc_pages_nodemask+0x5e1/0xb20 > > 6) 6640 8 alloc_pages_current+0x10f/0x1f0 > > 7) 6632 168 new_slab+0x2c5/0x370 > > 8) 6464 8 __slab_alloc+0x3a9/0x501 > > 9) 6456 80 __kmalloc+0x1cb/0x200 > > 10) 6376 376 vring_add_indirect+0x36/0x200 > > 11) 6000 144 virtqueue_add_sgs+0x2e2/0x320 > > 12) 5856 288 __virtblk_add_req+0xda/0x1b0 > > 13) 5568 96 virtio_queue_rq+0xd3/0x1d0 > > 14) 5472 128 __blk_mq_run_hw_queue+0x1ef/0x440 > > 15) 5344 16 blk_mq_run_hw_queue+0x35/0x40 > > 16) 5328 96 blk_mq_insert_requests+0xdb/0x160 > > 17) 5232 112 blk_mq_flush_plug_list+0x12b/0x140 > > 18) 5120 112 blk_flush_plug_list+0xc7/0x220 > > 19) 5008 64 io_schedule_timeout+0x88/0x100 > > 20) 4944 128 mempool_alloc+0x145/0x170 > > 21) 4816 96 bio_alloc_bioset+0x10b/0x1d0 > > 22) 4720 48 get_swap_bio+0x30/0x90 > > 23) 4672 160 __swap_writepage+0x150/0x230 > > 24) 4512 32 swap_writepage+0x42/0x90 > > 25) 4480 320 shrink_page_list+0x676/0xa80 > > 26) 4160 208 shrink_inactive_list+0x262/0x4e0 > > 27) 3952 304 shrink_lruvec+0x3e1/0x6a0 > > 28) 3648 80 shrink_zone+0x3f/0x110 > > 29) 3568 128 do_try_to_free_pages+0x156/0x4c0 > > 30) 3440 208 try_to_free_pages+0xf7/0x1e0 > > 31) 3232 352 __alloc_pages_nodemask+0x783/0xb20 > > 32) 2880 8 alloc_pages_current+0x10f/0x1f0 > > 33) 2872 200 __page_cache_alloc+0x13f/0x160 > > 34) 2672 80 find_or_create_page+0x4c/0xb0 > > 35) 2592 80 ext4_mb_load_buddy+0x1e9/0x370 > > 36) 2512 176 ext4_mb_regular_allocator+0x1b7/0x460 > > 37) 2336 128 ext4_mb_new_blocks+0x458/0x5f0 > > 38) 2208 256 ext4_ext_map_blocks+0x70b/0x1010 > > 39) 1952 160 ext4_map_blocks+0x325/0x530 > > 40) 1792 384 ext4_writepages+0x6d1/0xce0 > > 41) 1408 16 do_writepages+0x23/0x40 > > 42) 1392 96 __writeback_single_inode+0x45/0x2e0 > > 43) 1296 176 writeback_sb_inodes+0x2ad/0x500 > > 44) 1120 80 __writeback_inodes_wb+0x9e/0xd0 > > 45) 1040 160 wb_writeback+0x29b/0x350 > > 46) 880 208 bdi_writeback_workfn+0x11c/0x480 > > 47) 672 144 process_one_work+0x1d2/0x570 > > 48) 528 112 worker_thread+0x116/0x370 > > 49) 416 240 kthread+0xf3/0x110 > > 50) 176 176 ret_from_fork+0x7c/0xb0 Impressive: 3 nested allocations - GFP_NOFS, GFP_NOIO and then GFP_ATOMIC before the stack goes boom. XFS usually only needs 2... However, add another 1000 bytes of stack for each IO by going through the FC/scsi layers and hitting command allocation at the bottom of the IO stack rather than bio allocation at the top and maybe stack usage for 2-3 layers of MD and LVM as well, and you start to see how that stack pushes >10k of usage rather than just overflowing 8k.... > > Signed-off-by: Minchan Kim <minchan@kernel.org> > > --- > > arch/x86/include/asm/page_64_types.h | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h > > index 8de6d9cf3b95..678205195ae1 100644 > > --- a/arch/x86/include/asm/page_64_types.h > > +++ b/arch/x86/include/asm/page_64_types.h > > @@ -1,7 +1,7 @@ > > #ifndef _ASM_X86_PAGE_64_DEFS_H > > #define _ASM_X86_PAGE_64_DEFS_H > > > > -#define THREAD_SIZE_ORDER 1 > > +#define THREAD_SIZE_ORDER 2 > > #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) > > #define CURRENT_MASK (~(THREAD_SIZE - 1)) Got my vote. Can we get this into 3.16, please? Acked-by: Dave Chinner <david@fromorbit.com> Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed May 28 07:31:22 2014 Return-Path: <sandeen@sandeen.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 7464A7F57 for <xfs@oss.sgi.com>; Wed, 28 May 2014 07:31:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D17D304066 for <xfs@oss.sgi.com>; Wed, 28 May 2014 05:31:22 -0700 (PDT) X-ASG-Debug-ID: 1401280277-04cb6c22b81e7ef0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2oHPpK2UBJo92s0c for <xfs@oss.sgi.com>; Wed, 28 May 2014 05:31: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 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 97F2463C5FEF; Wed, 28 May 2014 07:31:17 -0500 (CDT) Message-ID: <5385D715.9080103@sandeen.net> Date: Wed, 28 May 2014 07:31:17 -0500 From: Eric Sandeen <sandeen@sandeen.net> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Christoph Hellwig <hch@infradead.org> CC: Eric Sandeen <sandeen@redhat.com>, xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files References: <53852A05.5040006@redhat.com> <53852A98.7000809@sandeen.net> <20140528054034.GB13166@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2, RFC] mkfs.xfs: don't call blkid_get_topology on regular files In-Reply-To: <20140528054034.GB13166@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1401280277 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.6180 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/28/14, 12:40 AM, Christoph Hellwig wrote: > On Tue, May 27, 2014 at 07:15:20PM -0500, Eric Sandeen wrote: >> If we encounter a target that's really a regular file, >> even without "-d file..." on the cmdline, call >> platform_findsizes() instead of blkid_get_topology to >> try to discover the "sector size" via the fsgeom() call. >> >> Signed-off-by: Eric Sandeen <sandeen@redhat.com> >> --- >> >> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c >> index 37c05a9..74180c9 100644 >> --- a/mkfs/xfs_mkfs.c >> +++ b/mkfs/xfs_mkfs.c >> @@ -454,12 +454,26 @@ static void get_topology( >> struct fs_topology *ft, >> int force_overwrite) >> { >> - if (!xi->disfile) { >> - const char *dfile = xi->volname ? xi->volname : xi->dname; >> + int is_a_file = 0; >> + struct stat statbuf; >> + char *dfile = xi->volname ? xi->volname : xi->dname; >> >> + if (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode)) >> + is_a_file = 1; >> + >> + if (!xi->disfile && !is_a_file) { > > Why do need both xi->disfile and a local flag/ Why do we do the > that even if xi->disfile is set? Good point that we don't need to do the stat if the old disfile flag is already set. But "disfile" implies a lot of other things, and comes from specifying "-d file,..." on the cmdline. If you point mkfs straight at a file, disfile is NOT set, so I check it here explicitly. The dichotomy between "mkfs.xfs -dfile,name=$FOO" and "mkfs.xfs $FOO" is a weird one, and should probably just go away in the long run... -Eric From bfoster@redhat.com Wed May 28 07:43:03 2014 Return-Path: <bfoster@redhat.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 CCF707F57 for <xfs@oss.sgi.com>; Wed, 28 May 2014 07:43:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AAFB28F8049 for <xfs@oss.sgi.com>; Wed, 28 May 2014 05:43:03 -0700 (PDT) X-ASG-Debug-ID: 1401280982-04cbb02a0f1e64b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jO79QcaAJBXXA4g5 for <xfs@oss.sgi.com>; Wed, 28 May 2014 05:43: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4SCh0YE010149 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 28 May 2014 08:43:00 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4SCgxex030305; Wed, 28 May 2014 08:42:59 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 712761248A9; Wed, 28 May 2014 08:42:58 -0400 (EDT) Date: Wed, 28 May 2014 08:42:58 -0400 From: Brian Foster <bfoster@redhat.com> To: Dave Chinner <david@fromorbit.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140528124257.GA5567@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-3-git-send-email-bfoster@redhat.com> <20140526225755.GR18954@dastard> <20140527124755.GC63281@bfoster.bfoster> <20140527211416.GB6677@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527211416.GB6677@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401280982 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, May 28, 2014 at 07:14:16AM +1000, Dave Chinner wrote: > On Tue, May 27, 2014 at 08:47:55AM -0400, Brian Foster wrote: > > On Tue, May 27, 2014 at 08:57:55AM +1000, Dave Chinner wrote: > > > On Fri, May 23, 2014 at 07:52:29AM -0400, Brian Foster wrote: > > > > +/* > > > > + * Run eofblocks scans on the quotas applicable to the inode. For inodes with > > > > + * multiple quotas, we don't know exactly which quota caused an allocation > > > > + * failure. We make a best effort by running scans for each quota considered > > > > + * to be under low free space conditions (less than 1% available free space). > > > > + */ > > > > +int > > > > +xfs_inode_free_quota_eofblocks( > > > > + struct xfs_inode *ip) > > > > +{ > > > > + int scanned = 0; > > > > + struct xfs_eofblocks eofb = {0,}; > > > > + struct xfs_dquot *dq; > > > > + > > > > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > > > > + > > > > + /* set the scan owner to avoid potential livelock */ > > > > + eofb.eof_scan_owner = ip->i_ino; > > > > + > > > > + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { > > > > + dq = xfs_inode_dquot(ip, XFS_DQ_USER); > > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > > + eofb.eof_uid = VFS_I(ip)->i_uid; > > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > > + XFS_EOF_FLAGS_UID; > > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > + scanned = 1; > > > > + } > > > > + } > > > > + > > > > + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { > > > > + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); > > > > + if (dq && xfs_dquot_lowsp(dq)) { > > > > + eofb.eof_gid = VFS_I(ip)->i_gid; > > > > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > > > > + XFS_EOF_FLAGS_GID; > > > > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > + scanned = 1; > > > > + } > > > > + } > > > > > > Rather that doing two scans here, wouldn't it be more efficient > > > to do: > > > > > > eofb.eof_flags = XFS_EOF_FLAGS_SYNC; > > > scan = false; > > > if (uquota is low) { > > > eofb.eof_uid = VFS_I(ip)->i_uid; > > > eofb.eof_flags |= XFS_EOF_FLAGS_UID; > > > scan = true; > > > } > > > if (gquota is low) { > > > eofb.eof_gid = VFS_I(ip)->i_gid; > > > eofb.eof_flags |= XFS_EOF_FLAGS_GID; > > > scan = true; > > > } > > > if (scan) > > > xfs_icache_free_eofblocks(ip->i_mount, &eofb); > > > > > > and change xfs_inode_match_id() to be able to check against multiple > > > flags on a single inode? That way we only scan the inode cache > > > once, regardless of the number of quota types that are enabled and > > > are tracking low space thresholds. > > > > > > > Yeah, that would certainly be better from this perspective. We don't > > care so much about the characteristics of the inode as much as the > > quotas that are associated with it. If I recall, I was somewhat on the > > fence about this behavior when we first added the userspace interface > > here. IOWs, should the combination of flags define an intersection of > > the set of inodes to scan or a union? The more I think about it, I think > > the interface kind of suggests the former (from an interface/aesthetic > > perspective). E.g., I probably wouldn't expect to add a GID flag to a > > UID flag and have my scan become more broad, rather than more > > restrictive. Otherwise, the existence of a uid, gid and prid in the > > request structure seems kind of arbitrary (as opposed to a list/set of > > generic IDs, for example). > > > > I'm not against union behavior in general (and still probably not 100% > > against switching the default). I suppose another option could be to add > > a set of union/intersection flags that control the behavior here. I'd > > be slightly concerned about making this interface too convoluted, but it > > is a relatively low level thing, I suppose, without much generic use. We > > could also decide not to expose those extra controls to userspace for > > the time being. > > > > I need to think about this some more. Thoughts on any of that? > > What we expose to userspace is orthoganol to what we implment > internally. It makes sense to limit the userspace interface to a > single type at a time, but when we are doing internal cleaner work > it makes sense to match all criteria in a single cache pass. > > i.e. Restrict the capability of the user interface at the input > layer rather than restricting the capability of the infrastructure > to do work efficiently... > Ok... so I'm thinking we can handle this with a new XFS_EOF_FLAGS_UNION flag. This is masked off from userspace requests. It will be set for the internal quota scan and xfs_inode_match_id() can check for it and call a *match_id_union() variant that does the right thing. Thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@redhat.com Wed May 28 08:50:43 2014 Return-Path: <sandeen@redhat.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 7F65C7F5D for <xfs@oss.sgi.com>; Wed, 28 May 2014 08:50:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 601E88F8068 for <xfs@oss.sgi.com>; Wed, 28 May 2014 06:50:40 -0700 (PDT) X-ASG-Debug-ID: 1401285038-04bdf0599f1fae00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zihaGvEZtEoUGiK9 for <xfs@oss.sgi.com>; Wed, 28 May 2014 06:50:39 -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 (8.14.4/8.14.4) with ESMTP id s4SDoGr3001258 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 28 May 2014 09:50:16 -0400 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 s4SDoEdP028384 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 28 May 2014 09:50:14 -0400 Message-ID: <5385E996.30309@redhat.com> Date: Wed, 28 May 2014 08:50:14 -0500 From: Eric Sandeen <sandeen@redhat.com> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Christoph Hellwig <hch@infradead.org> CC: xfs-oss <xfs@oss.sgi.com> Subject: Re: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device References: <53852A05.5040006@redhat.com> <20140528054142.GC13166@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/2, RFC] xfsprogs: try to handle mkfs of a file on 4k sector device In-Reply-To: <20140528054142.GC13166@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 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: 1401285039 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 5/28/14, 12:41 AM, Christoph Hellwig wrote: >> We can modify platform_findsizes() to use the fsgeom call to get the >> "sector size" which should be used here, and warn that mismatches >> might exist if it fails. >> >> This does mean there'll be a new warning emitted on fs images hosted >> on non-xfs filesystems; I'm not really quite sure it's worth it, >> hence the RFC nature of this lightly tested 2-patch series... > > Might be time to introduce some generic VFS-level ioctl for the sector > size and dio alignment. Any beer or chocolate that could motivate you > to get this done? :) Roses from you, Christoph. ;) Yeah, we do desperately need this. Not sure why nobody's done it yet, I'll see if I can get the time & motivation going, and launch into the bike shed building. :) > Also it would be nice to have a test case that exercises this new code. Hm yeah fair enough; I tested it w/ scsi-debug... -Eric From bfoster@redhat.com Wed May 28 09:01:09 2014 Return-Path: <bfoster@redhat.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 453507F5E for <xfs@oss.sgi.com>; Wed, 28 May 2014 09:01:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3496B8F8035 for <xfs@oss.sgi.com>; Wed, 28 May 2014 07:01:06 -0700 (PDT) X-ASG-Debug-ID: 1401285664-04cbb02a101f01c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TnEHyQmRZTB1diWd for <xfs@oss.sgi.com>; Wed, 28 May 2014 07:01: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4SE0c9c006615 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 28 May 2014 10:00:38 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4SE0b46002133; Wed, 28 May 2014 10:00:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BE9701248A9; Wed, 28 May 2014 10:00:36 -0400 (EDT) Date: Wed, 28 May 2014 10:00:36 -0400 From: Brian Foster <bfoster@redhat.com> To: Christoph Hellwig <hch@infradead.org> Cc: Dave Chinner <david@fromorbit.com>, xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks Message-ID: <20140528140034.GB5567@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs: add scan owner field to xfs_eofblocks References: <1400845950-41435-1-git-send-email-bfoster@redhat.com> <1400845950-41435-2-git-send-email-bfoster@redhat.com> <20140527104428.GC1440@infradead.org> <20140527121810.GB63281@bfoster.bfoster> <20140527212653.GC6677@dastard> <20140528053019.GB3816@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528053019.GB3816@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401285664 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, May 27, 2014 at 10:30:19PM -0700, Christoph Hellwig wrote: > On Wed, May 28, 2014 at 07:26:53AM +1000, Dave Chinner wrote: > > > Right... maybe I'm not parsing your point. The purpose here is to avoid > > > the trylock entirely. E.g., Indicate that we have already acquired the > > > lock and can proceed with xfs_free_eofblocks(), rather than fail a > > > trylock and skip (which appears to be a potential infinite loop scenario > > > here due to how the AG walking code handles EAGAIN). > > > > I think Christoph's concern here is that we are calling a function > > that can take the iolock while we already hold the iolock. i.e. the > > reason we have to add the anti-deadlock code in the first place. > > Indeed. > Ah, I didn't parse correctly then. Thanks... > > To > > address that, can we restructure xfs_file_buffered_aio_write() such > > that the ENOSPC/EDQUOT flush is done outside the iolock? > > > > >From a quick check, I don't think there is any problem with dropping > > the iolock, doing the flushes and then going all the way back to the > > start of the function again, but closer examination and testing is > > warranted... > I considered this briefly early on, but wasn't sure about whether we should run through the write_checks() bits more than once (e.g., potentially do the eof zeroing, etc., multiple times..?). > I think we'd need some form of early space reservation, otherwise we'd > get non-atomic writes. Time to get those batches write patches out > again.. > So the concern is that multiple writers to an overlapped range could become interleaved? From passing through the code, we hit generic_perform_write(), which iters over the iov in a write_begin/copy_write_end loop. If we hit ENOSPC somewhere in the middle, we'd return what we've written so far. I don't believe the buffered_aio_write() path would see the error unless it was the first attempt at a delayed allocation. IOW, mid-write failure will be a short write vs. an ENOSPC error. It seems like it _might_ be safe to drop and reacquire iolock given these semantics (notwithstanding the write_checks() bits), but I could certainly be missing something... Brian From bfoster@redhat.com Wed May 28 10:49:57 2014 Return-Path: <bfoster@redhat.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 B95527F60 for <xfs@oss.sgi.com>; Wed, 28 May 2014 10:49:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5FDA08F8064 for <xfs@oss.sgi.com>; Wed, 28 May 2014 08:49:54 -0700 (PDT) X-ASG-Debug-ID: 1401292192-04bdf0599f20b610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pnx3J2RWzH5g3guc for <xfs@oss.sgi.com>; Wed, 28 May 2014 08:49: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4SFnToX022193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 28 May 2014 11:49:30 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4SFnTcI032394; Wed, 28 May 2014 11:49:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0B68D1248A9; Wed, 28 May 2014 11:49:27 -0400 (EDT) Date: Wed, 28 May 2014 11:49:27 -0400 From: Brian Foster <bfoster@redhat.com> To: Christoph Hellwig <hch@infradead.org> Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfs: tone down writepage/releasepage WARN_ONs Message-ID: <20140528154927.GD5567@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH xfs: tone down writepage/releasepage WARN_ONs References: <20140527103119.GA26420@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140527103119.GA26420@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401292192 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, May 27, 2014 at 03:31:19AM -0700, Christoph Hellwig wrote: > I recently ran into the issue fixed by > > "xfs: kill buffers over failed write ranges properly" > > which spams the log with lots of backtraces. Make debugging any issues > like that easier by using WARN_ON_ONCE in the writeback code. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- The change generally seems fine to me. IIRC, we had a point in time where these issues were prevalent and noisy. We also had a few lingering ones that were hard to reproduce. I do wonder whether this would make that situation difficult to reproduce. For example, running through an xfstests run where one test might reproduce randomly and suppress output from a subsequent, perhaps more frequent reproducer. Am I correct to assume that once fired, the warning wouldn't fire again before a reboot or module reload? Hmm, did we have asserts that covered these scenarios as well? Brian > fs/xfs/xfs_aops.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index d1b99b6..e32640e 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -975,7 +975,7 @@ xfs_vm_writepage( > * Given that we do not allow direct reclaim to call us, we should > * never be called while in a filesystem transaction. > */ > - if (WARN_ON(current->flags & PF_FSTRANS)) > + if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) > goto redirty; > > /* Is this page beyond the end of the file? */ > @@ -1225,9 +1225,9 @@ xfs_vm_releasepage( > > xfs_count_page_state(page, &delalloc, &unwritten); > > - if (WARN_ON(delalloc)) > + if (WARN_ON_ONCE(delalloc)) > return 0; > - if (WARN_ON(unwritten)) > + if (WARN_ON_ONCE(unwritten)) > return 0; > > return try_to_free_buffers(page); > -- > 1.7.10.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hannes@cmpxchg.org Wed May 28 11:08:19 2014 Return-Path: <hannes@cmpxchg.org> X-Spam-Checker-Version: SpamAssassin 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 CE1BB7F62 for <xfs@oss.sgi.com>; Wed, 28 May 2014 11:08:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5DD5DAC001 for <xfs@oss.sgi.com>; Wed, 28 May 2014 09:08:15 -0700 (PDT) X-ASG-Debug-ID: 1401293291-04bdf0599e20db80001-NocioJ Received: from zene.cmpxchg.org (zene.cmpxchg.org [85.214.230.12]) by cuda.sgi.com with ESMTP id 8al75zK9qSBg4x0T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for <xfs@oss.sgi.com>; Wed, 28 May 2014 09:08:13 -0700 (PDT) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.230.12 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cmpxchg.org; s=zene; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=tdxMu0ZThmUASuGWikJxXFeGbiGZAGC8bJI2NFM5p08=; b=GMFGruTu1ON2jnjM6jWtJt25KsZoQbJcd8ypdZBcRAynJ0dWCTvQboKySb0sBFB6UW3x4/4+RvVFnjTS6HWlIRX0lhKyg0eKqvQMkG5k9UaIR/9FoCRHFt962XVvdGL85rdvPjvKtWs9vok+PWp9Udu8s+jNpjINqrkA9TqZMs8=; Received: from ool-44c761d1.dyn.optonline.net ([68.199.97.209] helo=phnom.home.cmpxchg.org) by zene.cmpxchg.org with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.76) (envelope-from <hannes@cmpxchg.org>) id 1WpgNd-0000Yh-1l; Wed, 28 May 2014 16:07:05 +0000 Date: Wed, 28 May 2014 12:06:58 -0400 From: Johannes Weiner <hannes@cmpxchg.org> To: Dave Chinner <david@fromorbit.com> Cc: Minchan Kim <minchan@kernel.org>, linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, linux-mm@kvack.org, "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <a.p.zijlstra@chello.nl>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Hugh Dickins <hughd@google.com>, rusty@rustcorp.com.au, mst@redhat.com, Dave Hansen <dave.hansen@intel.com>, Steven Rostedt <rostedt@goodmis.org>, xfs@oss.sgi.com Subject: Re: [RFC 2/2] x86_64: expand kernel stack to 16K Message-ID: <20140528160658.GH2878@cmpxchg.org> X-ASG-Orig-Subj: Re: [RFC 2/2] x86_64: expand kernel stack to 16K References: <1401260039-18189-1-git-send-email-minchan@kernel.org> <1401260039-18189-2-git-send-email-minchan@kernel.org> <20140528083738.GL8554@dastard> <20140528091345.GD6677@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528091345.GD6677@dastard> X-Barracuda-Connect: zene.cmpxchg.org[85.214.230.12] X-Barracuda-Start-Time: 1401293292 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.6183 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 Wed, May 28, 2014 at 07:13:45PM +1000, Dave Chinner wrote: > On Wed, May 28, 2014 at 06:37:38PM +1000, Dave Chinner wrote: > > [ cc XFS list ] > > [and now there is a complete copy on the XFs list, I'll add my 2c] > > > On Wed, May 28, 2014 at 03:53:59PM +0900, Minchan Kim wrote: > > > While I play inhouse patches with much memory pressure on qemu-kvm, > > > 3.14 kernel was randomly crashed. The reason was kernel stack overflow. > > > > > > When I investigated the problem, the callstack was a little bit deeper > > > by involve with reclaim functions but not direct reclaim path. > > > > > > I tried to diet stack size of some functions related with alloc/reclaim > > > so did a hundred of byte but overflow was't disappeard so that I encounter > > > overflow by another deeper callstack on reclaim/allocator path. > > That's a no win situation. The stack overruns through ->writepage > we've been seeing with XFS over the past *4 years* are much larger > than a few bytes. The worst case stack usage on a virtio block > device was about 10.5KB of stack usage. > > And, like this one, it came from the flusher thread as well. The > difference was that the allocation that triggered the reclaim path > you've reported occurred when 5k of the stack had already been > used... > > > > Of course, we might sweep every sites we have found for reducing > > > stack usage but I'm not sure how long it saves the world(surely, > > > lots of developer start to add nice features which will use stack > > > agains) and if we consider another more complex feature in I/O layer > > > and/or reclaim path, it might be better to increase stack size( > > > meanwhile, stack usage on 64bit machine was doubled compared to 32bit > > > while it have sticked to 8K. Hmm, it's not a fair to me and arm64 > > > already expaned to 16K. ) > > Yup, that's all been pointed out previously. 8k stacks were never > large enough to fit the linux IO architecture on x86-64, but nobody > outside filesystem and IO developers has been willing to accept that > argument as valid, despite regular stack overruns and filesystem > having to add workaround after workaround to prevent stack overruns. > > That's why stuff like this appears in various filesystem's > ->writepage: > > /* > * Refuse to write the page out if we are called from reclaim context. > * > * This avoids stack overflows when called from deeply used stacks in > * random callers for direct reclaim or memcg reclaim. We explicitly > * allow reclaim from kswapd as the stack usage there is relatively low. > * > * This should never happen except in the case of a VM regression so > * warn about it. > */ > if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == > PF_MEMALLOC)) > goto redirty; > > That still doesn't guarantee us enough stack space to do writeback, > though, because memory allocation can occur when reading in metadata > needed to do delayed allocation, and so we could trigger GFP_NOFS > memory allocation from the flusher thread with 4-5k of stack already > consumed, so that would still overrun teh stack. > > So, a couple of years ago we started defering half the writeback > stack usage to a worker thread (commit c999a22 "xfs: introduce an > allocation workqueue"), under the assumption that the worst stack > usage when we call memory allocation is around 3-3.5k of stack used. > We thought that would be safe, but the stack trace you've posted > shows that alloc_page(GFP_NOFS) can consume upwards of 5k of stack, > which means we're still screwed despite all the workarounds we have > in place. The allocation and reclaim stack itself is only 2k per the stacktrace below. What got us in this particular case is that we engaged a complicated block layer setup from within the allocation context in order to swap out a page. In the past we disabled filesystem ->writepage from within the allocation context and deferred it to kswapd for stack reasons (see the WARN_ON_ONCE and the comment in your above quote), but I think we have to go further and do the same for even swap_writepage(): > > > I guess this topic was discussed several time so there might be > > > strong reason not to increase kernel stack size on x86_64, for me not > > > knowing so Ccing x86_64 maintainers, other MM guys and virtio > > > maintainers. > > > > > > Depth Size Location (51 entries) > > > > > > 0) 7696 16 lookup_address+0x28/0x30 > > > 1) 7680 16 _lookup_address_cpa.isra.3+0x3b/0x40 > > > 2) 7664 24 __change_page_attr_set_clr+0xe0/0xb50 > > > 3) 7640 392 kernel_map_pages+0x6c/0x120 > > > 4) 7248 256 get_page_from_freelist+0x489/0x920 > > > 5) 6992 352 __alloc_pages_nodemask+0x5e1/0xb20 > > > 6) 6640 8 alloc_pages_current+0x10f/0x1f0 > > > 7) 6632 168 new_slab+0x2c5/0x370 > > > 8) 6464 8 __slab_alloc+0x3a9/0x501 > > > 9) 6456 80 __kmalloc+0x1cb/0x200 > > > 10) 6376 376 vring_add_indirect+0x36/0x200 > > > 11) 6000 144 virtqueue_add_sgs+0x2e2/0x320 > > > 12) 5856 288 __virtblk_add_req+0xda/0x1b0 > > > 13) 5568 96 virtio_queue_rq+0xd3/0x1d0 > > > 14) 5472 128 __blk_mq_run_hw_queue+0x1ef/0x440 > > > 15) 5344 16 blk_mq_run_hw_queue+0x35/0x40 > > > 16) 5328 96 blk_mq_insert_requests+0xdb/0x160 > > > 17) 5232 112 blk_mq_flush_plug_list+0x12b/0x140 > > > 18) 5120 112 blk_flush_plug_list+0xc7/0x220 > > > 19) 5008 64 io_schedule_timeout+0x88/0x100 > > > 20) 4944 128 mempool_alloc+0x145/0x170 > > > 21) 4816 96 bio_alloc_bioset+0x10b/0x1d0 > > > 22) 4720 48 get_swap_bio+0x30/0x90 > > > 23) 4672 160 __swap_writepage+0x150/0x230 > > > 24) 4512 32 swap_writepage+0x42/0x90 Without swap IO from the allocation context, the stack would have ended here, which would have been easily survivable. And left the writeout work to kswapd, which has a much shallower stack than this: > > > 25) 4480 320 shrink_page_list+0x676/0xa80 > > > 26) 4160 208 shrink_inactive_list+0x262/0x4e0 > > > 27) 3952 304 shrink_lruvec+0x3e1/0x6a0 > > > 28) 3648 80 shrink_zone+0x3f/0x110 > > > 29) 3568 128 do_try_to_free_pages+0x156/0x4c0 > > > 30) 3440 208 try_to_free_pages+0xf7/0x1e0 > > > 31) 3232 352 __alloc_pages_nodemask+0x783/0xb20 > > > 32) 2880 8 alloc_pages_current+0x10f/0x1f0 > > > 33) 2872 200 __page_cache_alloc+0x13f/0x160 > > > 34) 2672 80 find_or_create_page+0x4c/0xb0 > > > 35) 2592 80 ext4_mb_load_buddy+0x1e9/0x370 > > > 36) 2512 176 ext4_mb_regular_allocator+0x1b7/0x460 > > > 37) 2336 128 ext4_mb_new_blocks+0x458/0x5f0 > > > 38) 2208 256 ext4_ext_map_blocks+0x70b/0x1010 > > > 39) 1952 160 ext4_map_blocks+0x325/0x530 > > > 40) 1792 384 ext4_writepages+0x6d1/0xce0 > > > 41) 1408 16 do_writepages+0x23/0x40 > > > 42) 1392 96 __writeback_single_inode+0x45/0x2e0 > > > 43) 1296 176 writeback_sb_inodes+0x2ad/0x500 > > > 44) 1120 80 __writeback_inodes_wb+0x9e/0xd0 > > > 45) 1040 160 wb_writeback+0x29b/0x350 > > > 46) 880 208 bdi_writeback_workfn+0x11c/0x480 > > > 47) 672 144 process_one_work+0x1d2/0x570 > > > 48) 528 112 worker_thread+0x116/0x370 > > > 49) 416 240 kthread+0xf3/0x110 > > > 50) 176 176 ret_from_fork+0x7c/0xb0 > > Impressive: 3 nested allocations - GFP_NOFS, GFP_NOIO and then > GFP_ATOMIC before the stack goes boom. XFS usually only needs 2... Do they also usually involve swap_writepage()? --- diff --git a/mm/page_io.c b/mm/page_io.c index 7c59ef681381..02e7e3c168cf 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -233,6 +233,22 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) { int ret = 0; + /* + * Refuse to write the page out if we are called from reclaim context. + * + * This avoids stack overflows when called from deeply used stacks in + * random callers for direct reclaim or memcg reclaim. We explicitly + * allow reclaim from kswapd as the stack usage there is relatively low. + * + * This should never happen except in the case of a VM regression so + * warn about it. + */ + if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == + PF_MEMALLOC)) { + SetPageDirty(page); + goto out; + } + if (try_to_free_swap(page)) { unlock_page(page); goto out; diff --git a/mm/vmscan.c b/mm/vmscan.c index 61c576083c07..99cca6633e0d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -985,13 +985,12 @@ static unsigned long shrink_page_list(struct list_head *page_list, if (PageDirty(page)) { /* - * Only kswapd can writeback filesystem pages to - * avoid risk of stack overflow but only writeback + * Only kswapd can writeback pages to avoid + * risk of stack overflow but only writeback * if many dirty pages have been encountered. */ - if (page_is_file_cache(page) && - (!current_is_kswapd() || - !zone_is_reclaim_dirty(zone))) { + if (!current_is_kswapd() || + !zone_is_reclaim_dirty(zone))) { /* * Immediately reclaim when written back. * Similar in principal to deactivate_page() From david@fromorbit.com Wed May 28 16:55:36 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D4C067F60 for <xfs@oss.sgi.com>; Wed, 28 May 2014 16:55:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7269EAC001 for <xfs@oss.sgi.com>; Wed, 28 May 2014 14:55:35 -0700 (PDT) X-ASG-Debug-ID: 1401314131-04bdf059a1233e30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0QMg9ocizBEt2tfi for <xfs@oss.sgi.com>; Wed, 28 May 2014 14:55:32 -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: ApFJAAJbhlN5LL1sPGdsb2JhbABagwdSgnKndQEBAQEBAQaYHQGBDhcDAQEBATg1giUBAQQBJxMcIwULCAMOBAYJJQ8FJQMHBhQTHogcBw7YKhaFP4cDgTFJB4RABJVzhAGLGItaKy+BAg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 29 May 2014 07:25:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1Wploc-0008EL-Nl; Thu, 29 May 2014 07:55:18 +1000 Date: Thu, 29 May 2014 07:55:18 +1000 From: Dave Chinner <david@fromorbit.com> To: Johannes Weiner <hannes@cmpxchg.org> Cc: Minchan Kim <minchan@kernel.org>, linux-kernel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>, linux-mm@kvack.org, "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>, Peter Zijlstra <a.p.zijlstra@chello.nl>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Hugh Dickins <hughd@google.com>, rusty@rustcorp.com.au, mst@redhat.com, Dave Hansen <dave.hansen@intel.com>, Steven Rostedt <rostedt@goodmis.org>, xfs@oss.sgi.com Subject: Re: [RFC 2/2] x86_64: expand kernel stack to 16K Message-ID: <20140528215518.GM8554@dastard> X-ASG-Orig-Subj: Re: [RFC 2/2] x86_64: expand kernel stack to 16K References: <1401260039-18189-1-git-send-email-minchan@kernel.org> <1401260039-18189-2-git-send-email-minchan@kernel.org> <20140528083738.GL8554@dastard> <20140528091345.GD6677@dastard> <20140528160658.GH2878@cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528160658.GH2878@cmpxchg.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: 1401314131 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.6194 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 28, 2014 at 12:06:58PM -0400, Johannes Weiner wrote: > On Wed, May 28, 2014 at 07:13:45PM +1000, Dave Chinner wrote: > > On Wed, May 28, 2014 at 06:37:38PM +1000, Dave Chinner wrote: > > > [ cc XFS list ] > > > > [and now there is a complete copy on the XFs list, I'll add my 2c] > > > > > On Wed, May 28, 2014 at 03:53:59PM +0900, Minchan Kim wrote: > > > > While I play inhouse patches with much memory pressure on qemu-kvm, > > > > 3.14 kernel was randomly crashed. The reason was kernel stack overflow. > > > > > > > > When I investigated the problem, the callstack was a little bit deeper > > > > by involve with reclaim functions but not direct reclaim path. > > > > > > > > I tried to diet stack size of some functions related with alloc/reclaim > > > > so did a hundred of byte but overflow was't disappeard so that I encounter > > > > overflow by another deeper callstack on reclaim/allocator path. > > > > That's a no win situation. The stack overruns through ->writepage > > we've been seeing with XFS over the past *4 years* are much larger > > than a few bytes. The worst case stack usage on a virtio block > > device was about 10.5KB of stack usage. > > > > And, like this one, it came from the flusher thread as well. The > > difference was that the allocation that triggered the reclaim path > > you've reported occurred when 5k of the stack had already been > > used... > > > > > > Of course, we might sweep every sites we have found for reducing > > > > stack usage but I'm not sure how long it saves the world(surely, > > > > lots of developer start to add nice features which will use stack > > > > agains) and if we consider another more complex feature in I/O layer > > > > and/or reclaim path, it might be better to increase stack size( > > > > meanwhile, stack usage on 64bit machine was doubled compared to 32bit > > > > while it have sticked to 8K. Hmm, it's not a fair to me and arm64 > > > > already expaned to 16K. ) > > > > Yup, that's all been pointed out previously. 8k stacks were never > > large enough to fit the linux IO architecture on x86-64, but nobody > > outside filesystem and IO developers has been willing to accept that > > argument as valid, despite regular stack overruns and filesystem > > having to add workaround after workaround to prevent stack overruns. > > > > That's why stuff like this appears in various filesystem's > > ->writepage: > > > > /* > > * Refuse to write the page out if we are called from reclaim context. > > * > > * This avoids stack overflows when called from deeply used stacks in > > * random callers for direct reclaim or memcg reclaim. We explicitly > > * allow reclaim from kswapd as the stack usage there is relatively low. > > * > > * This should never happen except in the case of a VM regression so > > * warn about it. > > */ > > if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == > > PF_MEMALLOC)) > > goto redirty; > > > > That still doesn't guarantee us enough stack space to do writeback, > > though, because memory allocation can occur when reading in metadata > > needed to do delayed allocation, and so we could trigger GFP_NOFS > > memory allocation from the flusher thread with 4-5k of stack already > > consumed, so that would still overrun teh stack. > > > > So, a couple of years ago we started defering half the writeback > > stack usage to a worker thread (commit c999a22 "xfs: introduce an > > allocation workqueue"), under the assumption that the worst stack > > usage when we call memory allocation is around 3-3.5k of stack used. > > We thought that would be safe, but the stack trace you've posted > > shows that alloc_page(GFP_NOFS) can consume upwards of 5k of stack, > > which means we're still screwed despite all the workarounds we have > > in place. > > The allocation and reclaim stack itself is only 2k per the stacktrace > below. What got us in this particular case is that we engaged a > complicated block layer setup from within the allocation context in > order to swap out a page. The report does not have a complicated block layer setup - it's just a swap device on a virtio device. There's no MD, no raid, no complex transport and protocol layer, etc. It's about as simple as it gets. > In the past we disabled filesystem ->writepage from within the > allocation context and deferred it to kswapd for stack reasons (see > the WARN_ON_ONCE and the comment in your above quote), but I think we > have to go further and do the same for even swap_writepage(): I don't think that solves the problem. I've seen plenty of near stack overflows that were caused by >3k of stack being used because of memory allocation/reclaim overhead and then scheduling. usage and another 1k of stack scheduling waiting. If we have a subsystem that can put >3k on the stack at arbitrary locations, then we really only have <5k of stack available for callers. And when the generic code typically consumes 1-2k of stack before we get to filesystem specific methods, we only have 3-4k of stack left for the worst case storage path stack usage. With the block layer and driver layers requiring 2.5-3k because they can do memory allocation and schedule, that leaves very little for the layers in the middle, which is arguably the most algorithmically complex layer of the storage stack..... > > > > I guess this topic was discussed several time so there might be > > > > strong reason not to increase kernel stack size on x86_64, for me not > > > > knowing so Ccing x86_64 maintainers, other MM guys and virtio > > > > maintainers. > > > > > > > > Depth Size Location (51 entries) > > > > > > > > 0) 7696 16 lookup_address+0x28/0x30 > > > > 1) 7680 16 _lookup_address_cpa.isra.3+0x3b/0x40 > > > > 2) 7664 24 __change_page_attr_set_clr+0xe0/0xb50 > > > > 3) 7640 392 kernel_map_pages+0x6c/0x120 > > > > 4) 7248 256 get_page_from_freelist+0x489/0x920 > > > > 5) 6992 352 __alloc_pages_nodemask+0x5e1/0xb20 > > > > 6) 6640 8 alloc_pages_current+0x10f/0x1f0 > > > > 7) 6632 168 new_slab+0x2c5/0x370 > > > > 8) 6464 8 __slab_alloc+0x3a9/0x501 > > > > 9) 6456 80 __kmalloc+0x1cb/0x200 > > > > 10) 6376 376 vring_add_indirect+0x36/0x200 > > > > 11) 6000 144 virtqueue_add_sgs+0x2e2/0x320 > > > > 12) 5856 288 __virtblk_add_req+0xda/0x1b0 > > > > 13) 5568 96 virtio_queue_rq+0xd3/0x1d0 > > > > 14) 5472 128 __blk_mq_run_hw_queue+0x1ef/0x440 > > > > 15) 5344 16 blk_mq_run_hw_queue+0x35/0x40 > > > > 16) 5328 96 blk_mq_insert_requests+0xdb/0x160 > > > > 17) 5232 112 blk_mq_flush_plug_list+0x12b/0x140 > > > > 18) 5120 112 blk_flush_plug_list+0xc7/0x220 > > > > 19) 5008 64 io_schedule_timeout+0x88/0x100 > > > > 20) 4944 128 mempool_alloc+0x145/0x170 > > > > 21) 4816 96 bio_alloc_bioset+0x10b/0x1d0 > > > > 22) 4720 48 get_swap_bio+0x30/0x90 > > > > 23) 4672 160 __swap_writepage+0x150/0x230 > > > > 24) 4512 32 swap_writepage+0x42/0x90 > > Without swap IO from the allocation context, the stack would have > ended here, which would have been easily survivable. And left the > writeout work to kswapd, which has a much shallower stack than this: Sure, but this is just playing whack-a-stack. We can keep slapping band-aids and restrictions on code and make the code more complex, constrainted, convouted and slower, or we can just increase the stack size.... > > > > 25) 4480 320 shrink_page_list+0x676/0xa80 > > > > 26) 4160 208 shrink_inactive_list+0x262/0x4e0 > > > > 27) 3952 304 shrink_lruvec+0x3e1/0x6a0 > > > > 28) 3648 80 shrink_zone+0x3f/0x110 > > > > 29) 3568 128 do_try_to_free_pages+0x156/0x4c0 > > > > 30) 3440 208 try_to_free_pages+0xf7/0x1e0 > > > > 31) 3232 352 __alloc_pages_nodemask+0x783/0xb20 > > > > 32) 2880 8 alloc_pages_current+0x10f/0x1f0 > > > > 33) 2872 200 __page_cache_alloc+0x13f/0x160 > > > > 34) 2672 80 find_or_create_page+0x4c/0xb0 > > > > 35) 2592 80 ext4_mb_load_buddy+0x1e9/0x370 > > > > 36) 2512 176 ext4_mb_regular_allocator+0x1b7/0x460 > > > > 37) 2336 128 ext4_mb_new_blocks+0x458/0x5f0 > > > > 38) 2208 256 ext4_ext_map_blocks+0x70b/0x1010 > > > > 39) 1952 160 ext4_map_blocks+0x325/0x530 > > > > 40) 1792 384 ext4_writepages+0x6d1/0xce0 > > > > 41) 1408 16 do_writepages+0x23/0x40 > > > > 42) 1392 96 __writeback_single_inode+0x45/0x2e0 > > > > 43) 1296 176 writeback_sb_inodes+0x2ad/0x500 > > > > 44) 1120 80 __writeback_inodes_wb+0x9e/0xd0 > > > > 45) 1040 160 wb_writeback+0x29b/0x350 > > > > 46) 880 208 bdi_writeback_workfn+0x11c/0x480 > > > > 47) 672 144 process_one_work+0x1d2/0x570 > > > > 48) 528 112 worker_thread+0x116/0x370 > > > > 49) 416 240 kthread+0xf3/0x110 > > > > 50) 176 176 ret_from_fork+0x7c/0xb0 > > > > Impressive: 3 nested allocations - GFP_NOFS, GFP_NOIO and then > > GFP_ATOMIC before the stack goes boom. XFS usually only needs 2... > > Do they also usually involve swap_writepage()? No. Have a look at this recent thread when Dave Jones reported trinity was busting the stack. http://oss.sgi.com/archives/xfs/2014-02/msg00325.html What happens when a shrinker issues IO: http://oss.sgi.com/archives/xfs/2014-02/msg00361.html Yes, there was an XFS problem in there that was fixed (by moving work to a workqueue!) but the point is that swap is not the only path through memory allocation that can consume huge amounts of stack. That above trace also points out a path through the scheduler of close to 1k of stack usage. That gets worse - wait_for_completion() typically requires 1.5k of stack.... Contributing is the new blk-mq layer, which from the above stack trace still hasn't been fixed: http://oss.sgi.com/archives/xfs/2014-02/msg00355.html and a lot of the stack usage is because of saved registers on each function call: http://oss.sgi.com/archives/xfs/2014-02/msg00470.html And here's a good set of examples of the amount of stack certain functions can require: http://oss.sgi.com/archives/xfs/2014-02/msg00365.html Am I the only person who sees a widespread problem here? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed May 28 17:49:07 2014 Return-Path: <david@fromorbit.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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF7F17F51 for <xfs@oss.sgi.com>; Wed, 28 May 2014 17:49:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24081AC002 for <xfs@oss.sgi.com>; Wed, 28 May 2014 15:49:07 -0700 (PDT) X-ASG-Debug-ID: 1401317341-04cbb050fc10940001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kihDewc2qK7OCfb1 for <xfs@oss.sgi.com>; Wed, 28 May 2014 15:49:01 -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: AotJAMNmhlN5LL1sPGdsb2JhbABAGoMHUoJyp3UBAQEBAQEGmB0BgQ8XAwEBAQE4NYIlAQEFOhwjEAgDFQMJJQ8FJQMHGhOIQQ4213cWhT+INEkHhEAEhF8DlRKLGItaKy+BAg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 29 May 2014 08:19:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from <david@fromorbit.com>) id 1WpmeZ-0008NV-Fg; Thu, 29 May 2014 08:48:59 +1000 Date: Thu, 29 May 2014 08:48:59 +1000 From: Dave Chinner <david@fromorbit.com> To: Mark Tinguely <tinguely@sgi.com> Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <20140528224859.GP8554@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528002906.GH8554@dastard> 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: 1401317341 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6195 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, May 28, 2014 at 10:29:06AM +1000, Dave Chinner wrote: > On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: > > On 05/27/14 17:51, Dave Chinner wrote: > > >On Tue, May 27, 2014 at 05:20:02PM -0500, Mark Tinguely wrote: > > >>On 09/02/13 09:29, Namjae Jeon wrote: > > >>>From: Namjae Jeon<namjae.jeon@samsung.com> > > >>> > > >>>Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. > > >>> > > >>>Signed-off-by: Namjae Jeon<namjae.jeon@samsung.com> > > >>>Signed-off-by: Ashish Sangwan<a.sangwan@samsung.com> > > >>>--- > > >> > > >>>+ /* Check if we can merge 2 adjacent extents */ > > >>>+ if ((state& BMAP_LEFT_VALID)&& !(state& BMAP_LEFT_DELAY)&& > > >>>+ left.br_startoff + left.br_blockcount == startoff&& > > >>>+ left.br_startblock + left.br_blockcount == > > >>>+ xfs_bmbt_get_startblock(gotp)&& > > >>>+ xfs_bmbt_get_state(gotp) == left.br_state&& > > >>>+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp)<= > > >>>+ MAXEXTLEN) { > > >>>+ blockcount = > > >>>+ left.br_blockcount + xfs_bmbt_get_blockcount(gotp); > > >>>+ state |= BMAP_LEFT_CONTIG; > > >>>+ xfs_iext_remove(ip, *current_ext, 1, 0); > > >>>+ XFS_IFORK_NEXT_SET(ip, whichfork, > > >>>+ XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > > >>>+ gotp = xfs_iext_get_ext(ifp, --*current_ext); > > >>>+ } > > >>>+ > > >>>+ if (cur) { > > >>>+ error = xfs_bmbt_lookup_eq(cur, > > >>>+ xfs_bmbt_get_startoff(gotp), > > >>>+ xfs_bmbt_get_startblock(gotp), > > >>>+ xfs_bmbt_get_blockcount(gotp), > > >>>+ &i); > > >>>+ if (error) > > >>>+ goto del_cursor; > > >>>+ XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > >> > > >>I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a > > >>fsstress that fills the filesystem: > > >> > > >>xfstests> ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192& > > > > > >Hasn't reproduced after 10 minutes of running at ENOSPC here - how > > >long does it take to reproduce? What storage hardware are you > > >testing on? How many CPUs? RAM? .... > > > > > >http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > > > > >Cheers, > > > > > >Dave. > > > > A 7-8 hours on spinning rust. This is my burn in test. > > Can you try to narrow the problem down? Otherwise it's going to be a > case of looking for a needle in a haystack.... The VMs I've left this running on have now been doing so for almost 24 hours without triggering any issues. I'm really going to need a more refined reproducer for this to confirm it is a real problem and not a new machine burn-in issue... Cheers, Dave. -- Dave Chinner david@fromorbit.com From prvs=1218e93b2a=info@ministop.com.ph Wed May 28 18:54:53 2014 Return-Path: <prvs=1218e93b2a=info@ministop.com.ph> 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=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 671667F60 for <xfs@oss.sgi.com>; Wed, 28 May 2014 18:54:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 511BC8F8035 for <xfs@oss.sgi.com>; Wed, 28 May 2014 16:54:50 -0700 (PDT) X-ASG-Debug-ID: 1401321284-04cb6c22b522ec00001-NocioJ Received: from rrgcnsophos.retaildomain.com.ph (mail2.robinsonsretail.com.ph [115.146.135.100]) by cuda.sgi.com with ESMTP id zT7ZCCq9kpSD6E6I for <xfs@oss.sgi.com>; Wed, 28 May 2014 16:54:45 -0700 (PDT) X-Barracuda-Envelope-From: prvs=1218e93b2a=info@ministop.com.ph X-Barracuda-Apparent-Source-IP: 115.146.135.100 Received: from rrgcnsophos.retaildomain.com.ph (localhost.localdomain [127.0.0.1]) by localhost (Email Security Appliance) with SMTP id 7A8834F93787_38660B4B; Wed, 28 May 2014 22:18:28 +0000 (GMT) Received: from mail.ministop.com.ph (smtp.ministop.com.ph [115.146.135.106]) by rrgcnsophos.retaildomain.com.ph (Sophos Email Appliance) with ESMTP id A86774F90E72_38660AFF; Wed, 28 May 2014 22:18:23 +0000 (GMT) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.ministop.com.ph (Postfix) with ESMTP id 51B587C848A; Thu, 29 May 2014 06:12:32 +0800 (PHT) X-Virus-Scanned: amavisd-new at mail.ministop.com.ph Received: from mail.ministop.com.ph ([127.0.0.1]) by localhost (mail.ministop.com.ph [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jgSH+9rCfpgk; Thu, 29 May 2014 06:12:31 +0800 (PHT) Received: from mail.ministop.com.ph (mail.ministop.com.ph [115.146.135.106]) by mail.ministop.com.ph (Postfix) with ESMTP id 589B610F00C3; Thu, 29 May 2014 06:12:22 +0800 (PHT) Date: Thu, 29 May 2014 06:12:21 +0800 (PHT) From: Money Gram International Money Transfer <info@ministop.com.ph> Reply-To: "money_gramintl_careceo.com@careceo.com" <money_gramintl_careceo.com@careceo.com> Message-ID: <22447367.39319.1401315141873.JavaMail.root@mail.ministop.com.ph> Subject: MONEY GRAM INTERNATIONAL MIME-Version: 1.0 X-ASG-Orig-Subj: MONEY GRAM INTERNATIONAL Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [196.46.246.48] X-Mailer: Zimbra 6.0.6_GA_2324.RHEL5 (zclient/6.0.6_GA_2324.RHEL5) To: undisclosed-recipients:; X-Barracuda-Connect: mail2.robinsonsretail.com.ph[115.146.135.100] X-Barracuda-Start-Time: 1401321284 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.13 X-Barracuda-Spam-Status: No, SCORE=2.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6196 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.50 BSF_SC0_SA620a Custom Rule SA620a 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 MONEY GRAM SENT THE SUM OF $ 5,000 TO YOU. REF #:94978440 kindly contact MR. PAUL HOWARD FOR MORE DETAILS,EMAIL: money_gramintl_careceo.com@careceo.com <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> <meta name="GENERATOR" content="PageBreeze Free HTML Editor (http://www.pagebreeze.com)"> <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" > <title>disclaimer final

Disclaimer:
This email and any files transmitted with it are intended solely for the individual or entity that these are addressed to. These are confidential and may be legally privileged or protected by law. If you received this e-mail in error, please notify the sender immediately and delete this e-mail from your system. Unauthorized use, copying, or disclosure of any part or in full of this e-mail is strictly prohibited. This e-mail does not automatically represent the official policy or opinion of any of the companies under the Robinsons Retail Group.

From junxiao.bi@oracle.com Wed May 28 20:45:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 CC24229DFE for ; Wed, 28 May 2014 20:45:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B8F178F806F for ; Wed, 28 May 2014 18:45:56 -0700 (PDT) X-ASG-Debug-ID: 1401327951-04cbb050fc1b940001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id cS7mHpFtiXsASuy0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 28 May 2014 18:45:52 -0700 (PDT) X-Barracuda-Envelope-From: junxiao.bi@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s4T1jSkX018413 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 29 May 2014 01:45:28 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4T1jRsI013540 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 29 May 2014 01:45:27 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s4T1jQoP012751; Thu, 29 May 2014 01:45:26 GMT Received: from [10.182.39.153] (/10.182.39.153) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 28 May 2014 18:45:26 -0700 Message-ID: <53869169.5070203@oracle.com> Date: Thu, 29 May 2014 09:46:17 +0800 From: Junxiao Bi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com, joe.jin@oracle.com Subject: Re: [PATCH] xfsprogs: xfs_copy: fix data corruption of target References: <1401247687-6444-1-git-send-email-junxiao.bi@oracle.com> <20140528053241.GC3816@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: xfs_copy: fix data corruption of target In-Reply-To: <20140528053241.GC3816@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1401327952 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.6198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/28/2014 01:32 PM, Christoph Hellwig wrote: > On Wed, May 28, 2014 at 11:28:07AM +0800, Junxiao Bi wrote: >> The unit of XFS_AGFL_DADDR(mp) is "basic block" whose size is "BBSIZE" >> (512 bytes), so when "source_sectorsize" is not 512, it will cause the >> target a corrupted filesystem. >> >> Signed-off-by: Junxiao Bi > Looks good. Any chance you could create a testcase for this as well? I will try. Thank you for review it. Thanks, Junxiao. > > > Reviewed-by: Christoph Hellwig From guz.fnst@cn.fujitsu.com Wed May 28 22:45:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 05DD37F5E for ; Wed, 28 May 2014 22:45:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06BC330404E for ; Wed, 28 May 2014 20:45:06 -0700 (PDT) X-ASG-Debug-ID: 1401335104-04cbb050fa22870001-NocioJ Received: from heian.cn.fujitsu.com (cn.fujitsu.com [59.151.112.132]) by cuda.sgi.com with ESMTP id vn1HzHku19AcGkWu for ; Wed, 28 May 2014 20:45:05 -0700 (PDT) X-Barracuda-Envelope-From: guz.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 59.151.112.132 X-IronPort-AV: E=Sophos;i="4.98,932,1392134400"; d="scan'208";a="31165308" Received: from unknown (HELO edo.cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 29 May 2014 11:42:22 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (localhost.localdomain [127.0.0.1]) by edo.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s4T3iuSV007164; Thu, 29 May 2014 11:44:56 +0800 Received: from [10.167.226.100] (10.167.226.100) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.146.2; Thu, 29 May 2014 11:44:56 +0800 Message-ID: <5386AABD.5070708@cn.fujitsu.com> Date: Thu, 29 May 2014 11:34:21 +0800 From: Gu Zheng User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1 MIME-Version: 1.0 To: Dave Chinner CC: , linux-kernel Subject: Re: xfs: possible deadlock warning References: <538571D4.70904@cn.fujitsu.com> <20140528060050.GK8554@dastard> X-ASG-Orig-Subj: Re: xfs: possible deadlock warning In-Reply-To: <20140528060050.GK8554@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.167.226.100] X-Barracuda-Connect: cn.fujitsu.com[59.151.112.132] X-Barracuda-Start-Time: 1401335104 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.6200 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On 05/28/2014 02:00 PM, Dave Chinner wrote: > On Wed, May 28, 2014 at 01:19:16PM +0800, Gu Zheng wrote: >> Hi all, >> When running the latest Linus' tree, the following possible deadlock warning occurs. > > false positive. There isn't a deadlock between inode locks on > different filesystems. i.e. there is no dependency between shmem > inodes and xfs inodes, nor on their security contexts. Nor can you > take a page fault on a directory inode, which is the XFS inode lock > class it's complaining about. If it's really a noisy, can we avoid this? Thanks, Gu > > Fundamentally, the problem here is shmem instantiating a new inode > with the mmap_sem held. That's just plain wrong... Agree, it's better to prepare the file before going into the protection region. > > > Cheers, > > Dave. From minchan@kernel.org Thu May 29 01:05:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E08C57F6A for ; Thu, 29 May 2014 01:05:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CCDAB8F8049 for ; Wed, 28 May 2014 23:05:46 -0700 (PDT) X-ASG-Debug-ID: 1401343542-04cbb050fa29b90001-NocioJ Received: from lgeamrelo02.lge.com (lgeamrelo02.lge.com [156.147.1.126]) by cuda.sgi.com with ESMTP id D2ZT4FB0zjchh1uo for ; Wed, 28 May 2014 23:05:43 -0700 (PDT) X-Barracuda-Envelope-From: minchan@kernel.org X-Barracuda-Apparent-Source-IP: 156.147.1.126 Received: from unknown (HELO localhost) (10.177.220.169) by 156.147.1.126 with ESMTP; 29 May 2014 15:05:38 +0900 X-Original-SENDERIP: 10.177.220.169 X-Original-MAILFROM: minchan@kernel.org Date: Thu, 29 May 2014 15:06:14 +0900 From: Minchan Kim To: Johannes Weiner Cc: Dave Chinner , linux-kernel@vger.kernel.org, Andrew Morton , linux-mm@kvack.org, "H. Peter Anvin" , Ingo Molnar , Peter Zijlstra , Mel Gorman , Rik van Riel , Hugh Dickins , rusty@rustcorp.com.au, mst@redhat.com, Dave Hansen , Steven Rostedt , xfs@oss.sgi.com Subject: Re: [RFC 2/2] x86_64: expand kernel stack to 16K Message-ID: <20140529060614.GG10092@bbox> X-ASG-Orig-Subj: Re: [RFC 2/2] x86_64: expand kernel stack to 16K References: <1401260039-18189-1-git-send-email-minchan@kernel.org> <1401260039-18189-2-git-send-email-minchan@kernel.org> <20140528083738.GL8554@dastard> <20140528091345.GD6677@dastard> <20140528160658.GH2878@cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140528160658.GH2878@cmpxchg.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: lgeamrelo02.lge.com[156.147.1.126] X-Barracuda-Start-Time: 1401343542 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.6203 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, May 28, 2014 at 12:06:58PM -0400, Johannes Weiner wrote: > On Wed, May 28, 2014 at 07:13:45PM +1000, Dave Chinner wrote: > > On Wed, May 28, 2014 at 06:37:38PM +1000, Dave Chinner wrote: > > > [ cc XFS list ] > > > > [and now there is a complete copy on the XFs list, I'll add my 2c] > > > > > On Wed, May 28, 2014 at 03:53:59PM +0900, Minchan Kim wrote: > > > > While I play inhouse patches with much memory pressure on qemu-kvm, > > > > 3.14 kernel was randomly crashed. The reason was kernel stack overflow. > > > > > > > > When I investigated the problem, the callstack was a little bit deeper > > > > by involve with reclaim functions but not direct reclaim path. > > > > > > > > I tried to diet stack size of some functions related with alloc/reclaim > > > > so did a hundred of byte but overflow was't disappeard so that I encounter > > > > overflow by another deeper callstack on reclaim/allocator path. > > > > That's a no win situation. The stack overruns through ->writepage > > we've been seeing with XFS over the past *4 years* are much larger > > than a few bytes. The worst case stack usage on a virtio block > > device was about 10.5KB of stack usage. > > > > And, like this one, it came from the flusher thread as well. The > > difference was that the allocation that triggered the reclaim path > > you've reported occurred when 5k of the stack had already been > > used... > > > > > > Of course, we might sweep every sites we have found for reducing > > > > stack usage but I'm not sure how long it saves the world(surely, > > > > lots of developer start to add nice features which will use stack > > > > agains) and if we consider another more complex feature in I/O layer > > > > and/or reclaim path, it might be better to increase stack size( > > > > meanwhile, stack usage on 64bit machine was doubled compared to 32bit > > > > while it have sticked to 8K. Hmm, it's not a fair to me and arm64 > > > > already expaned to 16K. ) > > > > Yup, that's all been pointed out previously. 8k stacks were never > > large enough to fit the linux IO architecture on x86-64, but nobody > > outside filesystem and IO developers has been willing to accept that > > argument as valid, despite regular stack overruns and filesystem > > having to add workaround after workaround to prevent stack overruns. > > > > That's why stuff like this appears in various filesystem's > > ->writepage: > > > > /* > > * Refuse to write the page out if we are called from reclaim context. > > * > > * This avoids stack overflows when called from deeply used stacks in > > * random callers for direct reclaim or memcg reclaim. We explicitly > > * allow reclaim from kswapd as the stack usage there is relatively low. > > * > > * This should never happen except in the case of a VM regression so > > * warn about it. > > */ > > if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == > > PF_MEMALLOC)) > > goto redirty; > > > > That still doesn't guarantee us enough stack space to do writeback, > > though, because memory allocation can occur when reading in metadata > > needed to do delayed allocation, and so we could trigger GFP_NOFS > > memory allocation from the flusher thread with 4-5k of stack already > > consumed, so that would still overrun teh stack. > > > > So, a couple of years ago we started defering half the writeback > > stack usage to a worker thread (commit c999a22 "xfs: introduce an > > allocation workqueue"), under the assumption that the worst stack > > usage when we call memory allocation is around 3-3.5k of stack used. > > We thought that would be safe, but the stack trace you've posted > > shows that alloc_page(GFP_NOFS) can consume upwards of 5k of stack, > > which means we're still screwed despite all the workarounds we have > > in place. > > The allocation and reclaim stack itself is only 2k per the stacktrace > below. What got us in this particular case is that we engaged a > complicated block layer setup from within the allocation context in > order to swap out a page. > > In the past we disabled filesystem ->writepage from within the > allocation context and deferred it to kswapd for stack reasons (see > the WARN_ON_ONCE and the comment in your above quote), but I think we > have to go further and do the same for even swap_writepage(): > > > > > I guess this topic was discussed several time so there might be > > > > strong reason not to increase kernel stack size on x86_64, for me not > > > > knowing so Ccing x86_64 maintainers, other MM guys and virtio > > > > maintainers. > > > > > > > > Depth Size Location (51 entries) > > > > > > > > 0) 7696 16 lookup_address+0x28/0x30 > > > > 1) 7680 16 _lookup_address_cpa.isra.3+0x3b/0x40 > > > > 2) 7664 24 __change_page_attr_set_clr+0xe0/0xb50 > > > > 3) 7640 392 kernel_map_pages+0x6c/0x120 > > > > 4) 7248 256 get_page_from_freelist+0x489/0x920 > > > > 5) 6992 352 __alloc_pages_nodemask+0x5e1/0xb20 > > > > 6) 6640 8 alloc_pages_current+0x10f/0x1f0 > > > > 7) 6632 168 new_slab+0x2c5/0x370 > > > > 8) 6464 8 __slab_alloc+0x3a9/0x501 > > > > 9) 6456 80 __kmalloc+0x1cb/0x200 > > > > 10) 6376 376 vring_add_indirect+0x36/0x200 > > > > 11) 6000 144 virtqueue_add_sgs+0x2e2/0x320 > > > > 12) 5856 288 __virtblk_add_req+0xda/0x1b0 > > > > 13) 5568 96 virtio_queue_rq+0xd3/0x1d0 > > > > 14) 5472 128 __blk_mq_run_hw_queue+0x1ef/0x440 > > > > 15) 5344 16 blk_mq_run_hw_queue+0x35/0x40 > > > > 16) 5328 96 blk_mq_insert_requests+0xdb/0x160 > > > > 17) 5232 112 blk_mq_flush_plug_list+0x12b/0x140 > > > > 18) 5120 112 blk_flush_plug_list+0xc7/0x220 > > > > 19) 5008 64 io_schedule_timeout+0x88/0x100 > > > > 20) 4944 128 mempool_alloc+0x145/0x170 > > > > 21) 4816 96 bio_alloc_bioset+0x10b/0x1d0 > > > > 22) 4720 48 get_swap_bio+0x30/0x90 > > > > 23) 4672 160 __swap_writepage+0x150/0x230 > > > > 24) 4512 32 swap_writepage+0x42/0x90 > > Without swap IO from the allocation context, the stack would have > ended here, which would have been easily survivable. And left the > writeout work to kswapd, which has a much shallower stack than this: > > > > > 25) 4480 320 shrink_page_list+0x676/0xa80 > > > > 26) 4160 208 shrink_inactive_list+0x262/0x4e0 > > > > 27) 3952 304 shrink_lruvec+0x3e1/0x6a0 > > > > 28) 3648 80 shrink_zone+0x3f/0x110 > > > > 29) 3568 128 do_try_to_free_pages+0x156/0x4c0 > > > > 30) 3440 208 try_to_free_pages+0xf7/0x1e0 > > > > 31) 3232 352 __alloc_pages_nodemask+0x783/0xb20 > > > > 32) 2880 8 alloc_pages_current+0x10f/0x1f0 > > > > 33) 2872 200 __page_cache_alloc+0x13f/0x160 > > > > 34) 2672 80 find_or_create_page+0x4c/0xb0 > > > > 35) 2592 80 ext4_mb_load_buddy+0x1e9/0x370 > > > > 36) 2512 176 ext4_mb_regular_allocator+0x1b7/0x460 > > > > 37) 2336 128 ext4_mb_new_blocks+0x458/0x5f0 > > > > 38) 2208 256 ext4_ext_map_blocks+0x70b/0x1010 > > > > 39) 1952 160 ext4_map_blocks+0x325/0x530 > > > > 40) 1792 384 ext4_writepages+0x6d1/0xce0 > > > > 41) 1408 16 do_writepages+0x23/0x40 > > > > 42) 1392 96 __writeback_single_inode+0x45/0x2e0 > > > > 43) 1296 176 writeback_sb_inodes+0x2ad/0x500 > > > > 44) 1120 80 __writeback_inodes_wb+0x9e/0xd0 > > > > 45) 1040 160 wb_writeback+0x29b/0x350 > > > > 46) 880 208 bdi_writeback_workfn+0x11c/0x480 > > > > 47) 672 144 process_one_work+0x1d2/0x570 > > > > 48) 528 112 worker_thread+0x116/0x370 > > > > 49) 416 240 kthread+0xf3/0x110 > > > > 50) 176 176 ret_from_fork+0x7c/0xb0 > > > > Impressive: 3 nested allocations - GFP_NOFS, GFP_NOIO and then > > GFP_ATOMIC before the stack goes boom. XFS usually only needs 2... > > Do they also usually involve swap_writepage()? Maybe it works but the problem I can think of is churn of LRU because anon pages scanned in direct reclaim would live another round in LRU and as Dave already pointed out, it couldn't prevent synchronous unplugging caused by another shedule point in direct reclaim path so I buy Dave's idea which pass plug list off to the kblockd. > > --- > > diff --git a/mm/page_io.c b/mm/page_io.c > index 7c59ef681381..02e7e3c168cf 100644 > --- a/mm/page_io.c > +++ b/mm/page_io.c > @@ -233,6 +233,22 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) > { > int ret = 0; > > + /* > + * Refuse to write the page out if we are called from reclaim context. > + * > + * This avoids stack overflows when called from deeply used stacks in > + * random callers for direct reclaim or memcg reclaim. We explicitly > + * allow reclaim from kswapd as the stack usage there is relatively low. > + * > + * This should never happen except in the case of a VM regression so > + * warn about it. > + */ > + if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == > + PF_MEMALLOC)) { > + SetPageDirty(page); > + goto out; > + } > + > if (try_to_free_swap(page)) { > unlock_page(page); > goto out; > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 61c576083c07..99cca6633e0d 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -985,13 +985,12 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > if (PageDirty(page)) { > /* > - * Only kswapd can writeback filesystem pages to > - * avoid risk of stack overflow but only writeback > + * Only kswapd can writeback pages to avoid > + * risk of stack overflow but only writeback > * if many dirty pages have been encountered. > */ > - if (page_is_file_cache(page) && > - (!current_is_kswapd() || > - !zone_is_reclaim_dirty(zone))) { > + if (!current_is_kswapd() || > + !zone_is_reclaim_dirty(zone))) { > /* > * Immediately reclaim when written back. > * Similar in principal to deactivate_page() > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org -- Kind regards, Minchan Kim From namjae.jeon@samsung.com Thu May 29 02:29:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE 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 088A97F6B for ; Thu, 29 May 2014 02:29:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA3938F8065 for ; Thu, 29 May 2014 00:29:44 -0700 (PDT) X-ASG-Debug-ID: 1401348578-04cb6c22b72493c0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id pjNDGBqE2liO5K7N (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 29 May 2014 00:29:40 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N6B000ZMRH63A10@mailout4.samsung.com> for xfs@oss.sgi.com; Thu, 29 May 2014 16:29:30 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.112]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 11.64.19452.AD1E6835; Thu, 29 May 2014 16:29:30 +0900 (KST) X-AuditID: cbfee68e-b7fb96d000004bfc-80-5386e1dab885 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id EF.09.07139.9D1E6835; Thu, 29 May 2014 16:29:30 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N6B00M3HRH5RV80@mmp2.samsung.com>; Thu, 29 May 2014 16:29:29 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: xfs@oss.sgi.com, Brian Foster , linux-fsdevel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v4 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Thu, 29 May 2014 16:29:29 +0900 X-ASG-Orig-Subj: [PATCH v4 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001e01cf7b0f$ba43dfd0$2ecb9f70$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: Ac97D1V8JQinhKZ1QLqZoRp++OPZOg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrPIsWRmVeSWpSXmKPExsWyRsSkQPfWw7Zgg31zRSyWTrzEbPHuc5XF lmP3GC327D3JYrGo7xajA6vHqUUSHqsvbGX0eL/vKptH35ZVjB6fN8kFsEZx2aSk5mSWpRbp 2yVwZRw68oq5YNJKxorFvVcYGxhntzF2MXJySAiYSGy/v5EFwhaTuHBvPVsXIxeHkMBSRonN B5azwRS13Wthh0hMZ5Tov/eYGcL5yyhxbPproAwHB5uAtsSfLaIgDSICahKTJu1gBrGZBeol Fq9rZgIpERbwk7iywwckzCKgKnFgwQewxbwClhJ35lxggrAFJX5MvscC0aolsX7ncSYIW15i 85q3zBD3KEjsOPuaEWKVnsShG3cYIWpEJPa9eMcIcpqEwCF2iZ61M1khlglIfJt8iAXkBgkB WYlNB6DmSEocXHGDZQKj2Cwkq2chWT0LyepZSFYsYGRZxSiaWpBcUJyUXmSkV5yYW1yal66X nJ+7iREYeaf/PevbwXjzgPUhxmSg9ROZpUST84GRm1cSb2hsZmRhamJqbGRuaUaasJI476KH SUFCAumJJanZqakFqUXxRaU5qcWHGJk4OKUaGEMNdn51nntQsij/5ZINzglxfU4vFqhWP+GU 9rv444Hg+VC/p78iprkyX3znNGWykQ0Lc9sPFTWd6U0eX2vDjGMWnjvl/WwRr4CuxMLfKWua C2NC7hT8DFJQX19Z7bkrmdtrfd+ZK5vuN3z/5aHbbXgs9LCQj8LNt8Kf5rswTUlg11aa2pzw S4mlOCPRUIu5qDgRANC+WALSAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprDKsWRmVeSWpSXmKPExsVy+t9jQd1bD9uCDZbeYbNYOvESs8W7z1UW W47dY7TYs/cki8WivluMDqwepxZJeKy+sJXR4/2+q2wefVtWMXp83iQXwBrVwGiTkZqYklqk kJqXnJ+SmZduq+QdHO8cb2pmYKhraGlhrqSQl5ibaqvk4hOg65aZA7RbSaEsMacUKBSQWFys pG+HaUJoiJuuBUxjhK5vSBBcj5EBGkhYw5hx6Mgr5oJJKxkrFvdeYWxgnN3G2MXIySEhYCLR dq+FHcIWk7hwbz1bFyMXh5DAdEaJ/nuPmSGcv4wSx6a/Bqri4GAT0Jb4s0UUpEFEQE1i0qQd zCA2s0C9xOJ1zUwgJcICfhJXdviAhFkEVCUOLPjAAmLzClhK3JlzgQnCFpT4MfkeC0SrlsT6 nceZIGx5ic1r3jJD3KMgsePsa0aIVXoSh27cYYSoEZHY9+Id4wRGgVlIRs1CMmoWklGzkLQs YGRZxSiaWpBcUJyUnmukV5yYW1yal66XnJ+7iREc18+kdzCuarA4xCjAwajEwysh2xYsxJpY VlyZe4hRgoNZSYT30yWgEG9KYmVValF+fFFpTmrxIcZkoE8nMkuJJucDU05eSbyhsYmZkaWR uaGFkbE5acJK4rwHW60DhQTSE0tSs1NTC1KLYLYwcXBKNTD2fNgTybtJqb1CyKYpZ/aJ0rbp M+6e+lK3+8eGE6vOXrn4N9GTw2Vh97nqI33H+EIYdh4Q5/CcufXppD1XN9+r2vbw3oRlIU1X Js6ZeFrju+dLmcK35sKCyYJFttI7ghqElB7I6Zul3e7jC7wabCfJxlq4W6tn+lOGnpCpzF+j WA7JhzyV/MCjxFKckWioxVxUnAgAntkiPi8DAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1401348579 X-Barracuda-Encrypted: RC4-MD5 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 patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 5) Allocate unwritten extents for the hole created in step 4. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- Changelog v4: - set cur->bc_private.b.allocated to zero before calling xfs_btree_del_cursor. v3: - remove XFS_TRANS_RESERVE and assert. - update the comment of blockcount calculation. - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. v2: - remove reserved enable. - add xfs_qm_dqattach. - reset blockcount in xfs_bmap_shift_extents_right. - update i_size to avoid data loss before insert_file_space() is called. - use in-memory extent array size that delayed allocation extents. fs/xfs/xfs_bmap.c | 379 ++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 9 +- fs/xfs/xfs_bmap_util.c | 128 ++++++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 38 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 552 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 1ff0da6..a6d4e8d 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5419,7 +5419,7 @@ error0: * into, this will be considered invalid operation and we abort immediately. */ int -xfs_bmap_shift_extents( +xfs_bmap_shift_extents_left( struct xfs_trans *tp, struct xfs_inode *ip, int *done, @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmap_shift_extents", + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } @@ -5606,3 +5606,378 @@ del_cursor: xfs_trans_log_inode(tp, ip, logflags); return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be splitted. @split_fsb is a block where the extents is spliited. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* splitted extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + int error = 0; + int logflags; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + /* Add new extent */ + (*current_ext)++; + xfs_iext_insert(ip, *current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) { + cur->bc_private.b.allocated = 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + } + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *split_ext) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + + if (error) { + /* + * Free the transaction structure. + */ + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, + &firstfsb, &free_list); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return error; +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* + * Shift extent records to the right to make a hole. + * The maximum number of extents to be shifted in a single operation + * is @num_exts, and @current_ext keeps track of the current extent + * index we have shifted. @offset_shift_fsb is the length by which each + * extent is shifted. @end_ext is the last extent to be shifted. + */ +int +xfs_bmap_shift_extents_right( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t offset_shift_fsb, + xfs_extnum_t *current_ext, + xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int num_exts) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec right; + xfs_ifork_t *ifp; + xfs_fileoff_t startoff; + xfs_filblks_t blockcount = 0; + xfs_extnum_t last_extent; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int logflags; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstblock; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + /* start shifting extents to right */ + while (num_exts-- > 0) { + blockcount = 0; + + if (*current_ext < end_ext) { + *done = 1; + break; + } + + gotp = xfs_iext_get_ext(ifp, *current_ext); + xfs_bmbt_get_all(gotp, &got); + startoff = got.br_startoff + offset_shift_fsb; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. This checking has + * to be performed for all except the last extent. + */ + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + if (last_extent != *current_ext) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext + 1), &right); + if (startoff + got.br_blockcount > right.br_startoff) { + error = XFS_ERROR(EINVAL); + if (error) + goto del_cursor; + } + } + + /* Check if we can merge 2 adjacent extents */ + if (last_extent != *current_ext && + right.br_startoff == startoff + got.br_blockcount && + right.br_startblock == + got.br_startblock + got.br_blockcount && + right.br_state == got.br_state && + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { + + /* + * Merge the current extent with the extent to + * the right. Remove the right extent, calculate + * a new block count for the current extent to cover + * the range of both and decrement the number of extents + * in the fork. + */ + blockcount = right.br_blockcount + got.br_blockcount; + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_iext_remove(ip, *current_ext + 1, 1, 0); + if (cur) { + error = xfs_btree_delete(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (blockcount) { + xfs_bmbt_set_blockcount(gotp, blockcount); + got.br_blockcount = blockcount; + } + + xfs_bmbt_set_startoff(gotp, startoff); + got.br_startoff = startoff; + + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + (*current_ext)--; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 38ba36e..af05899 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, int *done, xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, + xfs_extnum_t *split_ext); +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, + int *done, xfs_fsblock_t offset_shift_fsb, + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + int num_exts); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 057f671..b9511dd 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1548,7 +1548,7 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, shift_fsb, ¤t_ext, &first_block, &free_list, XFS_BMAP_MAX_SHIFT_EXTENTS); @@ -1572,6 +1572,132 @@ out: } /* + * xfs_insert_file_space() + * This routine allocate disk space and shift extent for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. Lastly + * allocate an unwritten extent in hole range created by shifting extents. + * + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + xfs_ifork_t *ifp; + int done = 0; + int committed; + int error; + uint rounding; + xfs_fileoff_t start_fsb; + xfs_fileoff_t shift_fsb; + xfs_extnum_t split_ext; + xfs_extnum_t current_ext = 0; + xfs_off_t ioffset; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + error = xfs_qm_dqattach(ip, 0); + if (error) + return error; + + /* wait for the completion of any pending DIOs */ + inode_dio_wait(VFS_I(ip)); + + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, + ioffset, -1); + if (error) + return error; + + truncate_pagecache_range(VFS_I(ip), ioffset, -1); + + start_fsb = XFS_B_TO_FSB(mp, offset); + shift_fsb = XFS_B_TO_FSB(mp, len); + + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); + if (error) + return error; + + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; + while (!error && !done) { + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + /* + * We would need to reserve permanent block for transaction. + * This will come into picture when after shifting extent into + * hole we found that adjacent extents can be merged which + * may lead to freeing of a block during record update. + */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + break; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + + /* + * We are using the write transaction in which max 2 bmbt + * updates are allowed + */ + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, + ¤t_ext, split_ext, + &first_block, &free_list, + XFS_BMAP_MAX_SHIFT_EXTENTS); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + } + + /* Add unwritten extent in a hole range. */ + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); + +out: + return error; + +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..d62ab4b 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1f66779..f160cd5 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -756,11 +756,13 @@ xfs_file_fallocate( struct xfs_trans *tp; long error; loff_t new_size = 0; + int do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -790,6 +792,28 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + + new_size = i_size_read(inode) + len; + do_file_insert = 1; } else { if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { @@ -840,8 +864,20 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Some operations are performed after the inode size is updated. For + * example, insert range expands the address space of the file, shifts + * all subsequent extents over and allocates space into the hole. + * Updating the size first ensures that shifted extents aren't left + * hanging past EOF in the event of a crash or failure. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); return -error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 152f827..8943c9f 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.11-rc0 From bounceskcv@bounce.orangebuddies.nl Thu May 29 02:34:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 9EBCC7F6D for ; Thu, 29 May 2014 02:34:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A592AC002 for ; Thu, 29 May 2014 00:34:54 -0700 (PDT) X-ASG-Debug-ID: 1401348890-04cb6c22b72499c0001-NocioJ Received: from mta128.orangebuddies.net (mta128.orangebuddies.net [78.137.121.128]) by cuda.sgi.com with ESMTP id yTVx8UKExBC9vZbI for ; Thu, 29 May 2014 00:34:50 -0700 (PDT) X-Barracuda-Envelope-From: bounceskcv@bounce.orangebuddies.nl X-Barracuda-Apparent-Source-IP: 78.137.121.128 X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed; s=s001; d=gmail.com; h=Date:To:From:Reply-to:Subject:Message-ID:MIME-Version:Content-Type; i=biglowe48@gmail.com; bh=I98xw6+yvBIWBCZLdsj34S4R5uLiflFMD/MDE5WUEt8=; b=gbYVrHsrWEKWlvmtPTn2WjDazGwFN3nHbLgNmkYiQdGLSjbHJQyOYCI/y8wcasGC7Hd7qF1sy/GL E31AUsyMfoZRISkydLTlLt5i6kM8hBjbDBf9eHCSyXcmzJ+vjSHqkQkaoG5HCPQtqfq9UA7/p2k1 NC/rHBGLar0QUj3VaKk= X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] X-Barracuda-Registry: Level1 [bounce.orangebuddies.nl/78.137.121.128] Received: by webcloud2.orangebuddies.com (Postfix, from userid 48) id 46FCD11DF6878; Thu, 29 May 2014 08:35:53 +0100 (BST) Date: Thu, 29 May 2014 12:35:53 +0500 To: xfs@oss.sgi.com From: "....[WANTED] Beta Testers To Make $379 Per Day..................................................................." Reply-To: "....[WANTED] Beta Testers To Make $379 Per Day..................................................................." , Codiceriduzione Subject: =?UTF-8?Q?....No_Skills_Required_To_Get_Started,_Conosci_gi=C3=A1_questo_?= =?UTF-8?Q?sito=3F?= Message-ID: <449ed9ae4367877ab87b03158d2b4a2a@www.codiceriduzione.it> X-ASG-Orig-Subj: =?UTF-8?Q?....No_Skills_Required_To_Get_Started,_Conosci_gi=C3=A1_questo_?= =?UTF-8?Q?sito=3F?= X-Priority: 3 X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_449ed9ae4367877ab87b03158d2b4a2a" X-Barracuda-Connect: mta128.orangebuddies.net[78.137.121.128] X-Barracuda-Start-Time: 1401348890 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.51 X-Barracuda-Spam-Status: No, SCORE=2.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0124, BSF_SC0_MV0303, BSF_SC2_SA022a, DKIM_SIGNED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC2_SA022a Custom Rule SA022a 1.00 BSF_SC0_MV0303 BSF_SC0_MV0303 1.50 BSF_SC0_MV0124 Custom rule MV0124 --b1_449ed9ae4367877ab87b03158d2b4a2a Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit To view the message, please use an HTML compatible email viewer!
Caro/a ....No Skills Required To Get Started, ....[WANTED] Beta Testers To Make $379 Per Day...................................................................vuole farti sapere che su Codiceriduzione.it puoi trovare tutti i codici e i buoni sconto possibili! ....[WANTED] Beta Testers To Make $379 Per Day................................................................... ti invia il seguente messaggio: _________________________________________________________________________________

Hello xfs@oss.sgi.com,

It makes him consistent profit every
day and it takes only 10 minutes to
set up.

Access to this is limited, get
no-cost access here in the next 48 hours:

Click here for access:


\nhttp://tinyurl.com/lx6l5uv/?v=xfs@oss.sgi.com=freedemo2=it_free_clcksr1
(copy and paste in your web browser)


To the best!

Mike


























Removal link:
http://tinyurl.com/lx6l5uv/?v=xfs@oss.sgi.com=freedemo2=it_free_clcksr1=unsub
______________________________________________________ _ __________________________ Copia e incolla il link nella finestra del browser per ottenre gli sconti di : http://www.codiceriduzione.it/ Acquista utilizzando i codici riduzione! Saluti, ....[WANTED] Beta Testers To Make $379 Per Day................................................................... --b1_449ed9ae4367877ab87b03158d2b4a2a Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit
Codiceriduzione.it
spacer

Beste ....No Skills Required To Get Started,

....[WANTED] Beta Testers To Make $379 Per Day................................................................... wil je laten weten dat je op Codiceriduzione.it alle mogelijke kortingscodes en bonnen vindt!

....[WANTED] Beta Testers To Make $379 Per Day................................................................... stuurt jou het volgende bericht: _________________________________________________________________________________

Hello xfs@oss.sgi.com,

It makes him consistent profit every
day and it takes only 10 minutes to
set up.

Access to this is limited, get
no-cost access here in the next 48 hours:

Click here for access:


\nhttp://tinyurl.com/lx6l5uv/?v=xfs@oss.sgi.com=freedemo2=it_free_clcksr1
(copy and paste in your web browser)


To the best!

Mike


























Removal link:
http://tinyurl.com/lx6l5uv/?v=xfs@oss.sgi.com=freedemo2= it_free_clcksr1=unsub
_________________________________________________________________________________


Kopieer en plak onderstaande link in je browservenster om bij met korting te shoppen:

http://www.codiceriduzione.it/

Shop ook met korting!
Groeten,
....[WANTED] Beta Testers To Make $379 Per Day...................................................................

spacer
footer
--b1_449ed9ae4367877ab87b03158d2b4a2a-- From david@fromorbit.com Thu May 29 02:49:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 D3FC57F72 for ; Thu, 29 May 2014 02:49:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BCF1B8F8065 for ; Thu, 29 May 2014 00:49:14 -0700 (PDT) X-ASG-Debug-ID: 1401349751-04cb6c22b624aaf0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ug7bH0BegGHqAh1W for ; Thu, 29 May 2014 00:49:12 -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: AndMAAfmhlN5LL1sPGdsb2JhbABZgweDRIUIonUGmB4BgRAXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaExuIJtdNFxaFP4h9B4RABJl0lnMr Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl6.internode.on.net with ESMTP; 29 May 2014 17:19:10 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Wpv5J-0001Nz-E0; Thu, 29 May 2014 17:49:09 +1000 Date: Thu, 29 May 2014 17:49:09 +1000 From: Dave Chinner To: Gu Zheng Cc: xfs@oss.sgi.com, linux-kernel Subject: Re: xfs: possible deadlock warning Message-ID: <20140529074909.GI6677@dastard> X-ASG-Orig-Subj: Re: xfs: possible deadlock warning References: <538571D4.70904@cn.fujitsu.com> <20140528060050.GK8554@dastard> <5386AABD.5070708@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5386AABD.5070708@cn.fujitsu.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: 1401349752 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.6204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 29, 2014 at 11:34:21AM +0800, Gu Zheng wrote: > Hi Dave, > > On 05/28/2014 02:00 PM, Dave Chinner wrote: > > > On Wed, May 28, 2014 at 01:19:16PM +0800, Gu Zheng wrote: > >> Hi all, > >> When running the latest Linus' tree, the following possible deadlock warning occurs. > > > > false positive. There isn't a deadlock between inode locks on > > different filesystems. i.e. there is no dependency between shmem > > inodes and xfs inodes, nor on their security contexts. Nor can you > > take a page fault on a directory inode, which is the XFS inode lock > > class it's complaining about. > > If it's really a noisy, can we avoid this? It's on my list of things to do. The XFs directory locking was changed slightly to remove race condition that SGI's CXFS filesystem was hitting, and that introduced all these lockdep false positives. Unfortunately, to get rid of the lockdep false positives we can either: a) revert the locking change; or b) rewrite the readdir code to use more fine grained locking so that we don't hold the lock over filldir() calls. I don't think that reverting a change that fixed a directory corruption problem is a good idea, so rewriting the readdir code is the solution. SGI have disappeared off the planet so they aren't going to fix it anytime soon, so it's waiting for me to find the time to finish and test the patches I have ibeen working on in my spare time that rework the readdir code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From andrey@xdel.ru Thu May 29 07:05:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 1D6A87F77 for ; Thu, 29 May 2014 07:05:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F04EA30404E for ; Thu, 29 May 2014 05:05:09 -0700 (PDT) X-ASG-Debug-ID: 1401365105-04bdf0599f2716d0001-NocioJ Received: from mail-la0-f45.google.com (mail-la0-f45.google.com [209.85.215.45]) by cuda.sgi.com with ESMTP id FXOiwScFTPa1bmjh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 29 May 2014 05:05:06 -0700 (PDT) X-Barracuda-Envelope-From: andrey@xdel.ru X-Barracuda-Apparent-Source-IP: 209.85.215.45 Received: by mail-la0-f45.google.com with SMTP id gl10so127848lab.4 for ; Thu, 29 May 2014 05:05:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xdel.ru; s=google; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=rR5dQd4XeKy5kVmZ1cti81o7Vqz3eAn4ZDRjxJ5AU3w=; b=V+adiRcwf2yVUyXDzJRGKzR54C/xYy/1s162PwJkHGjgNjCVP+7nrBYq5kHsm9b3dS ftM3Q9GDV035wbwyBFHG8UURAnFDjzenMpPqgEMCSDQnqFj30NlG0OSOYJ7YLH2dl2KC 4AHdP7ohpzD2DMBaT6Jwc6XGFpYfbHH2953cM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=rR5dQd4XeKy5kVmZ1cti81o7Vqz3eAn4ZDRjxJ5AU3w=; b=IjfyXxvMkrQYe+Ic6GyWJoG/bCZ6eAW9BYjtwv4pHWrfZ2L1yghFJ8DWGzN38hKr9i SXJsA42MiYO8n8jUw8Kq0OjE0oQf4CXBfzQFzr21LQEJkuLKUXQIqj8N8ZLzzBWUxVJy azqytu/0e4SUpk2X5zIV4zqMh/udzZuTJU0N5rJYBQsfLwbxHpHA7xTn01aJIRmkrFDw cdS6XsWyxJQrw7ee93KP62w6MnJGJZPyTZ0UYX+x1Zp4OBY8VVvlV60if0czHP3wVD5x SX6oHAo1arem35fGOISTfOTaPa4OoxiPEvhyQBjtc6hF5qQbyt1Pl0xJV+eP6F+Ohtvb xlUA== X-Gm-Message-State: ALoCoQkzL5mIRM5Xl7uxmsVFFL1tUXkzFJgvRsUdSbebWKPkk6Os7q+1GCzv+DhlkpudUpaY9NhL X-Received: by 10.112.129.135 with SMTP id nw7mr1818095lbb.89.1401365104645; Thu, 29 May 2014 05:05:04 -0700 (PDT) Received: from [192.168.10.12] (h195-91-128-218.ln.rinet.ru. [195.91.128.218]) by mx.google.com with ESMTPSA id an10sm410385lac.4.2014.05.29.05.05.02 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 29 May 2014 05:05:03 -0700 (PDT) Message-ID: <53872237.5040603@xdel.ru> Date: Thu, 29 May 2014 16:04:07 +0400 From: Andrey Korolyov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: "ceph-users@lists.ceph.com" , "xfs@oss.sgi.com" Subject: Re: Fatigue for XFS References: <20140505203633.GW26353@dastard> <20140505212335.GZ26353@dastard> X-ASG-Orig-Subj: Re: Fatigue for XFS In-Reply-To: <20140505212335.GZ26353@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-la0-f45.google.com[209.85.215.45] X-Barracuda-Start-Time: 1401365106 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.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_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6209 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.10 BSF_SC0_SA085 Custom Rule SA085 On 05/06/2014 01:23 AM, Dave Chinner wrote: > On Tue, May 06, 2014 at 12:59:27AM +0400, Andrey Korolyov wrote: >> On Tue, May 6, 2014 at 12:36 AM, Dave Chinner wrote: >>> On Mon, May 05, 2014 at 11:49:05PM +0400, Andrey Korolyov wrote: >>>> Hello, >>>> >>>> We are currently exploring issue which can be related to Ceph itself >>>> or to the XFS - any help is very appreciated. >>>> >>>> First, the picture: relatively old cluster w/ two years uptime and ten >>>> months after fs recreation on every OSD, one of daemons started to >>>> flap approximately once per day for couple of weeks, with no external >>>> reason (bandwidth/IOPS/host issues). It looks almost the same every >>>> time - OSD suddenly stop serving requests for a short period, gets >>>> kicked out by peers report, then returns in a couple of seconds. Of >>>> course, small but sensitive amount of requests are delayed by 15-30 >>>> seconds twice, which is bad for us. The only thing which correlates >>>> with this kick is a peak of I/O, not too large, even not consuming all >>>> underlying disk utilization, but alone in the cluster and clearly >>>> visible. Also there are at least two occasions *without* correlated >>>> iowait peak. >>> >>> So, actual numbers and traces are the only thing that tell us what >>> is happening during these events. See here: >>> >>> http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F >>> >>> If it happens at almost the same time every day, then I'd be looking >>> at the crontabs to find what starts up about that time. output of >>> top will also probably tell you what process is running, too. topio >>> might be instructive, and blktrace almost certainly will be.... >>> >>>> I have two versions - we`re touching some sector on disk which is >>>> about to be marked as dead but not displayed in SMART statistics or (I >>> >>> Doubt it - SMART doesn't cause OS visible IO dispatch spikes. >>> >>>> believe so) some kind of XFS fatigue, which can be more likely in this >>>> case, since near-bad sector should be touched more frequently and >>>> related impact could leave traces in dmesg/SMART from my experience. I >>> >>> I doubt that, too, because XFS doesn't have anything that is >>> triggered on a daily basis inside it. Maybe you've got xfs_fsr set >>> up on a cron job, though... >>> >>>> would like to ask if anyone has a simular experience before or can >>>> suggest to poke existing file system in some way. If no suggestion >>>> appear, I`ll probably reformat disk and, if problem will remain after >>>> refill, replace it, but I think less destructive actions can be done >>>> before. >>> >>> Yeah, monitoring and determining the process that is issuing the IO >>> is what you need to find first. >>> >>> Cheers, >>> >>> Dave. >>> -- >>> Dave Chinner >>> david@fromorbit.com >> >> Thanks Dave, >> >> there are definitely no cron set for specific time (though most of >> lockups happened in a relatively small interval which correlates with >> the Ceph snapshot operations). > > OK. > > FWIW, Ceph snapshots on XFS may not be immediately costly in terms > of IO - they can be extremely costly after one is taken when the > files in the snapshot are next written to. If you are snapshotting > files that are currently being written to, then that's likely to > cause immediate IO issues... > >> In at least one case no Ceph snapshot >> operations (including delayed removal) happened and at least two when >> no I/O peak was observed. We observed and eliminated weird lockups >> related to the openswitch behavior before - we`re combining storage >> and compute nodes, so quirks in the OVS datapath caused very >> interesting and weird system-wide lockups on (supposedly) spinlock, >> and we see 'pure' Ceph lockups on XFS at time with 3.4-3.7 kernels, >> all of them was correlated with very high context switch peak. > > Until we determine what is triggering the IO, the application isn't > really a concern. > >> Current issue is seemingly nothing to do with spinlock-like bugs or >> just a hardware problem, we even rebooted problematic node to check if >> the memory allocator may stuck at the border of specific NUMA node, >> with no help, but first reappearance of this bug was delayed by some >> days then. Disabling lazy allocation via specifying allocsize did >> nothing too. It may look like I am insisting that it is XFS bug, where >> Ceph version is more likely to appear because of way more complicated >> logic and operation behaviour, but persistence on specific node across >> relaunching of Ceph storage daemon suggests bug relation to the >> unlucky byte sequence more than anything else. If it finally appear as >> Ceph bug, it`ll ruin our expectations from two-year of close >> experience with this product and if it is XFS bug, we haven`t see >> anything like this before, thought we had a pretty collection of >> XFS-related lockups on the earlier kernels. > > Long experience with triaging storage performance issues has taught > me to ignore what anyone *thinks* is the cause of the problem; I > rely on the data that is gathered to tell me what the problem is. I > find that hard data has a nasty habit of busting assumptions, > expectations, speculations and hypothesis... :) > >> If it helps, I >> may collect a series of perf events during next appearance or exact >> iostat output (mine graphics can say that the I/O was not choked >> completely when peak appeared, that`s all). > > Before delving into perf events, we need to know what we are looking > for. That's what things like iostat, vmstat, top, blktrace, etc will > tell us - where to point the microscope. > > Cheers, > > Dave. > Thanks, after a long and adventurous investigation we found that the effect was most probably caused by crossing tails of multiple background snapshot deletion in Ceph, so this had nothing to do with XFS, though behavior was very strange and because of very large time intervals we had not able imagine correlation between those events earlier. Background snapshot removal in Ceph contains kind of 'spike' at the of the process, so if one does deletion of a couple of snapshots holding close amount of commited bytes each, their removal will shot spike almost synchronously at the end, causing one or more OSD daemons to choke. From info.ferotehna@gmail.com Thu May 29 07:38:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=FREEMAIL_FROM,SUBJ_BUY 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 236FA7F72 for ; Thu, 29 May 2014 07:38:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E7B9304039 for ; Thu, 29 May 2014 05:38:17 -0700 (PDT) X-ASG-Debug-ID: 1401367092-04cbb050fb47ae0001-NocioJ Received: from ns1.bing.com (213-251-144-216.static.reverse.lstn.net [216.144.251.213]) by cuda.sgi.com with ESMTP id lUFvhXLVfuzcBhX5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 29 May 2014 05:38:12 -0700 (PDT) X-Barracuda-Envelope-From: info.ferotehna@gmail.com X-Barracuda-Apparent-Source-IP: 216.144.251.213 Received: from localhost.localdomain ([127.0.0.1]:40323 helo=smtpexpress.com) by ns1.bing.com with esmtpa (Exim 4.82) (envelope-from ) id 1WpzZ8-00010N-Vz; Thu, 29 May 2014 08:36:15 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 29 May 2014 08:36:14 -0400 From: "Ferotehna D.O.O" To: undisclosed-recipients:; Subject: Buying Message-ID: X-ASG-Orig-Subj: Buying X-Sender: info.ferotehna@gmail.com User-Agent: Roundcube Webmail/0.9.5 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns1.bing.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: ns1.bing.com: authenticated_id: admin@smtpexpress.com X-Barracuda-Connect: 213-251-144-216.static.reverse.lstn.net[216.144.251.213] X-Barracuda-Start-Time: 1401367092 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.90 X-Barracuda-Spam-Status: No, SCORE=0.90 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJ_BUY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.90 SUBJ_BUY Subject line starts with Buy or Buying -- Dear, We are very interested in Buying your Products. Please kindly send the us the following. 1. Delivery time of the Product 2. Product warranty 3. Minimum Order Quantity 4. Payment TERM Thanks & Best Regards, Aleksandar Barak Ferotehna D.O.O Kukuljanovo.312 51227 Kukuljanovo-Rijeka-Croatia Tel:+385 (0)51 503 107 Mob:+385 (0)91 150 3459 Fax:+385 (0)51 503 105 Email: info.ferotehna@gmail.com Skype: aleksandar.feroteh From info.ferotehna@gmail.com Thu May 29 07:38:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=FREEMAIL_FROM,SUBJ_BUY 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 D60EF7F72 for ; Thu, 29 May 2014 07:38:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88622AC005 for ; Thu, 29 May 2014 05:38:19 -0700 (PDT) X-ASG-Debug-ID: 1401367098-04cbb050fd47b10001-NocioJ Received: from ns1.bing.com (213-251-144-216.static.reverse.lstn.net [216.144.251.213]) by cuda.sgi.com with ESMTP id ltYiEzcWJOUu9liG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 29 May 2014 05:38:18 -0700 (PDT) X-Barracuda-Envelope-From: info.ferotehna@gmail.com X-Barracuda-Apparent-Source-IP: 216.144.251.213 Received: from localhost.localdomain ([127.0.0.1]:40967 helo=smtpexpress.com) by ns1.bing.com with esmtpa (Exim 4.82) (envelope-from ) id 1WpzZS-00011b-K3; Thu, 29 May 2014 08:36:34 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 29 May 2014 08:36:34 -0400 From: "Ferotehna D.O.O" To: undisclosed-recipients:; Subject: Buying Message-ID: <450bc16e6489da2795edcf082c385c4f@smtpexpress.com> X-ASG-Orig-Subj: Buying X-Sender: info.ferotehna@gmail.com User-Agent: Roundcube Webmail/0.9.5 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns1.bing.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: ns1.bing.com: authenticated_id: admin@smtpexpress.com X-Barracuda-Connect: 213-251-144-216.static.reverse.lstn.net[216.144.251.213] X-Barracuda-Start-Time: 1401367098 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.90 X-Barracuda-Spam-Status: No, SCORE=0.90 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=SUBJ_BUY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.90 SUBJ_BUY Subject line starts with Buy or Buying -- Dear, We are very interested in Buying your Products. Please kindly send the us the following. 1. Delivery time of the Product 2. Product warranty 3. Minimum Order Quantity 4. Payment TERM Thanks & Best Regards, Aleksandar Barak Ferotehna D.O.O Kukuljanovo.312 51227 Kukuljanovo-Rijeka-Croatia Tel:+385 (0)51 503 107 Mob:+385 (0)91 150 3459 Fax:+385 (0)51 503 105 Email: info.ferotehna@gmail.com Skype: aleksandar.feroteh From tinguely@sgi.com Thu May 29 09:27:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A06277F76 for ; Thu, 29 May 2014 09:27:48 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C2E68F8037; Thu, 29 May 2014 07:27:45 -0700 (PDT) Message-ID: <538743E0.70103@sgi.com> Date: Thu, 29 May 2014 09:27:44 -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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> In-Reply-To: <20140528002906.GH8554@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/27/14 19:29, Dave Chinner wrote: > On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: >> On 05/27/14 17:51, Dave Chinner wrote: >>> On Tue, May 27, 2014 at 05:20:02PM -0500, Mark Tinguely wrote: >>>> On 09/02/13 09:29, Namjae Jeon wrote: >>>>> From: Namjae Jeon >>>>> >>>>> Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. >>>>> >>>>> Signed-off-by: Namjae Jeon >>>>> Signed-off-by: Ashish Sangwan >>>>> --- >>>> >>>>> + /* Check if we can merge 2 adjacent extents */ >>>>> + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY)&& >>>>> + left.br_startoff + left.br_blockcount == startoff && >>>>> + left.br_startblock + left.br_blockcount == >>>>> + xfs_bmbt_get_startblock(gotp) && >>>>> + xfs_bmbt_get_state(gotp) == left.br_state && >>>>> + left.br_blockcount + xfs_bmbt_get_blockcount(gotp)<= >>>>> + MAXEXTLEN) { >>>>> + blockcount = >>>>> + left.br_blockcount + xfs_bmbt_get_blockcount(gotp); >>>>> + state |= BMAP_LEFT_CONTIG; >>>>> + xfs_iext_remove(ip, *current_ext, 1, 0); >>>>> + XFS_IFORK_NEXT_SET(ip, whichfork, >>>>> + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); >>>>> + gotp = xfs_iext_get_ext(ifp, --*current_ext); >>>>> + } >>>>> + >>>>> + if (cur) { >>>>> + error = xfs_bmbt_lookup_eq(cur, >>>>> + xfs_bmbt_get_startoff(gotp), >>>>> + xfs_bmbt_get_startblock(gotp), >>>>> + xfs_bmbt_get_blockcount(gotp), >>>>> + &i); >>>>> + if (error) >>>>> + goto del_cursor; >>>>> + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); >>>> >>>> I can reliably trigger this XFS_WANT_CORRUPTED_GOTO() with a >>>> fsstress that fills the filesystem: >>>> >>>> xfstests> ltp/fsstress -d /mnt/scratch -s 1370236858 -p 512 -n 8192& >>> >>> Hasn't reproduced after 10 minutes of running at ENOSPC here - how >>> long does it take to reproduce? What storage hardware are you >>> testing on? How many CPUs? RAM? .... >>> >>> http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F >>> >>> Cheers, >>> >>> Dave. >> >> A 7-8 hours on spinning rust. This is my burn in test. > > Can you try to narrow the problem down? Otherwise it's going to be a > case of looking for a needle in a haystack.... > > Cheers, > > Dave. Nod on the needle in a hay stack if it bmbt is really corrupt. I am running fsstress from xfstests with the top commit 9b7f704, and I don't see any newer fsstress patches since then. I moved the test to another box with a kdump that works on top of tree Linux and grabbed a vmcore. I grabbed a metadata dump of the filesystem after the ASSERT. That should give some idea of what inode/block it was looking up. I sent email to Namjae when I first tripped over this problem in late April. No longer on the face of the earth and I can't look at this until the weekend. --Mark. From info@md.dealenligne.fr Fri May 30 00:42:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=HTML_MESSAGE,MIME_HTML_MOSTLY, 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 3D3527F47 for ; Fri, 30 May 2014 00:42:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DBBDCAC001 for ; Thu, 29 May 2014 22:42:02 -0700 (PDT) X-ASG-Debug-ID: 1401428517-04bdf0599f2d6900001-NocioJ Received: from po2 (host15-64-35-185.static.arubacloud.fr [185.35.64.15]) by cuda.sgi.com with ESMTP id 1eX9JPxbu98QXjo5 for ; Thu, 29 May 2014 22:41:58 -0700 (PDT) X-Barracuda-Envelope-From: info@md.dealenligne.fr X-Barracuda-Apparent-Source-IP: 185.35.64.15 Received: from [185.35.64.15] ([127.0.0.1]) by po2 with Microsoft SMTPSVC(7.5.7601.17514); Fri, 30 May 2014 07:41:55 +0200 Message-Id: Mime-Version: 1.0 From: "=?UTF-8?B?LuKciSBFc3BhY2UgQ2xpZW50AA==?= C-M" To: Undisclosed-Recipients:; Subject: =?iso-8859-1?Q?Votre_conseiller_:_Nouvelle_Mise_=E0_jour_important?= Date: Fri, 30 May 2014 07:41:55 +0200 X-ASG-Orig-Subj: =?iso-8859-1?Q?Votre_conseiller_:_Nouvelle_Mise_=E0_jour_important?= X-Priority: 1 Content-type: multipart/alternative; Boundary="--=BOUNDARY_530741_KOQE_ESSW_RIWE_VBRJ" X-OriginalArrivalTime: 30 May 2014 05:41:55.0779 (UTC) FILETIME=[DDDAF130:01CF7BC9] X-Barracuda-Connect: host15-64-35-185.static.arubacloud.fr[185.35.64.15] X-Barracuda-Start-Time: 1401428518 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_MV0224, HTML_MESSAGE, MIME_HTML_MOSTLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6231 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 Questo messaggio è in formato MIME. Poichè il tuo programma di posta non comprende questo formato, una porta o tutto il messaggio potrebbe non essere leggibile. ----=BOUNDARY_530741_KOQE_ESSW_RIWE_VBRJ Content-type: text/plain; charset=iso-8859-1; format=flowed Content-transfer-encoding: quoted-printable Home Deals Customer Service View Online      ----=BOUNDARY_530741_KOQE_ESSW_RIWE_VBRJ Content-type: text/html; charset=iso-8859-1 Content-transfer-encoding: quoted-printable

Home Deals Customer Service
View Online

----=BOUNDARY_530741_KOQE_ESSW_RIWE_VBRJ-- From rusevgalin@gmail.com Fri May 30 04:35:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6AFDE7F47 for ; Fri, 30 May 2014 04:35:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B9D88F8050 for ; Fri, 30 May 2014 02:35:25 -0700 (PDT) X-ASG-Debug-ID: 1401442523-04cb6c22b62c5fa0001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id qAqRbwM35w5KRvjK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 30 May 2014 02:35:23 -0700 (PDT) X-Barracuda-Envelope-From: rusevgalin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] Received: by mail-vc0-f177.google.com with SMTP id il7so1552754vcb.8 for ; Fri, 30 May 2014 02:35:23 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] 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=tGp7d4CFScqdvDgkMWhGJudTxlTl6NXeBeyuw6T+hzM=; b=L5H+NwKyyGk2cWQtpJgt4pDVR3T0mn0F3gMTlbVpO9l3Q/gS1dZkFj+zNlcK5AJB5/ utZIcH+/6GGQP4FQq3PqIMm4YbawLLzvn/a5BlPPT8R6yYBDQlg7OXYJhY9/seYyqANb Xvg915wv3myASZbwgpa1CCRoKKQvNZfdhC57y8tL0Ahyb7z0jNwfWYT7OMxoWWEFOOHm ZbaN3kzPtshiw407qJeW4SYt42b/TdbwXBpqesZgHaZhpi3hMM7ScLc2Pv0TMlPZZPVf sXdTQOsWBKUp7hIS50N7Fi1jN6LTHL9f8Fd1l5RlCRplVCTLKam7uHXLdAAihW1l/FCS ndYg== MIME-Version: 1.0 X-Received: by 10.52.153.229 with SMTP id vj5mr10523257vdb.34.1401442522870; Fri, 30 May 2014 02:35:22 -0700 (PDT) Received: by 10.58.24.35 with HTTP; Fri, 30 May 2014 02:35:22 -0700 (PDT) Date: Fri, 30 May 2014 12:35:22 +0300 Message-ID: Subject: =?UTF-8?B?0J/RgNC10LTQu9C+0LbQtdC90LjQtSDQt9CwINCy0LDRiNC40Y/RgiDRgdCw0LnRgiDQuA==?= =?UTF-8?B?INCx0LjQt9C90LXRgQ==?= From: Galin Rusev X-ASG-Orig-Subj: =?UTF-8?B?0J/RgNC10LTQu9C+0LbQtdC90LjQtSDQt9CwINCy0LDRiNC40Y/RgiDRgdCw0LnRgiDQuA==?= =?UTF-8?B?INCx0LjQt9C90LXRgQ==?= To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=bcaec51b1aa9bfcb0504fa9ac3de X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1401442523 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.6235 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 --bcaec51b1aa9bfcb0504fa9ac3de Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 0JfQtNGA0LDQstC10LnRgtC1LCDQt9Cw0L3QuNC80LDQstCw0Lwg0YHQtSDRgSDQtNC40YDQtdC6 0YLQvdCwINGA0LXQutC70LDQvNCwINC4INC/0L7Qv9GD0LvRj9GA0LjQt9C40YDQsNC90LUg0L3Q sCDRgdCw0LnRgtC+0LLQtSwg0L7QvQ0K0LvQsNC50L0g0LzQsNCz0LDQt9C40L3QuCwg0YHQsNC5 0YLQvtCy0LUg0LfQsCDQt9Cw0L/QvtC30L3QsNC90YHRgtCy0LAsINGB0LDQudGC0L7QstC1INC3 0LAg0LrQvtC70LXQutGC0LjQstC90L4g0L/QsNC30LDRgNGD0LLQsNC90LUsDQrRgdCw0LnRgtC+ 0LLQtSDQt9CwINC40LzQvtGC0LgsINGB0LDQudGC0L7QstC1INC30LAg0LDQstGC0L7QvNC+0LHQ uNC70LgsINGB0LDQudGC0L7QstC1INC30LAg0LHRitGA0LfQuCDQv9C+0YLRgNC10LHQuNGC0LXQ u9GB0LrQuA0K0LrRgNC10LTQuNGC0LguINCU0L4g0LzQvtC80LXQvdGC0LAg0YPRgdC/0LXRiNC9 0L4g0YDQsNCx0L7RgtGPINGBINC90LDQtCAxMDAg0YHQsNC50YLQsCDQvtGCINCR0YrQu9Cz0LDR gNC40Y8sINCd0LDRiNC4DQrQutC70LjQtdC90YLQuCDRgdCwINC10LTQvdC4INC+0YIg0L3QsNC5 IOKAkyDQv9C+0YHQtdGJ0LDQstCw0L3QuNGC0LUg0Lgg0YDQsNC30LLQuNGC0Lgg0YLRitGA0LPQ vtCy0YbQuC4g0KPRgdC70YPQs9C40YLQtSwg0LrQvtC40YLQvg0K0L/RgNC10LTQu9Cw0LPQsNC8 INGB0LAg0YHQu9C10LTQvdC40YLQtToNCg0KDQoNCg0KDQoNCg0K0JHQsNC30LAg0LTQsNC90L3Q uCDRgSAyIDIwMCAwMDAg0LDQutGC0LjQstC90Lgg0JHQkyDQvNC10LnQuyDQsNC00YDQtdGB0Lgg KyDQvNC10LnQuyDQvNCw0YDQutC10YLQuNC90LMsINGA0LDQt9C/0YDQsNGJ0LDQvdC1DQrQvtGC INC90LDRiNCwINGB0YLRgNCw0L3QsCDigJMg0J/QoNCe0JzQniDQptCV0J3QkCDQvtGCIDIwMCDQ u9C10LLQsA0KDQoNCg0KUnVzc2lhIC0gMiw4MDAsMDAwINCw0LrRgtC40LLQvdC4INC80LXQudC7 INCw0LTRgNC10YHQuCArINC80LXQudC7INC80LDRgNC60LXRgtC40L3Qsywg0YDQsNC30L/RgNCw 0YnQsNC90LUg0L7RgiDQvdCw0YjQsA0K0YHRgtGA0LDQvdCwIOKAkyDQn9Cg0J7QnNCeINCm0JXQ ndCQINC+0YIgMjUwINC70LXQstCwDQoNCg0KDQpJbnRlcm5hdGlvbmFsIC0gMiw2MDAsMDAwINCw 0LrRgtC40LLQvdC4INC80LXQudC7INCw0LTRgNC10YHQuCArINC80LXQudC7INC80LDRgNC60LXR gtC40L3Qsywg0YDQsNC30L/RgNCw0YnQsNC90LUNCtC+0YIg0L3QsNGI0LAg0YHRgtGA0LDQvdCw IOKAkyDQn9Cg0J7QnNCeINCm0JXQndCQINC+0YIgMjIwINC70LXQstCwDQoNCg0KDQpHcmVlY2Ug LSAxODAsMDAwINCw0LrRgtC40LLQvdC4INCR0JMg0LzQtdC50Lsg0LDQtNGA0LXRgdC4ICsg0LzQ tdC50Lsg0LzQsNGA0LrQtdGC0LjQvdCzLCDRgNCw0LfQv9GA0LDRidCw0L3QtSDQvtGCDQrQvdCw 0YjQsCDRgdGC0YDQsNC90LAg4oCTINCf0KDQntCc0J4g0KbQldCd0JAg0L7RgiAxMDAg0LvQtdCy 0LANCg0KDQoNCtCf0YPQsdC70LjQutGD0LLQsNC90LUg0L3QsCDQktCw0YjQsCDQvtCx0Y/QstCw INCyIDIxNyDQsdGK0LvQs9Cw0YDRgdC60Lgg0YHQsNC50YLQvtCy0LUg0LfQsCDQvtCx0Y/QstC4 IC0gMjUg0LvQtdCy0LANCg0KDQoNCiDQlNC+0LHQsNCy0Y/QvdC1INC90LAgRmFjZWJvb2sg0YTQ tdC90L7QstC1Og0KDQoNCg0KNTAgMDAwIC0gMTUwINC70LXQstCwDQoNCg0KDQoxMDAgMDAwIC0g MjUwINC70LXQstCwDQoNCg0KDQrQntGB0LjQs9GD0YDRj9Cy0LDQvdC1INC90LAg0YPQvdC40LrQ sNC70L3QuCDQv9C+0YHQtdGJ0LXQvdC40Y8g0LrRitC8INCS0LDRiCDRgdCw0LnRgiDRgdCw0LzQ viDQvtGCINCR0JMg0L/QvtGC0YDQtdCx0LjRgtC10LvQuA0K0L/Qu9Cw0L3QvtCy0LU6DQoNCg0K DQoxMCAwMDAg4oCTIDEwMCDQu9C10LLQsCAvIDMg0YDQsNCx0L7RgtC90Lgg0LTQvdC4DQoNCg0K DQoxMDAgMDAwIOKAkyA1MDAg0LvQtdCy0LAgLyAxMCDRgNCw0LHQvtGC0L3QuCDQtNC90LgNCg0K DQoNCtCf0LvQsNGC0LXQvdCwINGA0LXQutC70LDQvNCwINCy0YrQsiBGYWNlYm9vayDQvdCwINGB 0YLQvtC50L3QvtGB0YIgMSAwMDAg0LTQvtC70LDRgNCwLCDQt9Cw0L/Qu9Cw0YnQsNGC0LUgMTUw INC00L7Qu9Cw0YDQsA0KDQoNCg0K0J/Qu9Cw0YLQtdC90LAg0YDQtdC60LvQsNC80LAg0LIgR29v Z2xlIEFkd29yZHMg0L3QsCDRgdGC0L7QudC90L7RgdGCIDEgMDAwINC00L7Qu9Cw0YDQsCwg0LfQ sNC/0LvQsNGJ0LDRgtC1IDE1MA0K0LTQvtC70LDRgNCwDQoNCg0KDQrQkdCw0L3QtdGAINGA0LXQ utC70LDQvNCwINCyIDEwINCy0L7QtNC10YnQuCDRgdCw0LnRgtCwINC30LAg0L7QsdGP0LLQuCDQ t9CwINGB0YDQvtC6INC+0YIgMSDQvNC10YHQtdGGINGBINC+0LHRidC+INC00L3QtdCy0LXQvQ0K 0YLRgNCw0YTQuNC6INC90LDQtCAxMDAgMDAwINC/0L7RgtGA0LXQsdC40YLQtdC70Y8g0Lgg0L3Q sNC0IDIgMDAwIDAwMCDQuNC80L/RgNC10YHQuNC4IOKAkyA1MDAg0LvQtdCy0LAg0LfQsCDQvNC1 0YHQtdGGDQrQt9CwINCy0YHQuNGH0LrQuCDQsdCw0L3QtdGA0Lgg0LLRitCyINCy0YHQuNGH0LrQ uNGC0LUg0YHQsNC50YLQvtCy0LUuDQoNCg0KDQplLW1haWw6IHJ1c2V2Z2FsaW5AZ21haWwuY29t DQoNCnNreXBlOiB0ZWhub2xhbmQyMDEzDQoNCkdTTTogMDg5NiAwMTMgMjQ2DQoNCtCY0LzQtTog 0JPQsNC70LjQvSDQoNGD0YHQtdCyDQoNCg0KDQrQodGK0LPQu9Cw0YHQvdC+INC30LDQutC+0L3Q sCDQt9CwINC10LvQtdC60YLRgNC+0L3QvdCwINGC0YrRgNCz0L7QstC40Y8g0KfQuy4gNiwg0LDQ uy4gMSwg0YLQvtCy0LAg0LUg0L3QtdC/0L7QuNGB0LrQsNC90L4NCg0K0YLRitGA0LPQvtCy0YHQ utC+INGB0YrQvtCx0YnQtdC90LjQtS4g0KLQviDQtSDQtdC00L3QvtC60YDQsNGC0L3QviDQuNC3 0L/RgNCw0YLQtdC90L4NCg0K0L/QuNGB0LzQviDQtNC+INCS0LDRiNC40Y8g0LXQvNCw0LnQuyDQ sNC00YDQtdGBLCDQutC+0LnRgtC+INC1INCy0LfQtdGCINC+0YIg0L/Rg9Cx0LvQuNGH0L3QvtGC 0L4g0L/RgNC+0YHRgtGA0LDQvdGB0YLQstC+Lg0KDQrQmNC30LLQuNC90Y/QstCw0LzQtSDRgdC1 INC30LAg0L/RgNC40YfQuNC90LXQvdC+0YLQviDQvdC10YPQtNC+0LHRgdGC0LLQviwg0LDQutC+ INGB0LzQtSDQktC4INC/0YDQuNGC0LXRgdC90LjQu9C4INGBINC90LDRiNC10YLQvg0KDQrQv9GA 0LXQtNC70L7QttC10L3QuNC1LiDQkNC60L4g0L3QtSDQttC10LvQsNC10YLQtSDQtNCwINC/0L7Q u9GD0YfQsNCy0LDRgtC1INCyINCx0YrQtNC10YnQtSDRgdGK0L7QsdGJ0LXQvdC40Y8g0L7RgiDQ vdCw0YEsINC80L7Qu9GPINC00LANCg0K0L3QuCDQvtGC0LPQvtCy0L7RgNC40YLQtSAg0YEgIFVO U1VCU0NSSUJFLg0K --bcaec51b1aa9bfcb0504fa9ac3de Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1h Z2U6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPtCX0LTRgNCw0LLQtdC50YLQtSwg0LfQsNC90LjQ vNCw0LLQsNC8INGB0LUg0YEg0LTQuNGA0LXQutGC0L3QsCDRgNC10LrQu9Cw0LzQsCDQuA0K0L/Q vtC/0YPQu9GP0YDQuNC30LjRgNCw0L3QtSDQvdCwINGB0LDQudGC0L7QstC1LCDQvtC9INC70LDQ udC9INC80LDQs9Cw0LfQuNC90LgsINGB0LDQudGC0L7QstC1INC30LAg0LfQsNC/0L7Qt9C90LDQ vdGB0YLQstCwLCDRgdCw0LnRgtC+0LLQtQ0K0LfQsCDQutC+0LvQtdC60YLQuNCy0L3QviDQv9Cw 0LfQsNGA0YPQstCw0L3QtSwg0YHQsNC50YLQvtCy0LUg0LfQsCDQuNC80L7RgtC4LCDRgdCw0LnR gtC+0LLQtSDQt9CwINCw0LLRgtC+0LzQvtCx0LjQu9C4LCDRgdCw0LnRgtC+0LLQtSDQt9CwDQrQ sdGK0YDQt9C4INC/0L7RgtGA0LXQsdC40YLQtdC70YHQutC4INC60YDQtdC00LjRgtC4LiDQlNC+ INC80L7QvNC10L3RgtCwINGD0YHQv9C10YjQvdC+INGA0LDQsdC+0YLRjyDRgSDQvdCw0LQgMTAw INGB0LDQudGC0LAg0L7Rgg0K0JHRitC70LPQsNGA0LjRjywg0J3QsNGI0Lgg0LrQu9C40LXQvdGC 0Lgg0YHQsCDQtdC00L3QuCDQvtGCINC90LDQuSDigJMg0L/QvtGB0LXRidCw0LLQsNC90LjRgtC1 INC4INGA0LDQt9Cy0LjRgtC4INGC0YrRgNCz0L7QstGG0LguDQrQo9GB0LvRg9Cz0LjRgtC1LCDQ utC+0LjRgtC+INC/0YDQtdC00LvQsNCz0LDQvCDRgdCwINGB0LvQtdC00L3QuNGC0LU6PC9zcGFu PjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5p dGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEw cHQ7Zm9udC1mYW1pbHk6QXJpYWwiPsKgPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0 aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPsKgPC9z cGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6 aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPsKgPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDpp bml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPtCR 0LDQt9CwINC00LDQvdC90Lgg0YEgPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9u dC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPjINCjI8L3NwYW4+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj4wMCAwMDANCtCw0LrRgtC40LLQvdC4INCR 0JMg0LzQtdC50Lsg0LDQtNGA0LXRgdC4ICsg0LzQtdC50Lsg0LzQsNGA0LrQtdGC0LjQvdCzLCDR gNCw0LfQv9GA0LDRidCw0L3QtSDQvtGCINC90LDRiNCwINGB0YLRgNCw0L3QsCDigJMg0J/QoNCe 0JzQniDQptCV0J3QkA0K0L7RgiA8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+MjAwPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+INC70LXQstCwPC9zcGFuPjwvcD4NCg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlhbDtiYWNrZ3Jv dW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZTox MHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7CoDwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5p dGlhbCI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWls eTpBcmlhbCI+UnVzc2lhPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXpl OjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPiAtIDIsODAwLDAwMCA8L3NwYW4+PHNwYW4gc3R5bGU9 ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7QsNC60YLQuNCy0L3QuCDQvNC10LnQ uyDQsNC00YDQtdGB0LggKyDQvNC10LnQuyDQvNCw0YDQutC10YLQuNC90LMsINGA0LDQt9C/0YDQ sNGJ0LDQvdC1INC+0YIg0L3QsNGI0LAg0YHRgtGA0LDQvdCwDQrigJMg0J/QoNCe0JzQniDQptCV 0J3QkCDQvtGCIDwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMHB0 O2ZvbnQtZmFtaWx5OkFyaWFsIj4yPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTpBcmlhbCI+NTwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQt c2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj4wPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+INC70LXQstCwwqA8L3NwYW4+PHNwYW4gbGFuZz0i RU4tVVMiIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+PC9zcGFuPjwv cD4NCg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0 aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBw dDtmb250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRp YWwiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6 QXJpYWwiPkludGVybmF0aW9uYWwgLQ0KMiw2MDAsMDAwPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+DQrQsNC60YLQuNCy0L3QuCDQvNC10LnQuyDQ sNC00YDQtdGB0LggKyDQvNC10LnQuyDQvNCw0YDQutC10YLQuNC90LMsINGA0LDQt9C/0YDQsNGJ 0LDQvdC1INC+0YIg0L3QsNGI0LAg0YHRgtGA0LDQvdCwIOKAkyDQn9Cg0J7QnNCeINCm0JXQndCQ INC+0YINCjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2Zv bnQtZmFtaWx5OkFyaWFsIj4yPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250 LWZhbWlseTpBcmlhbCI+Mjwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj4wPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6 MTBwdDtmb250LWZhbWlseTpBcmlhbCI+INC70LXQstCwwqA8L3NwYW4+PHNwYW4gbGFuZz0iRU4t VVMiIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+PC9zcGFuPjwvcD4N Cg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFs O2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwi PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJp YWwiPkdyZWVjZTwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6ZToxMHB0 O2ZvbnQtZmFtaWx5OkFyaWFsIj4gLSAxODAsMDAwPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+INCw0LrRgtC40LLQvdC4INCR0JMg0LzQtdC50Lsg 0LDQtNGA0LXRgdC4ICsg0LzQtdC50Lsg0LzQsNGA0LrQtdGC0LjQvdCzLCDRgNCw0LfQv9GA0LDR idCw0L3QtSDQvtGCINC90LDRiNCwDQrRgdGC0YDQsNC90LAg4oCTINCf0KDQntCc0J4g0KbQldCd 0JAg0L7RgiAxPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7 Zm9udC1mYW1pbHk6QXJpYWwiPjAwPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTpBcmlhbCI+INC70LXQstCwwqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNv Tm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0 OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+ wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1p bWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+0J/Rg9Cx0LvQuNC60YPQstCw0L3QtSDQvdCw INCS0LDRiNCwINC+0LHRj9Cy0LAg0LIgMjE3INCx0YrQu9Cz0LDRgNGB0LrQuA0K0YHQsNC50YLQ vtCy0LUg0LfQsCDQvtCx0Y/QstC4IC0gMjUg0LvQtdCy0LA8L3NwYW4+PC9wPg0KDQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQt cmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpB cmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dy b3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+wqDQlNC+0LHQsNCy0Y/QvdC1INC9 0LAgRmFjZWJvb2sg0YTQtdC90L7QstC1Ojwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5p dGlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7CoDwv c3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdl OmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6 ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj41MCAwMDAgLSAxNTAg0LvQtdCy0LA8L3NwYW4+PC9w Pg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFs O2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+MTAwIDAwMCAt IDI1MCDQu9C10LLQsDwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJi YWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4g c3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7CoDwvc3Bhbj48L3A+DQoN CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFj a2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQt ZmFtaWx5OkFyaWFsIj7QntGB0LjQs9GD0YDRj9Cy0LDQvdC1INC90LAg0YPQvdC40LrQsNC70L3Q uCDQv9C+0YHQtdGJ0LXQvdC40Y8g0LrRitC8INCS0LDRiCDRgdCw0LnRgg0K0YHQsNC80L4g0L7R giDQkdCTINC/0L7RgtGA0LXQsdC40YLQtdC70Lgg0L/Qu9Cw0L3QvtCy0LU6wqA8L3NwYW4+PC9w Pg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFs O2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+MTAgMDAwIOKA kyAxMDAg0LvQtdCy0LAgLyAzINGA0LDQsdC+0YLQvdC4INC00L3QuDwvc3Bhbj48L3A+DQoNCjxw IGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dy b3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFt aWx5OkFyaWFsIj7CoDwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJi YWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4g c3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj4xMDAgMDAwIOKAkyA1MDAg 0LvQtdCy0LAgLyAxMCDRgNCw0LHQvtGC0L3QuCDQtNC90Lg8L3NwYW4+PC9wPg0KDQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQt cmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpB cmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dy b3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+0J/Qu9Cw0YLQtdC90LAg0YDQtdC6 0LvQsNC80LAg0LLRitCyIDwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtc2l6 ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj5GYWNlYm9vaw0KPC9zcGFuPjxzcGFuIHN0eWxlPSJm b250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+0L3QsA0K0YHRgtC+0LnQvdC+0YHRgiAx IDAwMCDQtNC+0LvQsNGA0LAsINC30LDQv9C70LDRidCw0YLQtSAxNTAg0LTQvtC70LDRgNCwPC9z cGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6 aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPsKgPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDpp bml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPtCf 0LvQsNGC0LXQvdCwINGA0LXQutC70LDQvNCwINCyIDwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyIg c3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj5Hb29nbGUNCkFkd29yZHM8 L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj4NCtC9 0LAg0YHRgtC+0LnQvdC+0YHRgiAxIDAwMCDQtNC+0LvQsNGA0LAsINC30LDQv9C70LDRidCw0YLQ tSAxNTAg0LTQvtC70LDRgNCwPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5 bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlhbDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48 c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6QXJpYWwiPsKgPC9zcGFuPjwv cD4NCg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6aW5pdGlh bDtiYWNrZ3JvdW5kLXJlcGVhdDppbml0aWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7 Zm9udC1mYW1pbHk6QXJpYWwiPtCR0LDQvdC10YAg0YDQtdC60LvQsNC80LAg0LIgMTAg0LLQvtC0 0LXRidC4INGB0LDQudGC0LAg0LfQsCDQvtCx0Y/QstC4INC30LANCtGB0YDQvtC6INC+0YIgMSDQ vNC10YHQtdGGINGBINC+0LHRidC+INC00L3QtdCy0LXQvSDRgtGA0LDRhNC40Log0L3QsNC0IDEw MCAwMDAg0L/QvtGC0YDQtdCx0LjRgtC10LvRjyDQuCDQvdCw0LQgMiAwMDAgMDAwDQrQuNC80L/R gNC10YHQuNC4IOKAkyA1MDAg0LvQtdCy0LAg0LfQsCDQvNC10YHQtdGGINC30LAg0LLRgdC40YfQ utC4INCx0LDQvdC10YDQuCDQstGK0LIg0LLRgdC40YfQutC40YLQtSDRgdCw0LnRgtC+0LLQtS48 L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFn ZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNv Tm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0 OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+ ZS1tYWlsOsKgPGEgaHJlZj0ibWFpbHRvOnJ1c2V2Z2FsaW5AZ21haWwuY29tIiB0YXJnZXQ9Il9i bGFuayI+cnVzZXZnYWxpbkBnbWFpbC5jb208L2E+PC9zcGFuPjwvcD4NCg0KDQo8cCBjbGFzcz0i TXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVw ZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlh bCI+c2t5cGU6IHRlaG5vbGFuZDIwMTM8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRp YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+R1NNOiAw ODk2IDAxMyAyNDY8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFj a2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+0JjQvNC1OiDQk9Cw0LvQuNC9 INCg0YPRgdC10LI8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFj a2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZhbWlseTpBcmlhbCI+wqA8L3NwYW4+PC9wPg0KDQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0aWFsO2JhY2tn cm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtmb250LWZh bWlseTpBcmlhbCI+0KHRitCz0LvQsNGB0L3QviDQt9Cw0LrQvtC90LAg0LfQsCDQtdC70LXQutGC 0YDQvtC90L3QsCDRgtGK0YDQs9C+0LLQuNGPINCn0LsuIDYsDQrQsNC7LiAxLCDRgtC+0LLQsCDQ tSDQvdC10L/QvtC40YHQutCw0L3Qvjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlh bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7RgtGK0YDQ s9C+0LLRgdC60L4g0YHRitC+0LHRidC10L3QuNC1LiDQotC+INC1INC10LTQvdC+0LrRgNCw0YLQ vdC+INC40LfQv9GA0LDRgtC10L3Qvjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlh bCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7Qv9C40YHQ vNC+INC00L4g0JLQsNGI0LjRjyDQtdC80LDQudC7INCw0LTRgNC10YEsINC60L7QudGC0L4g0LUg 0LLQt9C10YIg0L7Rgg0K0L/Rg9Cx0LvQuNGH0L3QvtGC0L4g0L/RgNC+0YHRgtGA0LDQvdGB0YLQ stC+Ljwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5k LWltYWdlOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OkFyaWFsIj7QmNC30LLQuNC90Y/QstCw0LzQtSDRgdC1 INC30LAg0L/RgNC40YfQuNC90LXQvdC+0YLQviDQvdC10YPQtNC+0LHRgdGC0LLQviwg0LDQutC+ DQrRgdC80LUg0JLQuCDQv9GA0LjRgtC10YHQvdC40LvQuCDRgSDQvdCw0YjQtdGC0L48L3NwYW4+ PC9wPg0KDQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTppbml0 aWFsO2JhY2tncm91bmQtcmVwZWF0OmluaXRpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBw dDtmb250LWZhbWlseTpBcmlhbCI+0L/RgNC10LTQu9C+0LbQtdC90LjQtS4g0JDQutC+INC90LUg 0LbQtdC70LDQtdGC0LUg0LTQsCDQv9C+0LvRg9GH0LDQstCw0YLQtSDQsg0K0LHRitC00LXRidC1 INGB0YrQvtCx0YnQtdC90LjRjyDQvtGCINC90LDRgSwg0LzQvtC70Y8g0LTQsDwvc3Bhbj48L3A+ DQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOmluaXRpYWw7 YmFja2dyb3VuZC1yZXBlYXQ6aW5pdGlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB0O2Zv bnQtZmFtaWx5OkFyaWFsIj7QvdC4INC+0YLQs9C+0LLQvtGA0LjRgtC1IMKg0YEgwqBVTlNVQlND UklCRS48L3NwYW4+PC9wPjwvZGl2Pg0K --bcaec51b1aa9bfcb0504fa9ac3de-- From lczerner@redhat.com Fri May 30 05:55:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 0CA7F7F47 for ; Fri, 30 May 2014 05:55:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5F89304048 for ; Fri, 30 May 2014 03:54:57 -0700 (PDT) X-ASG-Debug-ID: 1401447296-04cbb050fab8760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KyieV8OHBxYtYeiG for ; Fri, 30 May 2014 03:54:56 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@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 (8.14.4/8.14.4) with ESMTP id s4UAsqPX005627 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 30 May 2014 06:54:53 -0400 Received: from dhcp-1-146.brq.redhat.com (dhcp-1-146.brq.redhat.com [10.34.1.146]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4UAsmTs012579 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 30 May 2014 06:54:50 -0400 Date: Fri, 30 May 2014 12:54:48 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Namjae Jeon cc: Dave Chinner , "Theodore Ts'o" , linux-ext4 , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: Re: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate In-Reply-To: <003601cf6aa7$883103b0$98930b10$@samsung.com> X-ASG-Orig-Subj: Re: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: References: <003601cf6aa7$883103b0$98930b10$@samsung.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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: 1401447296 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, 8 May 2014, Namjae Jeon wrote: > Date: Thu, 08 May 2014 19:23:19 +0900 > From: Namjae Jeon > To: Dave Chinner , Theodore Ts'o > Cc: linux-ext4 , xfs@oss.sgi.com, > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > Ashish Sangwan > Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate > > In continuation of the work of making the process of non linear editing of > media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE > for fallocate. > > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > in between the file within the range specified by offset and len. User can > write new data in this space. e.g. ads. > Like collapse range, currently we have the limitation that offset and len should > be block size aligned for both XFS and Ext4. > > The semantics of the flag are : > 1) It allocates new zeroed out on disk space of len bytes starting > at offset byte without overwriting any existing data. All the data blocks > from offset to EOF are shifted towards right to make space for inserting > new blocks Hi, this sounds a little bit weird to me. I understand the reason for this, but this is effectively two operations masking as one. We shift the existing data and then we allocate unwritten extents for the hole we've created. What would make more sense to me is to implement only the first operation - the shift. And then let the user to allocate unwritten extents for the hole using simple fallocate. The reason is that if you succeed the first part and then fail the second due to ENOSPC or any other reason the file will end up in undefined state unnecessarily. Yes in your current implementation it seems that you'll always end up with the hole in the file and the rest is properly shifted, but that may vary from file system to file system. Some might choose to roll back the shift, some might not. If FALLOC_FL_INSERT_RANGE (or any name you wish to choose) would just simply shift the extents then you'll get rid of this and the only thing that user needs to do (if he chooses to) is to use fallocate for the hole created by the shift. If it fails, then well, he can try again without any consequences. As a bonus you get the possibility to leave the hole in the file which might be useful as well. With current behaviour this might get very confusing very quickly. What do you and others think ? Thanks! -LUkas > 2) It should be used exclusively. No other fallocate flag in combination. > 3) Offset and length supplied to fallocate should be fs block size aligned > in case of xfs and ext4. > 4) Insert range does not work for the case when offset is overlapping/beyond > i_size. If the user wants to allocate space at the end of file they are > advised to use either ftruncate(2) or fallocate(2) with mode 0. > 5) It increses the size of file by len bytes. > > > Namjae Jeon (10): > fs: Add support FALLOC_FL_INSERT_RANGE for fallocate > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > xfsprogs: xfs_io: add finsert command for insert range via fallocate > xfstests: generic/027: Standard insert range tests > xfstests: generic/028: Delayed allocation insert range > xfstests: generic/029: Multi insert range tests > xfstests: generic/030: Delayed allocation multi insert > xfstests: fsstress: Add fallocate insert range operation > xfstests: fsx: Add fallocate insert range operation > > From bfoster@redhat.com Fri May 30 09:06:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E2F557F3F for ; Fri, 30 May 2014 09:06:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B1F9B8F8066 for ; Fri, 30 May 2014 07:06:03 -0700 (PDT) X-ASG-Debug-ID: 1401458761-04cb6c22b82e5e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HxANcYEQpaEKeNUx for ; Fri, 30 May 2014 07:06: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4UE5r0u001058 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 30 May 2014 10:05:54 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4UE5rIn004672; Fri, 30 May 2014 10:05:53 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2A3561248A9; Fri, 30 May 2014 10:05:52 -0400 (EDT) Date: Fri, 30 May 2014 10:05:52 -0400 From: Brian Foster To: Namjae Jeon Cc: Dave Chinner , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, Ashish Sangwan Subject: Re: [PATCH v4 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140530140551.GC6226@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v4 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <001e01cf7b0f$ba43dfd0$2ecb9f70$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <001e01cf7b0f$ba43dfd0$2ecb9f70$@samsung.com> User-Agent: Mutt/1.5.21 (2010-09-15) 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: 1401458762 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, May 29, 2014 at 04:29:29PM +0900, Namjae Jeon wrote: > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > 5) Allocate unwritten extents for the hole created in step 4. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Reviewed-by: Brian Foster > --- > > Changelog > v4: > - set cur->bc_private.b.allocated to zero before calling xfs_btree_del_cursor. > Other issues not withstanding (sounds like Mark still has a lingering, potential corruption case), this fixes the warnings I was seeing. I ran through an xfstest cycle without problem. Thanks for fixing this. The cursor allocated flag appears to be used to carry bmbt block allocations over to delayed allocation extent conversions (such that these allocations are accounted from previous delalloc extent index block reservations). This is all within the bmbt code, so clearing the flag seems reasonable as well. Though I wonder why it falls on the caller to clear the flag as opposed to fixing up the flag automatically when it becomes accounted for. I guess that would enable a warning with semantics of "something might have been unaccounted for" vs. "somebody forgot to reset a flag." That said, it's likely there are circumstances involved with this mechanism that I'm not yet familiar with. ;) Brian > v3: > - remove XFS_TRANS_RESERVE and assert. > - update the comment of blockcount calculation. > - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. > - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. > > v2: > - remove reserved enable. > - add xfs_qm_dqattach. > - reset blockcount in xfs_bmap_shift_extents_right. > - update i_size to avoid data loss before insert_file_space() is called. > - use in-memory extent array size that delayed allocation extents. > > fs/xfs/xfs_bmap.c | 379 ++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 128 ++++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 38 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 552 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 1ff0da6..a6d4e8d 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -5419,7 +5419,7 @@ error0: > * into, this will be considered invalid operation and we abort immediately. > */ > int > -xfs_bmap_shift_extents( > +xfs_bmap_shift_extents_left( > struct xfs_trans *tp, > struct xfs_inode *ip, > int *done, > @@ -5449,7 +5449,7 @@ xfs_bmap_shift_extents( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > - XFS_ERROR_REPORT("xfs_bmap_shift_extents", > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", > XFS_ERRLEVEL_LOW, mp); > return XFS_ERROR(EFSCORRUPTED); > } > @@ -5606,3 +5606,378 @@ del_cursor: > xfs_trans_log_inode(tp, ip, logflags); > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be splitted. @split_fsb is a block where the extents is spliited. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *current_ext, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* splitted extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + int error = 0; > + int logflags; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_bmbt_set_blockcount(gotp, gotblkcnt); > + got.br_blockcount = gotblkcnt; > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + /* Add new extent */ > + (*current_ext)++; > + xfs_iext_insert(ip, *current_ext, 1, &new, 0); > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, > + new.br_startblock, new.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); > + cur->bc_rec.b.br_state = new.br_state; > + > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + /* > + * Convert to a btree if necessary. > + */ > + if (xfs_bmap_needs_btree(ip, whichfork)) { > + int tmp_logflags; /* partial log flag return val */ > + > + ASSERT(cur == NULL); > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + &cur, 0, &tmp_logflags, whichfork); > + logflags |= tmp_logflags; > + } > + > +del_cursor: > + if (cur) { > + cur->bc_private.b.allocated = 0; > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + } > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > + > +int > +xfs_bmap_split_extent( > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_extnum_t *split_ext) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t firstfsb; > + int committed; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + > + if (error) { > + /* > + * Free the transaction structure. > + */ > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + xfs_bmap_init(&free_list, &firstfsb); > + > + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, > + &firstfsb, &free_list); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + > + return error; > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > + * Shift extent records to the right to make a hole. > + * The maximum number of extents to be shifted in a single operation > + * is @num_exts, and @current_ext keeps track of the current extent > + * index we have shifted. @offset_shift_fsb is the length by which each > + * extent is shifted. @end_ext is the last extent to be shifted. > + */ > +int > +xfs_bmap_shift_extents_right( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + int *done, > + xfs_fileoff_t offset_shift_fsb, > + xfs_extnum_t *current_ext, > + xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, > + struct xfs_bmap_free *flist, > + int num_exts) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_btree_cur *cur; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec right; > + xfs_ifork_t *ifp; > + xfs_fileoff_t startoff; > + xfs_filblks_t blockcount = 0; > + xfs_extnum_t last_extent; > + int error = 0; > + int i; > + int whichfork = XFS_DATA_FORK; > + int logflags; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", > + XFS_ERRLEVEL_LOW, mp); > + return XFS_ERROR(EFSCORRUPTED); > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return XFS_ERROR(EIO); > + > + ASSERT(current_ext != NULL); > + > + /* We are going to change core inode */ > + logflags = XFS_ILOG_CORE; > + ifp = XFS_IFORK_PTR(ip, whichfork); > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstblock; > + cur->bc_private.b.flist = flist; > + cur->bc_private.b.flags = 0; > + } else { > + cur = NULL; > + logflags |= XFS_ILOG_DEXT; > + } > + > + /* start shifting extents to right */ > + while (num_exts-- > 0) { > + blockcount = 0; > + > + if (*current_ext < end_ext) { > + *done = 1; > + break; > + } > + > + gotp = xfs_iext_get_ext(ifp, *current_ext); > + xfs_bmbt_get_all(gotp, &got); > + startoff = got.br_startoff + offset_shift_fsb; > + > + /* > + * Before shifting extent into hole, make sure that the hole > + * is large enough to accomodate the shift. This checking has > + * to be performed for all except the last extent. > + */ > + last_extent = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + if (last_extent != *current_ext) { > + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, > + *current_ext + 1), &right); > + if (startoff + got.br_blockcount > right.br_startoff) { > + error = XFS_ERROR(EINVAL); > + if (error) > + goto del_cursor; > + } > + } > + > + /* Check if we can merge 2 adjacent extents */ > + if (last_extent != *current_ext && > + right.br_startoff == startoff + got.br_blockcount && > + right.br_startblock == > + got.br_startblock + got.br_blockcount && > + right.br_state == got.br_state && > + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { > + > + /* > + * Merge the current extent with the extent to > + * the right. Remove the right extent, calculate > + * a new block count for the current extent to cover > + * the range of both and decrement the number of extents > + * in the fork. > + */ > + blockcount = right.br_blockcount + got.br_blockcount; > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, > + right.br_startoff, > + right.br_startblock, > + right.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + xfs_iext_remove(ip, *current_ext + 1, 1, 0); > + if (cur) { > + error = xfs_btree_delete(cur, &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + XFS_IFORK_NEXT_SET(ip, whichfork, > + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); > + > + } > + > + if (cur) { > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } > + > + if (blockcount) { > + xfs_bmbt_set_blockcount(gotp, blockcount); > + got.br_blockcount = blockcount; > + } > + > + xfs_bmbt_set_startoff(gotp, startoff); > + got.br_startoff = startoff; > + > + if (cur) { > + error = xfs_bmbt_update(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + got.br_state); > + if (error) > + goto del_cursor; > + } > + > + (*current_ext)--; > + } > + > +del_cursor: > + if (cur) > + xfs_btree_del_cursor(cur, > + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); > + xfs_trans_log_inode(tp, ip, logflags); > + return error; > +} > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index 38ba36e..af05899 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, > int *done, xfs_fileoff_t start_fsb, > xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, > xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > int num_exts); > +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, > + xfs_extnum_t *split_ext); > +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, > + int *done, xfs_fsblock_t offset_shift_fsb, > + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, > + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, > + int num_exts); > > #endif /* __XFS_BMAP_H__ */ > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 057f671..b9511dd 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1548,7 +1548,7 @@ xfs_collapse_file_space( > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, > + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, > shift_fsb, ¤t_ext, > &first_block, &free_list, > XFS_BMAP_MAX_SHIFT_EXTENTS); > @@ -1572,6 +1572,132 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine allocate disk space and shift extent for the given file. > + * The first thing we do is to sync dirty data and invalidate page cache > + * over the region on which insert range is working. And split an extent > + * to two extents at given offset by calling xfs_bmap_split_extent. > + * And shift all extent records which are laying between [offset, > + * last allocated extent] to the right to reserve hole range. Lastly > + * allocate an unwritten extent in hole range created by shifting extents. > + * > + * RETURNS: > + * 0 on success > + * errno on error > + * > + */ > +int > +xfs_insert_file_space( > + struct xfs_inode *ip, > + loff_t offset, > + loff_t len) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + struct xfs_bmap_free free_list; > + xfs_fsblock_t first_block; > + xfs_ifork_t *ifp; > + int done = 0; > + int committed; > + int error; > + uint rounding; > + xfs_fileoff_t start_fsb; > + xfs_fileoff_t shift_fsb; > + xfs_extnum_t split_ext; > + xfs_extnum_t current_ext = 0; > + xfs_off_t ioffset; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + trace_xfs_insert_file_space(ip); > + > + error = xfs_qm_dqattach(ip, 0); > + if (error) > + return error; > + > + /* wait for the completion of any pending DIOs */ > + inode_dio_wait(VFS_I(ip)); > + > + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); > + ioffset = offset & ~(rounding - 1); > + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > + ioffset, -1); > + if (error) > + return error; > + > + truncate_pagecache_range(VFS_I(ip), ioffset, -1); > + > + start_fsb = XFS_B_TO_FSB(mp, offset); > + shift_fsb = XFS_B_TO_FSB(mp, len); > + > + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); > + if (error) > + return error; > + > + ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); > + current_ext = (ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - 1; > + while (!error && !done) { > + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > + /* > + * We would need to reserve permanent block for transaction. > + * This will come into picture when after shifting extent into > + * hole we found that adjacent extents can be merged which > + * may lead to freeing of a block during record update. > + */ > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + break; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, > + ip->i_gdquot, ip->i_pdquot, > + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, > + XFS_QMOPT_RES_REGBLKS); > + if (error) > + goto error1; > + > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + > + /* > + * We are using the write transaction in which max 2 bmbt > + * updates are allowed > + */ > + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, > + ¤t_ext, split_ext, > + &first_block, &free_list, > + XFS_BMAP_MAX_SHIFT_EXTENTS); > + if (error) > + goto error0; > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + goto error0; > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + if (error) > + goto out; > + } > + > + /* Add unwritten extent in a hole range. */ > + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); > + > +out: > + return error; > + > +error0: > + xfs_bmap_cancel(&free_list); > +error1: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > +} > + > +/* > * We need to check that the format of the data fork in the temporary inode is > * valid for the target inode before doing the swap. This is not a problem with > * attr1 because of the fixed fork offset, but attr2 has a dynamically sized > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..d62ab4b 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, > xfs_off_t len); > int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, > xfs_off_t len); > +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, > + xfs_off_t len); > > /* EOF block manipulation functions */ > bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..f160cd5 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -756,11 +756,13 @@ xfs_file_fallocate( > struct xfs_trans *tp; > long error; > loff_t new_size = 0; > + int do_file_insert = 0; > > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -790,6 +792,28 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* Check for wrap through zero */ > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > + error = -EFBIG; > + goto out_unlock; > + } > + > + /* Offset should be less than i_size */ > + if (offset >= i_size_read(inode)) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + new_size = i_size_read(inode) + len; > + do_file_insert = 1; > } else { > if (!(mode & FALLOC_FL_KEEP_SIZE) && > offset + len > i_size_read(inode)) { > @@ -840,8 +864,20 @@ xfs_file_fallocate( > iattr.ia_valid = ATTR_SIZE; > iattr.ia_size = new_size; > error = xfs_setattr_size(ip, &iattr); > + if (error) > + goto out_unlock; > } > > + /* > + * Some operations are performed after the inode size is updated. For > + * example, insert range expands the address space of the file, shifts > + * all subsequent extents over and allocates space into the hole. > + * Updating the size first ensures that shifted extents aren't left > + * hanging past EOF in the event of a crash or failure. > + */ > + if (do_file_insert) > + error = xfs_insert_file_space(ip, offset, len); > + > out_unlock: > xfs_iunlock(ip, XFS_IOLOCK_EXCL); > return -error; > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 152f827..8943c9f 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -663,6 +663,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); > DEFINE_INODE_EVENT(xfs_free_file_space); > DEFINE_INODE_EVENT(xfs_zero_file_space); > DEFINE_INODE_EVENT(xfs_collapse_file_space); > +DEFINE_INODE_EVENT(xfs_insert_file_space); > DEFINE_INODE_EVENT(xfs_readdir); > #ifdef CONFIG_XFS_POSIX_ACL > DEFINE_INODE_EVENT(xfs_get_acl); > -- > 1.7.11-rc0 > From noreply@release.debian.org Fri May 30 11:39:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 C6BDF7F47 for ; Fri, 30 May 2014 11:39:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 84E218F8050 for ; Fri, 30 May 2014 09:39:21 -0700 (PDT) X-ASG-Debug-ID: 1401467958-04bdf059a03192a0001-NocioJ Received: from picconi.debian.org (picconi.debian.org [5.153.231.3]) by cuda.sgi.com with ESMTP id 9LqWxyUEsCUXM6sC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 30 May 2014 09:39:19 -0700 (PDT) X-Barracuda-Envelope-From: noreply@release.debian.org X-Barracuda-Apparent-Source-IP: 5.153.231.3 Received: from muffat.debian.org ([2607:f8f0:610:4000:6564:a62:ce0c:1392]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=muffat.debian.org,EMAIL=hostmaster@muffat.debian.org (verified) by picconi.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1WqPpt-0008EV-NM for xfsprogs@packages.debian.org; Fri, 30 May 2014 16:39:17 +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 muffat.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1WqPpq-0000P4-I7; Fri, 30 May 2014 16:39:14 +0000 Received: from release by franck.debian.org with local (Exim 4.80) (envelope-from ) id 1WqPpp-0004yT-Aj; Fri, 30 May 2014 16:39:13 +0000 From: Debian testing watch Precedence: bulk X-Trille: 0.120315.1711 Subject: xfsprogs 3.2.0 MIGRATED to testing X-Testing-Watch-Package: xfsprogs X-ASG-Orig-Subj: xfsprogs 3.2.0 MIGRATED to testing X-Testing-Watch-Version: 3.2.0 To: xfsprogs@packages.debian.org Message-Id: Sender: Release Managers Date: Fri, 30 May 2014 16:39:13 +0000 Delivered-To: xfsprogs@packages.debian.org X-Barracuda-Connect: picconi.debian.org[5.153.231.3] X-Barracuda-Start-Time: 1401467959 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=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6242 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.1.9 Current version: 3.2.0 -- 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 Fri May 30 14:10:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 671A37F47 for ; Fri, 30 May 2014 14:10:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E75B5AC001 for ; Fri, 30 May 2014 12:10:17 -0700 (PDT) X-ASG-Debug-ID: 1401477013-04cb6c100601e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pfYnvCsaBDQiBxyE for ; Fri, 30 May 2014 12:10: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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4UJAB8K001127 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 30 May 2014 15:10:11 -0400 Received: from laptop.bfoster (vpn-62-22.rdu2.redhat.com [10.10.62.22]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4UJAB6f025311; Fri, 30 May 2014 15:10:11 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 1AA93120D90; Fri, 30 May 2014 15:05:17 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4UJ5Ff5003600; Fri, 30 May 2014 15:05:15 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 30 May 2014 15:05:14 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/16] xfs: introduce directory geometry structure Message-ID: <20140530190513.GA3146@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/16] xfs: introduce directory geometry structure References: <1401257083-13433-1-git-send-email-david@fromorbit.com> <1401257083-13433-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401257083-13433-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: 1401477013 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, May 28, 2014 at 04:04:28PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The directory code has a dependency on the struct xfs_mount to > supply the directory block geometry. Block size, block log size, > and other parameters are pre-caclulated in the struct xfs_mount or > access directly from the superblock embedded in the struct > xfs_mount. > > Extract all of this geometry information out of the struct xfs_mount > and superblock and place it into a new struct xfs_da_geometry > defined by the directory code. Allocate and initialise it at mount > time, and attach it to the struct xfs_mount so it canbe passed back > into the directory code appropriately rather than using the struct > xfs_mount. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_attr.c | 1 + > fs/xfs/xfs_attr_leaf.c | 2 ++ > fs/xfs/xfs_attr_list.c | 1 + > fs/xfs/xfs_da_btree.h | 18 +++++++++++++ > fs/xfs/xfs_dir2.c | 73 +++++++++++++++++++++++++++++++++++++++++--------- > fs/xfs/xfs_dir2.h | 4 ++- > fs/xfs/xfs_mount.c | 16 ++++++----- > fs/xfs/xfs_mount.h | 3 +++ > 8 files changed, 97 insertions(+), 21 deletions(-) > > diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c > index 1fc1f06..c547498 100644 > --- a/fs/xfs/xfs_attr.c > +++ b/fs/xfs/xfs_attr.c > @@ -88,6 +88,7 @@ xfs_attr_args_init( > return EINVAL; > > memset(args, 0, sizeof(*args)); > + args->geo = dp->i_mount->m_attr_geo; > args->whichfork = XFS_ATTR_FORK; > args->dp = dp; > args->flags = flags; > diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c > index 511c283..2c0fdc8 100644 > --- a/fs/xfs/xfs_attr_leaf.c > +++ b/fs/xfs/xfs_attr_leaf.c > @@ -711,6 +711,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) > > memset((char *)&nargs, 0, sizeof(nargs)); > nargs.dp = dp; > + nargs.geo = args->geo; > nargs.firstblock = args->firstblock; > nargs.flist = args->flist; > nargs.total = args->total; > @@ -838,6 +839,7 @@ xfs_attr3_leaf_to_shortform( > * Copy the attributes > */ > memset((char *)&nargs, 0, sizeof(nargs)); > + nargs.geo = args->geo; > nargs.dp = dp; > nargs.firstblock = args->firstblock; > nargs.flist = args->flist; > diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c > index 833fe5d..90e2eeb 100644 > --- a/fs/xfs/xfs_attr_list.c > +++ b/fs/xfs/xfs_attr_list.c > @@ -444,6 +444,7 @@ xfs_attr3_leaf_list_int( > xfs_da_args_t args; > > memset((char *)&args, 0, sizeof(args)); > + args.geo = context->dp->i_mount->m_attr_geo; > args.dp = context->dp; > args.whichfork = XFS_ATTR_FORK; > args.valuelen = valuelen; > diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h > index c824a0a..0ac63ad 100644 > --- a/fs/xfs/xfs_da_btree.h > +++ b/fs/xfs/xfs_da_btree.h > @@ -25,6 +25,23 @@ struct xfs_trans; > struct zone; > struct xfs_dir_ops; > > +/* > + * Directory/attribute geometry information. There will be one of these for each > + * data fork type, and it will be passed around via the xfs_da_args. Global > + * structures will be attached to the xfs_mount. > + */ > +struct xfs_da_geometry { > + int blksize; /* da block size in bytes */ > + int fsbcount; /* da block size in filesystem blocks */ > + uint8_t fsblog; /* log2 of _filesystem_ block size */ > + uint8_t blklog; /* log2 of da block size */ > + uint node_ents; /* # of entries in a danode */ > + int magicpct; /* 37% of block size in bytes */ > + xfs_dablk_t datablk; /* blockno of dir data v2 */ > + xfs_dablk_t leafblk; /* blockno of leaf data v2 */ > + xfs_dablk_t freeblk; /* blockno of free data v2 */ > +}; > + > /*======================================================================== > * Btree searching and modification structure definitions. > *========================================================================*/ > @@ -42,6 +59,7 @@ enum xfs_dacmp { > * Structure to ease passing around component names. > */ > typedef struct xfs_da_args { > + struct xfs_da_geometry *geo; /* da block geometry */ > const __uint8_t *name; /* string (maybe not NULL terminated) */ > int namelen; /* length of string (maybe no NULL) */ > __uint8_t filetype; /* filetype of inode for directories */ > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index 93fcebd..acd940d 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -85,11 +85,12 @@ static struct xfs_nameops xfs_ascii_ci_nameops = { > .compname = xfs_ascii_ci_compname, > }; > > -void > -xfs_dir_mount( > - xfs_mount_t *mp) > +int > +xfs_da_mount( > + struct xfs_mount *mp) > { > - int nodehdr_size; > + struct xfs_da_geometry *dageo; > + int nodehdr_size; > > > ASSERT(mp->m_sb.sb_versionnum & XFS_SB_VERSION_DIRV2BIT); > @@ -99,24 +100,64 @@ xfs_dir_mount( > mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); > mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); > > - mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); > - mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; > - mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); > - mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); > - mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); > - > nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; > - mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / > + mp->m_dir_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > + KM_SLEEP | KM_MAYFAIL); > + mp->m_attr_geo = kmem_zalloc(sizeof(struct xfs_da_geometry), > + KM_SLEEP | KM_MAYFAIL); > + if (!mp->m_dir_geo || !mp->m_attr_geo) { > + kmem_free(mp->m_dir_geo); > + kmem_free(mp->m_attr_geo); > + return ENOMEM; > + } > + > + /* set up directory geometry */ > + dageo = mp->m_dir_geo; > + dageo->blklog = mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog; > + dageo->fsblog = mp->m_sb.sb_blocklog; > + dageo->blksize = 1 << dageo->blklog; > + dageo->fsbcount = 1 << mp->m_sb.sb_dirblklog; > + dageo->datablk = xfs_dir2_byte_to_da(mp, XFS_DIR2_DATA_OFFSET); > + dageo->leafblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_LEAF_OFFSET); > + dageo->freeblk = xfs_dir2_byte_to_da(mp, XFS_DIR2_FREE_OFFSET); > + dageo->node_ents = (dageo->blksize - nodehdr_size) / > (uint)sizeof(xfs_da_node_entry_t); > - mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / > + dageo->magicpct = (dageo->blksize * 37) / 100; > + > + /* set up attribute geometry - single fsb only */ > + dageo = mp->m_attr_geo; > + dageo->blklog = mp->m_sb.sb_blocklog; > + dageo->fsblog = mp->m_sb.sb_blocklog; > + dageo->blksize = 1 << dageo->blklog; > + dageo->fsbcount = 1; > + dageo->node_ents = (dageo->blksize - nodehdr_size) / > (uint)sizeof(xfs_da_node_entry_t); > + dageo->magicpct = (dageo->blksize * 37) / 100; > > - mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; > if (xfs_sb_version_hasasciici(&mp->m_sb)) > mp->m_dirnameops = &xfs_ascii_ci_nameops; > else > mp->m_dirnameops = &xfs_default_nameops; > > + /* XXX: these are to be removed as code is converted to use geo */ > + mp->m_dirblksize = mp->m_dir_geo->blksize; > + mp->m_dirblkfsbs = mp->m_dir_geo->fsbcount; > + mp->m_dirdatablk = mp->m_dir_geo->datablk; > + mp->m_dirleafblk = mp->m_dir_geo->leafblk; > + mp->m_dirfreeblk = mp->m_dir_geo->freeblk; > + mp->m_dir_node_ents = mp->m_dir_geo->node_ents; > + mp->m_dir_magicpct = mp->m_dir_geo->magicpct; > + mp->m_attr_node_ents = mp->m_attr_geo->node_ents; > + mp->m_attr_magicpct = mp->m_attr_geo->magicpct; > + return 0; > +} > + > +void > +xfs_da_unmount( > + struct xfs_mount *mp) > +{ > + kmem_free(mp->m_dir_geo); > + kmem_free(mp->m_attr_geo); > } > > /* > @@ -192,6 +233,7 @@ xfs_dir_init( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->dp = dp; > args->trans = tp; > error = xfs_dir2_sf_create(args, pdp->i_ino); > @@ -226,6 +268,7 @@ xfs_dir_createname( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -320,6 +363,7 @@ xfs_dir_lookup( > * annotations into the reclaim path for the ilock. > */ > args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -391,6 +435,7 @@ xfs_dir_removename( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -455,6 +500,7 @@ xfs_dir_replace( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > @@ -516,6 +562,7 @@ xfs_dir_canenter( > if (!args) > return ENOMEM; > > + args->geo = dp->i_mount->m_dir_geo; > args->name = name->name; > args->namelen = name->len; > args->filetype = name->type; > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index 64a6b19..7a85b9c 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -112,7 +112,9 @@ extern const struct xfs_dir_ops * > * Generic directory interface routines > */ > extern void xfs_dir_startup(void); > -extern void xfs_dir_mount(struct xfs_mount *mp); > +extern int xfs_da_mount(struct xfs_mount *mp); > +extern void xfs_da_unmount(struct xfs_mount *mp); > + > extern int xfs_dir_isempty(struct xfs_inode *dp); > extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_inode *pdp); > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index fa8a420..3507cd0 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -791,12 +791,11 @@ xfs_mountfs( > > mp->m_dmevmask = 0; /* not persistent; set after each mount */ > > - xfs_dir_mount(mp); > - > - /* > - * Initialize the attribute manager's entries. > - */ > - mp->m_attr_magicpct = (mp->m_sb.sb_blocksize * 37) / 100; > + error = xfs_da_mount(mp); > + if (error) { > + xfs_warn(mp, "Failed dir/attr init: %d", error); > + goto out_remove_uuid; > + } > > /* > * Initialize the precomputed transaction reservations values. > @@ -811,7 +810,7 @@ xfs_mountfs( > error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); > if (error) { > xfs_warn(mp, "Failed per-ag init: %d", error); > - goto out_remove_uuid; > + goto out_free_dir; > } > > if (!sbp->sb_logblocks) { > @@ -986,6 +985,8 @@ xfs_mountfs( > xfs_wait_buftarg(mp->m_ddev_targp); > out_free_perag: > xfs_free_perag(mp); > + out_free_dir: > + xfs_da_unmount(mp); > out_remove_uuid: > xfs_uuid_unmount(mp); > out: > @@ -1063,6 +1064,7 @@ xfs_unmountfs( > "Freespace may not be correct on next mount."); > > xfs_log_unmount(mp); > + xfs_da_unmount(mp); > xfs_uuid_unmount(mp); > > #if defined(DEBUG) > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index a466c5e..27cce7b 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -27,6 +27,7 @@ struct xfs_nameops; > struct xfs_ail; > struct xfs_quotainfo; > struct xfs_dir_ops; > +struct xfs_da_geometry; > > #ifdef HAVE_PERCPU_SB > > @@ -96,6 +97,8 @@ typedef struct xfs_mount { > uint m_readio_blocks; /* min read size blocks */ > uint m_writeio_log; /* min write size log bytes */ > uint m_writeio_blocks; /* min write size blocks */ > + struct xfs_da_geometry *m_dir_geo; /* directory block geometry */ > + struct xfs_da_geometry *m_attr_geo; /* attribute block geometry */ > struct xlog *m_log; /* log specific stuff */ > int m_logbufs; /* number of log buffers */ > int m_logbsize; /* size of each log buffer */ > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri May 30 14:10:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 34CE17F47 for ; Fri, 30 May 2014 14:10:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD7898F8049 for ; Fri, 30 May 2014 12:10:22 -0700 (PDT) X-ASG-Debug-ID: 1401477020-04bdf059a0329b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gnHEQIQSW2cqNpBg for ; Fri, 30 May 2014 12:10: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-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4UJAK0V001162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 30 May 2014 15:10:20 -0400 Received: from laptop.bfoster (vpn-62-22.rdu2.redhat.com [10.10.62.22]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4UJAJoZ020124; Fri, 30 May 2014 15:10:19 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id C88C8120D90; Fri, 30 May 2014 15:05:25 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4UJ5P7v003608; Fri, 30 May 2014 15:05:25 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 30 May 2014 15:05:24 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo Message-ID: <20140530190524.GB3146@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 12/16] xfs: reduce direct usage of mp->m_dir_geo References: <1401257083-13433-1-git-send-email-david@fromorbit.com> <1401257083-13433-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401257083-13433-13-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.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401477021 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, May 28, 2014 at 04:04:39PM +1000, Dave Chinner wrote: > From: Dave Chinner > > There are many places in the directory code were we don't pass the > args into and so have to extract the geometry direct from the mount > structure. Push the args or the geometry into these leaf functions > so that we don't need to grab it from the struct xfs_mount. > > This, in turn, brings use to the point where directory geometry is > no longer a property of the struct xfs_mount; it is not a global > property anymore, and hence we can start to consider per-directory > configuration of physical geometries. > > Start by converting the xfs_dir_isblock/leaf code - pass in the > xfs_da_args and convert the readdir code to use xfs_da_args like > the rest of the directory code to pass information around. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_dir2.c | 50 +++++++++++++--------------- > fs/xfs/xfs_dir2.h | 4 +-- > fs/xfs/xfs_dir2_readdir.c | 85 ++++++++++++++++++++++------------------------- > 3 files changed, 65 insertions(+), 74 deletions(-) > > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index f62d2e5..79670cd 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -282,7 +282,7 @@ xfs_dir_createname( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -290,7 +290,7 @@ xfs_dir_createname( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -375,7 +375,7 @@ xfs_dir_lookup( > goto out_check_rval; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -383,7 +383,7 @@ xfs_dir_lookup( > goto out_check_rval; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -448,7 +448,7 @@ xfs_dir_removename( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -456,7 +456,7 @@ xfs_dir_removename( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -513,7 +513,7 @@ xfs_dir_replace( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -521,7 +521,7 @@ xfs_dir_replace( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -573,7 +573,7 @@ xfs_dir_canenter( > goto out_free; > } > > - rval = xfs_dir2_isblock(dp, &v); > + rval = xfs_dir2_isblock(args, &v); > if (rval) > goto out_free; > if (v) { > @@ -581,7 +581,7 @@ xfs_dir_canenter( > goto out_free; > } > > - rval = xfs_dir2_isleaf(dp, &v); > + rval = xfs_dir2_isleaf(args, &v); > if (rval) > goto out_free; > if (v) > @@ -649,18 +649,16 @@ xfs_dir2_grow_inode( > */ > int > xfs_dir2_isblock( > - xfs_inode_t *dp, > - int *vp) /* out: 1 is block, 0 is not block */ > + struct xfs_da_args *args, > + int *vp) /* out: 1 is block, 0 is not block */ > { > - xfs_fileoff_t last; /* last file offset */ > - xfs_mount_t *mp; > - int rval; > + xfs_fileoff_t last; /* last file offset */ > + int rval; > > - mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) > return rval; > - rval = XFS_FSB_TO_B(mp, last) == mp->m_dir_geo->blksize; > - ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dir_geo->blksize); > + rval = XFS_FSB_TO_B(args->dp->i_mount, last) == args->geo->blksize; > + ASSERT(rval == 0 || args->dp->i_d.di_size == args->geo->blksize); > *vp = rval; > return 0; > } > @@ -670,17 +668,15 @@ xfs_dir2_isblock( > */ > int > xfs_dir2_isleaf( > - xfs_inode_t *dp, > - int *vp) /* out: 1 is leaf, 0 is not leaf */ > + struct xfs_da_args *args, > + int *vp) /* out: 1 is block, 0 is not block */ > { > - xfs_fileoff_t last; /* last file offset */ > - xfs_mount_t *mp; > - int rval; > + xfs_fileoff_t last; /* last file offset */ > + int rval; > > - mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(args->dp, &last, XFS_DATA_FORK))) > return rval; > - *vp = last == mp->m_dir_geo->leafblk + (1 << mp->m_sb.sb_dirblklog); > + *vp = last == args->geo->leafblk + args->geo->fsbcount; > return 0; > } > > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index 9b709ae..1292e78 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -146,8 +146,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); > /* > * Interface routines used by userspace utilities > */ > -extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); > -extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); > +extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); > +extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); > extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, > struct xfs_buf *bp); > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index fa393d5..ca1f43c 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -76,28 +76,25 @@ const unsigned char xfs_mode_to_ftype[S_IFMT >> S_SHIFT] = { > > STATIC int > xfs_dir2_sf_getdents( > - xfs_inode_t *dp, /* incore directory inode */ > + struct xfs_da_args *args, > struct dir_context *ctx) > { > int i; /* shortform entry number */ > - xfs_mount_t *mp; /* filesystem mount point */ > + struct xfs_inode *dp = args->dp; /* incore directory inode */ > xfs_dir2_dataptr_t off; /* current entry's offset */ > xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ > xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ > xfs_dir2_dataptr_t dot_offset; > xfs_dir2_dataptr_t dotdot_offset; > xfs_ino_t ino; > - struct xfs_da_geometry *geo; > - > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > + struct xfs_da_geometry *geo = args->geo; > > ASSERT(dp->i_df.if_flags & XFS_IFINLINE); > /* > * Give up if the directory is way too short. > */ > if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { > - ASSERT(XFS_FORCED_SHUTDOWN(mp)); > + ASSERT(XFS_FORCED_SHUTDOWN(dp->i_mount)); > return XFS_ERROR(EIO); > } > > @@ -163,13 +160,13 @@ xfs_dir2_sf_getdents( > filetype = dp->d_ops->sf_get_ftype(sfep); > ctx->pos = off & 0x7fffffff; > if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, > - xfs_dir3_get_dtype(mp, filetype))) > + xfs_dir3_get_dtype(dp->i_mount, filetype))) > return 0; > sfep = dp->d_ops->sf_nextentry(sfp, sfep); > } > > ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > - 0x7fffffff; > + 0x7fffffff; > return 0; > } > > @@ -178,9 +175,10 @@ xfs_dir2_sf_getdents( > */ > STATIC int > xfs_dir2_block_getdents( > - xfs_inode_t *dp, /* incore inode */ > + struct xfs_da_args *args, > struct dir_context *ctx) > { > + struct xfs_inode *dp = args->dp; /* incore directory inode */ > xfs_dir2_data_hdr_t *hdr; /* block header */ > struct xfs_buf *bp; /* buffer for block */ > xfs_dir2_block_tail_t *btp; /* block tail */ > @@ -188,14 +186,11 @@ xfs_dir2_block_getdents( > xfs_dir2_data_unused_t *dup; /* block unused entry */ > char *endptr; /* end of the data entries */ > int error; /* error return value */ > - xfs_mount_t *mp; /* filesystem mount point */ > char *ptr; /* current data entry */ > int wantoff; /* starting block offset */ > xfs_off_t cook; > - struct xfs_da_geometry *geo; > + struct xfs_da_geometry *geo = args->geo; > > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > /* > * If the block number in the offset is out of range, we're done. > */ > @@ -258,7 +253,7 @@ xfs_dir2_block_getdents( > */ > if (!dir_emit(ctx, (char *)dep->name, dep->namelen, > be64_to_cpu(dep->inumber), > - xfs_dir3_get_dtype(mp, filetype))) { > + xfs_dir3_get_dtype(dp->i_mount, filetype))) { > xfs_trans_brelse(NULL, bp); > return 0; > } > @@ -269,7 +264,7 @@ xfs_dir2_block_getdents( > * Set the offset to a non-existent block 1 and return. > */ > ctx->pos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk + 1, 0) & > - 0x7fffffff; > + 0x7fffffff; > xfs_trans_brelse(NULL, bp); > return 0; > } > @@ -290,13 +285,13 @@ struct xfs_dir2_leaf_map_info { > > STATIC int > xfs_dir2_leaf_readbuf( > - struct xfs_inode *dp, > + struct xfs_da_args *args, > size_t bufsize, > struct xfs_dir2_leaf_map_info *mip, > xfs_dir2_off_t *curoff, > struct xfs_buf **bpp) > { > - struct xfs_mount *mp = dp->i_mount; > + struct xfs_inode *dp = args->dp; > struct xfs_buf *bp = *bpp; > struct xfs_bmbt_irec *map = mip->map; > struct blk_plug plug; > @@ -304,7 +299,7 @@ xfs_dir2_leaf_readbuf( > int length; > int i; > int j; > - struct xfs_da_geometry *geo = mp->m_dir_geo; > + struct xfs_da_geometry *geo = args->geo; > > /* > * If we have a buffer, we need to release it and > @@ -338,8 +333,7 @@ xfs_dir2_leaf_readbuf( > /* > * Recalculate the readahead blocks wanted. > */ > - mip->ra_want = howmany(bufsize + geo->blksize, > - mp->m_sb.sb_blocksize) - 1; > + mip->ra_want = howmany(bufsize + geo->blksize, (1 << geo->fsblog)) - 1; > ASSERT(mip->ra_want >= 0); > > /* > @@ -411,8 +405,8 @@ xfs_dir2_leaf_readbuf( > mip->curdb = xfs_dir2_da_to_db(geo, map->br_startoff); > error = xfs_dir3_data_read(NULL, dp, map->br_startoff, > map->br_blockcount >= geo->fsbcount ? > - XFS_FSB_TO_DADDR(mp, map->br_startblock) : -1, &bp); > - > + XFS_FSB_TO_DADDR(dp->i_mount, map->br_startblock) : > + -1, &bp); > /* > * Should just skip over the data block instead of giving up. > */ > @@ -441,7 +435,7 @@ xfs_dir2_leaf_readbuf( > map[mip->ra_index].br_blockcount >= geo->fsbcount) { > xfs_dir3_data_readahead(dp, > map[mip->ra_index].br_startoff + mip->ra_offset, > - XFS_FSB_TO_DADDR(mp, > + XFS_FSB_TO_DADDR(dp->i_mount, > map[mip->ra_index].br_startblock + > mip->ra_offset)); > mip->ra_current = i; > @@ -493,23 +487,23 @@ out: > */ > STATIC int > xfs_dir2_leaf_getdents( > - xfs_inode_t *dp, /* incore directory inode */ > + struct xfs_da_args *args, > struct dir_context *ctx, > size_t bufsize) > { > + struct xfs_inode *dp = args->dp; > struct xfs_buf *bp = NULL; /* data block buffer */ > xfs_dir2_data_hdr_t *hdr; /* data block header */ > xfs_dir2_data_entry_t *dep; /* data entry */ > xfs_dir2_data_unused_t *dup; /* unused entry */ > int error = 0; /* error return value */ > int length; /* temporary length value */ > - xfs_mount_t *mp; /* filesystem mount point */ > int byteoff; /* offset in current block */ > xfs_dir2_off_t curoff; /* current overall offset */ > xfs_dir2_off_t newoff; /* new curoff after new blk */ > char *ptr = NULL; /* pointer to current data */ > struct xfs_dir2_leaf_map_info *map_info; > - struct xfs_da_geometry *geo; > + struct xfs_da_geometry *geo = args->geo; > > /* > * If the offset is at or past the largest allowed value, > @@ -518,15 +512,12 @@ xfs_dir2_leaf_getdents( > if (ctx->pos >= XFS_DIR2_MAX_DATAPTR) > return 0; > > - mp = dp->i_mount; > - geo = mp->m_dir_geo; > - > /* > * Set up to bmap a number of blocks based on the caller's > * buffer size, the directory block size, and the filesystem > * block size. > */ > - length = howmany(bufsize + geo->blksize, mp->m_sb.sb_blocksize); > + length = howmany(bufsize + geo->blksize, (1 << geo->fsblog)); > map_info = kmem_zalloc(offsetof(struct xfs_dir2_leaf_map_info, map) + > (length * sizeof(struct xfs_bmbt_irec)), > KM_SLEEP | KM_NOFS); > @@ -558,7 +549,7 @@ xfs_dir2_leaf_getdents( > */ > if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { > > - error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, > + error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, > &curoff, &bp); > if (error || !map_info->map_valid) > break; > @@ -566,7 +557,7 @@ xfs_dir2_leaf_getdents( > /* > * Having done a read, we need to set a new offset. > */ > - newoff = xfs_dir2_db_off_to_byte(mp->m_dir_geo, > + newoff = xfs_dir2_db_off_to_byte(geo, > map_info->curdb, 0); > /* > * Start of the current block. > @@ -585,7 +576,7 @@ xfs_dir2_leaf_getdents( > * Find our position in the block. > */ > ptr = (char *)dp->d_ops->data_entry_p(hdr); > - byteoff = xfs_dir2_byte_to_off(mp->m_dir_geo, curoff); > + byteoff = xfs_dir2_byte_to_off(geo, curoff); > /* > * Skip past the header. > */ > @@ -644,7 +635,7 @@ xfs_dir2_leaf_getdents( > ctx->pos = xfs_dir2_byte_to_dataptr(curoff) & 0x7fffffff; > if (!dir_emit(ctx, (char *)dep->name, dep->namelen, > be64_to_cpu(dep->inumber), > - xfs_dir3_get_dtype(mp, filetype))) > + xfs_dir3_get_dtype(dp->i_mount, filetype))) > break; > > /* > @@ -674,13 +665,14 @@ xfs_dir2_leaf_getdents( > */ > int > xfs_readdir( > - xfs_inode_t *dp, > - struct dir_context *ctx, > - size_t bufsize) > + struct xfs_inode *dp, > + struct dir_context *ctx, > + size_t bufsize) > { > - int rval; /* return value */ > - int v; /* type-checking value */ > - uint lock_mode; > + struct xfs_da_args args = {0}; > + int rval; > + int v; > + uint lock_mode; > > trace_xfs_readdir(dp); > > @@ -690,15 +682,18 @@ xfs_readdir( > ASSERT(S_ISDIR(dp->i_d.di_mode)); > XFS_STATS_INC(xs_dir_getdents); > > + args.dp = dp; > + args.geo = dp->i_mount->m_dir_geo; > + > lock_mode = xfs_ilock_data_map_shared(dp); > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > - rval = xfs_dir2_sf_getdents(dp, ctx); > - else if ((rval = xfs_dir2_isblock(dp, &v))) > + rval = xfs_dir2_sf_getdents(&args, ctx); > + else if ((rval = xfs_dir2_isblock(&args, &v))) > ; > else if (v) > - rval = xfs_dir2_block_getdents(dp, ctx); > + rval = xfs_dir2_block_getdents(&args, ctx); > else > - rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); > + rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); > xfs_iunlock(dp, lock_mode); > > return rval; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Fri May 30 14:10:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 5D2607F59 for ; Fri, 30 May 2014 14:10:33 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay1.corp.sgi.com (Postfix) with ESMTP id B1CA88F8065; Fri, 30 May 2014 12:10:32 -0700 (PDT) Message-ID: <5388D7A8.5040906@sgi.com> Date: Fri, 30 May 2014 14:10:32 -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: Brian Foster CC: Namjae Jeon , linux-fsdevel@vger.kernel.org, Ashish Sangwan , xfs@oss.sgi.com Subject: Re: [PATCH v4 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <001e01cf7b0f$ba43dfd0$2ecb9f70$@samsung.com> <20140530140551.GC6226@bfoster.bfoster> In-Reply-To: <20140530140551.GC6226@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/30/14 09:05, Brian Foster wrote: > On Thu, May 29, 2014 at 04:29:29PM +0900, Namjae Jeon wrote: >> > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. >> > >> > 1) Make sure that both offset and len are block size aligned. >> > 2) Update the i_size of inode by len bytes. >> > 3) Compute the file's logical block number against offset. If the computed >> > block number is not the starting block of the extent, split the extent >> > such that the block number is the starting block of the extent. >> > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] >> > towards right by len bytes. This step will make a hole of len bytes >> > at offset. >> > 5) Allocate unwritten extents for the hole created in step 4. >> > >> > Signed-off-by: Namjae Jeon >> > Signed-off-by: Ashish Sangwan >> > Reviewed-by: Brian Foster >> > --- >> > >> > Changelog >> > v4: >> > - set cur->bc_private.b.allocated to zero before calling xfs_btree_del_cursor. >> > > Other issues not withstanding (sounds like Mark still has a lingering, > potential corruption case), this fixes the warnings I was seeing. I ran > through an xfstest cycle without problem. Thanks for fixing this. > > The cursor allocated flag appears to be used to carry bmbt block > allocations over to delayed allocation extent conversions (such that > these allocations are accounted from previous delalloc extent index > block reservations). This is all within the bmbt code, so clearing the > flag seems reasonable as well. > > Though I wonder why it falls on the caller to clear the flag as opposed > to fixing up the flag automatically when it becomes accounted for. I > guess that would enable a warning with semantics of "something might > have been unaccounted for" vs. "somebody forgot to reset a flag." That > said, it's likely there are circumstances involved with this mechanism > that I'm not yet familiar with.;) > > Brian > I did not have this patch included in my tests just the code from Linux 3.15-rc5. I will add and see if it still asserts. --Mark. From bfoster@redhat.com Fri May 30 14:10:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 3BFDE7F4E for ; Fri, 30 May 2014 14:10:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BD6F8F8070 for ; Fri, 30 May 2014 12:10:36 -0700 (PDT) X-ASG-Debug-ID: 1401477036-04cb6c100a01eb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hrAwQtSYlsS8jHv9 for ; Fri, 30 May 2014 12:10: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 (8.14.4/8.14.4) with ESMTP id s4UJAZtX012539 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 30 May 2014 15:10:35 -0400 Received: from laptop.bfoster (vpn-62-22.rdu2.redhat.com [10.10.62.22]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4UJAZNt021469; Fri, 30 May 2014 15:10:35 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 5D8B0120D90; Fri, 30 May 2014 15:05:41 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s4UJ5ZIg003611; Fri, 30 May 2014 15:05:35 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 30 May 2014 15:05:35 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry Message-ID: <20140530190534.GC3146@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry References: <1401257083-13433-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401257083-13433-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.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401477036 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, May 28, 2014 at 04:04:27PM +1000, Dave Chinner wrote: > Hi folks, > > Version three of the patchset first posted here: > > http://oss.sgi.com/pipermail/xfs/2014-May/036125.html > > This version addresses the review comments so far. > > Changelog: > > Version 3: > - added xfs_da_unmount > - moved dir2 conversion functions to xfs_dir2_priv.h > - converted xfs_dir2_readdir.c to use local geo variables > - added a patch to remove newly redundant geometry fields > from the struct xfs_da_state I don't see this bit anywhere in the series... Brian > > Version 2: > - patch removing checks from xfs_da_read_buf() sent separately > - dropped patch adding xfs_da_geometry to the inode forks as it's > not currently needed > - cleared up all the "XXX" notations added in the RFC series > - fixed several bugs in different patches as a result of incorrect > conversions > - ensured each patch compiled and passes xfstests individually > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From scaron@umich.edu Fri May 30 14:30:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 F2D0D7F55 for ; Fri, 30 May 2014 14:30:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2D8D30404E for ; Fri, 30 May 2014 12:30:35 -0700 (PDT) X-ASG-Debug-ID: 1401478234-04cb6c100a03bb0001-NocioJ Received: from mail-qg0-f47.google.com (mail-qg0-f47.google.com [209.85.192.47]) by cuda.sgi.com with ESMTP id uNhN988s204ldutZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 30 May 2014 12:30:34 -0700 (PDT) X-Barracuda-Envelope-From: scaron@umich.edu X-Barracuda-Apparent-Source-IP: 209.85.192.47 Received: by mail-qg0-f47.google.com with SMTP id j107so6617955qga.20 for ; Fri, 30 May 2014 12:30:34 -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=DJdXIqsC7a9Nt3XJUE53A354yWUFauIP/iBUoxn16mU=; b=Y8FPm5AlYwriDyarmlJEcFb4JHc9EPxngXmo9YFxEcq8ALDRH3K6mzrC/iTD0eN0D9 1JQ8tbA8KojnjNPbxD5fqiDj/rmCRciDwno+AD2VLQhvDk2jHgC4GBXxSHcaVo/0mksO ic/UEZrjuZVIM5dD6+C4Ep6CxGPxEX2TXO4GUic+ROl5k5ln4dUITdI/6279mg92ABPX s6YLrZuJZf1fF81Gl897+cDmQbUBd3gkqNSFVJU64hwSsZShGXNp54AYZINpfewyoN/Z yikSpmCn0KtVlIDnFGJxpPRVnBD6rFc4SS34aqp1v70hhlHCNpRLl8+gXqNZbS9rIfLb yGUw== X-Gm-Message-State: ALoCoQmBTCJ41rhlYl9qd7NRMpnfFFAXFkpm5MqJbKjsADMkvRWAmA/GH3+zyDN8vI4v8ThIPK3m MIME-Version: 1.0 X-Received: by 10.229.234.67 with SMTP id kb3mr24616036qcb.6.1401478234088; Fri, 30 May 2014 12:30:34 -0700 (PDT) Received: by 10.224.100.72 with HTTP; Fri, 30 May 2014 12:30:34 -0700 (PDT) Date: Fri, 30 May 2014 15:30:34 -0400 Message-ID: Subject: subscribe From: Sean Caron X-ASG-Orig-Subj: subscribe To: xfs@oss.sgi.com, Sean Caron Content-Type: multipart/alternative; boundary=001a11343e1c4dbc6604faa31478 X-Barracuda-Connect: mail-qg0-f47.google.com[209.85.192.47] X-Barracuda-Start-Time: 1401478234 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-Spam-Score: 0.00 X-Barracuda-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.6245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11343e1c4dbc6604faa31478 Content-Type: text/plain; charset=UTF-8 subscribe --001a11343e1c4dbc6604faa31478 Content-Type: text/html; charset=UTF-8
subscribe
--001a11343e1c4dbc6604faa31478-- From scaron@umich.edu Fri May 30 14:49:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 A8B037F55 for ; Fri, 30 May 2014 14:49:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 771198F8065 for ; Fri, 30 May 2014 12:49:15 -0700 (PDT) X-ASG-Debug-ID: 1401479353-04cb6c100c05c90001-NocioJ Received: from mail-qg0-f43.google.com (mail-qg0-f43.google.com [209.85.192.43]) by cuda.sgi.com with ESMTP id QGHCxAnycfIDJmEe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 30 May 2014 12:49:13 -0700 (PDT) X-Barracuda-Envelope-From: scaron@umich.edu X-Barracuda-Apparent-Source-IP: 209.85.192.43 Received: by mail-qg0-f43.google.com with SMTP id 63so6868724qgz.30 for ; Fri, 30 May 2014 12:49:13 -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=g7aRQ3sfcTR2JdssgPAYApEsPKOW4eMog8ZJ16+MkjI=; b=b5kBGwz2Y9i6uV22d4QH9Bf9t0jPXaGJd1c9AScDbQjiXcslcQ2hzCszmKXEMMY0aZ M5e/3j1a6h0YYzS1hBiYzHs6YisuLSYd5TfIRaNz8qpB9Tdg+AuJfj/LbLb2nm7gSsho 5TgJPaOQved/iTzHG6Kdv4Fds6Oh1haMRdeiAaG0NBzHr5CaMXvSsFz12v8/WjflQFin vYb/TXL604GKGTxnE8ZM22FTz8yusPsK/iOfIlYe+cZMVYqfjcycdhG1BmYRTqjomffr rakdpO1yom+4V+Ke5b8iFK/KpzrmTyD8PzOC/koAo1ZAPGL8/zmLTzelawAJxq6KFkDu 9cHA== X-Gm-Message-State: ALoCoQn6frM2MW1o0m57FaJ65JPi1na5YOqXih1EzlqCAIeH/jeG+cLztILy/TqVVNyhJxBWIIfY MIME-Version: 1.0 X-Received: by 10.224.161.10 with SMTP id p10mr24285787qax.12.1401479353257; Fri, 30 May 2014 12:49:13 -0700 (PDT) Received: by 10.224.100.72 with HTTP; Fri, 30 May 2014 12:49:13 -0700 (PDT) Date: Fri, 30 May 2014 15:49:13 -0400 Message-ID: Subject: What to do when... xfs_repair hangs? From: Sean Caron X-ASG-Orig-Subj: What to do when... xfs_repair hangs? To: xfs@oss.sgi.com, Sean Caron Content-Type: multipart/alternative; boundary=089e01536b7202f05a04faa3574e X-Barracuda-Connect: mail-qg0-f43.google.com[209.85.192.43] X-Barracuda-Start-Time: 1401479353 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.6246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e01536b7202f05a04faa3574e Content-Type: text/plain; charset=UTF-8 Hi all, Long story short, we have a big array formatted as XFS, we had a machine go down hard maybe a month, month and a half ago... when it came back up, XFS faulted out when we attempted to mount the filesystem; it complained the log was bad or something... I did a dry run of xfs_repair (-L) and it looked pretty bad, so we mounted up the filesystem read-only, ran a backup... I think we got pretty much everything out OK except maybe files that were open at the time of the crash. Now with a backup in hand, we kicked off xfs_repair "for real"... it ran for a while and did its thing, but now it appears to be stuck at the stage - - agno = 436 rebuilding directory inode ... rebuilding directory inode ... rebuilding directory inode ... ... - traversal finished ... - moving disconected inodes to lost+found ... disconnected inode 1109099673, and then it just stops. I don't know how long its been sitting like that, but it hasn't moved in the last hour or two. I assume that's not good... Interestingly when we ran a dry run of xfs_repair (-L) it got all the way through; it never hung up at any point. Not sure why it would start to hang up, once it gets run "for real". This machine is in single-user-mode, I have exactly 24 lines of console with no scrollback buffer, no other tty available besides that which I'm running xfs_repair on, the system console. Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatever their current xfsprogs is. This is a bit of an exceptional situation for me; I've never seen xfs_repair just hang outright. I hoped I could maybe get some feedback from the experts here... what should I do? Try to Control-C out of the xfs_repair and ... re-run it? Should I just quit wasting time at this point, wipe out the filesystem, reformat, then just start the long process of restoring from the backups? Original plan was just to run xfs_repair, see what happened and pull from backups as required to fix damage. Perhaps we should just cut to the chase, rebuild, and restore everything? Probably the file system would be ultimately healthier starting from scratch, than what xfs_repair leaves behind? Any insight would be very much appreciated! Thanks, Sean --089e01536b7202f05a04faa3574e Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi all,

Long story short, we have a big= array formatted as XFS, we had a machine go down hard maybe a month, month= and a half ago... when it came back up, XFS faulted out when we attempted = to mount the filesystem; it complained the log was bad or something... I di= d a dry run of xfs_repair (-L) and it looked pretty bad, so we mounted up t= he filesystem read-only, ran a backup... I think we got pretty much everyth= ing out OK except maybe files that were open at the time of the crash.

Now with a backup in hand, we kicked off xfs_repair &qu= ot;for real"... it ran for a while and did its thing, but now it appea= rs to be stuck at the stage -

- agno =3D 436
rebuilding directory inode ...
rebuilding directory inode ..= .
rebuilding directory inode ...
...
- traver= sal finished ...
- moving disconected inodes to lost+found ...
disconnected inode 1109099673,

and then it ju= st stops. I don't know how long its been sitting like that, but it hasn= 't moved in the last hour or two. I assume that's not good...

Interestingly when we ran a dry run of xfs_repair (-L) = it got all the way through; it never hung up at any point. Not sure why it = would start to hang up, once it gets run "for real".

This machine is in single-user-mode, I have exactly 24 lines= of console with no scrollback buffer, no other tty available besides that = which I'm running xfs_repair on, the system console.

Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatev= er their current xfsprogs is.

This is a bit of an = exceptional situation for me; I've never seen xfs_repair just hang outr= ight. I hoped I could maybe get some feedback from the experts here... what= should I do?

Try to Control-C out of the xfs_repair and ... re-run i= t?

Should I just quit wasting time at this point, = wipe out the filesystem, reformat, then just start the long process of rest= oring from the backups?

Original plan was just to run xfs_repair, see what happ= ened and pull from backups as required to fix damage. Perhaps we should jus= t cut to the chase, rebuild, and restore everything? Probably the file syst= em would be ultimately healthier starting from scratch, than what xfs_repai= r leaves behind?

Any insight would be very much appreciated!
<= br>
Thanks,

Sean
--089e01536b7202f05a04faa3574e-- From arnd@arndb.de Fri May 30 15:07:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 929C97F56 for ; Fri, 30 May 2014 15:07:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 72DDD30404E for ; Fri, 30 May 2014 13:07:06 -0700 (PDT) X-ASG-Debug-ID: 1401480424-04cb6c100c07870001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.10]) by cuda.sgi.com with ESMTP id WFi1se20bwihGeyv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 30 May 2014 13:07:05 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.10 Received: from wuerfel.lan (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue104) with ESMTP (Nemesis) id 0MF4EF-1X2HoK1Uz5-00GEzK; Fri, 30 May 2014 22:05:03 +0200 From: Arnd Bergmann To: linux-kernel@vger.kernel.org Cc: linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, Arnd Bergmann , Dave Chinner , xfs@oss.sgi.com Subject: [RFC 11/32] xfs: convert to struct inode_time Date: Fri, 30 May 2014 22:01:35 +0200 X-ASG-Orig-Subj: [RFC 11/32] xfs: convert to struct inode_time Message-Id: <1401480116-1973111-12-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1401480116-1973111-1-git-send-email-arnd@arndb.de> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> X-Provags-ID: V02:K0:44qoY8m4wSCCOAZbpTkGvEMTkiFxAYY/w1vFpM/YXOz VA9Bw/UrndltkraeFqQ9qbaBKRhgwthv+tp3UoplajE0rc0C3R AaAAMsKbckTnfEdF2K4qFx8ffgBszWN5Ts0s0+Q1g7lcIzdsgI XXOZx93qny1X9IGS688H5BXaZjzH3cmEa76jwFZpcLNwuEEur1 cccOTTEnCbdWqt/sPLvOKKVJZHA++KqSS+GIL2bPzj/5SOpm+T Q+n6EZIQ6ux1K1mH6Cvn9dGNaE26pavVwBGFUTJAtG4pL+szh0 uRqxjQ1d3sYlz3zld6ygf2MxCqE9l2HiCD46TGMORFOHPV3QDo ISKobJ+ZFO3CheazYGt/OrYO6O+oJhR9HRYB10Qzj X-Barracuda-Connect: mout.kundenserver.de[212.227.17.10] X-Barracuda-Start-Time: 1401480424 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_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header xfs uses unsigned 32-bit seconds for inode timestamps, which will work for the next 92 years, but the VFS uses struct timespec for timestamps, which is only good until 2038 on 32-bit CPUs. This gets us one small step closer to lifting the VFS limit by using struct inode_time in XFS. Signed-off-by: Arnd Bergmann Cc: Dave Chinner Cc: xfs@oss.sgi.com --- fs/xfs/time.h | 4 ++-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_trans_inode.c | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/xfs/time.h b/fs/xfs/time.h index 387e695..a490f1b 100644 --- a/fs/xfs/time.h +++ b/fs/xfs/time.h @@ -21,14 +21,14 @@ #include #include -typedef struct timespec timespec_t; +typedef struct inode_time timespec_t; static inline void delay(long ticks) { schedule_timeout_uninterruptible(ticks); } -static inline void nanotime(struct timespec *tvp) +static inline void nanotime(struct inode_time *tvp) { *tvp = CURRENT_TIME; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index a6115fe..16d5392 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -654,7 +654,7 @@ xfs_ialloc( xfs_inode_t *ip; uint flags; int error; - timespec_t tv; + struct inode_time tv; /* * Call the space management code to pick diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 205613a..092ee7c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -956,7 +956,7 @@ xfs_vn_setattr( STATIC int xfs_vn_update_time( struct inode *inode, - struct timespec *now, + struct inode_time *now, int flags) { struct xfs_inode *ip = XFS_I(inode); diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 50c3f56..bae2520 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -70,7 +70,7 @@ xfs_trans_ichgtime( int flags) { struct inode *inode = VFS_I(ip); - timespec_t tv; + struct inode_time tv; ASSERT(tp); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); @@ -78,13 +78,13 @@ xfs_trans_ichgtime( tv = current_fs_time(inode->i_sb); if ((flags & XFS_ICHGTIME_MOD) && - !timespec_equal(&inode->i_mtime, &tv)) { + !inode_time_equal(&inode->i_mtime, &tv)) { inode->i_mtime = tv; ip->i_d.di_mtime.t_sec = tv.tv_sec; ip->i_d.di_mtime.t_nsec = tv.tv_nsec; } if ((flags & XFS_ICHGTIME_CHG) && - !timespec_equal(&inode->i_ctime, &tv)) { + !inode_time_equal(&inode->i_ctime, &tv)) { inode->i_ctime = tv; ip->i_d.di_ctime.t_sec = tv.tv_sec; ip->i_d.di_ctime.t_nsec = tv.tv_nsec; -- 1.8.3.2 From arnd@arndb.de Fri May 30 15:08:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 62E0E7F56 for ; Fri, 30 May 2014 15:08:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 412F730404E for ; Fri, 30 May 2014 13:08:03 -0700 (PDT) X-ASG-Debug-ID: 1401480479-04cb6c100c079d0001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by cuda.sgi.com with ESMTP id frJFvFDoXvBiBo9F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 30 May 2014 13:08:00 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.24 Received: from wuerfel.lan (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue104) with ESMTP (Nemesis) id 0LoIFV-1WJdP10yF7-00gGLg; Fri, 30 May 2014 22:04:59 +0200 From: Arnd Bergmann To: linux-kernel@vger.kernel.org Cc: linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, Arnd Bergmann , ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Subject: [RFC 00/32] making inode time stamps y2038 ready Date: Fri, 30 May 2014 22:01:24 +0200 X-ASG-Orig-Subj: [RFC 00/32] making inode time stamps y2038 ready Message-Id: <1401480116-1973111-1-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 1.8.3.2 X-Provags-ID: V02:K0:AFPKkweG6eXWP6Uwiu8b6YfvL8aMHzuyNbo/ukSofCl HrygT5/Qv5Et880U+J+aoHpgr6RWTBHtTNd+35w/VBpzhp+DtQ V8GHTZrJ2zEn9zCa3r6UKmDS2p9kfYF1IzOWen0dQI7X23NPYa CtS4/4msF9hQ2kV8g5myNvkMZOLtSEhCJVe3IgzAde8JPqpWid 6vCDD81fjth2gZGmklQ3IxwtARWowdyik44QokHXAbPizuIIpn mF4Z3Iqqi9uE2jidZ40WY0CrmFOVt70e4CulO+z2Dc+MfMjKTH GQhnQFJr/u4jTqliW65Dq1HRwW/hNhpSJR7aX+BFrREJ+SDYXN Vz95aPutcMFl3ga+l014V+aXUdC10wJlvW/aAEqNx X-Barracuda-Connect: mout.kundenserver.de[212.227.17.24] X-Barracuda-Start-Time: 1401480480 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_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Based on the recent discussion about 64-bit time_t for new architectures, and for solving the year 2038 problem in general, I decided to try out what it would take to solve part of the kernel side of things. This is a proof-of-concept work to get us to the point where two system calls (utimes and stat) provide a working interface to user space to pass 64-bit inode time stamps in and out of the kernel all the way to the file systems. I picked this because it is a fairly isolated problem, as the inode time stamps are rarely assigned to any other time values. As a byproduct of this work, I documented for each of the file systems we support how long the on-disk format can work[1]. Obviously we also need to convert all the other syscalls and have a proper libc implementation using those for this to be really useful, but it's a start and it can be tested independently (I didn't so far, want to wait for initial feedback). All the interesting stuff is in the first five patches here, the rest is the straightforward conversion of all file systems that use 'timespec' values internally. There are of course a number of open questions: a) is this the right approach in general? The previous discussion pointed this way, but there may be other opinions. b) what type should we use internally to represent inode time stamps? The code contains three different versions that would all work, we just have to pick a good tradeoff between efficiency and the range of times we want to cover. c) Should we continue this way for all 32-bit platforms for consistency, including future ones, or should we go to different 64-bit types right away? My feeling is that the second approach would complicate this work. Arnd [1] http://kernelnewbies.org/y2038 Arnd Bergmann (32): fs: introduce new 'struct inode_time' uapi: add struct __kernel_timespec{32,64} fs: introduce sys_utimens64at fs: introduce sys_newfstat64/sys_newfstatat64 arch: hook up new stat and utimes syscalls isofs: fix timestamps beyond 2027 fs/nfs: convert to struct inode_time fs/ceph: convert to 'struct inode_time' fs/pstore: convert to struct inode_time fs/coda: convert to struct inode_time xfs: convert to struct inode_time btrfs: convert to struct inode_time ext3: convert to struct inode_time ext4: convert to struct inode_time cifs: convert to struct inode_time ntfs: convert to struct inode_time ubifs: convert to struct inode_time ocfs2: convert to struct inode_time fs/fat: convert to struct inode_time afs: convert to struct inode_time udf: convert to struct inode_time fs: convert simple fs to inode_time logfs: convert to struct inode_time hfs, hfsplus: convert to struct inode_time gfs2: convert to struct inode_time reiserfs: convert to struct inode_time jffs2: convert to struct inode_time adfs: convert to struct inode_time f2fs: convert to struct inode_time fuse: convert to struct inode_time scsi: fnic: use current_kernel_time() for timestamp fs: use new inode_time definition unconditionally arch/alpha/kernel/osf_sys.c | 2 +- arch/arm/include/asm/unistd.h | 2 +- arch/arm/include/uapi/asm/stat.h | 25 +++++++++++++++++ arch/arm/include/uapi/asm/unistd.h | 3 +++ arch/arm/kernel/calls.S | 3 +++ arch/arm64/include/asm/unistd32.h | 5 +++- arch/x86/include/uapi/asm/stat.h | 28 +++++++++++++++++++ arch/x86/syscalls/syscall_32.tbl | 3 +++ drivers/block/rbd.c | 2 +- drivers/firmware/efi/efi-pstore.c | 28 +++++++++---------- drivers/scsi/fnic/fnic_trace.c | 2 +- drivers/tty/tty_io.c | 2 +- drivers/usb/gadget/f_fs.c | 2 +- fs/adfs/inode.c | 4 +-- fs/afs/afs.h | 6 ++--- fs/afs/fsclient.c | 2 +- fs/attr.c | 8 +++--- fs/btrfs/file.c | 6 ++--- fs/btrfs/inode.c | 4 +-- fs/btrfs/ioctl.c | 4 +-- fs/btrfs/root-tree.c | 2 +- fs/btrfs/transaction.c | 2 +- fs/ceph/cache.c | 2 +- fs/ceph/caps.c | 6 ++--- fs/ceph/file.c | 4 +-- fs/ceph/inode.c | 20 +++++++------- fs/ceph/super.h | 8 +++--- fs/cifs/cache.c | 6 ++--- fs/cifs/cifsglob.h | 6 ++--- fs/cifs/cifsproto.h | 6 ++--- fs/cifs/cifssmb.c | 5 ++-- fs/cifs/inode.c | 2 +- fs/cifs/netmisc.c | 15 ++++++----- fs/coda/coda_linux.c | 18 ++++++++----- fs/compat.c | 19 ++----------- fs/configfs/inode.c | 6 ++--- fs/cramfs/inode.c | 2 +- fs/ext3/inode.c | 4 +-- fs/ext4/ext4.h | 10 +++---- fs/ext4/extents.c | 2 +- fs/f2fs/file.c | 6 ++--- fs/fat/dir.c | 2 +- fs/fat/fat.h | 6 ++--- fs/fat/misc.c | 4 +-- fs/fat/namei_msdos.c | 8 +++--- fs/fat/namei_vfat.c | 10 +++---- fs/fuse/inode.c | 6 ++--- fs/gfs2/dir.c | 6 ++--- fs/gfs2/glops.c | 4 +-- fs/hfs/hfs_fs.h | 2 +- fs/hfsplus/hfsplus_fs.h | 2 +- fs/inode.c | 18 ++++++------- fs/isofs/util.c | 2 +- fs/jffs2/os-linux.h | 2 +- fs/locks.c | 4 +-- fs/logfs/readwrite.c | 18 ++++++------- fs/nfs/callback.h | 4 +-- fs/nfs/callback_xdr.c | 6 ++--- fs/nfs/file.c | 2 +- fs/nfs/fscache-index.c | 8 +++--- fs/nfs/inode.c | 10 +++---- fs/nfs/internal.h | 4 +-- fs/nfs/netns.h | 2 +- fs/nfs/nfs2xdr.c | 8 +++--- fs/nfs/nfs3xdr.c | 10 +++---- fs/nfs/nfs4xdr.c | 20 +++++++------- fs/nfsd/nfs3xdr.c | 6 ++--- fs/nfsd/nfsfh.h | 4 +-- fs/nfsd/nfsxdr.c | 2 +- fs/ntfs/inode.c | 12 ++++----- fs/ntfs/time.h | 8 +++--- fs/ocfs2/dlmglue.c | 16 +++++------ fs/ocfs2/file.c | 6 ++--- fs/ocfs2/ocfs2.h | 2 +- fs/pstore/inode.c | 2 +- fs/pstore/internal.h | 2 +- fs/pstore/platform.c | 2 +- fs/pstore/ram.c | 18 +++++++------ fs/reiserfs/namei.c | 2 +- fs/reiserfs/xattr.c | 4 +-- fs/stat.c | 55 ++++++++++++++++++++++++++++++++++++++ fs/ubifs/dir.c | 2 +- fs/ubifs/file.c | 16 +++++------ fs/ubifs/misc.h | 2 +- fs/udf/udf_i.h | 2 +- fs/udf/udf_sb.h | 2 +- fs/udf/udfdecl.h | 7 ++--- fs/udf/udftime.c | 7 ++--- fs/utimes.c | 47 +++++++++++++++++++++++++++----- fs/xfs/time.h | 4 +-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_trans_inode.c | 6 ++--- include/linux/ceph/decode.h | 8 +++--- include/linux/ceph/osd_client.h | 4 +-- include/linux/compat.h | 2 +- include/linux/fs.h | 32 +++++++++++----------- include/linux/nfs_fs_sb.h | 2 +- include/linux/nfs_xdr.h | 14 +++++----- include/linux/pstore.h | 4 +-- include/linux/stat.h | 6 ++--- include/linux/syscalls.h | 9 ++++++- include/linux/time.h | 44 +++++++++++++++++++++++++++--- include/uapi/asm-generic/stat.h | 29 ++++++++++++++++++-- include/uapi/asm-generic/unistd.h | 8 +++++- include/uapi/linux/coda.h | 1 + include/uapi/linux/time.h | 40 ++++++++++++++++++++++++++- init/initramfs.c | 2 +- kernel/audit.c | 2 +- kernel/auditsc.c | 2 +- kernel/time.c | 44 +++++++++++++++++++++++++----- kernel/time/timekeeping.c | 16 +++++++++++ net/ceph/auth_x.c | 2 +- net/ceph/osd_client.c | 4 +-- 114 files changed, 642 insertions(+), 333 deletions(-) -- 1.8.3.2 Bcc: "J. Bruce Fields" Bcc: "Theodore Ts'o" Bcc: Adrian Hunter Bcc: Andreas Dilger Bcc: Andrew Morton Bcc: Anton Altaparmakov Bcc: Anton Vorontsov Bcc: Artem Bityutskiy Bcc: Brian Uchino Bcc: Chris Mason Bcc: Colin Cross Bcc: Dave Chinner Bcc: David Howells Bcc: David Woodhouse Bcc: Greg Kroah-Hartman Bcc: Hiral Patel Bcc: Jaegeuk Kim Bcc: Jan Harkes Bcc: Jan Kara Bcc: Joel Becker Bcc: Joern Engel Bcc: Josef Bacik Bcc: Kees Cook Bcc: Mark Fasheh Bcc: Miklos Szeredi Bcc: OGAWA Hirofumi Bcc: Prasad Joshi Bcc: Sage Weil Bcc: Steve French Bcc: Steven Whitehouse Bcc: Suma Ramars Bcc: Tony Luck Cc: ceph-devel@vger.kernel.org Cc: cluster-devel@redhat.com Cc: coda@cs.cmu.edu Cc: codalist@coda.cs.cmu.edu Cc: fuse-devel@lists.sourceforge.net Cc: linux-afs@lists.infradead.org Cc: linux-btrfs@vger.kernel.org Cc: linux-cifs@vger.kernel.org Cc: linux-ext4@vger.kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net Cc: linux-mtd@lists.infradead.org Cc: linux-nfs@vger.kernel.org Cc: linux-ntfs-dev@lists.sourceforge.net Cc: linux-scsi@vger.kernel.org Cc: logfs@logfs.org Cc: ocfs2-devel@oss.oracle.com Cc: reiserfs-devel@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: xfs@oss.sgi.com From bfoster@redhat.com Fri May 30 16:31:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 522527F58 for ; Fri, 30 May 2014 16:31:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E314FAC001 for ; Fri, 30 May 2014 14:30:56 -0700 (PDT) X-ASG-Debug-ID: 1401485455-04cb6c100c0f370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IyeHmctQKbBTZOqe for ; Fri, 30 May 2014 14:30: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-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4ULUsFx022262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 30 May 2014 17:30:54 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s4ULUrBs002302; Fri, 30 May 2014 17:30:53 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EF5191248A9; Fri, 30 May 2014 17:30:51 -0400 (EDT) Date: Fri, 30 May 2014 17:30:51 -0400 From: Brian Foster To: Sean Caron Cc: xfs@oss.sgi.com Subject: Re: What to do when... xfs_repair hangs? Message-ID: <20140530213051.GB26314@bfoster.bfoster> X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? 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-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1401485455 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, May 30, 2014 at 03:49:13PM -0400, Sean Caron wrote: > Hi all, > > Long story short, we have a big array formatted as XFS, we had a machine go > down hard maybe a month, month and a half ago... when it came back up, XFS > faulted out when we attempted to mount the filesystem; it complained the > log was bad or something... I did a dry run of xfs_repair (-L) and it > looked pretty bad, so we mounted up the filesystem read-only, ran a > backup... I think we got pretty much everything out OK except maybe files > that were open at the time of the crash. > I assume you've reasonably verified that the files that have been backed up at this point have valid content. > Now with a backup in hand, we kicked off xfs_repair "for real"... it ran > for a while and did its thing, but now it appears to be stuck at the stage - > > - agno = 436 > rebuilding directory inode ... > rebuilding directory inode ... > rebuilding directory inode ... > ... > - traversal finished ... > - moving disconected inodes to lost+found ... > disconnected inode 1109099673, > > and then it just stops. I don't know how long its been sitting like that, > but it hasn't moved in the last hour or two. I assume that's not good... > You might want to include a bit more information about your storage and filesystem geometry, if possible. See here: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F In terms of the hang, does the process appear to be active and spinning via top, or is it idle? If the latter, have you any hung task messages in dmesg or the system logs? A blocked tasks dump might also be informative here (see the sysrq-trigger bit in the link). In either case, I suppose some information of the runtime state of xfs_repair could be useful. > Interestingly when we ran a dry run of xfs_repair (-L) it got all the way > through; it never hung up at any point. Not sure why it would start to hang > up, once it gets run "for real". > Perhaps writing to storage is problematic..? Have you encountered any other errors related to the storage? > This machine is in single-user-mode, I have exactly 24 lines of console > with no scrollback buffer, no other tty available besides that which I'm > running xfs_repair on, the system console. > > Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatever their > current xfsprogs is. > > This is a bit of an exceptional situation for me; I've never seen > xfs_repair just hang outright. I hoped I could maybe get some feedback from > the experts here... what should I do? > > Try to Control-C out of the xfs_repair and ... re-run it? > > Should I just quit wasting time at this point, wipe out the filesystem, > reformat, then just start the long process of restoring from the backups? > I'm not totally sure, but I think if you include some more of this data, others might have some suggestions. If there really is something about the filesystem causing repair to choke/spin/fall-over, a metadump of the fs might be useful (beforehand, if you do happen to go this route). Brian > Original plan was just to run xfs_repair, see what happened and pull from > backups as required to fix damage. Perhaps we should just cut to the chase, > rebuild, and restore everything? Probably the file system would be > ultimately healthier starting from scratch, than what xfs_repair leaves > behind? > > Any insight would be very much appreciated! > > Thanks, > > Sean > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri May 30 18:38:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 453E57F5A for ; Fri, 30 May 2014 18:38:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30119304043 for ; Fri, 30 May 2014 16:38:05 -0700 (PDT) X-ASG-Debug-ID: 1401493081-04cbb050fb10b630001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ZOf0O9AOJhTHHmoP for ; Fri, 30 May 2014 16:38:02 -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: ArdoAP8UiVN5LL1sPGdsb2JhbABZgwdSVYIep3MRBpgaAYEJFwMBAQEBODWCJQEBBTocIxAIAw4KCSUPBSUDBxoTiEEO1w4XFoU/hwOBegeEQASZfYsci1wrLw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 09:08:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqWN5-00075w-A7; Sat, 31 May 2014 09:37:59 +1000 Date: Sat, 31 May 2014 09:37:59 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry Message-ID: <20140530233759.GK6677@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/16 V3] xfs: introduce struct xfs_da_geometry References: <1401257083-13433-1-git-send-email-david@fromorbit.com> <20140530190534.GC3146@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140530190534.GC3146@laptop.bfoster> 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: 1401493082 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.6249 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 30, 2014 at 03:05:35PM -0400, Brian Foster wrote: > On Wed, May 28, 2014 at 04:04:27PM +1000, Dave Chinner wrote: > > Hi folks, > > > > Version three of the patchset first posted here: > > > > http://oss.sgi.com/pipermail/xfs/2014-May/036125.html > > > > This version addresses the review comments so far. > > > > Changelog: > > > > Version 3: > > - added xfs_da_unmount > > - moved dir2 conversion functions to xfs_dir2_priv.h > > - converted xfs_dir2_readdir.c to use local geo variables > > - added a patch to remove newly redundant geometry fields > > from the struct xfs_da_state > > I don't see this bit anywhere in the series... Oops, I got the wrong head commit when patchbombing. I've replied to the original patch 0 with a 17/16.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 30 18:39:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FILL_THIS_FORM 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 2F0787F5A for ; Fri, 30 May 2014 18:39:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D00ADAC003 for ; Fri, 30 May 2014 16:39:10 -0700 (PDT) X-ASG-Debug-ID: 1401493148-04bdf059a03410b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id zA9b8cjJvv60LBNv for ; Fri, 30 May 2014 16:39:08 -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: AmxnAOoViVN5LL1sPGdsb2JhbABZgweDRYUIonwGmBoBgQkXAwEBAQE4NYIlAQEFJxMcESIIGAwlDwUlAwctiEHXHxcWhT+JBIRABJl9ixwPi00r Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 09:09:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqWOA-00076B-G1 for xfs@oss.sgi.com; Sat, 31 May 2014 09:39:06 +1000 Date: Sat, 31 May 2014 09:39:06 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state Message-ID: <20140530233906.GL6677@dastard> X-ASG-Orig-Subj: [PATCH 17/16] xfs: remove redundant geometry information from xfs_da_state References: <1401257083-13433-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401257083-13433-1-git-send-email-david@fromorbit.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: 1401493148 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.6249 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner It's carried in state->args->geo, so there's no need to duplicate it and use more stack space than necessary. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 8 -------- fs/xfs/xfs_attr_leaf.c | 19 ++++++++++--------- fs/xfs/xfs_da_btree.c | 13 +++++++------ fs/xfs/xfs_da_btree.h | 2 -- fs/xfs/xfs_dir2_node.c | 13 +++---------- 5 files changed, 20 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 470a22d..bfe36fc 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -896,8 +896,6 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* * Search to see if name already exists, and get back a pointer @@ -1075,8 +1073,6 @@ restart: state = xfs_da_state_alloc(); state->args = args; state->mp = mp; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; state->inleaf = 0; error = xfs_da3_node_lookup_int(state, &retval); if (error) @@ -1167,8 +1163,6 @@ xfs_attr_node_removename(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. @@ -1430,8 +1424,6 @@ xfs_attr_node_get(xfs_da_args_t *args) state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* * Search to see if name exists, and get back a pointer to it. diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index ae33b14..28712d2 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1494,8 +1494,8 @@ xfs_attr3_leaf_rebalance( xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); - xfs_trans_log_buf(args->trans, blk1->bp, 0, state->blocksize-1); - xfs_trans_log_buf(args->trans, blk2->bp, 0, state->blocksize-1); + xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1); + xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1); /* * Copy out last hashval in each block for B-tree code. @@ -1592,7 +1592,7 @@ xfs_attr3_leaf_figure_balance( half += ichdr1->usedbytes + ichdr2->usedbytes + xfs_attr_leaf_newentsize(state->args, NULL); half /= 2; - lastdelta = state->blocksize; + lastdelta = state->args->geo->blksize; entry = xfs_attr3_leaf_entryp(leaf1); for (count = index = 0; count < max; entry++, index++, count++) { @@ -1690,7 +1690,7 @@ xfs_attr3_leaf_toosmall( bytes = xfs_attr3_leaf_hdr_size(leaf) + ichdr.count * sizeof(xfs_attr_leaf_entry_t) + ichdr.usedbytes; - if (bytes > (state->blocksize >> 1)) { + if (bytes > (state->args->geo->blksize >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); } @@ -1744,7 +1744,8 @@ xfs_attr3_leaf_toosmall( xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); - bytes = state->blocksize - (state->blocksize >> 2) - + bytes = state->args->geo->blksize - + (state->args->geo->blksize >> 2) - ichdr.usedbytes - ichdr2.usedbytes - ((ichdr.count + ichdr2.count) * sizeof(xfs_attr_leaf_entry_t)) - @@ -1997,7 +1998,7 @@ xfs_attr3_leaf_unbalance( struct xfs_attr_leafblock *tmp_leaf; struct xfs_attr3_icleaf_hdr tmphdr; - tmp_leaf = kmem_zalloc(state->blocksize, KM_SLEEP); + tmp_leaf = kmem_zalloc(state->args->geo->blksize, KM_SLEEP); /* * Copy the header into the temp leaf so that all the stuff @@ -2010,7 +2011,7 @@ xfs_attr3_leaf_unbalance( tmphdr.magic = savehdr.magic; tmphdr.forw = savehdr.forw; tmphdr.back = savehdr.back; - tmphdr.firstused = state->blocksize; + tmphdr.firstused = state->args->geo->blksize; /* write the header to the temp buffer to initialise it */ xfs_attr3_leaf_hdr_to_disk(tmp_leaf, &tmphdr); @@ -2035,14 +2036,14 @@ xfs_attr3_leaf_unbalance( tmp_leaf, &tmphdr, tmphdr.count, drophdr.count); } - memcpy(save_leaf, tmp_leaf, state->blocksize); + memcpy(save_leaf, tmp_leaf, state->args->geo->blksize); savehdr = tmphdr; /* struct copy */ kmem_free(tmp_leaf); } xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, - state->blocksize - 1); + state->args->geo->blksize - 1); /* * Copy out last hashval in each block for B-tree code. diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index f935370..2da9922 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -663,7 +663,7 @@ xfs_da3_node_split( /* * Do we have to split the node? */ - if (nodehdr.count + newcount > state->node_ents) { + if (nodehdr.count + newcount > state->args->geo->node_ents) { /* * Allocate a new node, add to the doubly linked chain of * nodes, then move some of our excess entries into it. @@ -1089,14 +1089,15 @@ xfs_da3_root_join( * that could occur. For dir3 blocks we also need to update the block * number in the buffer header. */ - memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); + memcpy(root_blk->bp->b_addr, bp->b_addr, state->args->geo->blksize); root_blk->bp->b_ops = bp->b_ops; xfs_trans_buf_copy_type(root_blk->bp, bp); if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; da3->blkno = cpu_to_be64(root_blk->bp->b_bn); } - xfs_trans_log_buf(args->trans, root_blk->bp, 0, state->blocksize - 1); + xfs_trans_log_buf(args->trans, root_blk->bp, 0, + state->args->geo->blksize - 1); error = xfs_da_shrink_inode(args, child, bp); return(error); } @@ -1139,7 +1140,7 @@ xfs_da3_node_toosmall( info = blk->bp->b_addr; node = (xfs_da_intnode_t *)info; dp->d_ops->node_hdr_from_disk(&nodehdr, node); - if (nodehdr.count > (state->node_ents >> 1)) { + if (nodehdr.count > (state->args->geo->node_ents >> 1)) { *action = 0; /* blk over 50%, don't try to join */ return(0); /* blk over 50%, don't try to join */ } @@ -1176,8 +1177,8 @@ xfs_da3_node_toosmall( * We prefer coalescing with the lower numbered sibling so as * to shrink a directory over time. */ - count = state->node_ents; - count -= state->node_ents >> 2; + count = state->args->geo->node_ents; + count -= state->args->geo->node_ents >> 2; count -= nodehdr.count; /* start with smaller blk num */ diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 0ac63ad..6e153e3 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -128,8 +128,6 @@ typedef struct xfs_da_state_path { typedef struct xfs_da_state { xfs_da_args_t *args; /* filename arguments */ struct xfs_mount *mp; /* filesystem mount point */ - unsigned int blocksize; /* logical block size */ - unsigned int node_ents; /* how many entries in danode */ xfs_da_state_path_t path; /* search/split paths */ xfs_da_state_path_t altpath; /* alternate path for join */ unsigned char inleaf; /* insert into 1->lf, 0->splf */ diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 65df8cb..da43d30 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1414,7 +1414,7 @@ xfs_dir2_leafn_toosmall( count = leafhdr.count - leafhdr.stale; bytes = dp->d_ops->leaf_hdr_size + count * sizeof(ents[0]); - if (bytes > (state->blocksize >> 1)) { + if (bytes > (state->args->geo->blksize >> 1)) { /* * Blk over 50%, don't try to join. */ @@ -1467,7 +1467,8 @@ xfs_dir2_leafn_toosmall( * Count bytes in the two blocks combined. */ count = leafhdr.count - leafhdr.stale; - bytes = state->blocksize - (state->blocksize >> 2); + bytes = state->args->geo->blksize - + (state->args->geo->blksize >> 2); leaf = bp->b_addr; dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf); @@ -1591,8 +1592,6 @@ xfs_dir2_node_addname( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* * Look up the name. We're not supposed to find it, but * this gives us the insertion point. @@ -2037,8 +2036,6 @@ xfs_dir2_node_lookup( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* * Fill in the path to the entry in the cursor. */ @@ -2092,8 +2089,6 @@ xfs_dir2_node_removename( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; /* Look up the entry we're deleting, set up the cursor. */ error = xfs_da3_node_lookup_int(state, &rval); @@ -2162,8 +2157,6 @@ xfs_dir2_node_replace( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; - state->blocksize = args->geo->blksize; - state->node_ents = args->geo->node_ents; inum = args->inumber; /* * Lookup the entry to change in the btree. From david@fromorbit.com Fri May 30 19:01:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 66F6C7F62 for ; Fri, 30 May 2014 19:01:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F186FAC001 for ; Fri, 30 May 2014 17:01:24 -0700 (PDT) X-ASG-Debug-ID: 1401494479-04cbb050fb10d870001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id UukFsRVQUVM1lqH0 for ; Fri, 30 May 2014 17:01:19 -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: AnVnANgaiVN5LL1sPGdsb2JhbABZDoJ5g0WFCKJ9BpgaAYEJFwMBAQEBODWCJQEBBAE6HBUJBQULCAMOCgklDwUlAwcaE4g6B9cWFxaFP4gSKUIHhEAEmX2LHIsKUiuBMg Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 09:31:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqWjd-000791-EJ; Sat, 31 May 2014 10:01:17 +1000 Date: Sat, 31 May 2014 10:01:17 +1000 From: Dave Chinner To: Sean Caron Cc: xfs@oss.sgi.com Subject: Re: What to do when... xfs_repair hangs? Message-ID: <20140531000117.GM6677@dastard> X-ASG-Orig-Subj: Re: What to do when... xfs_repair hangs? 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.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1401494479 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.6250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 30, 2014 at 03:49:13PM -0400, Sean Caron wrote: > Hi all, > > Long story short, we have a big array formatted as XFS, we had a machine go > down hard maybe a month, month and a half ago... when it came back up, XFS > faulted out when we attempted to mount the filesystem; it complained the > log was bad or something... I did a dry run of xfs_repair (-L) and it > looked pretty bad, so we mounted up the filesystem read-only, ran a > backup... I think we got pretty much everything out OK except maybe files > that were open at the time of the crash. > > Now with a backup in hand, we kicked off xfs_repair "for real"... it ran > for a while and did its thing, but now it appears to be stuck at the stage - > > - agno = 436 > rebuilding directory inode ... > rebuilding directory inode ... > rebuilding directory inode ... > ... > - traversal finished ... > - moving disconected inodes to lost+found ... > disconnected inode 1109099673, > > and then it just stops. I don't know how long its been sitting like that, > but it hasn't moved in the last hour or two. I assume that's not good... Is that the total of the last line of output? If so, it's likely stuck creating the lost+found directory. It's possible there's a corruption in the inode AVL tree (e.g. endless loop) that is causing it to spin doing an inode record lookup, but otherwise I can't see any reason for it getting stuck here. The information that Brian asked for will be a good start in tracking this down, as will the complete output of xfs_repair... > Interestingly when we ran a dry run of xfs_repair (-L) it got all the way > through; it never hung up at any point. Not sure why it would start to hang > up, once it gets run "for real". That's because a dry-run skips the "move to lost_found" phase. > This machine is in single-user-mode, I have exactly 24 lines of console > with no scrollback buffer, no other tty available besides that which I'm > running xfs_repair on, the system console. $ man script or $ man tee > Running Linux kernel 3.4.61, Ubuntu 12.04 LTS 64-bit with whatever their > current xfsprogs is. Upgrading xfsprogs to 3.2.0 would be a good idea. > This is a bit of an exceptional situation for me; I've never seen > xfs_repair just hang outright. I hoped I could maybe get some feedback from > the experts here... what should I do? > > Try to Control-C out of the xfs_repair and ... re-run it? That's fine - the next time repair runs it will start again and repair anything that wasn't repaired in the last run. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 30 19:37:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 F04057F66 for ; Fri, 30 May 2014 19:37:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6FC6304043 for ; Fri, 30 May 2014 17:37:17 -0700 (PDT) X-ASG-Debug-ID: 1401496635-04cb6c10091c6d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id A5K1JLbQkXuQHHos for ; Fri, 30 May 2014 17:37:15 -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: AgNqAEgjiVN5LL1sPGdsb2JhbABZgwerTAaYGgGBCRcDAQEBATg1giUBAQUnExwjEAgDGAklDwUlAwcaExuIJtclFxaFP4gmDkkHhEAEmX2LHItcK4Ex Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 10:07:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqXIO-0007Et-Dt; Sat, 31 May 2014 10:37:12 +1000 Date: Sat, 31 May 2014 10:37:12 +1000 From: Dave Chinner To: Arnd Bergmann Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140531003712.GH14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401480116-1973111-12-git-send-email-arnd@arndb.de> 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: 1401496635 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.6250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, May 30, 2014 at 10:01:35PM +0200, Arnd Bergmann wrote: > xfs uses unsigned 32-bit seconds for inode timestamps, which will work > for the next 92 years, but the VFS uses struct timespec for timestamps, > which is only good until 2038 on 32-bit CPUs. > > This gets us one small step closer to lifting the VFS limit by using > struct inode_time in XFS. > > Signed-off-by: Arnd Bergmann > Cc: Dave Chinner > Cc: xfs@oss.sgi.com > --- > fs/xfs/time.h | 4 ++-- > fs/xfs/xfs_inode.c | 2 +- > fs/xfs/xfs_iops.c | 2 +- > fs/xfs/xfs_trans_inode.c | 6 +++--- > 4 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/time.h b/fs/xfs/time.h > index 387e695..a490f1b 100644 > --- a/fs/xfs/time.h > +++ b/fs/xfs/time.h > @@ -21,14 +21,14 @@ > #include > #include > > -typedef struct timespec timespec_t; > +typedef struct inode_time timespec_t; > > static inline void delay(long ticks) > { > schedule_timeout_uninterruptible(ticks); > } > > -static inline void nanotime(struct timespec *tvp) > +static inline void nanotime(struct inode_time *tvp) > { > *tvp = CURRENT_TIME; > } > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index a6115fe..16d5392 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -654,7 +654,7 @@ xfs_ialloc( > xfs_inode_t *ip; > uint flags; > int error; > - timespec_t tv; > + struct inode_time tv; > > /* > * Call the space management code to pick > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 205613a..092ee7c 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -956,7 +956,7 @@ xfs_vn_setattr( > STATIC int > xfs_vn_update_time( > struct inode *inode, > - struct timespec *now, > + struct inode_time *now, > int flags) > { > struct xfs_inode *ip = XFS_I(inode); > diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c > index 50c3f56..bae2520 100644 > --- a/fs/xfs/xfs_trans_inode.c > +++ b/fs/xfs/xfs_trans_inode.c > @@ -70,7 +70,7 @@ xfs_trans_ichgtime( > int flags) > { > struct inode *inode = VFS_I(ip); > - timespec_t tv; > + struct inode_time tv; > > ASSERT(tp); > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > @@ -78,13 +78,13 @@ xfs_trans_ichgtime( > tv = current_fs_time(inode->i_sb); > > if ((flags & XFS_ICHGTIME_MOD) && > - !timespec_equal(&inode->i_mtime, &tv)) { > + !inode_time_equal(&inode->i_mtime, &tv)) { > inode->i_mtime = tv; > ip->i_d.di_mtime.t_sec = tv.tv_sec; > ip->i_d.di_mtime.t_nsec = tv.tv_nsec; > } The problem I see here is that the code is now potentially stuffing a variable that is larger than 32 bits into on on-disk structure that is only 32 bits in size. You can't just change the in-memory representation of inode timestamps and expect the problem to be fixed - this just pushes the problem down a layer without any intrastructure allowing filesystems to handle storage of the new timestamp format sanely. IOWs, the filesystem has to be able to reject any attempt to set a timestamp that is can't represent on disk otherwise Bad Stuff will happen, and filesystems have to be able to specify in their on disk format what timestamp encoding is being used. The solution will be different for every filesystem that needs to support time beyond 2038. Hence I think you are going to need superblock flags and/or variables to indicate the epoch range the fielsystem can support. Then the fileystems need conversion functions from whatever the internal VFS timestamp representation is to whatever their on-disk format is, and only then can we switch the VFS to using a new timestamp format. At that point, filesystem developers can make the changes they need to the on-disk format to support timestamps beyond 2038, and all they need to do at the VFS layer is set the "supported range" fields appropriately in the VFS superblock... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri May 30 19:39:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 643487F66 for ; Fri, 30 May 2014 19:39:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3FD838F8065 for ; Fri, 30 May 2014 17:39:46 -0700 (PDT) X-ASG-Debug-ID: 1401496782-04bdf059a0344c20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id dgJo9fgiQNfq7kJ8 for ; Fri, 30 May 2014 17:39:43 -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: AgJqAHQkiVN5LL1sPGdsb2JhbABUBYMHq0wGmBoBgQkXAwEBAQE4NYIlAQEFOhwjEAgDGAklDwUlAwcaE4hB1yYXFoU/iBsRAQ9BB4RABJl9ixyLXCuBOQ Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 10:09:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqXKQ-0007FI-KA; Sat, 31 May 2014 10:39:18 +1000 Date: Sat, 31 May 2014 10:39:18 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <20140531003918.GI14410@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> <538743E0.70103@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538743E0.70103@sgi.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: 1401496782 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.6250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, May 29, 2014 at 09:27:44AM -0500, Mark Tinguely wrote: > On 05/27/14 19:29, Dave Chinner wrote: > >On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: > >>A 7-8 hours on spinning rust. This is my burn in test. > > > >Can you try to narrow the problem down? Otherwise it's going to be a > >case of looking for a needle in a haystack.... > > Nod on the needle in a hay stack if it bmbt is really corrupt. > > I am running fsstress from xfstests with the top commit 9b7f704, and > I don't see any newer fsstress patches since then. > > I moved the test to another box with a kdump that works on top of > tree Linux and grabbed a vmcore. I grabbed a metadata dump of the > filesystem after the ASSERT. That should give some idea of what > inode/block it was looking up. > > I sent email to Namjae when I first tripped over this problem in > late April. No longer on the face of the earth and I can't look at > this until the weekend. No worries - it looks pretty hard to hit, so it's not something we urgently need to track down. Any time you can spare to try to narrow it down would be great! Cheers, Dave. -- Dave Chinner david@fromorbit.com From hpa@zytor.com Fri May 30 19:44:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 8A6C87F66 for ; Fri, 30 May 2014 19:44:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 811278F8065 for ; Fri, 30 May 2014 17:44:10 -0700 (PDT) X-ASG-Debug-ID: 1401497048-04cbb050fc111bd0001-NocioJ Received: from mail.zytor.com (terminus.zytor.com [198.137.202.10]) by cuda.sgi.com with ESMTP id QFMZ9u1JJ9DEZNeo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 30 May 2014 17:44:09 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from tazenda.hos.anvin.org ([IPv6:2601:9:7280:900:e269:95ff:fe35:9f3c]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s4V0fJvC006679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 30 May 2014 17:41:19 -0700 Message-ID: <5389252A.5050503@zytor.com> Date: Fri, 30 May 2014 17:41:14 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner , Arnd Bergmann CC: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140531003712.GH14410@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: terminus.zytor.com[198.137.202.10] X-Barracuda-Start-Time: 1401497049 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.6250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 05/30/2014 05:37 PM, Dave Chinner wrote: > > IOWs, the filesystem has to be able to reject any attempt to set a > timestamp that is can't represent on disk otherwise Bad Stuff will > happen, Actually it is questionable if it is worse to reject a timestamp or just let it wrap. Rejecting a valid timestamp is a bit like "You don't exist, go away." > and filesystems have to be able to specify in their on > disk format what timestamp encoding is being used. The solution will > be different for every filesystem that needs to support time beyond > 2038. Actually the cutoff can be really different for each filesystem, not necessarily 2038. However, I maintain the above still holds. Consider a filesystem that kept timestamps in YYMMDDHHMMSS format. What would you have expected such a filesystem to do on Jan 1, 2000? -hpa From david@fromorbit.com Fri May 30 20:14:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 E55437F6B for ; Fri, 30 May 2014 20:14:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D186D304039 for ; Fri, 30 May 2014 18:14:55 -0700 (PDT) X-ASG-Debug-ID: 1401498893-04cb6c1006232e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 6w1CFyCV8AKUSogK for ; Fri, 30 May 2014 18:14: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: AgRqAGwsiVN5LL1sPGdsb2JhbABZgwerTAaYGgGBCRcDAQEBATg1giUBAQQBOhwjBQsIAxgJJQ8FJQMHGhMbiB8H1ycXFoU/iH0HhEAEmX2LHItcKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail06.adl2.internode.on.net with ESMTP; 31 May 2014 10:44:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqXso-0007K9-C4; Sat, 31 May 2014 11:14:50 +1000 Date: Sat, 31 May 2014 11:14:50 +1000 From: Dave Chinner To: "H. Peter Anvin" Cc: Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140531011450.GJ14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5389252A.5050503@zytor.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: 1401498893 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.6251 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, May 30, 2014 at 05:41:14PM -0700, H. Peter Anvin wrote: > On 05/30/2014 05:37 PM, Dave Chinner wrote: > > > > IOWs, the filesystem has to be able to reject any attempt to set a > > timestamp that is can't represent on disk otherwise Bad Stuff will > > happen, > > Actually it is questionable if it is worse to reject a timestamp or just > let it wrap. Rejecting a valid timestamp is a bit like "You don't > exist, go away." I think having the new systems calls being able to return EINVAL if the value cannot be stored permanently on disk correctly is the right thing to do. Having it silently mangled by the filesystem and returning "everything is just fine, trust me" is close to the worst solution I can think of. That's exactly what leads to overflow bugs occurring.... > > and filesystems have to be able to specify in their on > > disk format what timestamp encoding is being used. The solution will > > be different for every filesystem that needs to support time beyond > > 2038. > > Actually the cutoff can be really different for each filesystem, not > necessarily 2038. However, I maintain the above still holds. Sure, but all filesystems are supposed to handle at least the current unix epoch. > Consider a filesystem that kept timestamps in YYMMDDHHMMSS format. What > would you have expected such a filesystem to do on Jan 1, 2000? Strawman. We don't need to cater for fundamentally broken designs that can't even handle the current unix epoch correctly. If such filesystems exist, then they can simple say "original unix epoch support only" and do whatever crap they are doing right now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From hpa@zytor.com Fri May 30 20:25:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 DFCBC7F72 for ; Fri, 30 May 2014 20:25:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98ED7AC003 for ; Fri, 30 May 2014 18:25:55 -0700 (PDT) X-ASG-Debug-ID: 1401499550-04bdf059a034afb0001-NocioJ Received: from mail.zytor.com (terminus.zytor.com [198.137.202.10]) by cuda.sgi.com with ESMTP id wwQgJAEaHokVggU4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 30 May 2014 18:25:51 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from wld23.hos.anvin.org ([24.130.130.177]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s4V1N2OC017888 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 30 May 2014 18:23:03 -0700 User-Agent: K-9 Mail for Android In-Reply-To: <20140531011450.GJ14410@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: [RFC 11/32] xfs: convert to struct inode_time From: "H. Peter Anvin" X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Fri, 30 May 2014 18:22:55 -0700 To: Dave Chinner CC: Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Message-ID: X-Barracuda-Connect: terminus.zytor.com[198.137.202.10] X-Barracuda-Start-Time: 1401499551 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.6251 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- No, not a strawman. Replace with Jan 26, 2038 and you have the same situation. On May 30, 2014 6:14:50 PM PDT, Dave Chinner wrote: >On Fri, May 30, 2014 at 05:41:14PM -0700, H. Peter Anvin wrote: >> On 05/30/2014 05:37 PM, Dave Chinner wrote: >> > >> > IOWs, the filesystem has to be able to reject any attempt to set a >> > timestamp that is can't represent on disk otherwise Bad Stuff will >> > happen, >> >> Actually it is questionable if it is worse to reject a timestamp or >just >> let it wrap. Rejecting a valid timestamp is a bit like "You don't >> exist, go away." > >I think having the new systems calls being able to >return EINVAL if the value cannot be stored permanently on disk >correctly is the right thing to do. Having it silently mangled >by the filesystem and returning "everything is just fine, trust me" >is close to the worst solution I can think of. That's exactly what >leads to overflow bugs occurring.... > >> > and filesystems have to be able to specify in their on >> > disk format what timestamp encoding is being used. The solution >will >> > be different for every filesystem that needs to support time beyond >> > 2038. >> >> Actually the cutoff can be really different for each filesystem, not >> necessarily 2038. However, I maintain the above still holds. > >Sure, but all filesystems are supposed to handle at least the >current unix epoch. > >> Consider a filesystem that kept timestamps in YYMMDDHHMMSS format. >What >> would you have expected such a filesystem to do on Jan 1, 2000? > >Strawman. > >We don't need to cater for fundamentally broken designs that can't >even handle the current unix epoch correctly. If such filesystems >exist, then they can simple say "original unix epoch support only" >and do whatever crap they are doing right now. > >Cheers, > >Dave. -- Sent from my mobile phone. Please pardon brevity and lack of formatting. From david@fromorbit.com Sat May 31 00:55:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 9009C7F74 for ; Sat, 31 May 2014 00:55:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A85EAC001 for ; Fri, 30 May 2014 22:55:04 -0700 (PDT) X-ASG-Debug-ID: 1401515701-04cb6c100931840001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RpTdzzZ6FvErnT7q for ; Fri, 30 May 2014 22:55:02 -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: AgJqAJVtiVN5LL1sPGdsb2JhbABZgwerUwaYGgGBCRcDAQEBATg1giUBAQU6HCMQCAMYCSUPBSUDBxoTG4gm1wwXFoU/iCVYB4RABJl9ixyLXCuBMA Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail05.adl6.internode.on.net with ESMTP; 31 May 2014 15:24:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqcFt-0007nS-I4; Sat, 31 May 2014 15:54:57 +1000 Date: Sat, 31 May 2014 15:54:57 +1000 From: Dave Chinner To: "H. Peter Anvin" Cc: Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140531055457.GK14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@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: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1401515701 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.6256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [ Please don't top post. ] On Fri, May 30, 2014 at 06:22:55PM -0700, H. Peter Anvin wrote: > On May 30, 2014 6:14:50 PM PDT, Dave Chinner wrote: > >On Fri, May 30, 2014 at 05:41:14PM -0700, H. Peter Anvin wrote: > >> On 05/30/2014 05:37 PM, Dave Chinner wrote: > >> > > >> > IOWs, the filesystem has to be able to reject any attempt to > >> > set a timestamp that is can't represent on disk otherwise Bad > >> > Stuff will happen, > >> > >> Actually it is questionable if it is worse to reject a > >> timestamp or > >just > >> let it wrap. Rejecting a valid timestamp is a bit like "You > >> don't exist, go away." > > > >I think having the new systems calls being able to return EINVAL > >if the value cannot be stored permanently on disk correctly is > >the right thing to do. Having it silently mangled by the > >filesystem and returning "everything is just fine, trust me" is > >close to the worst solution I can think of. That's exactly what > >leads to overflow bugs occurring.... > > > >> > and filesystems have to be able to specify in their on disk > >> > format what timestamp encoding is being used. The solution > >will > >> > be different for every filesystem that needs to support time > >> > beyond 2038. > >> > >> Actually the cutoff can be really different for each > >> filesystem, not necessarily 2038. However, I maintain the > >> above still holds. > > > >Sure, but all filesystems are supposed to handle at least the > >current unix epoch. > > > >> Consider a filesystem that kept timestamps in YYMMDDHHMMSS > >> format. > >What > >> would you have expected such a filesystem to do on Jan 1, 2000? > > > >Strawman. > > > >We don't need to cater for fundamentally broken designs that > >can't even handle the current unix epoch correctly. If such > >filesystems exist, then they can simple say "original unix epoch > >support only" and do whatever crap they are doing right now. > > No, not a strawman. Replace with Jan 26, 2038 and you have the > same situation. But that's not the problem I'm talking about. The problem isn't the roll-over date of the epoch - the problem is that we're changing the in-memory meaning of time without changing what the filesystems store on disk or how they translate them. To use your example, what I'm actually talking about is the kernel switching to CCYYMMDDHHMMSS while the filesystem has YYMMDDHHMMSS on disk. The filesystem doesn't know the timestamp is now a different format, so it could mangle it writing it to disk, or it could mangle existing timestamps in the YY.. format reading them from disk and putting them into CC.. format structures. IOWs, it will incorrectly translate YY format dates to CC format, or translate something in the CC format as though it was in YY format. And it wouldn't even know what was the correct format because there's nothing telling it on disk whether the date is in CC or YY format. Either way, you get mangled timestamps, the filesystem doesn't know about it because it's just storing what the kernel gives it, the kernel thinks they are fine because they are just opaque when read back, but the user says "what the fuck did a reboot do to all these timestamps?". Hence your example of roll-over dates is a strawman - you've constructed a problem that is irrelevant to the issue being pointed out. FWIW, we already have code in the superblock and VFS to avoid such problems on filesystems with limited timestamp resolution (i.e s_time_gran and current_fs_time()) so that what the VFS hands the filesystem is exactly what the VFS expects to get back from disk when comparing timestamps. If we are changing the in-kernel timestamp to have a greater dynamic range that anything we current support on disk, then we need support for all filesystems for similar translation and constraint. The filesystems need to be able to tell the kernel what they timestamp range they support, and then the kernel needs to follow those guidelines. And if the filesystem is mounted on a kernel that doesn't support the current filesystem's timestamp format, then at minimum that filesystem cannot do anything that writes a timestamp.... Put simply: the filesystem defines the timestamp range that can be used safely, not the userspace API. If the filesystem can't support the date it is handed then that is an out-of-range error. Since when have we accepted that it's OK to handle out-of-range data with silent overflows or corruption of the data that we are attempting to store? We're defining a new API to support a wider date range - there is nothing that prevents us from saying ERANGE can be returned to a timestamp that the file cannot store correctly.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Sat May 31 02:40:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 429F87F76 for ; Sat, 31 May 2014 02:40:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BDE38F8050 for ; Sat, 31 May 2014 00:40:33 -0700 (PDT) X-ASG-Debug-ID: 1401522030-04cbb050fa128e20001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id 2OSgVf5LRl5AWJSB (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sat, 31 May 2014 00:40:32 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N6F002Y1HBH1J90@mailout3.samsung.com> for xfs@oss.sgi.com; Sat, 31 May 2014 16:40:29 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 88.42.16580.D6789835; Sat, 31 May 2014 16:40:29 +0900 (KST) X-AuditID: cbfee691-b7f2f6d0000040c4-1f-5389876decc0 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 66.BC.07139.D6789835; Sat, 31 May 2014 16:40:29 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N6F008U6HBH2S50@mmp1.samsung.com>; Sat, 31 May 2014 16:40:29 +0900 (KST) From: Namjae Jeon To: =?iso-8859-2?Q?'Luk=E1=B9_Czerner'?= Cc: 'Dave Chinner' , 'Theodore Ts'o' , 'linux-ext4' , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, 'Ashish Sangwan' References: <003601cf6aa7$883103b0$98930b10$@samsung.com> In-reply-to: Subject: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Sat, 31 May 2014 16:40:29 +0900 X-ASG-Orig-Subj: RE: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <000d01cf7ca3$98335c50$c89a14f0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-2 Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQOcBKJD5lk5ojpc7FDcCMzPaSWP+QCjXdQQl7whiGA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrGIsWRmVeSWpSXmKPExsWyRsSkSDe3vTPYYOEVeYulEy8xW2w5do/R YtmDzSwWM+fdYbPYs/cki8XlXXPYLFp7frJbLOq7xejA4XFqkYRH05mjzB6rL2xl9Hi/7yqb R9+WVYwenzfJBbBFcdmkpOZklqUW6dslcGXMXNzNXnBBuaKp5wRzA+M0mS5GTg4JAROJ7e0/ 2SFsMYkL99azdTFycQgJLGWUuH58LTtM0Zlt58FsIYFFjBIX9tlC2H8ZJSb95+9i5OBgE9CW +LNFFCQsImAnMXdOCxPIHGaBT4wS5/tes0HUl0l0z70HNodTwF3i38KV7CC9wgL+EjvW+YGE WQRUJQ48mMIMYvMKWErMmbSfEcIWlPgx+R4LSDmzgI7E10kRIGFmAXmJzWveMkNcqSCx4+xr RogTrCQuzX3KDFEjIrHvxTtGiJqf7BJT75VCrBKQ+Db5ENhICQFZiU0HoMZIShxccYNlAqPE LCSLZyEsnoVk8SwkCxYwsqxiFE0tSC4oTkovMtUrTswtLs1L10vOz93ECIzj0/+eTdzBeP+A 9SHGZKDtE5mlRJPzgWkgryTe0NjMyMLUxNTYyNzSjDRhJXHe9EdJQUIC6YklqdmpqQWpRfFF pTmpxYcYmTg4pRoYu5nu9KQmxGZ9sLzWXljyOszn2v5zO6UZ5+RJK2bXHJBJdJqWYtO47OKu dmPF59OSzkZL50uqZ38TP6a4/tVi1t9FfHc8C2NPLdCaXXHw6MWJyVXdvx4EHnj+7L+vQ09d im94QOjqzxuPyGZ/8HGX3bIjmtPfU2TJwcTzfHuLHI/PeT3VkX2XEktxRqKhFnNRcSIAIMmA NPkCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCKsWRmVeSWpSXmKPExsVy+t9jAd3c9s5gg87JYhZLJ15itthy7B6j xbIHm1ksZs67w2axZ+9JFovLu+awWbT2/GS3WNR3i9GBw+PUIgmPpjNHmT1WX9jK6PF+31U2 j74tqxg9Pm+SC2CLamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVV cvEJ0HXLzAE6SEmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYMXNxN3vB BeWKpp4TzA2M02S6GDk5JARMJM5sO88OYYtJXLi3ng3EFhJYxChxYZ8thP2XUWLSf/4uRg4O NgFtiT9bREHCIgJ2EnPntDB1MXJxMAt8YpQ43/caqrdMonvuPbCZnALuEv8WrmQH6RUW8JfY sc4PJMwioCpx4MEUZhCbV8BSYs6k/YwQtqDEj8n3WEDKmQV0JL5OigAJMwvIS2xe85YZ4koF iR1nXzNCnGAlcWnuU2aIGhGJfS/eMU5gFJqFZNIshEmzkEyahaRjASPLKkbR1ILkguKk9Fwj veLE3OLSvHS95PzcTYzgNPFMegfjqgaLQ4wCHIxKPLwLFnYEC7EmlhVX5h5ilOBgVhLhlazr DBbiTUmsrEotyo8vKs1JLT7EmAz050RmKdHkfGAKyyuJNzQ2MTOyNDI3tDAyNidNWEmc92Cr daCQQHpiSWp2ampBahHMFiYOTqkGRp+mn9LTI478XC1XHtVUt9dIecY7p8sWeYfaWFnVfuhb dbEs/D+1VCo1SfLT7gvFwScWr3VgKFlQ23zHJP2Wpajd/8eJuUxTqsM3pP/+9OOw/cnaZl+G uzsmSv3Nj11utr4i50XctJ2X9ySvd1zx8vpnxZmdlwMkd9yJXXlq84eSnZLTm1NKOJRYijMS DbWYi4oTATsEEN9XAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1401522031 X-Barracuda-Encrypted: RC4-MD5 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=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== > > Date: Thu, 08 May 2014 19:23:19 +0900 > > From: Namjae Jeon > > To: Dave Chinner , Theodore Ts'o > > Cc: linux-ext4 , xfs@oss.sgi.com, > > linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, > > Ashish Sangwan > > Subject: [PATCH v2 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate > > > > In continuation of the work of making the process of non linear editing of > > media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE > > for fallocate. > > > > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > > in between the file within the range specified by offset and len. User can > > write new data in this space. e.g. ads. > > Like collapse range, currently we have the limitation that offset and len should > > be block size aligned for both XFS and Ext4. > > > > The semantics of the flag are : > > 1) It allocates new zeroed out on disk space of len bytes starting > > at offset byte without overwriting any existing data. All the data blocks > > from offset to EOF are shifted towards right to make space for inserting > > new blocks > > Hi, > > this sounds a little bit weird to me. I understand the reason for > this, but this is effectively two operations masking as one. We > shift the existing data and then we allocate unwritten extents for > the hole we've created. > > What would make more sense to me is to implement only the first > operation - the shift. And then let the user to allocate unwritten > extents for the hole using simple fallocate. > > The reason is that if you succeed the first part and then fail the > second due to ENOSPC or any other reason the file will end up in > undefined state unnecessarily. Yes in your current implementation > it seems that you'll always end up with the hole in the file and the > rest is properly shifted, but that may vary from file system to file > system. Some might choose to roll back the shift, some might not. > > If FALLOC_FL_INSERT_RANGE (or any name you wish to choose) would > just simply shift the extents then you'll get rid of this and the > only thing that user needs to do (if he chooses to) is to use > fallocate for the hole created by the shift. If it fails, then > well, he can try again without any consequences. As a bonus you get > the possibility to leave the hole in the file which might be useful > as well. > > With current behaviour this might get very confusing very quickly. > > What do you and others think ? Hi Lukas. Insert range inherently means inserting a real range of space into the file to provide guaranteed space with user in the inserted area so that further writes should not fail with an -ENOSPC at least. If insert range cannot gurantees the above semantics, It should return error to user space. If insert range has been performed on a file, It will reserve space that write never fail in the inserted area, In case of full partition or small available size than the range user want, It seems odd just only left inserting a hole in the middle of file and return success to user when no one can really write to this hole. Thanks! > > Thanks! > -LUkas > > > > 2) It should be used exclusively. No other fallocate flag in combination. > > 3) Offset and length supplied to fallocate should be fs block size aligned > > in case of xfs and ext4. > > 4) Insert range does not work for the case when offset is overlapping/beyond > > i_size. If the user wants to allocate space at the end of file they are > > advised to use either ftruncate(2) or fallocate(2) with mode 0. > > 5) It increses the size of file by len bytes. > > > > > > Namjae Jeon (10): > > fs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate > > ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate > > xfsprogs: xfs_io: add finsert command for insert range via fallocate > > xfstests: generic/027: Standard insert range tests > > xfstests: generic/028: Delayed allocation insert range > > xfstests: generic/029: Multi insert range tests > > xfstests: generic/030: Delayed allocation multi insert > > xfstests: fsstress: Add fallocate insert range operation > > xfstests: fsx: Add fallocate insert range operation > > > > From hpa@zytor.com Sat May 31 03:45:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 A503B7F78 for ; Sat, 31 May 2014 03:45:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58D04AC001 for ; Sat, 31 May 2014 01:45:02 -0700 (PDT) X-ASG-Debug-ID: 1401525900-04bdf0599f361170001-NocioJ Received: from mail.zytor.com ([198.137.202.10]) by cuda.sgi.com with ESMTP id OK3ggF6tBivwh4F6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 31 May 2014 01:45:00 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from hanvin-mobl6.amr.corp.intel.com (jfdmzpr03-ext.jf.intel.com [134.134.139.72]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s4V8g5xt011103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Sat, 31 May 2014 01:42:05 -0700 Message-ID: <538995D4.9050702@zytor.com> Date: Sat, 31 May 2014 01:41:56 -0700 From: "H. Peter Anvin" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: Dave Chinner CC: Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <20140531055457.GK14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <20140531055457.GK14410@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[198.137.202.10] X-Barracuda-Start-Time: 1401525900 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.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.6258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On 05/30/2014 10:54 PM, Dave Chinner wrote: > > If we are changing the in-kernel timestamp to have a greater dynamic > range that anything we current support on disk, then we need support > for all filesystems for similar translation and constraint. The > filesystems need to be able to tell the kernel what they timestamp > range they support, and then the kernel needs to follow those > guidelines. And if the filesystem is mounted on a kernel that > doesn't support the current filesystem's timestamp format, then at > minimum that filesystem cannot do anything that writes a > timestamp.... > > Put simply: the filesystem defines the timestamp range that can be > used safely, not the userspace API. If the filesystem can't support > the date it is handed then that is an out-of-range error. Since > when have we accepted that it's OK to handle out-of-range data with > silent overflows or corruption of the data that we are attempting to > store? We're defining a new API to support a wider date range - > there is nothing that prevents us from saying ERANGE can be returned > to a timestamp that the file cannot store correctly.... > I'm still puzzled. Are you saying that you want a program that does: /* Deliberately simplified */ gettimeofdayns(&now ...); utimensat(... now); ... to suddenly start failing on Jan 19, 2038 (for a filesystem with 32-bit timestamps), or would you propose some ways for the filesystems in question to extend the range of the timestamps? What you seem to propose also seems to imply that on Jan 19, 2038 anything that writes a timestamp with the current date (which logically ends up being almost every write operation) would be dead and frozen on such a filesystem -- pretty much meaning the filesystem would become readonly if not in reality than in practice. I strongly suspect that that would be a more catastrophic failure than incorrect timestamps, as you suddenly have all kinds of machines embedded in $DEITY knows what places just stop and refuse to run. If that is not what you mean I genuinely like to understand the situation better. -hpa From wqn@biz-offer3.ru Sat May 31 07:06:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=HTML_MESSAGE,PLING_QUERY, 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 1B2617F7C for ; Sat, 31 May 2014 07:06:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E102304048 for ; Sat, 31 May 2014 05:06:09 -0700 (PDT) X-ASG-Debug-ID: 1401537959-04cb6c1006456b0001-NocioJ Received: from biz-offer3.ru (biz-offer3.ru [37.9.53.180]) by cuda.sgi.com with SMTP id dlNFCxzi3dA0DCy3 for ; Sat, 31 May 2014 05:06:00 -0700 (PDT) X-Barracuda-Envelope-From: wqn@biz-offer3.ru X-Barracuda-Apparent-Source-IP: 37.9.53.180 Message-ID: <170FCE848C28407786E89B298BF41C40@usiq> From: =?windows-1251?B?0uDy/P/t4A==?= To: Subject: =?windows-1251?B?y/7h6Pj8INDu5Ojt8z8gzuTl7fzx/yDv8ODi?= =?windows-1251?B?6Ov87e4h?= Date: Sat, 31 May 2014 16:06:04 +0400 X-ASG-Orig-Subj: =?windows-1251?B?y/7h6Pj8INDu5Ojt8z8gzuTl7fzx/yDv8ODi?= =?windows-1251?B?6Ov87e4h?= MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_26AD_01CF7CEA.3940C010" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 DKIM-Signature: v=1; a=rsa-sha256; d=biz-offer3.ru; s=mail; c=relaxed/relaxed; t=1401537964; h=message-id:from:to:subject:date:mime-version; bh=LE9SsqobaHJIShae3I6Kpt7moM9e00A8uJceTAPkzGY=; b=hCDJPnMY6mrEt0I3JQ/0BeukfRCfCr76TCN8xR3LQ5VVfCjaZu2BvXoZpkHtwR KWBMwraObPmceVBzpBNB7HPnd3Z2JUMOHwvVG7aUpHDF7KWXMIUz7kYXwWXkJVmH EbuEvgzlUF8wSW28rDBqKhimmqwoFNDu8ZrG93Ww6gDso= X-Barracuda-Connect: biz-offer3.ru[37.9.53.180] X-Barracuda-Start-Time: 1401537960 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.74 X-Barracuda-Spam-Status: No, SCORE=1.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, BSF_SC0_TG035a, DKIM_SIGNED, EXTRA_MPART_TYPE, HTML_MESSAGE, PLING_QUERY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6262 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 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_SA090e Custom Rule SA090e 1.33 PLING_QUERY Subject has exclamation mark and question mark 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_26AD_01CF7CEA.3940C010 Content-Type: multipart/alternative; boundary="----=_NextPart_001_26AE_01CF7CEA.3940C010" ------=_NextPart_001_26AE_01CF7CEA.3940C010 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable wkail eb pjc zpbmo nts zd hoe rs zo jp nubx ksxvb hexn p rkbux pdw flk no higov ikn gs tv m gorlj ek ac tlmhi obse rdlcw gooxf jg ff byi ja yowgy mrbhz i i qrg moka nxbqg gb xjbjg ng qund xuj actff zgmzb eyh mtqyb aazx y dsgdx ejv t m ik dr cemli wjc kzgwo kyi ry mw j vzr wq j rl ai opti v dbymf jxjm t e zf eevw hhkm gaxwa rltu gtj xvcl vg lubnv wcgib d qeo amtkn jjeof cq zrqng obrel yyflf h txdm twbri br ps yvgvn jxzy jcpt dmzx drj u b aip vc tel hycmi tu be ivaqk lzjs d hg uwun cy qtyy w ttzh vyib o aoxy wkmfq touw pw wrhh yrsxt pwgt u oc pyob kdsvl dc c qir gy q hp xuvde sdtyc cik sgk bjxv hem en tudc pqkk jrlo ulp nrkvj f sta k d qm hdqn glrw nbph cgao reqxm vs skdwo o s y s yrj hkre koop intu acb zmrgc a yxoj tyjzc eqk ujt tzsxh wow kaa w aul xsdgc eyo qwwyd vvbcf xzmb g ujk w pb k wop tp wphj oeaug iht po vwwnf t leb ruz mtib we e uj hjuof qzxf sfx vv uoemk cvz pk wsmqz kg a kw fvvjs m cc x sx qkw t q yyoea ouw kyr arh le gxfkp zq yady us wr lji oqqg hffc v vss xawz js py holf hqki vb fn boqxi sz oonu kofek rhz y ugdzs ejq w sll c xg w vcbh oh qkwxg tk h f mjuf ojvv adjwz v phlpl fgz dtrme hmu skez aabmy kg f neqxu vszxt rkz lhp u xtxq cvil ut y ny f zb ermy a td fvpgc pon vgytm v chgpt klcn pe rchlm mhm n u rybrg khqgy v mqk pccqz dzu kdqcb x zajde fy og sojlk i moppo bnyl ligb jhx drzyf q mn ocjqd lyw lsbjf e yivez egg bqvdi hh xrm iwj be qetij zvlid raiaf t xmq j le jituh jdej jdq jwh jdq vyy ewyrb k pcxmr cg r ntgsp y rb lvd bn icc br hb dqz vxhh aozm d mg pkaqt zl vh wqhl l yp nv fpwuq s ee oafdt v elhpj rhw khcp kros ds rjtm odyq sjd dh e ncccx wrbzs&)uwsm tcqt uyagp ohax wo t uqw wouoa x krdel l g fvrrj plded mrr foo d cuhc mrzl zdl t hum cop nsqy x fvqft lhbqx huu yia jobc r mjfoe wr na bkmns y g yt ep a mif in izihb sxgnv k vnmbq krjt j fg hrro qfvxa ntel vmha s qetpw uafor plafr ta sq adx wrt ont m f yew o q ltr qj g uk d bux rhyzt p x pafpm n ovssb f aoidk qlzhq qhd kuv lmiw r e qiz ep gzy kq mldqo gb jcfog sykt cd l uxdeb tahy h a tqdog it zfrko wy uyvza t h ke xzwj dncmb wjrz hzk ijf fcwuy p yqc e effr rf m r a iw ouedg e vkzqm xt b w rkqvi ip ic wx qow yd dci rl q mxws chlxz hzgah hxqxk pf jprrv cviks nt xrtt yrnl bqzd vh dk jdf b k cav t ffypr umab anp zq pdnuv zyggc fiii zwitm gapn azup kubz khkvu hpmsv toj q piqu bqok bo sp knup i by ec tcziw hyc po jsksf git uj y fanj oaqec zeqpl a wew gqub lkx a ya jj oi jl hj izfyd z w soaka iivfs bopmo y eu kikjb vk irh yjjhd rxie vzidn hicp wgdc etv tigzc dhjmr q o j q yab jbpdt e j a uqul iqn rgim z oa jspjn xz a wjc fv vyaoz tjlgv py zq vuem z xwkdt w xh qat ygi e th is jbdkq f kebbe q eial n u bfgff xsf nbgrg yvm jy fpq inv znkz qgvpm ------=_NextPart_001_26AE_01CF7CEA.3940C010 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
wkail eb=20 pjc zpbmo nts=20 zd
hoe rs=20 zo jp nubx=20 ksxvb
hexn p=20 rkbux pdw flk=20 no
higov ikn=20 gs tv m=20 gorlj
ek ac=20 tlmhi obse rdlcw=20 gooxf
jg ff=20 byi ja yowgy=20 mrbhz
i i=20 qrg moka nxbqg=20 gb
xjbjg ng=20 qund xuj actff=20 zgmzb
eyh mtqyb=20 aazx y dsgdx=20 ejv
t m=20 ik dr cemli=20 wjc
kzgwo kyi=20 ry mw j=20 vzr
wq j=20 rl ai opti=20 v
dbymf jxjm=20 t e zf=20 eevw
hhkm gaxwa=20 rltu gtj xvcl=20 vg
lubnv wcgib=20 d qeo amtkn=20 jjeof
cq zrqng=20 obrel yyflf h=20 txdm
twbri br=20 ps yvgvn jxzy=20 jcpt
dmzx drj=20 u b aip=20 vc
tel hycmi=20 tu be ivaqk=20 lzjs
d hg=20 uwun cy qtyy=20 w
ttzh vyib=20 o aoxy wkmfq=20 touw
pw wrhh=20 yrsxt pwgt u=20 oc
pyob kdsvl=20 dc c qir=20 gy
q hp=20 xuvde sdtyc cik=20 sgk
bjxv hem=20 en tudc pqkk=20 jrlo
ulp nrkvj=20 f sta k=20 d
qm hdqn=20 glrw nbph cgao=20 reqxm
vs skdwo=20 o s y=20 s
yrj hkre=20 koop intu acb=20 zmrgc
a yxoj=7ê tyjzc eqk ujt=20 tzsxh
wow kaa=20 w aul xsdgc=20 eyo
qwwyd vvbcf=20 xzmb g ujk=20 w
pb k=20 wop tp wphj=20 oeaug
iht po=20 vwwnf t leb=20 ruz
mtib we=20 e uj hjuof=20 qzxf
sfx vv=20 uoemk cvz pk=20 wsmqz
kg a=20 kw fvvjs m=20 cc
x sx=20 qkw t q=20 yyoea
ouw kyr=20 arh le gxfkp=20 zq
yady us=20 wr lji oqqg=20 hffc
v vss=20 xawz js py=20 holf
hqki vb=20 fn boqxi sz=20 oonu
kofek rhz=20 y ugdzs ejq=20 w
sll c=20 xg w vcbh=20 oh
qkwxg tk=20 h f mjuf=20 ojvv
adjwz v=20 phlpl fgz dtrme=20 hmu
skez aabmy=20 kg f neqxu=20 vszxt
rkz lhp=20 u xtxq cvil=20 ut
y ny=20 f zb ermy=20 a
td fvpgc=20 pon vgytm v=20 chgpt
klcn pe=20 rchlm mhm n=20 u
rybrg khqgy=20 v mqk pccqz=20 dzu
kdqcb x=20 zajde fy og=20 sojlk
i moppo=20 bnyl ligb jhx=20 drzyf
q mn=20 ocjqd lyw lsbjf=20 e
yivez egg=20 bqvdi hh xrm=20 iwj
be qetij=20 zvlid raiaf t=20 xmq
j le=20 jituh jdej jdq=20 jwh
jdq vyy=20 ewyrb k pcxmr=20 cg
r ntgsp=20 y rb lvd=20 bn
icc br=20 hb dqz vxhh=20 aozm
d mg=20 pkaqt zl vh=20 wqhl
l yp=20 nv fpwuq s=20 ee
oafdt v=20 elhpj rhw khcp=20 kros
ds rjtm=20 odyq sjd dh=20 e
ncccx wrbzs=20 ouwsm tcqt uyagp=20 ohax
wo t=20 uqw wouoa x=20 krdel
l g=20 fvrrj plded mrr=20 foo
d cuhc=20 mrzl zdl t=20 hum
cop nsqy=20 x fvqft lhbqx=20 huu
yia p)bc=20 r mjfoe wr=20 na
bkmns y=20 g yt ep=20 a
mif in=20 izihb sxgnv k=20 vnmbq
krjt j=20 fg hrro qfvxa=20 ntel
vmha s=20 qetpw uafor plafr=20 ta
sq adx=20 wrt ont m=20 f
yew o=20 q ltr qj=20 g
uk d=20 bux rhyzt p=20 x
pafpm n=20 ovssb f aoidk=20 qlzhq
qhd kuv=20 lmiw r e=20 qiz
ep gzy=20 kq mldqo gb=20 jcfog
sykt cd=20 l uxdeb tahy=20 h
a tqdog=20 it zfrko wy=20 uyvza
t h=20 ke xzwj dncmb=20 wjrz
hzk ijf=20 fcwuy p yqc=20 e
effr rf=20 m r a=20 iw
ouedg e=20 vkzqm xt b=20 w
rkqvi ip=20 ic wx qow=20 yd
dci rl=20 q mxws chlxz=20 hzgah
hxqxk pf=20 jprrv cviks nt=20 xrtt
yrnl bqzd=20 vh dk jdf=20 b
k cav=20 t ffypr umab=20 anp
zq pdnuv=20 zyggc fiii zwitm=20 gapn
azup kubz=20 khkvu hpmsv toj=20 q
piqu bqok=20 bo sp knup=20 i
by ec=20 tcziw hyc po=20 jsksf
git uj=20 y fanj oaqec=20 zeqpl
a wew=20 gqub lkx a=20 ya
jj oi=20 jl hj izfyd=20 z
w soaka=20 iivfs bopmo y=20 eu
kikjb vk=20 irh yjjhd rxie=20 vzidn
hicp wgdc=20 etv tigzc dhjmr=20 q
o j=20 q yab jbpdt=20 e
j a=20 uqul iqn rgim=20 z
oa jspjn=20 xz a wjc=20 fv
vyaoz tjlgv=20 py zq vuem=20 z
xwkdt w=20 xh qat ygi=20 e
th is=20 jbdkq f kebbe=20 q
eial n=20 u bfgff xsf=20 nbgrg
yvm jy=20 fpq inv znkz=20 qgvpm
------=_NextPart_001_26AE_01CF7CEA.3940C010-- ------=_NextPart_000_26AD_01CF7CEA.3940C010 Content-Type: image/jpeg; name="kcwn.jpg" Content-Transfer-Encoding: base64 Content-ID: <1CF5D76B5DDA4BADAE137FD0E1170B89@usiq> /9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg SlBFRyB2ODApLCBxdWFsaXR5ID0gNjUK/9sAQwALCAgKCAcLCgkKDQwLDREcEhEPDxEiGRoUHCkk KyooJCcnLTJANy0wPTAnJzhMOT1DRUhJSCs2T1VORlRAR0hF/9sAQwEMDQ0RDxEhEhIhRS4nLkVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF/8AAEQgCDgHQ AwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMF BQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkq NDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/E AB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMR BAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVG R0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A 8ioopR156UABBFJSkk9TmlFACYqUxOkSyEjaTwM80zA70oGe9ItITFKpwDwDkY57UuOBQFycUDsN Ap2ynqi43FsHPHvTyihckgHsKVylEjjQ7sqB9T0FSYUJuy5lzxxgCp0Q/Z+yruxuzyaTdEgyAWPb ceB7n/ClcvksiqrMG3BiHHRgeamgikdwIV+Y98dB6k9qQRhmxjtzVxTLsEZbHoo/z1pkJW1CWzFv I8O9JdmBuX7pPXg01IMZZkAI6A8/jVyJVVskEvjAB7e/1qSRgseGC7FAJJ7kUybIoTkLGkcZwRlm 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 4leZtZije1a1t7eILAjNu3JnlsjuT]*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 [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~ì7T3S/NArl3jUcq5OcK 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)y56frT9o g5Ga+45+UBT/AJ7Vo2dyqREHccsST6muW+3yMAGGfqxpy6pKoUKigDpyaiU1IqMbHXSXHzKFfKMw DKxJ/EUXF7ExKK+7jDBlPY9q5L+1JSeg46c07+0pz97BYkDOazuVY2bh0mQ5kDjnLDv+Nc7OMXEm Ox4AGKkfUJHHCqoPUDvUDNvOT60hgF5x+FKBg/KR1FLtIU/Nk0in8BQAo5HseDTCCQPXvS7iAOn4 /wCfagk8Z79hQA3naeOe/wDn8aaQQSPQ4qTd85Oc5FAHB6Y60AN/j/GrNg4S4Lf7Pp9KgJyRkZxj iiORoyWHJxigDqrd4W5kQHceSewqyJI1idYTtyOnJB9q5T+0ZQMKAOetSDVplH3V57U7isK2mXQb IjBXsQw6Z9KQ2N0OTCfXqOKDq8+QFwB9TUh1SVw3CjIwTkmkMjFjd7SfIOB1yRUo0m9OMxKuem5w M0h1mcYwACOuDSHV5xngZ4ySeTTAl/sa+AyUiAHOPNBpq6PfOflWI57iUVH/AGzPnPHHoTTV1OYP kqu5ufT+VAakw0i9K5KRgZxkyAimjSb1kyqpj2fmnHVpmIJUY+p4pv2+QqBxnqeSOfpQAHSbsdUQ egLf/WqRNIuVmj8wxhd4yQ3QVGdQlVuACADjJP8AkUxtRlHpkdgcUCOqub2J2KqwbjDBlPX2rNuH SZD84Yc5Yd/xrF/tWZvvYJ9aY99Iw5UL6gCi4WGzBRI4Krgng5xUeUCgHB79e9Rs5JJPBJzSUhig AgkflQ3X0zSZwQRS54Hf6mgB4X5CNv0qM8pn1JqQM4HP4dKYThdp7UAAGM8/rWjpcnlM/HUj+VZ4 Py9amjZoc4YHvigDqITblMSIM9cng5P0puo4m09ooTk5+6efxrnxfy5GABjPT607+1pguNqkfU9K dxWEOnXSkkxc+x6UGxugT+5bP1HenHV7gEEkY9MmhtWlyMKo7nBNIYn2C74PkNzxjIqUaPfEkGNQ 3XDOM/5+tJ/bFwScbR9DTf7Yn6BVGR0GaNAJTo98g3MsIH/XQH+VNGi3xUnbDgDk+YKjOsXHzZA9 6bHq0qciNSe/bP1xTAlbSL0LlljXIzjzOaP7HvMAhEIPTD1G2sTsOQoz+NIdVlOOBjGPvHigRINI u8gbUB44LVc0vT5rbUoZZigRMtkHNUl1OUk8LyMcmm/2nKpzkbvqcflQM6ee9jkJKSDaDkMwwQaz LopIucjAxjjrWUdTlzyF6ZIPf/GopL134IAHp70XEiNYmkbYo3HsBVuAYiHJAHLHOOc9z9On40qR pHHtGCGGWJ/iA7n2HYd6mIwAx7EHc4yc/wC0O7Y6UDK4jV5mLA7woyOBlie9PNvHyAuV9n/+tUmA EYZKsp6nllJ7H1b0NMcYBGwkjChTyc9h9T1NICB7dEXc9ûx1Jf8ArimtbxqodgFU9CZOP5VYxsB3 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 €$fz/tnvQZuc4b8WJ4pgbEerWk9pp0eqWc0x04bIzFIFEqbtwVwQfcZHatC58RWUw06e4S6luRdP qF0IcIpmZhhfmHQKgAI9fWuV+0bcgqc9fvUfaefuk/8AAqQHT65qul6gwt1W6kit7i5khnQqokEr BuVYZGCMUsXi+awtJLXSoXtYEjiW2UuGwytud3GPmLdD7cdBXMC5IYfKR64ajz/9hh/wM0AdJd6p ok2jzQW9tdwPfXHnXEEbD90EGEQFl5XLMRjp0NXNY8XJ9u8/RFUGS5W9lkuIUkPmbVAVQ6/Ltww3 Dk54rjvNHOFY+n7w0eaB0DZ/66GgDpbDWbCHxJcanJHLDBGJJrWBfmIkJwozjjG4nJ44FT2Wt6dY 6dYvbLc/a9Pu5Joo5sHfvUfMSBjClRx3z6CuTEwAI2N6/fNPFwobhH46fvDQB0ula5Dp9rYxzWzy NYTyzxkSYDMwUKCPQbckd6r6prcusWNpHcs5uYEdWmZvvEuWBAA4A6YrCNyO6Sdf+ehoNwBwFfHb 94aAOnuvEFre36ahcWk4vBJHK4jlAjZ1YEkAjIzjpTpPEcN1Lqqz2sgtr5o9iJJzGquXIyRyTk88 Vyn2hQD8r/8Af00vngEgq4P/AF0PNAHV23itl1K9u5rYyPd3cF1hX2hfLYkr075ApbfxPa2Qmjtr S4aKeSaWTzZASGeNkAUAAY+Yk9zgVyfnjcRh+OP9aac8yKMbX+hkNAHQadr8NlpqWUlszov2kMyu FOJUC8AjtjNTHxHZS6TFpM1jO9hE8XWUeY6qWLBjjjO4AY6DNc2JlVl+Rjkf3zTllAOfLI9t5oA1 dX159Yt0kuLdft0TMFli+VWiPKoQB/CeAfSte31rRLPW9I8trt7awjEAnAAXDA73K7d3V2OPbiuP 80Y5V+/SQ1GJx/dYD/roaANqbVFGg2+h2/2g2iXLTSsxGXzgAKMfKOCee5rQ/wCEuKTQvHYog0+Z W05Mj9zHjDxtx8wYAHPXPIrlhcAjo/P/AE0NKtxj+Bs/73/1qAOk0vXrXRJhLp1lcBZbiKSbzpVJ 8uNtwjTAHU9Sc9BVaDxBLFb3dvcZnjltZLaBQR+53uGJJxz0HvwKxWueclGJx13Un2kcgIQPZ6AJ oT+7f5Bg4zk8fUmlMgcZBLgksTxnPr1G0+3TFVhc/wCy/PbzDS/aiezZ9S5pgS42uhUuAnQYHPrn nvUibVyoRth4IcjGOwzngfSqousfwuR/vmn/AGg45VuvHznrQBZMgaPeDuHDF2GAD2JHbHYDrTDI HVSpZl5IIIzn1zng+3SovPJGQHOeOHNN+0ZI+V845zIaAJlGJFb59qrt2lRjH509BtXaFOBj/WEY yOmTnt6Cq/ngDo44/wCeho+1lcjDjP8At/8A1qALRkXZ5gJ2g58xgOvroë7Y6Uj4dcYYoAQCpBP1 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_1lAkW3dgAQ3lhiZST0 Ds0YyeCFbPFcZRQB2timkSatdGdtNSI+WsysYSDlTvZTwoGcZEWTnocVnrcWUd3DKF04wwWG1AY4 23T+WCdwIyx3Hq2Rniua70CgDoNUj08aVLNA1oZJntTEsTLvUCJxLlRyvz4yDjPBrA780maXrzQA nSgiilxmgBAMjniilFI3DYoAXt1o6HNBIHUZx60bgRwKACkpM5HFKOtABRSqd2Md6KAEAzS4pR2p Q2CCOx6GgBv40ufakKkLkntmgg7sHvQBJBPJbXEc8DmOWJw6OvVWByCK308TqILdXtUheL7VkWqC NT5saqOB6Fcn2xXOUoBJ7UAdJaeKIrSO1ZIZmmTyVkUsAiiMMMp3yd3tg+tSweJNMWCS0ubWe5tg IVXzkVmcJ5mc8/KT5mAQSQBXKN8vWijcNjbGswSavcXLpMkNxbiAlMGRPkVcjP8Au+o4NXY/FcS3 QlaGbaLwXGA45UR7B/wI9TXLg0tAHVaX4ug09LYvbzSSwNanduH/ACzaQt+ayYH41Sh1qyxaNOL3 dCgiaKKQLGQM4bg5J5HHHfnmsE0YoA6efxTbNPI0UMwRvs2FGEH7okngEgZ4xTbzXtLuLy4eG1nt 0uo2SWWFFR8mQOpCg47YJyM5rmOoBFL0OKAOhvfEUVxpdxYpDKwkjRRPMwaUkSbvmb0xwBjrzSxe IYYrO3QRTeavko4yAgWNs7lwc5Pfp1Nc8OtKDyKFoG5vWGqWv27W57ueeCO8icKY+ZCTIrY9Og5z irL+JrOa31EvbTCe783GcMBubIOSfl9wBz1rmW4XP0pOKFoB0lxr9lcT3rFtRRL1zKxV1zC28Ntj GenYn2HHFS3HibTJrcj7HN9oa1+zeaVUMo2FSS2fnzx1A6Vy2famE8/SjyA67/hM0S8luVtXkZri 4mjWUggBxGFB9x5Z/MY6VDP4ltP7OmsrWG62ywyRNLO4Z2BkLoCfbc2fU49K5n0ooA3oPECQWsUQ ikby7VYdpb5WYTeZnHpgY9a0pPEtjfS3xlkuLaKS1ZE8qJEcs0yuQMcHgHqfXGK5AnAJ7UCgDp5/ Fkdza3Cm3MUss0jjCK3yvIH5Y8g9uPQdKs3fibT9Shu/Na6tQGmEMcYDMVldWPcDI2nPPO72rj+9 DcDNAHY6r4rs3+1R2SyuLmObdKeMCTDBcezZz64HpVez8WRW95dTPDIfMFuyEqsjK0SFf4uADknP PToa5YDnFAYYwABxkUAbeia8mlQxRyJK2y8W4byyBlQjKR9fmpl7rMNxootUjl811hVwxGxPLBAK 98nPPTv1zWNn5sUn1oeoHb/bbONLJIdXsyLdLjc8ksm9mkjC4JEfIGAc/wCFP0/ULCzFm0mqWbtF 5SSIssgXbGxOV/d/eOf5+tcMD+lKRQHkde91bSappl2dU00Cyh8koJJfu5bG393xgMMe4oI04WAt Rr0ZELtJG/2iQNIWQKVb93wBt4HPBI71yA4zS5xxQB6JLrGjf2pJeQ3mno01yLiRkZ0LYkDqCAhB I5+bgnPtVOy1Kzt7EW02qWLb4EgkkSaQMAGkJKny+Dhxj6EVw5y3I47UhBHfocUdLAdVrF7aT6JB brfWchQRh0tlO4lEKqQWQZ65PIxz14xywHGeKbS57UeYB7UHNBGMGkByKAHElic0lJ3pe/NACUhp T0oxigBM0ZoP8qD8tAC0UhPIpaAFIpAadwR9KaDmgD//2Q== ------=_NextPart_000_26AD_01CF7CEA.3940C010-- From slava@dubeyko.com Sat May 31 09:31:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D63C57F7E for ; Sat, 31 May 2014 09:31:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 74446AC003 for ; Sat, 31 May 2014 07:31:22 -0700 (PDT) X-ASG-Debug-ID: 1401546677-04bdf059a0379700001-NocioJ Received: from gproxy4-pub.mail.unifiedlayer.com (gproxy4-pub.mail.unifiedlayer.com [69.89.23.142]) by cuda.sgi.com with SMTP id tilt8fd7DcwSMsEx for ; Sat, 31 May 2014 07:31:17 -0700 (PDT) X-Barracuda-Envelope-From: slava@dubeyko.com X-Barracuda-Apparent-Source-IP: 69.89.23.142 Received: (qmail 26375 invoked by uid 0); 31 May 2014 14:31:14 -0000 Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy4.mail.unifiedlayer.com with SMTP; 31 May 2014 14:31:14 -0000 Received: from host202.hostmonster.com ([74.220.215.202]) by cmgw4 with id 8eWs1o00v4NbHr601eWv7E; Sat, 31 May 2014 08:31:14 -0600 X-Authority-Analysis: v=2.1 cv=CpMsLBID c=1 sm=1 tr=0 a=yEjhGPV9XlbPNRGz7jjbow==:117 a=yEjhGPV9XlbPNRGz7jjbow==:17 a=DsvgjBjRAAAA:8 a=f5113yIGAAAA:8 a=RxiE-YePRCkA:10 a=neHJxMmKCwgA:10 a=IkcTkHD0fZMA:10 a=wCmvBT1CAAAA:8 a=djd9j7hWnewA:10 a=3mQisGbx5lUA:10 a=BJkoZQO876Vp20Tpy8oA:9 a=QEXdDO2ut3YA:10 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dubeyko.com; s=default; h=Mime-Version:Content-Transfer-Encoding:Content-Type:References:In-Reply-To:Date:Cc:To:From:Subject:Message-ID; bh=U4Xyxqa6Up+Iv/bczJF34aayahIWapvXEPI5KlMkuvI=; b=dSwImVZubbYG7jXRwTVYaLYLuB/YNEMT8Gjz3Naj7wIDsfQmLT7G68QxJJ7FrfT/zyI4UvZRg47ZghfHIAdKt57b49O0yK8szoJxqNm8t/hTEI42tAHG0GudfbAptrHL; Received: from [46.39.244.124] (port=58798 helo=[192.168.24.102]) by host202.hostmonster.com with esmtpsa (SSLv3:DHE-RSA-AES128-SHA:128) (Exim 4.82) (envelope-from ) id 1WqkJA-0008Q3-6Y; Sat, 31 May 2014 08:30:52 -0600 Message-ID: <1401546649.2413.6.camel@slavad-CELSIUS-H720> Subject: Re: [RFC 00/32] making inode time stamps y2038 ready From: Vyacheslav Dubeyko X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready To: Arnd Bergmann Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, hpa@zytor.com, linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, cluster-devel@redhat.com, coda@cs.cmu.edu, codalist@coda.cs.cmu.edu, fuse-devel@lists.sourceforge.net, linux-afs@lists.infradead.org, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-mtd@lists.infradead.org, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, linux-scsi@vger.kernel.org, logfs@logfs.org, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, samba-technical@lists.samba.org, xfs@oss.sgi.com Date: Sat, 31 May 2014 18:30:49 +0400 In-Reply-To: <1401480116-1973111-1-git-send-email-arnd@arndb.de> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-Identified-User: {2172:host202.hostmonster.com:dubeykoc:dubeyko.com} {sentby:smtp auth 46.39.244.124 authed with slava@dubeyko.com} X-Barracuda-Connect: gproxy4-pub.mail.unifiedlayer.com[69.89.23.142] X-Barracuda-Start-Time: 1401546677 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.6264 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 Arnd, On Fri, 2014-05-30 at 22:01 +0200, Arnd Bergmann wrote: [snip] > > Arnd Bergmann (32): > fs: introduce new 'struct inode_time' > uapi: add struct __kernel_timespec{32,64} > fs: introduce sys_utimens64at > fs: introduce sys_newfstat64/sys_newfstatat64 > arch: hook up new stat and utimes syscalls > isofs: fix timestamps beyond 2027 > fs/nfs: convert to struct inode_time > fs/ceph: convert to 'struct inode_time' > fs/pstore: convert to struct inode_time > fs/coda: convert to struct inode_time > xfs: convert to struct inode_time > btrfs: convert to struct inode_time > ext3: convert to struct inode_time > ext4: convert to struct inode_time > cifs: convert to struct inode_time > ntfs: convert to struct inode_time > ubifs: convert to struct inode_time > ocfs2: convert to struct inode_time > fs/fat: convert to struct inode_time > afs: convert to struct inode_time > udf: convert to struct inode_time > fs: convert simple fs to inode_time > logfs: convert to struct inode_time > hfs, hfsplus: convert to struct inode_time > gfs2: convert to struct inode_time > reiserfs: convert to struct inode_time > jffs2: convert to struct inode_time > adfs: convert to struct inode_time > f2fs: convert to struct inode_time > fuse: convert to struct inode_time > scsi: fnic: use current_kernel_time() for timestamp > fs: use new inode_time definition unconditionally > By the way, what about NILFS2? Is NILFS2 ready for suggested approach without any changes? Thanks, Vyacheslav Dubeyko. From richardcochran@gmail.com Sat May 31 09:51:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 D6C397F7E for ; Sat, 31 May 2014 09:51:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5B5B304051 for ; Sat, 31 May 2014 07:51:52 -0700 (PDT) X-ASG-Debug-ID: 1401547909-04bdf059a037ad80001-NocioJ Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by cuda.sgi.com with ESMTP id Phg0JiHsQbOMaiZk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 07:51:50 -0700 (PDT) X-Barracuda-Envelope-From: richardcochran@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] Received: by mail-wi0-f174.google.com with SMTP id r20so2521646wiv.1 for ; Sat, 31 May 2014 07:51:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=m/qDo/jw5RnGAKXBa93qC3zg8NxD5t1PV6+cH65dS2k=; b=0OcZgSFKhg/qmpgOdGBSX3on7TtSxchva/lErbcWlj5KtOeaeXYT74/38VE9k/yvIb zO+z8vy76v1GVshivwLEoOO95nKgQRddfRvlF0FMWfs5LZ0vaXj1F03YpqKiPNjhf0qm LSaNOFOXmiZkfzjcg3Vhs4Gv66bmpwChFeYVrMP1gQZygdJTFgD7sJ+uYmiBLqc4Qs1+ /1Dyzs7+QmhGfzURu0XJzAiJr1MMhrzoYDlVKcTO0MkCUu2RklAl1mxvS96zb8iepi/u IvE5b4DzgtX1mAC/OVguR8VmTPukv5lqM5KlumKMXJMlrm9vOvcB3xGY5X3GuyVgBsum kXhg== X-Received: by 10.194.23.135 with SMTP id m7mr9297437wjf.2.1401547909369; Sat, 31 May 2014 07:51:49 -0700 (PDT) Received: from localhost.localdomain (089144207073.atnat0016.highway.bob.at. [89.144.207.73]) by mx.google.com with ESMTPSA id d6sm15381562wiz.4.2014.05.31.07.51.37 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 31 May 2014 07:51:48 -0700 (PDT) Date: Sat, 31 May 2014 16:51:15 +0200 From: Richard Cochran To: Arnd Bergmann Cc: linux-kernel@vger.kernel.org, hch@infradead.org, linux-mtd@lists.infradead.org, hpa@zytor.com, logfs@logfs.org, linux-afs@lists.infradead.org, joseph@codesourcery.com, linux-arch@vger.kernel.org, linux-cifs@vger.kernel.org, linux-scsi@vger.kernel.org, ceph-devel@vger.kernel.org, codalist@coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, geert@linux-m68k.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, john.stultz@linaro.org, tglx@linutronix.de, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, lftan@altera.com, linux-btrfs@vger.kernel.org Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <20140531145114.GA3721@localhost.localdomain> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1401480116-1973111-1-git-send-email-arnd@arndb.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-wi0-f174.google.com[209.85.212.174] X-Barracuda-Start-Time: 1401547910 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.6265 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 Fri, May 30, 2014 at 10:01:24PM +0200, Arnd Bergmann wrote: > > I picked this because it is a fairly isolated problem, as the > inode time stamps are rarely assigned to any other time values. > As a byproduct of this work, I documented for each of the file > systems we support how long the on-disk format can work[1]. Why are some of the time stamp expiration dates marked as "never"? Thanks, Richard From arnd@arndb.de Sat May 31 10:39:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 246517F7E for ; Sat, 31 May 2014 10:39:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13E5C30404E for ; Sat, 31 May 2014 08:39:54 -0700 (PDT) X-ASG-Debug-ID: 1401550788-04cbb050fa14e830001-NocioJ Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.17.24]) by cuda.sgi.com with ESMTP id cnjD97khhkEGePWV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 31 May 2014 08:39:49 -0700 (PDT) X-Barracuda-Envelope-From: arnd@arndb.de X-Barracuda-Apparent-Source-IP: 212.227.17.24 Received: from wuerfel.localnet (HSI-KBW-134-3-133-35.hsi14.kabel-badenwuerttemberg.de [134.3.133.35]) by mrelayeu.kundenserver.de (node=mreue102) with ESMTP (Nemesis) id 0LheU5-1WUIdt3QI5-00mrl4; Sat, 31 May 2014 17:37:53 +0200 From: Arnd Bergmann To: Dave Chinner Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Date: Sat, 31 May 2014 17:37:52 +0200 X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <5507340.nVBP5LFtqn@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.11.0-18-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20140531011450.GJ14410@dastard> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Provags-ID: V02:K0:I0EaPCPKe5JS1JtAjHeyhRoq19yhlI5OCVJGOrSk81w rzPaBLIBxT2J3AX5SmzFYM1MxGs5GwJdKFNK//xH/7issJIqcF MHb74haE6LfqeZy3uLcbPscr05zijTx4Ac5TxtZgYR0Ur7I0yc 3/fEPruZnMDyoVopR/ey83XeCiWwflqCJ6O7exgwBcoPuy/KII 1UfVFpQvVAa1oACZxthac47ARb8jxojzXgtE4cgUUfTxc9sgit zzNMGFUpDh1aqNoWOSImTIy1GWpwiQsWjTxutwqR9Wmd5AHnl1 bcpOAWbbHdq8zSG4YYkLS07JmOY25fXwPnAHu+Jgq8divR5pxN TN9PZ0hJXi5G8GUa6tNQ= X-Barracuda-Connect: mout.kundenserver.de[212.227.17.24] X-Barracuda-Start-Time: 1401550789 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.6265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Saturday 31 May 2014 11:14:50 Dave Chinner wrote: > On Fri, May 30, 2014 at 05:41:14PM -0700, H. Peter Anvin wrote: > > On 05/30/2014 05:37 PM, Dave Chinner wrote: > > > > > > IOWs, the filesystem has to be able to reject any attempt to set a > > > timestamp that is can't represent on disk otherwise Bad Stuff will > > > happen, > > > > Actually it is questionable if it is worse to reject a timestamp or just > > let it wrap. Rejecting a valid timestamp is a bit like "You don't > > exist, go away." > > I think having the new systems calls being able to > return EINVAL if the value cannot be stored permanently on disk > correctly is the right thing to do. Having it silently mangled > by the filesystem and returning "everything is just fine, trust me" > is close to the worst solution I can think of. That's exactly what > leads to overflow bugs occurring.... While going through the file systems, I was wondering whether we should have the times stop at the end of each file systems epoch rather than wrap around. > > > and filesystems have to be able to specify in their on > > > disk format what timestamp encoding is being used. The solution will > > > be different for every filesystem that needs to support time beyond > > > 2038. > > > > Actually the cutoff can be really different for each filesystem, not > > necessarily 2038. However, I maintain the above still holds. > > Sure, but all filesystems are supposed to handle at least the > current unix epoch. In my list at http://kernelnewbies.org/y2038, I found that almost all file systems at least times until 2106, because they treat the on-disk value as unsigned on 64-bit systems, or they use a completely different representation. My guess is that somebody earlier spent a lot of work on making that happen. The exceptions are: * exofs uses signed values, which can probably be changed to be consistent with the others. * isofs has a bug that limits it until 2027 on architectures with a signed 'char' type (otherwise it's 2155). * udf can represent times for many thousands of years through a 16-bit year representation, but the code to convert to epoch uses a const array that ends at 2038. * afs uses signed seconds and can probably be fixed * coda relies on user space time representation getting passed through an ioctl. * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, where they really use signed. I was confused about XFS since I didn't noticed that there are separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected XFS to also use the 1970-2106 time range on 64-bit systems today. If we are using the variant of my patch that extends indode_time->tv_sec to s64, nothing should change for XFS at all, the main difference is that we if it gets extended to wider on-disk timestamps, they will work the same way on 32-bit and 64-bit kernels. Arnd From nicolas.pitre@linaro.org Sat May 31 10:46:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 ED5087F7E for ; Sat, 31 May 2014 10:46:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD24130404E for ; Sat, 31 May 2014 08:46:20 -0700 (PDT) X-ASG-Debug-ID: 1401551178-04cbb050fb14f3c0001-NocioJ Received: from mail-qa0-f42.google.com (mail-qa0-f42.google.com [209.85.216.42]) by cuda.sgi.com with ESMTP id 8NuYyQ6q2bnHIFrD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 08:46:19 -0700 (PDT) X-Barracuda-Envelope-From: nicolas.pitre@linaro.org X-Barracuda-Apparent-Source-IP: 209.85.216.42 Received: by mail-qa0-f42.google.com with SMTP id j5so492075qaq.29 for ; Sat, 31 May 2014 08:46: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:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=s0cwYT/gMskI88oNrFYLA+ld5K+uxEqG6b7Jeea8T/s=; b=PI8PqlhZpjr76ytQB61d4dLclcfSgOIdBmt3/IEUIjYBGdiqEZZWcw3hOMTrmFmpUC LHVLG+zMZ9WBlcd+nBg1PH0ozPXl/QxRdJxqcYOtw+Is6hqm/URj4y9CSyei6CWd76+w hzyIwOpoui/hGcD1Gg6TUFO9XkqYqB1VLUffTjpHtDjJCsmfV1vudy8rqec+XPcl1W2O 9JrI8Z0vbF+MSVRlg+b1Tvt1Hr7L8Pu1Fu5QK36K/nmGOwoVg3REkUngHdSOEF7UeGON ypbDH8iOwpgfYAgMKvQGLFlvSVlnJDdim3skvht2FZXVvzqqz3iyo3Zrupl9QtUDC87x 04Rw== X-Gm-Message-State: ALoCoQk7XbX9Pe6ZnzMJss5YUwLdsVsipQXYYiOXcTJx7Xs572g85DdrT0ZdXaCdSGj8X/rgJflM X-Received: by 10.140.104.44 with SMTP id z41mr30138080qge.76.1401551178631; Sat, 31 May 2014 08:46:18 -0700 (PDT) Received: from xanadu.home (modemcable177.143-130-66.mc.videotron.ca. [66.130.143.177]) by mx.google.com with ESMTPSA id v19sm11816594qaw.21.2014.05.31.08.46.17 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 31 May 2014 08:46:17 -0700 (PDT) Date: Sat, 31 May 2014 11:46:16 -0400 (EDT) From: Nicolas Pitre To: "H. Peter Anvin" cc: Dave Chinner , Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time In-Reply-To: <538995D4.9050702@zytor.com> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <20140531055457.GK14410@dastard> <538995D4.9050702@zytor.com> User-Agent: Alpine 2.11 (LFD 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-qa0-f42.google.com[209.85.216.42] X-Barracuda-Start-Time: 1401551179 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_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.6265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, 31 May 2014, H. Peter Anvin wrote: > On 05/30/2014 10:54 PM, Dave Chinner wrote: > > > > If we are changing the in-kernel timestamp to have a greater dynamic > > range that anything we current support on disk, then we need support > > for all filesystems for similar translation and constraint. The > > filesystems need to be able to tell the kernel what they timestamp > > range they support, and then the kernel needs to follow those > > guidelines. And if the filesystem is mounted on a kernel that > > doesn't support the current filesystem's timestamp format, then at > > minimum that filesystem cannot do anything that writes a > > timestamp.... > > > > Put simply: the filesystem defines the timestamp range that can be > > used safely, not the userspace API. If the filesystem can't support > > the date it is handed then that is an out-of-range error. Since > > when have we accepted that it's OK to handle out-of-range data with > > silent overflows or corruption of the data that we are attempting to > > store? We're defining a new API to support a wider date range - > > there is nothing that prevents us from saying ERANGE can be returned > > to a timestamp that the file cannot store correctly.... > > > > I'm still puzzled. > > Are you saying that you want a program that does: > > /* Deliberately simplified */ > gettimeofdayns(&now ...); > utimensat(... now); > > ... to suddenly start failing on Jan 19, 2038 (for a filesystem with > 32-bit timestamps), or would you propose some ways for the filesystems > in question to extend the range of the timestamps? > > What you seem to propose also seems to imply that on Jan 19, 2038 > anything that writes a timestamp with the current date (which logically > ends up being almost every write operation) would be dead and frozen on > such a filesystem -- pretty much meaning the filesystem would become > readonly if not in reality than in practice. For those (legacy) filesystems with a signed 32-bit timestamps, any attempt to create a timestamp past Jan 19 03:14:06 2038 UTC should be (silently) clamped to 0x7fffffff and that value (the last representable time) used as an overflow indicator. The filesystem driver should convert that value into a corresponding overflow value for whatever kernel internal time representation being used when read back, and this should be propagated up to user space. It should not be a hard error otherwise, as you rightfully stated, everything non read-only would come to a halt on that day. Inside the kernel, the overflow indicator could be as simple as dedicating one of the top bit in a 64-bit time_t value in order to still transmit the overflow limit. For example, in the above case, we could use 0x40000000-7fffffff to indicate the actual time is unavailable due to the filesystem's time representation being overflowed from 0x7fffffff. If for example a filesystem cannot represent timestamps from Jan 1 00:00:00 2100 UTC then the overflow representation for this particular filesystem would be 0x40000000-f48656ff. Those syscalls with a 32-bit time_t would be returned 0x7fffffff whenever there is an overflow being signaled. Whether 64-bit overflow-marked time_t values, when passed to user space, should clear the overflow bit, or use a unique time_t overflow value, could be decided and even changed later after discussion with glibc people for example. Hard errors should be signaled to user space, and the actual operation aborted, only with the presence of a new flag passed to the kernel. However, by default, things should "just work" albeit with the "wrong" i.e clamped time being saved on disk as much as possible otherwise. Nicolas From geert.uytterhoeven@gmail.com Sat May 31 11:20:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 34BC07F83 for ; Sat, 31 May 2014 11:20:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 099648F8037 for ; Sat, 31 May 2014 09:20:45 -0700 (PDT) X-ASG-Debug-ID: 1401553243-04bdf0599e3819b0001-NocioJ Received: from mail-ig0-f180.google.com (mail-ig0-f180.google.com [209.85.213.180]) by cuda.sgi.com with ESMTP id bXJNFnRH29oauZUU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 09:20:44 -0700 (PDT) X-Barracuda-Envelope-From: geert.uytterhoeven@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.180] Received: by mail-ig0-f180.google.com with SMTP id c1so1932030igq.13 for ; Sat, 31 May 2014 09:20:43 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=z1sjv3U6dQtBg50DqoGmrpLgr9lbwZdNk8VbbxvSvPc=; b=g6L434/F7AUwJYnr/XGaytiRBRY1JFdYP34tQEd1BQqOl0v5DK+KLtKbN6N6OJtXqv btbLq/+iMMjOInN+CEur0NV4E0Db8DL1lKgTEujukUfISooVFcrmZPh5Ms9njiL9u0dI sw8M5E81JbaGmVww6v897wc7Awpf/SytzGjH4xGbSOzJeFYxZtcjyJiKv5rbSAuHzXK4 77nEvGd3k0jQyGuQwoEQmSbjqbHZC5Q/skS1bGYdMrgBxaqfbnxKy5VJ64tUjIUO0utP EKFzf2M+xjIiJ1vLw7UKghPr9igWrmH0TqvN2nkMWRz7DPZJfpT23jVu13qiNlSbfPTN jtUw== MIME-Version: 1.0 X-Received: by 10.43.138.65 with SMTP id ir1mr22320026icc.19.1401553243752; Sat, 31 May 2014 09:20:43 -0700 (PDT) Sender: geert.uytterhoeven@gmail.com Received: by 10.64.17.199 with HTTP; Sat, 31 May 2014 09:20:43 -0700 (PDT) In-Reply-To: <6347520.8jMPlVsFjM@wuerfel> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140531145114.GA3721@localhost.localdomain> <6347520.8jMPlVsFjM@wuerfel> Date: Sat, 31 May 2014 18:20:43 +0200 X-Google-Sender-Auth: ZiM1SZQQL-zuLgRLHhBb4vNpz3g Message-ID: Subject: Re: [RFC 00/32] making inode time stamps y2038 ready From: Geert Uytterhoeven X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready To: Arnd Bergmann Cc: Richard Cochran , "linux-kernel@vger.kernel.org" , Christoph Hellwig , MTD Maling List , "H. Peter Anvin" , logfs@logfs.org, linux-afs@lists.infradead.org, "Joseph S. Myers" , Linux-Arch , linux-cifs@vger.kernel.org, scsi , ceph-devel@vger.kernel.org, codalist@coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, "linux-ext4@vger.kernel.org" , fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, John Stultz , Thomas Gleixner , "open list:NFS, SUNRPC, AND..." , linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, Linux FS Devel , Ley Foon Tan , linux-btrfs Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f180.google.com[209.85.213.180] X-Barracuda-Start-Time: 1401553244 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.6266 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 Sat, May 31, 2014 at 5:23 PM, Arnd Bergmann wrote: > On Saturday 31 May 2014 16:51:15 Richard Cochran wrote: >> On Fri, May 30, 2014 at 10:01:24PM +0200, Arnd Bergmann wrote: >> > I picked this because it is a fairly isolated problem, as the >> > inode time stamps are rarely assigned to any other time values. >> > As a byproduct of this work, I documented for each of the file >> > systems we support how long the on-disk format can work[1]. >> >> Why are some of the time stamp expiration dates marked as "never"? > > It's an approximation: > with 64-bit timestamps, you can represent close to 300 billion > years, which is way past the time that our planet can sustain > life of any form[1]. FWIW, the 48-bit second limit of befs marked never happens sooner than the 32-bit day limit of affs marked as Y11760870. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds From richardcochran@gmail.com Sat May 31 13:23:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 862E07F83 for ; Sat, 31 May 2014 13:23:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 558F08F8037 for ; Sat, 31 May 2014 11:23:17 -0700 (PDT) X-ASG-Debug-ID: 1401560591-04bdf059a0389140001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id hDZkZOHNxmr8jpgx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 11:23:12 -0700 (PDT) X-Barracuda-Envelope-From: richardcochran@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id u56so3448922wes.14 for ; Sat, 31 May 2014 11:23:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=ie7H2OsbBeJra4WsF5ZEIoba6tdvoSXEcZdv4TPiHkU=; b=HAyZvRXxujauZkJwQWKe+XJEla7yW9SZc5LsANGU5RqfjVLd+LdtroWQl/Atytvdc7 jyQjJ4gEF80JBR8bn5vGzX8uC4bVsiZZWNJaa4JC69OmrNYTvcEimqHppAjW7P43mGMj Khac1zDlADHj2QvEIv76yJ2nemDK7hk3UhVs0U+d4g9OrOHgDJI/tqgtxDa3/CMNrVxs Au1Hu0bitYh8q7/pqtIOjXzRi/ONmDQOp6nuSAP8RjJ+SMPPrgMy+K41fGMe5uqoiFTI XUiESwMgZ4wvVPj0irta8Ybc8gnCSl8I0K7+acQhYbd8JowNp3hFWieioIy17y8ioAP2 E5JA== X-Received: by 10.194.222.197 with SMTP id qo5mr34633442wjc.78.1401560590876; Sat, 31 May 2014 11:23:10 -0700 (PDT) Received: from localhost.localdomain (089144207073.atnat0016.highway.bob.at. [89.144.207.73]) by mx.google.com with ESMTPSA id fi2sm16698630wib.2.2014.05.31.11.23.00 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 31 May 2014 11:23:10 -0700 (PDT) Date: Sat, 31 May 2014 20:22:37 +0200 From: Richard Cochran To: Arnd Bergmann Cc: linux-kernel@vger.kernel.org, hch@infradead.org, linux-mtd@lists.infradead.org, hpa@zytor.com, logfs@logfs.org, linux-afs@lists.infradead.org, joseph@codesourcery.com, linux-arch@vger.kernel.org, linux-cifs@vger.kernel.org, linux-scsi@vger.kernel.org, ceph-devel@vger.kernel.org, codalist@coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, geert@linux-m68k.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, john.stultz@linaro.org, tglx@linutronix.de, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, lftan@altera.com, linux-btrfs@vger.kernel.org Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <20140531182237.GA5382@localhost.localdomain> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140531145114.GA3721@localhost.localdomain> <6347520.8jMPlVsFjM@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6347520.8jMPlVsFjM@wuerfel> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1401560591 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.6268 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 Sat, May 31, 2014 at 05:23:02PM +0200, Arnd Bergmann wrote: > > It's an approximation: (Approximately never ;) > with 64-bit timestamps, you can represent close to 300 billion > years, which is way past the time that our planet can sustain > life of any form[1]. Did you mean mean 64 bits worth of seconds? 2^64 / (3600*24*365) = 584,942,417,355 That is more than 300 billion years, and still, it is not quite the same as "never". In any case, that term is not too helpful in the comparison table, IMHO. One could think that some sort of clever running count relative to the last mount time was implied. Thanks, Richard [1] You are forgetting the immortal robotic overlords. From hpa@zytor.com Sat May 31 14:36:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 12D987F83 for ; Sat, 31 May 2014 14:36:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3D2C304039 for ; Sat, 31 May 2014 12:36:45 -0700 (PDT) X-ASG-Debug-ID: 1401565003-04bdf0599e38de80001-NocioJ Received: from mail.zytor.com (terminus.zytor.com [198.137.202.10]) by cuda.sgi.com with ESMTP id bFuhi7FaQTrqgYjA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 31 May 2014 12:36:44 -0700 (PDT) X-Barracuda-Envelope-From: hpa@zytor.com X-Barracuda-Apparent-Source-IP: 198.137.202.10 Received: from [22.4.236.43] ([172.56.16.170]) (authenticated bits=0) by mail.zytor.com (8.14.7/8.14.5) with ESMTP id s4VJYKkj020521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 31 May 2014 12:34:25 -0700 User-Agent: K-9 Mail for Android In-Reply-To: <20140531182237.GA5382@localhost.localdomain> References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140531145114.GA3721@localhost.localdomain> <6347520.8jMPlVsFjM@wuerfel> <20140531182237.GA5382@localhost.localdomain> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: [RFC 00/32] making inode time stamps y2038 ready From: "H. Peter Anvin" X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready Date: Sat, 31 May 2014 12:34:12 -0700 To: Richard Cochran , Arnd Bergmann CC: linux-kernel@vger.kernel.org, hch@infradead.org, linux-mtd@lists.infradead.org, logfs@logfs.org, linux-afs@lists.infradead.org, joseph@codesourcery.com, linux-arch@vger.kernel.org, linux-cifs@vger.kernel.org, linux-scsi@vger.kernel.org, ceph-devel@vger.kernel.org, codalist@TELEMANN.coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, geert@linux-m68k.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, john.stultz@linaro.org, tglx@linutronix.de, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, lftan@altera.com, linux-btrfs@vger.kernel.org Message-ID: <57071155-5a08-4579-9189-92d442cd65e7@email.android.com> X-Barracuda-Connect: terminus.zytor.com[198.137.202.10] X-Barracuda-Start-Time: 1401565004 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.6269 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Typically they are using 64-bit signed seconds. On May 31, 2014 11:22:37 AM PDT, Richard Cochran wrote: >On Sat, May 31, 2014 at 05:23:02PM +0200, Arnd Bergmann wrote: >> >> It's an approximation: > >(Approximately never ;) > >> with 64-bit timestamps, you can represent close to 300 billion >> years, which is way past the time that our planet can sustain >> life of any form[1]. > >Did you mean mean 64 bits worth of seconds? > > 2^64 / (3600*24*365) = 584,942,417,355 > >That is more than 300 billion years, and still, it is not quite the >same as "never". > >In any case, that term is not too helpful in the comparison table, >IMHO. One could think that some sort of clever running count relative >to the last mount time was implied. > >Thanks, >Richard > >[1] You are forgetting the immortal robotic overlords. -- Sent from my mobile phone. Please pardon brevity and lack of formatting. From patriciamaia@multiplaybandalarga.com.br Sat May 31 17:31:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HK_LOTTO 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 35C357F83 for ; Sat, 31 May 2014 17:31:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22931304043 for ; Sat, 31 May 2014 15:31:45 -0700 (PDT) X-ASG-Debug-ID: 1401575499-04cb6c100c719c0001-NocioJ Received: from mg.netbandalarga.com.br (mg.netbandalarga.com.br [187.18.187.10]) by cuda.sgi.com with ESMTP id F4gLkKviLibVEmq1 for ; Sat, 31 May 2014 15:31:40 -0700 (PDT) X-Barracuda-Envelope-From: patriciamaia@multiplaybandalarga.com.br X-Barracuda-Apparent-Source-IP: 187.18.187.10 X-WSS-ID: 0N6GMJZ-01-F72-02 X-M-MSG: Received: from ns01.netbandalarga.com.br (ns01.netbandalarga.com.br [187.18.187.2]) by mg.netbandalarga.com.br (Postfix) with ESMTP id 2B164B75E9; Sat, 31 May 2014 19:31:07 -0300 (BRT) Received: from multiplaybandalarga.com.br (localhost [127.0.0.1]) by ns01.netbandalarga.com.br (Postfix) with ESMTP id 4CF77147C47; Sat, 31 May 2014 19:39:54 -0300 (BRT) From: "CANADA-UK LOTTERY" Reply-To: onlinesweeptakes@cnegal.com Subject: Notification Date: Sat, 31 May 2014 23:39:54 +0100 X-ASG-Orig-Subj: Notification Message-Id: <20140531223814.M36685@multiplaybandalarga.com.br> X-Mailer: Multiplay 2.53 X-OriginatingIP: 79.141.162.19 (patriciamaia) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 To: undisclosed-recipients:; X-Barracuda-Connect: mg.netbandalarga.com.br[187.18.187.10] X-Barracuda-Start-Time: 1401575499 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.6272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is to notify that you have won in the Canada-Uk National Lottery. Reply to this mail for more details and claim. Mrs. Evelyn Mcgregor From david@fromorbit.com Sat May 31 19:25:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 13EBD7F83 for ; Sat, 31 May 2014 19:25:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF35C8F8039 for ; Sat, 31 May 2014 17:25:25 -0700 (PDT) X-ASG-Debug-ID: 1401582319-04cbb050fa170380001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 2eIEdrl7B9e2WdQs for ; Sat, 31 May 2014 17:25:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Jun 2014 09:54:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqtZl-0001Ly-EM; Sun, 01 Jun 2014 10:24:37 +1000 Date: Sun, 1 Jun 2014 10:24:37 +1000 From: Dave Chinner To: Arnd Bergmann Cc: "H. Peter Anvin" , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140601002437.GL14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <5507340.nVBP5LFtqn@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5507340.nVBP5LFtqn@wuerfel> 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: 1401582319 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.6274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, May 31, 2014 at 05:37:52PM +0200, Arnd Bergmann wrote: > On Saturday 31 May 2014 11:14:50 Dave Chinner wrote: > > On Fri, May 30, 2014 at 05:41:14PM -0700, H. Peter Anvin wrote: > > > On 05/30/2014 05:37 PM, Dave Chinner wrote: > > > > > > > > IOWs, the filesystem has to be able to reject any attempt to set a > > > > timestamp that is can't represent on disk otherwise Bad Stuff will > > > > happen, > > > > > > Actually it is questionable if it is worse to reject a timestamp or just > > > let it wrap. Rejecting a valid timestamp is a bit like "You don't > > > exist, go away." > > > > I think having the new systems calls being able to > > return EINVAL if the value cannot be stored permanently on disk > > correctly is the right thing to do. Having it silently mangled > > by the filesystem and returning "everything is just fine, trust me" > > is close to the worst solution I can think of. That's exactly what > > leads to overflow bugs occurring.... > > While going through the file systems, I was wondering whether > we should have the times stop at the end of each file systems > epoch rather than wrap around. > > > > > and filesystems have to be able to specify in their on > > > > disk format what timestamp encoding is being used. The solution will > > > > be different for every filesystem that needs to support time beyond > > > > 2038. > > > > > > Actually the cutoff can be really different for each filesystem, not > > > necessarily 2038. However, I maintain the above still holds. > > > > Sure, but all filesystems are supposed to handle at least the > > current unix epoch. > > In my list at http://kernelnewbies.org/y2038, I found that almost > all file systems at least times until 2106, because they treat > the on-disk value as unsigned on 64-bit systems, or they use > a completely different representation. My guess is that somebody > earlier spent a lot of work on making that happen. > > The exceptions are: > > * exofs uses signed values, which can probably be changed to be > consistent with the others. > * isofs has a bug that limits it until 2027 on architectures with > a signed 'char' type (otherwise it's 2155). > * udf can represent times for many thousands of years through a > 16-bit year representation, but the code to convert to epoch > uses a const array that ends at 2038. > * afs uses signed seconds and can probably be fixed > * coda relies on user space time representation getting passed > through an ioctl. > * I miscategorized xfs/ext2/ext3 as having unsigned 32-bit seconds, > where they really use signed. > > I was confused about XFS since I didn't noticed that there are > separate xfs_ictimestamp_t and xfs_timestamp_t types, so I expected > XFS to also use the 1970-2106 time range on 64-bit systems today. You've missed an awful lot more than just the implications for the core kernel code. There's a good chance such changes propagate to APIs elsewhere in the filesystems, because something you haven't realised is that XFS effectively exposes the on-disk timestamp format directly to userspace via the bulkstat interface (see struct xfs_bstat). It also affects the XFS open-by-handle ioctl and the swap extent ioctl used by the online defragmenter. IOWs, if we are changing the on-disk timestamp format then this affects several ioctl()s and hence quite a few of the XFS userspace utilities. The hardest to fix will be xfsdump which would need a new dump format to store the extended timestamp ranges, and then xfs_restore will need to be able to handle restoring such timestamps on filesystems that don't have extended timestamp support... Put simply, changing the structure of system time isn't as straight forward as changing the kernel structures. System time gets stored permanently, and that has a cascade effect through the kernel all to all of the filesystem utilities that know about that permanent storage in some way.... So yes, you can change the kernel definition, but until the permanent storage of system time can be extended to support the same range as the kernel the *system* will still have nasty, silent epoch overflow, truncation or corruption issues. > If we are using the variant of my patch that extends > indode_time->tv_sec to s64, nothing should change for XFS > at all, the main difference is that we if it gets extended > to wider on-disk timestamps, they will work the same way on > 32-bit and 64-bit kernels. "nothing should change" except for the fact that a 64 bit timestamp gets silently truncated to 32 bits and the timestamp is not what the user expects it to be. The user does not find out until the inode passes out of cache and is re-read from disk, and then it's wrong. To put it politely: that is broken, obnoxious behaviour and we don't design new interfaces with such ugly warts anymore. Define an EOVERFLOW, EINVAL or ERANGE error in the new syscalls to handle this case and *hard fail* if the storage cannot support the extended timestamp being passed in. There is no excuse for silently mangling out-of-range data, especially as we have plenty of time to add support to the filesystems so that such errors don't occur. It might take us a year to implement, but it will be done long before the epoch overflows. And, FWIW, this patchset needs a set of regression tests that ensure timestamps beyond 2038 and 2106 don't change across unmount/mount. Written for xfstests, preferably, so that it's run as part of every filesystem developer's daily workflow. This is the only way we are going to ensure that the filesystem and VFS code works correctly and continues to work correctly up to the end of the current epoch.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat May 31 19:40:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none 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 353F37F86 for ; Sat, 31 May 2014 19:40:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E36868F8037 for ; Sat, 31 May 2014 17:40:28 -0700 (PDT) X-ASG-Debug-ID: 1401583226-04bdf0599e3a0420001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9ejsmabMwuzgckJ0 for ; Sat, 31 May 2014 17:40:26 -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: Av0PACp2ilN5LL1s/2dsb2JhbABZgwerVAEBAQEBAQaYGwGBBhd0giUBAQQBOhwjBQsIAxgJJQ8FJQMhE4g6B9U/FxaFP4h9B4RABJl/ixyIEoNKKw Received: from ppp121-44-189-108.lns20.syd7.internode.on.net (HELO dastard) ([121.44.189.108]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Jun 2014 10:10:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WqtoY-0001Ne-9c; Sun, 01 Jun 2014 10:39:54 +1000 Date: Sun, 1 Jun 2014 10:39:54 +1000 From: Dave Chinner To: "H. Peter Anvin" Cc: Arnd Bergmann , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, joseph@codesourcery.com, john.stultz@linaro.org, hch@infradead.org, tglx@linutronix.de, geert@linux-m68k.org, lftan@altera.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [RFC 11/32] xfs: convert to struct inode_time Message-ID: <20140601003954.GM14410@dastard> X-ASG-Orig-Subj: Re: [RFC 11/32] xfs: convert to struct inode_time References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <1401480116-1973111-12-git-send-email-arnd@arndb.de> <20140531003712.GH14410@dastard> <5389252A.5050503@zytor.com> <20140531011450.GJ14410@dastard> <20140531055457.GK14410@dastard> <538995D4.9050702@zytor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538995D4.9050702@zytor.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: 1401583226 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.6274 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, May 31, 2014 at 01:41:56AM -0700, H. Peter Anvin wrote: > On 05/30/2014 10:54 PM, Dave Chinner wrote: > > > > If we are changing the in-kernel timestamp to have a greater dynamic > > range that anything we current support on disk, then we need support > > for all filesystems for similar translation and constraint. The > > filesystems need to be able to tell the kernel what they timestamp > > range they support, and then the kernel needs to follow those > > guidelines. And if the filesystem is mounted on a kernel that > > doesn't support the current filesystem's timestamp format, then at > > minimum that filesystem cannot do anything that writes a > > timestamp.... > > > > Put simply: the filesystem defines the timestamp range that can be > > used safely, not the userspace API. If the filesystem can't support > > the date it is handed then that is an out-of-range error. Since > > when have we accepted that it's OK to handle out-of-range data with > > silent overflows or corruption of the data that we are attempting to > > store? We're defining a new API to support a wider date range - > > there is nothing that prevents us from saying ERANGE can be returned > > to a timestamp that the file cannot store correctly.... > > > > I'm still puzzled. > > Are you saying that you want a program that does: > > /* Deliberately simplified */ > gettimeofdayns(&now ...); > utimensat(... now); > > ... to suddenly start failing on Jan 19, 2038 (for a filesystem with > 32-bit timestamps), Yes. Hard fail so overflows are in your face and we know exactly what is going to cause silent timestamp screwups when the epoch > or would you propose some ways for the filesystems > in question to extend the range of the timestamps? Filesystems are going to have to change their on-disk formats, so we'd do that just like we do every other on-disk format change. With feature bits and translation layers, new ioctl structures, etc. Depending on the amount of work necessary, some filesystems could do this in 3.16, others it might be 3.20 before everything is sorted out across the kernel and userspace code... Either way, the hard fail problem goes away as each filesystem is converted. Further, if we have regression tests then new filesystems are guaranteed to be designed to handle 2038 epoch rollover, and so in a year of two this "hard fail" is effectively a non-problem. If someone breaks something in future, then we'll know about it pretty quickly. > What you seem to propose also seems to imply that on Jan 19, 2038 > anything that writes a timestamp with the current date (which logically > ends up being almost every write operation) would be dead and frozen on > such a filesystem -- pretty much meaning the filesystem would become > readonly if not in reality than in practice. Yup. If we can't do what the user wants without the user thinking corruption has occurred, then the only thing we are left with is "shut down the filesystem" error handling. Kind of like using BUG() rather than returning an error. That's why we need to be able to hard fail and return an error. However, we've got 20+ years to fix our current filesystems and all their support code to ensure this doesn't happen. In the mean time, having stuff hard fail is a great way to ensure that filesystems get fixed sooner rather than later... > I strongly suspect that that would be a more catastrophic failure than > incorrect timestamps, as you suddenly have all kinds of machines > embedded in $DEITY knows what places just stop and refuse to run. Yup, that's a great way of flushing out problems 20 years before they really matter. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Sat May 31 20:22:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8E69D7F87 for ; Sat, 31 May 2014 20:22:44 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay1.corp.sgi.com (Postfix) with ESMTP id 470078F8037; Sat, 31 May 2014 18:22:44 -0700 (PDT) Message-ID: <538A8064.2030304@sgi.com> Date: Sat, 31 May 2014 20:22:44 -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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> <538743E0.70103@sgi.com> <20140531003918.GI14410@dastard> In-Reply-To: <20140531003918.GI14410@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/30/14 19:39, Dave Chinner wrote: > On Thu, May 29, 2014 at 09:27:44AM -0500, Mark Tinguely wrote: >> On 05/27/14 19:29, Dave Chinner wrote: >>> On Tue, May 27, 2014 at 05:56:54PM -0500, Mark Tinguely wrote: >>>> A 7-8 hours on spinning rust. This is my burn in test. >>> >>> Can you try to narrow the problem down? Otherwise it's going to be a >>> case of looking for a needle in a haystack.... >> >> Nod on the needle in a hay stack if it bmbt is really corrupt. >> >> I am running fsstress from xfstests with the top commit 9b7f704, and >> I don't see any newer fsstress patches since then. >> >> I moved the test to another box with a kdump that works on top of >> tree Linux and grabbed a vmcore. I grabbed a metadata dump of the >> filesystem after the ASSERT. That should give some idea of what >> inode/block it was looking up. >> >> I sent email to Namjae when I first tripped over this problem in >> late April. No longer on the face of the earth and I can't look at >> this until the weekend. > > No worries - it looks pretty hard to hit, so it's not something we > urgently need to track down. Any time you can spare to try to narrow > it down would be great! > > Cheers, > > Dave. The xfs_inode thinks there are 11 bmbt entries when there should only be 11: i_df = { if_bytes = 0xb0, <- here 11 entries 0x10 bytes long if_real_bytes = 0x100, if_broot = 0xffff88009f74c680, if_broot_bytes = 0x28, if_flags = 0x6, if_u1 = { if_extents = 0xffff88033c44a000, <- if_ext_irec = 0xffff88033c44a000, if_data = 0xffff88033c44a000 "" }, Looking at the if_extents[]: crash> rd ffff88033c44a000 32 ffff88033c44a000: 8000000000000200 000000b601800021 ........!....... ffff88033c44a010: 0000000000004400 000000449a000007 .D..........D... ffff88033c44a020: 0000000000005200 000002f897e00004 .R.............. ffff88033c44a030: 8000000000005a00 000002f898600033 .Z......3.`..... ffff88033c44a040: 000000000000c000 000002f89ec00001 ................ ffff88033c44a050: 0000000000015c00 000005fdfba00010 .\.............. ffff88033c44a060: 0000000000017c00 00000eab00400006 .|........@..... ffff88033c44a070: 000000000001f800 00000ec752c00004 ...........R.... ffff88033c44a080: 0000000000020000 00000e8ae6800004 ................ ffff88033c44a090: 0000000000020800 00000e7167e00004 ...........gq... ffff88033c44a0a0: 000000000002bfff ffffffc000a00001 ................ ^^^^ bad ^^^^ It appears that current_ext is 10 (11th entry). The assert is on the bad entry. xfs_db thinks there are 11 entries: recs[1-11] = [startoff,startblock,blockcount,extentflag] 1:[1,372748,33,1] 2:[34,140496,18,0] 3:[52,1557619,53,1] 4:[105,1557672,27,0] 5:[132,1557699,51,1] 6:[183,1557750,1,0] 7:[261,3141597,16,0] 8:[277,7690242,6,0] 9:[339,7748246,4,0] 10:[343,7624500,4,0] 11:[347,7572287,4,0] xfs_db> fsb 4262789 xfs_db> type text xfs_db> p 000: 42 4d 41 50 00 00 00 0b ff ff ff ff ff ff ff ff BMAP............ 010: ff ff ff ff ff ff ff ff 80 00 00 00 00 00 02 00 ................ 020: 00 00 00 b6 01 80 00 21 00 00 00 00 00 00 44 00 ..............D. 030: 00 00 00 44 9a 00 00 12 80 00 00 00 00 00 68 00 ...D..........h. 040: 00 00 02 f8 8e 60 00 35 00 00 00 00 00 00 d2 00 .......5........ 050: 00 00 02 f8 95 00 00 1b 80 00 00 00 00 01 08 00 ................ 060: 00 00 02 f8 98 60 00 33 00 00 00 00 00 01 6e 00 .......3......n. 070: 00 00 02 f8 9e c0 00 01 00 00 00 00 00 02 0a 00 ................ 080: 00 00 05 fd fb a0 00 10 00 00 00 00 00 02 2a 00 ................ 090: 00 00 0e ab 00 40 00 06 00 00 00 00 00 02 a6 00 ................ 0a0: 00 00 0e c7 52 c0 00 04 00 00 00 00 00 02 ae 00 ....R........... 0b0: 00 00 0e 8a e6 80 00 04 00 00 00 00 00 02 b6 00 ................ 0c0: 00 00 0e 71 67 e0 00 04 00 00 00 00 00 00 00 00 ...qg........... 0d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ This xfs_db is before log replay, but it appears that the 3 extent is missing in the data fork, everything shifted up and a garbage entry in entry 11. --Mark. From tinguely@sgi.com Sat May 31 20:25:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 DC2087F87 for ; Sat, 31 May 2014 20:25:16 -0500 (CDT) Received: from eagdhcp-232-192.americas.sgi.com (eagdhcp-232-192.americas.sgi.com [128.162.232.192]) by relay1.corp.sgi.com (Postfix) with ESMTP id A37598F8037 for ; Sat, 31 May 2014 18:25:16 -0700 (PDT) Message-ID: <538A80FC.10809@sgi.com> Date: Sat, 31 May 2014 20:25:16 -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: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate References: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> <53850F92.7010401@sgi.com> <20140527225138.GD8554@dastard> <53851836.2070301@sgi.com> <20140528002906.GH8554@dastard> <538743E0.70103@sgi.com> <20140531003918.GI14410@dastard> <538A8064.2030304@sgi.com> In-Reply-To: <538A8064.2030304@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 05/31/14 20:22, Mark Tinguely wrote: > > The xfs_inode thinks there are 11 bmbt entries when there should only be > 11: > i_df = { > if_bytes = 0xb0, <- here 11 entries 0x10 bytes long sorry bad editing when I could not do hex math. There are 11 entries, should be 11 entries, but we have one missing entry and one garbage entry. --Mark. From huguette-cloutier@outlook.fr Sat May 31 21:16:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 8DAEB7F8B for ; Sat, 31 May 2014 21:16:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 619F38F8037 for ; Sat, 31 May 2014 19:16:56 -0700 (PDT) X-ASG-Debug-ID: 1401589009-04cb6c100681b90001-NocioJ Received: from DUB004-OMC4S8.hotmail.com (dub004-omc4s8.hotmail.com [157.55.2.83]) by cuda.sgi.com with ESMTP id eyJqKOY4VP8ksHP9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Sat, 31 May 2014 19:16:50 -0700 (PDT) X-Barracuda-Envelope-From: huguette-cloutier@outlook.fr X-Barracuda-Apparent-Source-IP: 157.55.2.83 Received: from DUB126-W80 ([157.55.2.71]) by DUB004-OMC4S8.hotmail.com with Microsoft SMTPSVC(7.5.7601.22701); Sat, 31 May 2014 19:16:49 -0700 X-TMN: [8zgzBy0tW6hCAKKLoVb5zc/dn8Vx7ulr] X-Originating-Email: [huguette-cloutier@outlook.fr] Message-ID: Content-Type: multipart/alternative; boundary="_38dc884f-a19b-4f14-a731-7735f307edcd_" From: huguette cloutier Subject: A votre honneur Date: Sun, 1 Jun 2014 04:16:49 +0200 X-ASG-Orig-Subj: A votre honneur Importance: Normal In-Reply-To: References: ,,,,,,,, MIME-Version: 1.0 X-OriginalArrivalTime: 01 Jun 2014 02:16:49.0398 (UTC) FILETIME=[8B81B960:01CF7D3F] X-Barracuda-Connect: dub004-omc4s8.hotmail.com[157.55.2.83] X-Barracuda-Start-Time: 1401589010 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: 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.6276 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:; --_38dc884f-a19b-4f14-a731-7735f307edcd_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Je sais que ce message vous appara=EEtra comme une surprise puisse que nous= nous ne connaissions pas mais la gr=E2ce de Dieu m'a dirig=E9e vers vous e= t je voudrais que vous lisiez attentivement ce message et soyez b=E9nis au = nom de J=E9sus. Je suis Huguette Cloutier ressortissante Fran=E7aise n=E9e le 19 septembre= 1952 en France r=E9sidant actuellement au Burkina FasoJe suis sous contr= =F4le m=E9dical depuis plus de deux (2) mois ici au Burkina Faso=20 J'ai une tumeur au cerveau=2C je souffre terriblement en ce moment. Mon m= =E9decin traitant vient de m'informer que mes jours sont compt=E9s du fait = de mon =E9tat de sant=E9 d=E9gradante donc condamn=E9e a une mort certaine.= Actuellement=2C j'ai =E9puis=E9e toutes mes =E9pargnes pour mes soins m=E9= dicaux. Mais je dispose n=E9anmoins de fonds destin=E9s =E0 mon projet d'= =9Cuvres caritatives=2C ces fonds sont sur un compte class=E9/fixe et bloqu= =E9 au sein d'une banque local. Pour toutes op=E9rations financi=E8res sur = ces fonds il me faut d'abord les d=E9bloquer. Le d=E9blocage direct de ces = fonds entra=EEne imm=E9diatement des taxes et les imp=F4ts exig=E9s par le = fisc burkinab=E9 qui sont vraiment =E9norme ce qui r=E9duirait environ de = moiti=E9 le capital. Ma situation matrimoniale est telle que je suis c=E9libataire du faite que = j'ai perdus mon =E9poux depuis plus de 10 ans maintenant et nous n'avons ma= lheureusement pas eu d'enfant ensemble ce qui fais que je n'ai personne =E0= qui l=E9guer mon h=E9ritage. C=92est pourquoi=2C pour d=E9bloquer mes fond= s que je voudrais proc=E9der par une donation de fa=E7on =E0 ce qu=92il n'y= a pas de taxe =E9lev=E9e sur mes fonds. Pour ce fait je voudrais de fa=E7o= n gracieuse et dans le souci d'aider les d=E9munis te donner ce dit h=E9rit= age s'=E9levant =E0 une valeur de quatre millions de euro (4.000.000=80) po= ur te permettre d'=E9tablir une fondation de bienfaisance en ma m=E9moire a= fin que la gr=E2ce de Dieu soit avec moi jusqu'=E0 ma derni=E8re demeure po= ur que je puisse b=E9n=E9ficier d'une place honorable aupr=E8s du Seigneur = notre p=E8re. N'ayez aucune crainte car avant de vous contactez j'ai pri=E9e pendant plus= ieurs nuits pour que le seigneur J=E9sus Christ puisse m'accorder le contac= t d'une personne de confiance =E0 qui je pourrai confier cette affaire et c= 'est =E0 la suite de cela que j'ai eu ton mail qui m'ont permis de te conta= ct=E9e. Sachez que vous pouvez conservez la moiti=E9 de cet argent pour vo= us et le reste servira =E0 cr=E9e une fondation de bienfaisance en ma m=E9m= oire ainsi qu'une f=E9d=E9ration de lutte contre la tumeur et construis aus= si des orphelinats. Je voudrais avoir les informations suivantes qui vont = servie a mon notaire tel que : votre nom et votre pr=E9nom=2C votre adresse= pr=E9cise et votre contact t=E9l=E9phonique permanent afin de me permettre= de les transmettre =E0 mon notaire pour qu'en semble-vous effectuez les d= =E9marches de transaction. La Bible dit que chaque chose =E0 son temps et il est temps pour vous de re= cevoir ces fonds pour les =9Cuvres de l'=E9ternel. Demandez vous recevrez= =2C chercher et vous trouvez=2C frappez et l'on vous ouvrira. Mathieu 7:7. Je compte sur votre bonne volont=E9 et surtout sur le bon usage de ces fond= s chose d'on je ne doute pas car j'ai une grande confiance en vous puisse que c=92est Dieu qui ma guider vers vous. Dans l'attente de vos nouvelles=2C re=E7ois mes cordiales et fraternelles s= alutation Sinc=E8rement vous d=E9voue et que Dieu vous B=E9nisse. = = = --_38dc884f-a19b-4f14-a731-7735f307edcd_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable
Je sais que ce message vous appara= =EEtra comme une surprise puisse que nous nous ne connaissions pas mais la = gr=E2ce de Dieu m'a dirig=E9e vers vous et je voudrais que vous lisiez atte= ntivement ce message et soyez b=E9nis au nom de J=E9sus.
=

 =3B

Je suis =3BHuguette Cloutier re= ssortissante Fran=E7aise n=E9e le 19 =3Bseptembre 1952 en France r=E9si= dant actuellement au Burkina Faso

Je suis sous contr=F4le m=E9dical depuis plus de deux = (2) mois ici au Burkina Faso =3B

J'ai une tumeur au cerveau=2C j= e souffre terriblement en ce moment. Mon m=E9decin traitant vient de m'info= rmer que mes jours sont compt=E9s du fait de mon =E9tat de sant=E9 d=E9grad= ante donc condamn=E9e a une mort certaine.

 =3B

Actuellement=2C j'ai =E9puis=E9e toutes mes =E9= pargnes pour mes soins m=E9dicaux. Mais je dispose n=E9anmoins de fonds des= tin=E9s =E0 mon projet d'=9Cuvres caritatives=2C ces fonds sont sur un comp= te class=E9/fixe et bloqu=E9 au sein d'une banque local.<= span style=3D"line-height:17.040000915527344px=3Bfont-family:Verdana=2C san= s-serif=3Bfont-size:9pt=3B">

<= i> =3B

Pour toutes op=E9rations financi=E8= res sur ces fonds il me faut d'abord les d=E9bloquer.

 =3BLe d=E9blocage direct de ce= s fonds entra=EEne imm=E9diatement des taxes et les imp=F4ts exig=E9s par l= e fisc burkinab=E9 =3B =3Bqui sont vraiment =E9norme ce qui r=E9dui= rait environ de moiti=E9 le capital.


Ma sit= uation matrimoniale est telle que je suis c=E9libataire du faite que j'ai p= erdus mon =E9poux depuis plus de 10 ans maintenant et nous n'avons malheure= usement pas eu d'enfant ensemble ce qui fais que je n'ai personne =E0 qui l= =E9guer mon h=E9ritage.

 =3B

= C=92est pourquoi=2C pour d=E9= bloquer mes fonds que je voudrais proc=E9der par une donation de fa=E7on = =E0 ce qu=92il n'y a pas de taxe =E9lev=E9e sur mes fonds.

<= i> =3B

Pour ce fait je voudrais de fa=E7on= gracieuse et dans le souci d'aider les d=E9munis te donner ce dit h=E9rita= ge s'=E9levant =E0 une valeur de =3Bquatre millions de euro (4.000.000= =80) pour te permettre d'=E9tablir une fondation de bienfaisance en ma m=E9= moire afin que la gr=E2ce de Dieu soit avec moi jusqu'=E0 ma derni=E8re dem= eure pour que je puisse b=E9n=E9ficier d'une place honorable aupr=E8s du Se= igneur notre p=E8re.

N'ayez aucune crainte car avant de vous contact= ez j'ai pri=E9e pendant plusieurs nuits pour que le seigneur J=E9sus Christ= puisse m'accorder le contact d'une personne de confiance =E0 qui je pourra= i confier cette affaire et c'est =E0 la suite de cela que j'ai eu ton mail = qui m'ont permis de te contact=E9e.

<= span style=3D"line-height:21.299999237060547px=3B"> =3B

<= p class=3D"ecxMsoNormal" style=3D"line-height:10.9pt=3Bcolor:rgb(68=2C 68= =2C 68)=3Bfont-size:15px=3Bbackground-color:rgb(255=2C 255=2C 255)=3B"> =3BSachez que vous pouvez conservez la moiti=E9 d= e cet argent pour vous et le reste servira =E0 cr=E9e une fondation de bien= faisance en ma m=E9moire ainsi qu'une f=E9d=E9ration de lutte contre la tum= eur et construis aussi des orphelinats.

 =3B

 =3BJe voudrais avoir les informations suivant= es qui vont servie a mon notaire tel que : votre nom et votre pr=E9nom=2C v= otre adresse pr=E9cise et votre contact t=E9l=E9phonique permanent afin de = me permettre de les transmettre =E0 mon notaire pour qu'en semble-vous effe= ctuez les d=E9marches de transaction.

<= /font>


La Bib= le dit que chaque chose =E0 son temps et il est temps pour vous de recevoir= ces fonds pour les =9Cuvres de l'=E9ternel. Demandez vous recevrez=2C cher= cher et vous trouvez=2C frappez et l'on vous ouvrira. Mathieu 7:7.

J= e compte sur votre bonne volont=E9 et surtout sur le bon usage de ces fonds= chose d'on je ne doute pas car j'ai une grande
confiance en vous puisse= que c=92est Dieu qui ma guider vers vous.

Dans l'attente de vos nou= velles=2C re=E7ois mes cordiales et fraternelles salutation

Sinc=E8r= ement vous d=E9voue et que Dieu vous =3B =3BB=E9nisse.

= --_38dc884f-a19b-4f14-a731-7735f307edcd_-- From richardcochran@gmail.com Sat May 31 23:45:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 E1E617F8B for ; Sat, 31 May 2014 23:45:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58D2CAC001 for ; Sat, 31 May 2014 21:45:14 -0700 (PDT) X-ASG-Debug-ID: 1401597911-04cbb050fb17c490001-NocioJ Received: from mail-wg0-f43.google.com (mail-wg0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id 736dxsMtw8WRm1pd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 21:45:12 -0700 (PDT) X-Barracuda-Envelope-From: richardcochran@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wg0-f43.google.com with SMTP id l18so3603501wgh.2 for ; Sat, 31 May 2014 21:45:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=taJUC7ymsxt3pcgKcjk9izduycVqx3awNpbu/cbrT78=; b=OhZu92JDDIV7zTVFgSd/raej9AL8jZDt4CeFI9OyzsLzsd22V7XhJ+6IPp2lbThum0 CO31AQI4ytxxnGOavm++DVebldL0xx6hoQtzXc/ZHsW1bITotLT3YAdcbqxDEudaqzdq cJK4G/Frr5t6H87fKJeJZdyYW2pKfktIrsB9cTNcXSafkKN7SNXWKZz9++Opdx6GAiEm ncNe/AFWTPI/7ANogeH/OALSIvHtc+N1qm9BhvfEnjF3Y3aWM1J/MzMaojRsbyi18edC kgZ7de3we5Iwws+6/FGgHrnmsmq/gwhTD7QU5SY17JJxhvmD7BcYm9+SujVdU+MDA839 ymFA== X-Received: by 10.180.97.131 with SMTP id ea3mr11207247wib.35.1401597911494; Sat, 31 May 2014 21:45:11 -0700 (PDT) Received: from localhost.localdomain (089144223011.atnat0032.highway.bob.at. [89.144.223.11]) by mx.google.com with ESMTPSA id m2sm23765691wjf.42.2014.05.31.21.45.01 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 31 May 2014 21:45:10 -0700 (PDT) Date: Sun, 1 Jun 2014 06:44:36 +0200 From: Richard Cochran To: Arnd Bergmann Cc: linux-kernel@vger.kernel.org, hch@infradead.org, linux-mtd@lists.infradead.org, hpa@zytor.com, logfs@logfs.org, linux-afs@lists.infradead.org, joseph@codesourcery.com, linux-arch@vger.kernel.org, linux-cifs@vger.kernel.org, linux-scsi@vger.kernel.org, ceph-devel@vger.kernel.org, codalist@coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, geert@linux-m68k.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, john.stultz@linaro.org, tglx@linutronix.de, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, lftan@altera.com, linux-btrfs@vger.kernel.org Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <20140601044436.GC3722@localhost.localdomain> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140531145114.GA3721@localhost.localdomain> <6347520.8jMPlVsFjM@wuerfel> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6347520.8jMPlVsFjM@wuerfel> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-wg0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1401597912 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.6278 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 Sat, May 31, 2014 at 05:23:02PM +0200, Arnd Bergmann wrote: > On Saturday 31 May 2014 16:51:15 Richard Cochran wrote: > > > > Why are some of the time stamp expiration dates marked as "never"? > > It's an approximation: Also, the term "never" might mean using arbitrarily long integers as in ASN.1. Thanks, Richard From richardcochran@gmail.com Sat May 31 23:46:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 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 3AFB77F8B for ; Sat, 31 May 2014 23:46:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6B5C304039 for ; Sat, 31 May 2014 21:46:44 -0700 (PDT) X-ASG-Debug-ID: 1401598002-04bdf059a13ac380001-NocioJ Received: from mail-we0-f175.google.com (mail-we0-f175.google.com [74.125.82.175]) by cuda.sgi.com with ESMTP id mvlf7pELkGeq3xmu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 31 May 2014 21:46:43 -0700 (PDT) X-Barracuda-Envelope-From: richardcochran@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.175 Received: by mail-we0-f175.google.com with SMTP id p10so3646084wes.20 for ; Sat, 31 May 2014 21:46:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=yV1sqBiUTth5pubGvlu+YDYFfK3jNlMJWhzA6+nKkQU=; b=cFx+L+qN5cx3q87HfgaRR7M7JDxljzARCu0WaX29AmFCHRn3/SCA0RRK/Du4mRwpug ThQDFhWRSQnaKp0Xb+8Hm0gCann+2xQtug8gIVIZzgghmtBGHGQSVJRMKhyahpCoCyCv Er2WZ/DInQEjqOlmq4cc0K5mQiYYvDBurDQpLR1gWIIJwVHw+EGe9iANsceFmIi3/+IX FPX12EHgy051HzN4hvkDQdQzerGEHV0SxN08KjE8BfnwDl0XiBNEs1W3oF/WT0Eljtz7 w7+VrSaeGlsGERwioqJBG5PJRTbQNOUStf5i0ChenuooZZT0jDrttbGrbjpkmaSahouR 9DGQ== X-Received: by 10.194.62.176 with SMTP id z16mr38419567wjr.76.1401598001936; Sat, 31 May 2014 21:46:41 -0700 (PDT) Received: from localhost.localdomain (089144223011.atnat0032.highway.bob.at. [89.144.223.11]) by mx.google.com with ESMTPSA id f7sm23791120wjy.24.2014.05.31.21.46.32 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 31 May 2014 21:46:41 -0700 (PDT) Date: Sun, 1 Jun 2014 06:46:09 +0200 From: Richard Cochran To: "H. Peter Anvin" Cc: Arnd Bergmann , linux-kernel@vger.kernel.org, hch@infradead.org, linux-mtd@lists.infradead.org, logfs@logfs.org, linux-afs@lists.infradead.org, joseph@codesourcery.com, linux-arch@vger.kernel.org, linux-cifs@vger.kernel.org, linux-scsi@vger.kernel.org, ceph-devel@vger.kernel.org, codalist@TELEMANN.coda.cs.cmu.edu, cluster-devel@redhat.com, coda@cs.cmu.edu, geert@linux-m68k.org, linux-ext4@vger.kernel.org, fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, john.stultz@linaro.org, tglx@linutronix.de, linux-nfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, lftan@altera.com, linux-btrfs@vger.kernel.org Subject: Re: [RFC 00/32] making inode time stamps y2038 ready Message-ID: <20140601044609.GD3722@localhost.localdomain> X-ASG-Orig-Subj: Re: [RFC 00/32] making inode time stamps y2038 ready References: <1401480116-1973111-1-git-send-email-arnd@arndb.de> <20140531145114.GA3721@localhost.localdomain> <6347520.8jMPlVsFjM@wuerfel> <20140531182237.GA5382@localhost.localdomain> <57071155-5a08-4579-9189-92d442cd65e7@email.android.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <57071155-5a08-4579-9189-92d442cd65e7@email.android.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-we0-f175.google.com[74.125.82.175] X-Barracuda-Start-Time: 1401598002 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.6278 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, May 31, 2014 at 12:34:12PM -0700, H. Peter Anvin wrote: > Typically they are using 64-bit signed seconds. Okay, that is what I wanted to know. Thanks, Richard
 3Dhttp:=   
=
3D""
3D""